diff --git a/ext/bin/tap-windows/x64/ztTap100.inf b/ext/bin/tap-windows/x64/ztTap100.inf
index 452d36249..ff7eb6a26 100644
--- a/ext/bin/tap-windows/x64/ztTap100.inf
+++ b/ext/bin/tap-windows/x64/ztTap100.inf
@@ -4,7 +4,7 @@ Class=Net
ClassGuid={4d36e972-e325-11ce-bfc1-08002be10318}
Provider=%Provider%
CatalogFile=ztTap100.cat
-DriverVer=08/24/2013,16.12.30.608
+DriverVer=01/20/2014,14.30.21.864
[Strings]
diff --git a/ext/bin/tap-windows/x64/ztTap100.sys b/ext/bin/tap-windows/x64/ztTap100.sys
index 904c0e64d..6641337f1 100644
Binary files a/ext/bin/tap-windows/x64/ztTap100.sys and b/ext/bin/tap-windows/x64/ztTap100.sys differ
diff --git a/ext/bin/tap-windows/x64/zttap100.cat b/ext/bin/tap-windows/x64/zttap100.cat
new file mode 100644
index 000000000..e1fdb5fd1
Binary files /dev/null and b/ext/bin/tap-windows/x64/zttap100.cat differ
diff --git a/ext/bin/tap-windows/x86/ztTap100.inf b/ext/bin/tap-windows/x86/ztTap100.inf
index b67eb1561..1849019bf 100644
--- a/ext/bin/tap-windows/x86/ztTap100.inf
+++ b/ext/bin/tap-windows/x86/ztTap100.inf
@@ -4,7 +4,7 @@ Class=Net
ClassGuid={4d36e972-e325-11ce-bfc1-08002be10318}
Provider=%Provider%
CatalogFile=ztTap100.cat
-DriverVer=08/24/2013,16.12.37.14
+DriverVer=01/20/2014,14.30.31.745
[Strings]
diff --git a/ext/bin/tap-windows/x86/ztTap100.sys b/ext/bin/tap-windows/x86/ztTap100.sys
index 297f46808..6dce8e8e3 100644
Binary files a/ext/bin/tap-windows/x86/ztTap100.sys and b/ext/bin/tap-windows/x86/ztTap100.sys differ
diff --git a/ext/bin/tap-windows/x86/zttap100.cat b/ext/bin/tap-windows/x86/zttap100.cat
new file mode 100644
index 000000000..9eff33eba
Binary files /dev/null and b/ext/bin/tap-windows/x86/zttap100.cat differ
diff --git a/windows/TapDriver Package/TapDriver Package.vcxproj b/windows/TapDriver Package/TapDriver Package.vcxproj
index 6ac36e9e9..4c1495fcf 100644
--- a/windows/TapDriver Package/TapDriver Package.vcxproj
+++ b/windows/TapDriver Package/TapDriver Package.vcxproj
@@ -124,7 +124,9 @@
-
+
+ http://timestamp.digicert.com/
+
DbgengKernelDebugger
False
@@ -139,6 +141,21 @@
133563
$(OutDir)TapDriver Package
+
+ http://timestamp.digicert.com/
+
+
+ http://timestamp.digicert.com/
+
+
+ http://timestamp.digicert.com/
+
+
+ http://timestamp.digicert.com/
+
+
+ http://timestamp.digicert.com/
+
@@ -147,8 +164,43 @@
{689210b1-467c-4850-bb7d-2e10d5b4a3da}
+ true
+ true
+ false
+ true
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ true
+ true
+ true
+ true
+ true
+
+
+ true
+ true
+ true
+ true
+ true
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+
diff --git a/windows/TapDriver Package/TapDriver Package.vcxproj.filters b/windows/TapDriver Package/TapDriver Package.vcxproj.filters
index e1b34f2aa..44a2620e8 100644
--- a/windows/TapDriver Package/TapDriver Package.vcxproj.filters
+++ b/windows/TapDriver Package/TapDriver Package.vcxproj.filters
@@ -6,4 +6,12 @@
inf;inv;inx;mof;mc;
+
+
+ Driver Files
+
+
+ Driver Files
+
+
\ No newline at end of file
diff --git a/windows/TapDriver/TapDriver.vcxproj b/windows/TapDriver/TapDriver.vcxproj
index 3ebc8f900..33421c842 100644
--- a/windows/TapDriver/TapDriver.vcxproj
+++ b/windows/TapDriver/TapDriver.vcxproj
@@ -127,6 +127,7 @@
ztTap100
$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\
$(Platform)\$(ConfigurationName)\
+ http://timestamp.digicert.com/
DbgengKernelDebugger
@@ -135,50 +136,61 @@
ztTap100
$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\
$(Platform)\$(ConfigurationName)\
+ http://timestamp.digicert.com/
ztTap100
$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\
$(Platform)\$(ConfigurationName)\
+ http://timestamp.digicert.com/
ztTap100
$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\
$(Platform)\$(ConfigurationName)\
+ http://timestamp.digicert.com/
ztTap100
$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\
$(Platform)\$(ConfigurationName)\
+ http://timestamp.digicert.com/
ztTap100
$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\
$(Platform)\$(ConfigurationName)\
+ http://timestamp.digicert.com/
ztTap100
$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\
+ http://timestamp.digicert.com/
ztTap100
$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\
+ http://timestamp.digicert.com/
ztTap100
$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\
+ http://timestamp.digicert.com/
ztTap100
$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\
+ http://timestamp.digicert.com/
ztTap100
$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\
+ http://timestamp.digicert.com/
ztTap100
$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\
+ http://timestamp.digicert.com/
diff --git a/windows/TapDriver/config.h b/windows/TapDriver/config.h
index 5a6ff2471..1dc6ac878 100644
--- a/windows/TapDriver/config.h
+++ b/windows/TapDriver/config.h
@@ -6,7 +6,7 @@
#define PRODUCT_TAP_WIN_MINOR 0
#define PRODUCT_TAP_WIN_PROVIDER "ZeroTier Networks"
#define PRODUCT_TAP_WIN_DEVICE_DESCRIPTION PRODUCT_NAME
-#define PRODUCT_TAP_WIN_RELDATE "08/01/2013"
+#define PRODUCT_TAP_WIN_RELDATE "01/20/2014"
#define TAP_DRIVER_MAJOR_VERSION PRODUCT_TAP_WIN_MAJOR
#define TAP_DRIVER_MINOR_VERSION PRODUCT_TAP_WIN_MINOR
diff --git a/windows/TapDriver/constants.h b/windows/TapDriver/constants.h
index 698dc6297..0e8d86f3a 100644
--- a/windows/TapDriver/constants.h
+++ b/windows/TapDriver/constants.h
@@ -40,7 +40,7 @@
#define ETHERNET_PACKET_SIZE (ETHERNET_MTU + ETHERNET_HEADER_SIZE)
#define DEFAULT_PACKET_LOOKAHEAD (ETHERNET_PACKET_SIZE)
-#define NIC_MAX_MCAST_LIST 32 // Max length of multicast address list
+#define NIC_MAX_MCAST_LIST 128 // Max length of multicast address list
#define MINIMUM_MTU 576 // USE TCP Minimum MTU
#define MAXIMUM_MTU 65536 // IP maximum MTU
diff --git a/windows/TapDriver/proto.h b/windows/TapDriver/proto.h
index 05d2db0d1..06c712bc8 100644
--- a/windows/TapDriver/proto.h
+++ b/windows/TapDriver/proto.h
@@ -28,12 +28,7 @@
#pragma pack(1)
-#define IP_HEADER_SIZE 20
-#define IPV6_HEADER_SIZE 40
-
typedef unsigned char MACADDR [6];
-typedef unsigned long IPADDR;
-typedef unsigned char IPV6ADDR [16];
//-----------------
// Ethernet address
@@ -62,163 +57,4 @@ typedef struct
USHORT proto; /* packet type ID field */
} ETH_HEADER, *PETH_HEADER;
-//----------------
-// ARP packet
-//----------------
-
-typedef struct
-{
- MACADDR m_MAC_Destination; // Reverse these two
- MACADDR m_MAC_Source; // to answer ARP requests
- USHORT m_Proto; // 0x0806
-
-# define MAC_ADDR_TYPE 0x0001
- USHORT m_MAC_AddressType; // 0x0001
-
- USHORT m_PROTO_AddressType; // 0x0800
- UCHAR m_MAC_AddressSize; // 0x06
- UCHAR m_PROTO_AddressSize; // 0x04
-
-# define ARP_REQUEST 0x0001
-# define ARP_REPLY 0x0002
- USHORT m_ARP_Operation; // 0x0001 for ARP request, 0x0002 for ARP reply
-
- MACADDR m_ARP_MAC_Source;
- IPADDR m_ARP_IP_Source;
- MACADDR m_ARP_MAC_Destination;
- IPADDR m_ARP_IP_Destination;
-}
-ARP_PACKET, *PARP_PACKET;
-
-//----------
-// IP Header
-//----------
-
-typedef struct {
-# define IPH_GET_VER(v) (((v) >> 4) & 0x0F)
-# define IPH_GET_LEN(v) (((v) & 0x0F) << 2)
- UCHAR version_len;
-
- UCHAR tos;
- USHORT tot_len;
- USHORT id;
-
-# define IP_OFFMASK 0x1fff
- USHORT frag_off;
-
- UCHAR ttl;
-
-# define IPPROTO_UDP 17 /* UDP protocol */
-# define IPPROTO_TCP 6 /* TCP protocol */
-# define IPPROTO_ICMP 1 /* ICMP protocol */
-# define IPPROTO_IGMP 2 /* IGMP protocol */
- UCHAR protocol;
-
- USHORT check;
- ULONG saddr;
- ULONG daddr;
- /* The options start here. */
-} IPHDR;
-
-//-----------
-// UDP header
-//-----------
-
-typedef struct {
- USHORT source;
- USHORT dest;
- USHORT len;
- USHORT check;
-} UDPHDR;
-
-//--------------------------
-// TCP header, per RFC 793.
-//--------------------------
-
-typedef struct {
- USHORT source; /* source port */
- USHORT dest; /* destination port */
- ULONG seq; /* sequence number */
- ULONG ack_seq; /* acknowledgement number */
-
-# define TCPH_GET_DOFF(d) (((d) & 0xF0) >> 2)
- UCHAR doff_res;
-
-# define TCPH_FIN_MASK (1<<0)
-# define TCPH_SYN_MASK (1<<1)
-# define TCPH_RST_MASK (1<<2)
-# define TCPH_PSH_MASK (1<<3)
-# define TCPH_ACK_MASK (1<<4)
-# define TCPH_URG_MASK (1<<5)
-# define TCPH_ECE_MASK (1<<6)
-# define TCPH_CWR_MASK (1<<7)
- UCHAR flags;
-
- USHORT window;
- USHORT check;
- USHORT urg_ptr;
-} TCPHDR;
-
-#define TCPOPT_EOL 0
-#define TCPOPT_NOP 1
-#define TCPOPT_MAXSEG 2
-#define TCPOLEN_MAXSEG 4
-
-//------------
-// IPv6 Header
-//------------
-
-typedef struct {
- UCHAR version_prio;
- UCHAR flow_lbl[3];
- USHORT payload_len;
-# define IPPROTO_ICMPV6 0x3a /* ICMP protocol v6 */
- UCHAR nexthdr;
- UCHAR hop_limit;
- IPV6ADDR saddr;
- IPV6ADDR daddr;
-} IPV6HDR;
-
-//--------------------------------------------
-// IPCMPv6 NS/NA Packets (RFC4443 and RFC4861)
-//--------------------------------------------
-
-// Neighbor Solictiation - RFC 4861, 4.3
-// (this is just the ICMPv6 part of the packet)
-typedef struct {
- UCHAR type;
-# define ICMPV6_TYPE_NS 135 // neighbour solicitation
- UCHAR code;
-# define ICMPV6_CODE_0 0 // no specific sub-code for NS/NA
- USHORT checksum;
- ULONG reserved;
- IPV6ADDR target_addr;
-} ICMPV6_NS;
-
-// Neighbor Advertisement - RFC 4861, 4.4 + 4.6/4.6.1
-// (this is just the ICMPv6 payload)
-typedef struct {
- UCHAR type;
-# define ICMPV6_TYPE_NA 136 // neighbour advertisement
- UCHAR code;
-# define ICMPV6_CODE_0 0 // no specific sub-code for NS/NA
- USHORT checksum;
- UCHAR rso_bits; // Router(0), Solicited(2), Ovrrd(4)
- UCHAR reserved[3];
- IPV6ADDR target_addr;
- // always include "Target Link-layer Address" option (RFC 4861 4.6.1)
- UCHAR opt_type;
-#define ICMPV6_OPTION_TLLA 2
- UCHAR opt_length;
-#define ICMPV6_LENGTH_TLLA 1 // multiplied by 8 -> 1 = 8 bytes
- MACADDR target_macaddr;
-} ICMPV6_NA;
-
-// this is the complete packet with Ethernet and IPv6 headers
-typedef struct {
- ETH_HEADER eth;
- IPV6HDR ipv6;
- ICMPV6_NA icmpv6;
-} ICMPV6_NA_PKT;
-
#pragma pack()
diff --git a/windows/TapDriver/prototypes.h b/windows/TapDriver/prototypes.h
index 2c4ea91da..4062fc18c 100644
--- a/windows/TapDriver/prototypes.h
+++ b/windows/TapDriver/prototypes.h
@@ -146,58 +146,12 @@ VOID FlushQueues
TapExtensionPointer p_Extension
);
-VOID ResetTapAdapterState
- (
- TapAdapterPointer p_Adapter
- );
-
-BOOLEAN ProcessARP
- (
- TapAdapterPointer p_Adapter,
- const PARP_PACKET src,
- const IPADDR adapter_ip,
- const IPADDR ip_network,
- const IPADDR ip_netmask,
- const MACADDR mac
- );
-
VOID SetMediaStatus
(
TapAdapterPointer p_Adapter,
BOOLEAN state
);
-VOID InjectPacketDeferred
- (
- TapAdapterPointer p_Adapter,
- UCHAR *packet,
- const unsigned int len
- );
-
-VOID InjectPacketNow
- (
- TapAdapterPointer p_Adapter,
- UCHAR *packet,
- const unsigned int len
- );
-
-// for KDEFERRED_ROUTINE and Static Driver Verifier
-//#include
-//KDEFERRED_ROUTINE InjectPacketDpc;
-
-VOID InjectPacketDpc
- (
- KDPC *Dpc,
- PVOID DeferredContext,
- PVOID SystemArgument1,
- PVOID SystemArgument2
- );
-
-VOID CheckIfDhcpAndTunMode
- (
- TapAdapterPointer p_Adapter
- );
-
VOID HookDispatchFunctions();
struct WIN2K_NDIS_MINIPORT_BLOCK
@@ -206,17 +160,4 @@ struct WIN2K_NDIS_MINIPORT_BLOCK
UNICODE_STRING MiniportName; // how mini-port refers to us
};
-#if PACKET_TRUNCATION_CHECK
-
-VOID IPv4PacketSizeVerify
- (
- const UCHAR *data,
- ULONG length,
- BOOLEAN tun,
- const char *prefix,
- LONG *counter
- );
-
-#endif
-
#endif
diff --git a/windows/TapDriver/tap-windows.h b/windows/TapDriver/tap-windows.h
index a396470e7..3b695e5dd 100644
--- a/windows/TapDriver/tap-windows.h
+++ b/windows/TapDriver/tap-windows.h
@@ -38,6 +38,13 @@
#define TAP_WIN_IOCTL_GET_MTU TAP_WIN_CONTROL_CODE (3, METHOD_BUFFERED)
#define TAP_WIN_IOCTL_SET_MEDIA_STATUS TAP_WIN_CONTROL_CODE (6, METHOD_BUFFERED)
#define TAP_WIN_IOCTL_GET_LOG_LINE TAP_WIN_CONTROL_CODE (8, METHOD_BUFFERED)
+#define TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS TAP_WIN_CONTROL_CODE (11, METHOD_BUFFERED)
+
+// Must be the same as NIC_MAX_MCAST_LIST in constants.h
+#define TAP_MAX_MCAST_LIST 128
+
+// Amount of memory that must be provided to ioctl TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS
+#define TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS_OUTPUT_BUF_SIZE (TAP_MAX_MCAST_LIST * 6)
/*
* =================
diff --git a/windows/TapDriver/tapdrvr.c b/windows/TapDriver/tapdrvr.c
index 031b0b4e3..f541ebd77 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;im_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 >=
diff --git a/windows/TapDriver/types.h b/windows/TapDriver/types.h
index 9a853e96b..94587a645 100644
--- a/windows/TapDriver/types.h
+++ b/windows/TapDriver/types.h
@@ -82,14 +82,6 @@ typedef struct _TapExtension
// Flags
BOOLEAN m_TapIsRunning;
BOOLEAN m_CalledTapDeviceFreeResources;
-
-#if 0
- // DPC queue for deferred packet injection
- BOOLEAN m_InjectDpcInitialized;
- KDPC m_InjectDpc;
- NDIS_SPIN_LOCK m_InjectLock;
- Queue *m_InjectQueue;
-#endif
}
TapExtension, *TapExtensionPointer;
@@ -103,17 +95,6 @@ typedef struct _TapPacket
}
TapPacket, *TapPacketPointer;
-#if 0
-typedef struct _InjectPacket
- {
-# define INJECT_PACKET_SIZE(data_size) (sizeof (InjectPacket) + (data_size))
-# define INJECT_PACKET_FREE(ib) NdisFreeMemory ((ib), INJECT_PACKET_SIZE ((ib)->m_Size), 0)
- ULONG m_Size;
- UCHAR m_Data []; // m_Data must be the last struct member
- }
-InjectPacket, *InjectPacketPointer;
-#endif
-
typedef struct _TapAdapter
{
# define NAME(a) ((a)->m_NameAnsi.Buffer)
@@ -122,9 +103,6 @@ typedef struct _TapAdapter
BOOLEAN m_InterfaceIsRunning;
NDIS_HANDLE m_MiniportAdapterHandle;
LONG m_Rx, m_Tx, m_RxErr, m_TxErr;
-#if PACKET_TRUNCATION_CHECK
- LONG m_RxTrunc, m_TxTrunc;
-#endif
NDIS_MEDIUM m_Medium;
ULONG m_Lookahead;
ULONG m_MTU;