summaryrefslogtreecommitdiff
path: root/windows/TapDriver/tapdrvr.c
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@zerotier.com>2014-01-20 14:33:05 -0800
committerAdam Ierymenko <adam.ierymenko@zerotier.com>2014-01-20 14:33:05 -0800
commit3375363d934dcd7e43bc4e3b3cefe92318123dc9 (patch)
tree834647d4ec72461c75e74ddc7d0f3b3511d5d3c1 /windows/TapDriver/tapdrvr.c
parentfbb40b98ad9b4ca687207be26a81c7bde0170305 (diff)
downloadinfinitytier-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.c34
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 >=