From 3375363d934dcd7e43bc4e3b3cefe92318123dc9 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Mon, 20 Jan 2014 14:33:05 -0800 Subject: [PATCH] More tap driver cleanup, and add IOCTL to get L2 multicast ethernet address subscriptions. --- ext/bin/tap-windows/x64/ztTap100.inf | 2 +- ext/bin/tap-windows/x64/ztTap100.sys | Bin 29928 -> 30392 bytes ext/bin/tap-windows/x64/zttap100.cat | Bin 0 -> 8974 bytes ext/bin/tap-windows/x86/ztTap100.inf | 2 +- ext/bin/tap-windows/x86/ztTap100.sys | Bin 32464 -> 27800 bytes ext/bin/tap-windows/x86/zttap100.cat | Bin 0 -> 1048 bytes .../TapDriver Package.vcxproj | 54 +++++- .../TapDriver Package.vcxproj.filters | 8 + windows/TapDriver/TapDriver.vcxproj | 12 ++ windows/TapDriver/config.h | 2 +- windows/TapDriver/constants.h | 2 +- windows/TapDriver/proto.h | 164 ------------------ windows/TapDriver/prototypes.h | 59 ------- windows/TapDriver/tap-windows.h | 7 + windows/TapDriver/tapdrvr.c | 34 ++++ windows/TapDriver/types.h | 22 --- 16 files changed, 118 insertions(+), 250 deletions(-) create mode 100644 ext/bin/tap-windows/x64/zttap100.cat create mode 100644 ext/bin/tap-windows/x86/zttap100.cat 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 904c0e64d9c2c0b872915e5c769e15ca98963449..6641337f136642bed7aafa794dcb8e6fe052ccf8 100644 GIT binary patch delta 16135 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 a93g2tM42tm%c*T+nPp=QS`)y)zyJWVs?R$B delta 16193 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 diff --git a/ext/bin/tap-windows/x64/zttap100.cat b/ext/bin/tap-windows/x64/zttap100.cat new file mode 100644 index 0000000000000000000000000000000000000000..e1fdb5fd1b0179fd875a8a8c7b2733ca162f7c73 GIT binary patch literal 8974 zcmXqLQs!dg)N1o+`_9YA&a|LO>9;|X(sw3CMni4`PBvC;K4vB8WpBpqWKQ`cDXJ4LFO`)Fr+frfuMmRQlPVl@EKl|IV!#Q;)X?)BEPyHUD;(An_`dzH;{*k$uPtq zNY00$n!yDef}l`yWH4bcV$fx1&65%g8^8~nZbm?oIw}tZf6Dqa9BDs z7%^Bfm@>FBxH8l-F)=Y1G%?O(2{K|ZVlZJaX0T*1VsK?Zf~w3KZnd z43-SW3?>YY3@!}j46Y2846Y333}y^23>IJ!H*mDLKqAGFevwklP{~jXiWKZ2=FDKm zV8LL?;K<;};KX174jqugK`c-zBrU`;;jsdW_-KPj0}~_>egidTCe{TD6i7?}O3ss( zAJ|oX`iSUBleKm8%5Gf$dUrvNL6(65+;AQyMiwOl1vwT_%7&&;p)iI_hGK>ihD3%4 zXnrs-L(!pOpeDz~;K2~i;0elLFn#DLn}K0Llhh`ICbletCf1+@%uI|-OajdF-@ZLv z8QuHVh^JHXgIT8mFT4a{WMySANCFof%%Lo7!c3vThN1?-Y|No7T*5pqndzC%sYN9U zo_WcJk_O@+VQyi8^73-Ml+5(ZadBx;YKnrVi-NPG zuAzaPIIp3xfvJ(90T@JqOByo+6EM#p%D^4f4T1*zAQQQSIbbFlsv0PRgqVe8U_uHZ znYpROC5gEO3PGvG1^Ia?sYM1&j7rG!gv^7=7jknW)Mng@xl*(E=WXpCA+y7Oex|T(+W-d$XVO zH=KLUe7MH&{Pxt)W4|BFn?@T`RhnjZX${{m$gexy1KhL)_8p zu7_(mRxui%F}~q%Aok?Hl9Ar)I_nQV<&0iWRlW4-Uv5atuB%V4T)Zp2es5&;lvV>q zCT2zk#>Gv{rUp&Sh6a3W%%QUUjEw(TSeTjE8w_|rd|?ou$$-H?48&6f@pufl*f_M= z7+G1_nK=xa825u@6j+)Vw;41sZZc?MT*$_m(B{F|_BV%}(V&TOl7R+HJrkptOh!pb zL9vy-K6=X0cMb?PXktu(t7S51VhodOVhmz%WXNNvWKduzWhiDyWl&(qXGmjEU?^e8 z0Ou4124{v;h9ZU%hD?SuhD?TJhD30otiX`Wkk60@&P$mLB@Crt(P9P#hD3&BhGd3R zh5~Rd%LB8KO$FKE!jQ?3&X5T=8)QoWgFb^ZLjXfC*o-`e6sRje>Vp_k8FCmZ!L>;` zg91YULn7EsAa^@5q%#yTq%x#3mC@_?RU7yU5!Jxp9!;s04%K&mCgq_Hc z1g^9|A|U;V3=q3OCW7n&)mR|E6)_YrA!LCqXNCJl%$mTStIK;1d z2Hfx{VipBwSXpHj2?MbP5m5#qZQ&W4X0pGPyT52(IIng((^&&qPz>|2h_Q$y>z}+| zIjMT9@~Pbqm%KBsd;DnbFN0c;v^-0hL5YFI0<#4sZAPFtw$j&6F3K@RDIN4-*%ewO zc)EZJ1ij><988@i#Of@Er5Hv=mTZGe0~HwGfU!*i>XQ8A;sO-&3>@LAnA%LCs*)2y z#aJ}uQS^wN=kN8wfrogbQ;uF5Q$EBz*3YsVdPg@>ni zf4Gp7vvl+6`Ci{b9;=zy>g_nFEwlaGVcUNfb>#xSOgZu6@4MpLo?E5AeEq+4!a++B z=^JkgrL$)I{^c;sWu+!xXk5jP?Ms>u7chQEb9lP0(&VAGFY`j(XSYL=B;H=->|V6$ z8qW!TseLn5D>7$xUWx3ycfaGq<@C6crE{0L7&Ni1G-zU-2&--4q>LHl9H%5~m5gW( zPT7tYWCq2kB|Yi2jgf%?q$1FSr7Q)H%=8QeaQaHjOHNgA&QD2I2+mB;%gjqhs(uWO zj9~SRIIp3pfsv7!p%JJ8iZUoibriJv;SlEV%}mb7Oi#>%)r#!GJg$i)`FRRKi3OP{ z#fEYQG9brr35!Oh7UhRzrWPsqrIwWE7iAYK`1m-(Yv`do?Fq7mxA%Bt6

AP<7{?`j_jC zOIPBzz&+ZAF;;sv6-{i-Xjm;`^Lm|(gqd@gh1446EjLeXRnXL#ai;k}_HvhLm&An{ zK8d78StbjWR$$681-mzagJ_sL9uR8YC(Q+ zW=VcgrCvr!?r7Btu4ZXpwKlfFB8icarOKd!$oeP%rpth-%>^2@chT2n9Rm=YTU!c|$hhA9N)=a(orJAyk&h6YB4hR|wBoY%93GJW}X*8jJHGUbUu92gy%5ub%rnuVIzi@xO!9U(Niz)skOI zIUOgxq!T}_6Nt;-bFp%Eq(s8gcbZ$7wU(Uw*evOv$y%(z`CCa~veJSHl2Sf~pDt_P zXmMU|ll*_iZG}sm+93yD{mp8AF0fdr@awhf4~43(J_w6C_lhw(BQ^S}1F|sA==c zPWN5F>gzHFY!x<31(ee#!fL2+gC^!+)Eb7d4cwK+s9~BI55tQ6T?WuT6dMP$|HN$2 z#5h{&=P?Za4wVon62YBi4g)qu#{W!=3k1 zfH*tqB^Q+#H1>mBCC}2>ZqV3b;IP1MflZqg%t(v|46IN>saTNA%fU1Otw}@J1Vm2~ zYm*H$bOh^(ZnQg`$^2u#JL8oZYEm3b?~_xs52F>y;9AV{bxp#)b?;BsY(BcnJLSGu z=A*V>nm6ywXsvZfQ#00g30<{n!b{TvE|Yzi*M;cyr7~QrGE%V1QQI+NrRBywQ;)BD z`SqP!+Of?qgnn$EKKFk~M3c$P(ttHC{Vyh+tL^4DoOb-qWkG`(C1S^(X1kUxp2B$6 zn4!w!TYj72$uMnWrK>*}x4E3_*>bAm(i5@A&%Zsgd&qfUZl$wxeP|5p+Q|aPba=B5 z%zIVw^iuh?9k*u9sNdx?Nqg?zB^?{@u0QN^Y5HvDW9#CjUHFa7MIWF3uOD_`$g4ANtu;_;Lwjcw1pwtJgz6{I^ z4WUDP22tX?psEbcrOP-Yq1x(2lkUu)rw%zyUD{CWP;hBpSV+vuBbOZ6`cE4F@pYXT z(>VXF&YT}&k@x3qRS`WjW9OD~&pVw*xNfaK9hd!f?S?|b*XOMqc-(v^zv-?r<6vIR zWAabJv+3XQIVK;s49N|6X)9zgYR-nlRQ0AB+^mI*%1} z{A8V8yZE^CU8Wb-wr@8&E`Dpj@Ag!WBk$xkf7-*NJ@dk`SRtpzhs}9S#rA66A`{j{ zrg0tV-FN96+q$(a`5rB^{T+6G^!c=Y#_wt@x-2{8;K-L{mag>h!a*@RT(rfmtoXa)}XROmBqxs2v#65 zGs0O+a27M1#R6x6Mg=c{w1YY`Ck>hyj~X;FZeins)@lrlETi=rc!+NB*J~&Ph1e>& zN?5EjGP2|vWD{A*Im2`rFtwS(Y9yjY-#`Tnta@t%r7?MMC(CMq#R9W76PQsrD>rbD zDK*8@1#V7`0ft^2)fzUvhzbqs$SHD#=K6Zk`Y)4CHyP>%b}wJ9IQMhz34XNF8C;>c z1=yY3uA#ErLUvoU=K7%XK`#y6SBJ$^U*+X?-2DDcseFmWr%f@5i{?x{9Pp%Rr}D*J zR&7OVEh^TO#)^xZ6uGxf3A^}uw^>X18I`4dlto zaNqygUqm)vJ@av=Mj2y6<>bjzH|~+xS#YQ7aJp5?irR^HUreViOp|8Zj9gmQW4v$Oi!;lO*gd0*(q?+tEZ9?~sjnsS>cy+*TyIVGS~Znf zMfEu#@ltk6Y zualmB;QU#+*GSLB;^^mP8BGhDnD`Bvn79$4$7a~X_{X4$@dqf`l+mMofn_okDUrk) zpeG5~LJdX(8HBT04f(;-pRk1%CQ%qk;sM8=(=tWhqk7Kke!u%sWU8v%ZDr(g1DYfl z1>4W6pKtk-xJ|9&Z^)0l=ZQ9ZxAEm(tj)c)JIDFCsu2%aOP60MItaY952@I>?T*db-K*=PRzG~2 zw(Q&Mc8jPZIn^UyFXRZmt@{7@ z%JY^YvN>j7+FIA&6+P%aahF)+>&urW-ApekD7g7y9&^Y-o6e82UuXT+JI-IZ-<8Qz N&gf@<_vCOn69A*foZtWe literal 0 HcmV?d00001 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 297f468088a8c648295e00d84651024fb8cc5635..6dce8e8e38478cd7f77e791de3132fe38f88bb7d 100644 GIT binary patch delta 15743 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 diff --git a/ext/bin/tap-windows/x86/zttap100.cat b/ext/bin/tap-windows/x86/zttap100.cat new file mode 100644 index 0000000000000000000000000000000000000000..9eff33eba39fa07b270c34b14dc169fac16c0659 GIT binary patch literal 1048 zcmXqLVi95E)N1o+`_9YA&a|M3h1H;mg^`Jo(U8HQiTN8Fr#2fS3uBWx7vq8^=H~`Y z%#RIt*tnpAJdBJi0#lbVCned;_Uh$)&iZ%x>KJieLlXl-BLgENV*_L3C<8tu7&5prSTeXV7&2HgI5Idh7%(_7STdM1 zI58M87%;dn7&16A7&4eKxH1@n)qzwvGMIy97#Iwj7#$6a5cV-K8mbs5$?-7wGXyg@ zGL$fsFcdMd2rx1*vhWx&STUF}=rI^DFfbU{py<&v(2?U{aAU}1$YDr@s+Xz)Yfoe- zU@&AbU@&0NV<={*WGDvdPD0YnWEf%)Bwg9U>tgE^RG z$Y99e!e9Uvb7nAMFlW#O8w&D{34C4(u0D}yUTEfW(HgFzegidTCe{TD6c))f$S~M|p+7?sLoq`>$PWx9455H}Oh|J)VDH`9*^!#)&LJAeVrm!j-|0!HvO;!IZ(A!I{C7!I{C0 z!HL0z!I{CB!3gXJPy~UZ#FD{;!HB_>!I;6E!HvO@!HmI$!2}#>W(<}L;K;Ewpj+f* zGUPF&fg&dnDVSIcgAD==bdW?ONer+9FCTsjKYD)eVO{QtnNGp=%dYTd8eorq7jPmq z1t(ch$Ux%Xl);igmx1K?Uyx&vWnchzI1dvei;{tY91AFALsO_w7(*sQF+&MMB0~g& j1%nyL^JXYIGz`?_xEMSb!Wle483v{gJ!La67%~6={kWez literal 0 HcmV?d00001 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;