diff options
author | Adam Ierymenko <adam.ierymenko@zerotier.com> | 2014-01-20 14:33:05 -0800 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@zerotier.com> | 2014-01-20 14:33:05 -0800 |
commit | 3375363d934dcd7e43bc4e3b3cefe92318123dc9 (patch) | |
tree | 834647d4ec72461c75e74ddc7d0f3b3511d5d3c1 /windows/TapDriver/tapdrvr.c | |
parent | fbb40b98ad9b4ca687207be26a81c7bde0170305 (diff) | |
download | infinitytier-3375363d934dcd7e43bc4e3b3cefe92318123dc9.tar.gz infinitytier-3375363d934dcd7e43bc4e3b3cefe92318123dc9.zip |
More tap driver cleanup, and add IOCTL to get L2 multicast ethernet address subscriptions.
Diffstat (limited to 'windows/TapDriver/tapdrvr.c')
-rw-r--r-- | windows/TapDriver/tapdrvr.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/windows/TapDriver/tapdrvr.c b/windows/TapDriver/tapdrvr.c index 031b0b4e..f541ebd7 100644 --- a/windows/TapDriver/tapdrvr.c +++ b/windows/TapDriver/tapdrvr.c @@ -1523,6 +1523,7 @@ NTSTATUS PIO_STACK_LOCATION l_IrpSp; NTSTATUS l_Status = STATUS_SUCCESS; BOOLEAN accessible; + ULONG i,j; l_IrpSp = IoGetCurrentIrpStackLocation (p_IRP); @@ -1633,6 +1634,39 @@ NTSTATUS } #endif + // Allow ZeroTier One to get multicast memberships at the L2 level in a + // protocol-neutral manner. + case TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS: + { + if (&l_Adapter->m_MCLockAllocated) + NdisAcquireSpinLock (&l_Adapter->m_MCLock); + if (l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength < TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS_OUTPUT_BUF_SIZE) { + /* output buffer too small */ + NOTE_ERROR (); + p_IRP->IoStatus.Status = l_Status = STATUS_INVALID_PARAMETER; + } else { + char *out = (char *)p_IRP->AssociatedIrp.SystemBuffer; + char *end = out + TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS_OUTPUT_BUF_SIZE; + for(i=0;i<l_Adapter->m_MCListSize;++i) { + if (i >= TAP_MAX_MCAST_LIST) + break; + for(j=0;j<6;++j) + *(out++) = l_Adapter->m_MCList.list[i].addr[j]; + if (out >= end) + break; + } + while (out < end) + *(out++) = (char)0; + p_IRP->IoStatus.Information + = l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength; + p_IRP->IoStatus.Status = l_Status = STATUS_SUCCESS; + } + if (&l_Adapter->m_MCLockAllocated) + NdisReleaseSpinLock (&l_Adapter->m_MCLock); + + break; + } + case TAP_WIN_IOCTL_SET_MEDIA_STATUS: { if (l_IrpSp->Parameters.DeviceIoControl.InputBufferLength >= |