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;