From aca31c7055bb500cc3783a07ce7158d3ec4e07b7 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 7 Aug 2019 18:14:12 -0500 Subject: [PATCH] Put kext back in Mac distro and use on versions older than High Sierra (which lack the feth device) --- ext/bin/tap-mac/tap.kext/Contents/Info.plist | 36 + ext/bin/tap-mac/tap.kext/Contents/MacOS/tap | Bin 0 -> 50496 bytes .../Contents/_CodeSignature/CodeResources | 105 ++ ext/installfiles/mac/ZeroTier One.pkgproj | 1525 ++++++++++------- ext/installfiles/mac/postinst.sh | 9 +- osdep/BSDEthernetTap.hpp | 25 +- osdep/EthernetTap.cpp | 117 ++ osdep/EthernetTap.hpp | 72 + osdep/LinuxEthernetTap.cpp | 21 +- osdep/LinuxEthernetTap.hpp | 31 +- osdep/MacEthernetTap.cpp | 21 +- osdep/MacEthernetTap.hpp | 40 +- osdep/MacKextEthernetTap.cpp | 703 ++++++++ osdep/MacKextEthernetTap.hpp | 93 + osdep/NetBSDEthernetTap.hpp | 23 +- osdep/TestEthernetTap.hpp | 161 -- osdep/WindowsEthernetTap.hpp | 27 +- 17 files changed, 2094 insertions(+), 915 deletions(-) create mode 100644 ext/bin/tap-mac/tap.kext/Contents/Info.plist create mode 100755 ext/bin/tap-mac/tap.kext/Contents/MacOS/tap create mode 100644 ext/bin/tap-mac/tap.kext/Contents/_CodeSignature/CodeResources create mode 100644 osdep/EthernetTap.cpp create mode 100644 osdep/EthernetTap.hpp create mode 100644 osdep/MacKextEthernetTap.cpp create mode 100644 osdep/MacKextEthernetTap.hpp delete mode 100644 osdep/TestEthernetTap.hpp diff --git a/ext/bin/tap-mac/tap.kext/Contents/Info.plist b/ext/bin/tap-mac/tap.kext/Contents/Info.plist new file mode 100644 index 000000000..c20eefa58 --- /dev/null +++ b/ext/bin/tap-mac/tap.kext/Contents/Info.plist @@ -0,0 +1,36 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + tap + CFBundleIdentifier + com.zerotier.tap + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + tap + CFBundlePackageType + KEXT + CFBundleShortVersionString + 20150118 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + OSBundleLibraries + + com.apple.kpi.mach + 8.0 + com.apple.kpi.bsd + 8.0 + com.apple.kpi.libkern + 8.0 + com.apple.kpi.unsupported + 8.0 + + + + diff --git a/ext/bin/tap-mac/tap.kext/Contents/MacOS/tap b/ext/bin/tap-mac/tap.kext/Contents/MacOS/tap new file mode 100755 index 0000000000000000000000000000000000000000..48bf9625551ea8af1d97fe3a0868e499ab55a48c GIT binary patch literal 50496 zcmX^A>+L^w1_nlE1_lOh1_lNW1_p)*W(I~<1_+R3U|@K`z`zh6AL1Gj0ue(Y6Hs^z z3{XBh0|Nsq0|NsSR60JsB(t!6kewAp3=Dr57#L1;FfeF{L(+Hv zL<@s10|OWrGB7aAV_;y2gNoy$ESeY?E`byjFff3Usx$)w1IV84rE|D8FE^3c|8>hm zpXbG1S_}-ZBmz>+APePxn9slvpb8cmB}PMFGz3ONU^E0qLtr!nMnhm&gg~fA=Tnd7 zHwGS^wI4h>OJ8_2)_wqajK9U6fq}uJyY>U9H^Jc1>H5H91?%Q-0reIir((bghG(9x`JHX=uj{re-vb_< z2YtF-4>$BxI1LQY-4}rFKA%okkVBwuj0and2&fYtjkPBrZiFN&*Aoyo z9snyuxY4KE^@2xd?E#284|sI??f|>fcZVY+ZDDt3K}@fkSOe~z0+BH#-sDNOSkJ8P|&$_9`xvTJwPDj_~l&~ zVCh)_6kZ_rz_XVf*fxYiK&c#>z2v}Bu^6hI+>W*?dP8I++sx{>lT z9vfl)6Y%J){o&DA`vVfm24El5{s3opk51PQhzJ1n%RRbXKY-%D^Z5UXAU}h%q(}1+ zf!M>)_!HOxDjvXwc9wpCNTGx$s(feY3y)6U2OiBw6d)-UJ-sTx)pwSD@#qYF(dqjH zp&B#)A?ydK2fHi{Za*mT|M2Lp{o!%k9o+5qI1cL0G8}gYd5*!O`3MInHjvXJBz(GS zf4tcJ|NnnX{~+W+gF2Yl<*;9tXt&gU4|P zuqe0|Ub` z*Z&MJK?56x2Re_zi+PXk(gz-mpmff_-zoxe>I;u<-v=I@jvOAHj4wfbY>#eGIvLf<_8DJp_)q{%7oR{jb8vzwH1d_9j5n3n+X(fc*mx zp9lP{ydX=DyMhztOHjCh3}JbGCZeHa)#SV3V83sjFzc8|^<9;_B1cYrI{<1eChLDj13 z2M<=zu!%?K@fV(OkqEH5<1ftNA_9yI3?MaI|Nj3EiCTvYP~;wSC}23|P{` z1kv)FNAnv6k6uSuU<1?7wXqGev7NQD*VVCSRNM`@iOKuXg(UEhI{DgXA;cisLR9-XxhI=^?G zdjT50H9YCKV*?`tgHJE7s2j+<&<8%pbPtDWcNtdZ*Jxg<}JF zn3ut)+xLNIr(=a@V7RqoB)Cg|bb<ur(?Kdm}978NU%ra8*t^*+p6&Y|9_ue)_Ffc6mR-B5GDHHD~OV<{Qm#H zN3X09Sk83z50IcO3z$;f3s$MC_VxdNNOPz3fJbNOj!xe#9^IiQj<;(3|NkG9B|JK> zc{Cn_r2VZR%RIV^1Ux#o8vOtNzuSwWv)2O5km&5S0W)MedmTVd>Rjsqrj`bPsl5?k zYHI?h@a&wM0p`su0Q0VSbZ)Hx3xqcKbozGqbh=LPIPN+Flr25FOLus5mM-Y_-O}m1 z0^%4@z6LdWI;RT!|NkExdY!E@|NsAQ+zTQ>+W1=>kRn&y1r)ihAk`k-;P`dv25W#O z4UcZHNgl_YKt?khbG^>+atSE6cSH45WO#I!9>8H!7?Mp7oQbokyD9^08Wx*7TY3Kf z|Nl~jfq`M4Lk9!HuK)j$%&dUuJLYr?x&tFXJ&GU!P+isKQPl8}@!LU0{#MZZ$xF~cGDsXveRq(8 zN8`aFkb63hdvu=rf9d5uP%;74c92}ZX=&aoVs|P%KL2c~X9Uk5F8J(_Mz_ElB4y{i>4gkf}@50IfNJUY*V4e;pp-Qm$)nc>mtx&SP&3sm`aUi0V`1x?9#bl0x%==NRU z*m(dNj$nC@Uf%=Y3clOUqwyd}hezkRPS-hL6Zp4_C?nLD$e;^LGu#+d>S%#F zsNi(b>3XHH_6j7=f~Ig_=A5x-VCW9L0y8QKlv=x8Pe2+mpa$IyP{R_`1I92$3aNlw zWe+NhLSJ8y)xPE(LeKU!?p4H|P$0b0}csZvl07j=TN=WrpLfS3oJ?C8V@*JpgX5 z9{(Tc(CK;s-q9BVjW4)@I_@y#nh>8KIOb3Q^7aFWgS%@Fbhd+%;c-{cq#6TMwMTF5 zjTb`y{{M%JzhFr(B>QIysJYec3iS_Y5)jlw1~pS*9`FDOc(6j+XvbeDe})7AyoBm@ zJ%HMFMRoH_J_ZJchKA2Dts=(fpxH9^0$EM3y?f0?}3AufBT8X zhoA^+{0UB-t)W}Uu}I->JnckP_cb1w`T85lZU_rO(km+tZC1`Py2Iy1=m z1yp1p)Il>2#Ft&*th9&O^-8Df6}TD?P&B~CD-BO}obs>*MQ=ywZ2mq_LWD=r)B_!^ zv%6epuVCbF_4)t*|2~js3{OJ5Q<2dfdIg+JVCp+vr|`Fck}%vRcq#`w2NX3gDt^I| zG`Oz9R^EWhXGnXe+uoy_{eOT2q;(BT{}}QDsPa7UCcbs)5B_G*phLIopH9~=FWJE1 z@uSoAOSkJ6kLDvh;0gk@ylZ>|8sH?9#b!XV*bI-((g~m}R`?T~<0qixtqB-;YXXsZ z3sOu5GBYq3LPFi6H}nK7utB4D44tk${H>tDXjpCW&Jteh9C!T#8rFiABrmx@#y|!y zpk{Q}LKvL~JAL;YcijStevfWfgzG%IODA}A*JX6Nc7Sc=-*%!qw1e?fXXpkDmI8?L63Bx~KE}iv&=KT-(xl>_ynW|NlEd4K8Q~ z0Cg8olJ=U$+BF~-@wXTvRb$$gpxST^v^MmBd7(RWO=svIm{;YQKyKL4?Yl=4LJi4L6$6&(Dpgs%O{a_K8*Fd4!?YhO;b#7wUYrknjo!3kH%Wi)B!_hYsvrr|M^?>k$mD}0goxTH_)Oi99%qs zTBfBC^9)ad20B2+9Z0bDKxZqcBL;CKq9p0`-SZMs`PQC*#AgAd^8vC4)E_(7*_s3E zfPusyk+~Pr#rqC54$6fD3MjkRo&fdF!LslopmqYNk=h-)rL#2#W}@LGkM7zDKHcoT z-439V?nGxRs1ND*{{qym2|nF!86KT`AstLeQO3XRgGV=51Z;uf$<9+CQ$VJJTn85H zbVZ~IJ*1FyH^&UgZr?SXzVHMAD$n4h5I9$XOQBC+A*E2`5m06aPthR8mlHt!eNf#B znjq=)y#pTp?+*O{>dH1Bv+(EzO*Mq>cu@=LhO9Z3G5M|bE356x2^ouLc(TR{Vg;93IIpzr2rJ;^`iP{SieP*0>Ipb+lj zBcKxZr3<8{d;sgWK&xTU@}%Rg5G9J>dK20Xf(Svqj-(3Y@)zH~K)l|3BmrFdVYZLK zT?Ww5Fru;d!=v+*NAn?&-*13|q0{%oi@GoHRz|;LrF;i_&ZE2bM`JyxMasZGn%7XJM^GX!Gg-Mip=XcNGBY zM1aapum#6m|9}QWI$ig?bOM_U?d7S0dRX8Jo4-{XDKF%kFu-~p$YzK!fEp4zUjBoJ zJ$&ABIV4%V0QDr{TEGQOCupFc7TV74t-S$h-9lQI$6mC40@rm1pfLy<3GY1qV*QK% z|3R^+0X7w;8P?1=?)nEb1qF?>PS-84C!yLf?a|B{|7p;j6PVJnZK#3F_L6H6cC`q979~<9*W@$iK9yEmonvv`d{m@tkIt!}(y?bZ{cTRV0h`r%)kIO6Fex;3L25)Z_#FkHY}lXCSZLoAp2T&gY=0Z z^x0+_9`0-f4e0T=90xT>K_d>JQpTgx6*SWd8ggPlO}Y0$ZTRk5NJp^4^*aAH-|LM( zLFo)KxeYCjUTz1e>vf%Q+_eXkcRWDzuHZR=?$91kBM20iAn!Bqw}M9vdOCoT;9=Vy|(&c;IrNeh2l->xX4|;S%22f#xI=_|<}+_baE}laq%ZBk`QP<{N2hCpM`JCh&x?pbPzHY~ z3sKPko1%eKt(^xuduu?sr`r`Kle`x!!1%)h(t_~l2Kx-sYz0rT_lmAEU|`sxzzhnV zy`WZxb}Lv<@&}LZUQlRtcY<614Xn;q(6I7La2LH-v>umMxN4pM@C^A9v|bvLGFw5T z%N~t;K@`Z#@bn4x9eC&m;!sfG>CxQ_QrBH504pd#S~|hw-!GwcBS-{V#QaGExBCBh zG#&xvbZ})4s!-tb*P!u$2cW@4Se@4$`U6y%!^gfZfE)Xuaj(!5FWTRNM(Dvc6KM6p z36IVu(12C9@0ZRl&;ZzR*E^s}`$hlT|Njj^GkFde^QAjLE&^Ey8g7I1UEuSt;Q1i< z)XxvtNUMJYsDuLb90NfkvmcH*6fwf&d_Q<}S4Mbr*Bih`VQWFtL>{0fqw5P$>kBj` z2N`q$DJ}#L@rHrARiHT_l={)5`3cbYITcqIFN@i@)`?zVKhegTaQFo1ev7ykeMe~fjS z4FdxsBoLtHf$Lke!njBS+#2Yta_~6r1S%>RzOlxDb#{iHfK1ea+L$jgLCGCbW1aAT zj*}jH;mpLqupczv>CtQY+z7IXfC1FH>~ynetOMo0|EP0I2f&k*p%0+R7Br~@t-4-b z0(W!XbRP6L_>j5tMCb7rU&TRL#rK3qr=x*KVLh4(|GZiAHdix&V#J3y}KG^#Us>j5}Q~Kq`SA zZyc6)9{(Q{0dXsmtH7E(I$bxwr`k4nKt0Oway}@nxc-L?^1bvybHL4i|Np}Zb{8E` zsm)skrdZ95K(P~g!YA3u!mCr{0BF1v5v`2SXazSxK!$c9rr<$M1yF+!PyVR=0UCUJ z(aeKy{1}u!P{*4W<5dqTk6wU_hwj=R$6UWNdUXEuXgmlR^sfaMMxEzg!;?eDU!P-%Szd0Km zq)$N0e?l*KbQghA(K$#e0#yv%uE!B zbii=x0Tsp$*YD8e@dTP&p1f@R|Ns9t*YAw{Evvx&7Erm&0GgSBxup;6mIv6}0_s?F zyCO>=xg`Qq2I3URC_Quv7rZ{J^Z5Tj4pimGS-}25!VhIxHHEq@dr8(CN-4&2^7`C8%!QToRse?6U9%@3AcytFiK$D|KFKZX5 z!O`t|!6P})!s9p#IQJiS1RD;X9D&Dmq5uQKP6sD`hR#!+u6I1TYcF^-9tWq8?$QfB z-EJJd-3}TajmJPj;QqJk1z2%-{Dq1D1B12e9sbr8Adextsv4WCYF~7@en0Md15~Yb zxE_C@`WG~Zc^uYl!mQssdRYy%v8|_Q1ho%9i#}>U@V7u$$b0~od;uDelCSfVN9Xy@ zYcCE8f$}hG7RVUTTmvlmpNB7@;FpKZUxC(79MnRx4<)mK)~O)ueF3-k1y*}KA@+U( z83$SzgJv(Ny2R)og7P=0p8Nr-qW_D!f%W29FQEV#pX?0%;?e2*qPzCb3(#nQM=x)W zE(3#4@&PYc=?z}vvjfx)?{t0g64coPDK-PAG2VDkosxXPqub_Ucj=$*&>!8tUwpb< zU%UXxce*|SWo^ikG4%3_rL*==ckQ2p?;)a0il9q5c7- zPo(g3`vdB5nC63uW`f}-30BPO1XfIW_;oSk3BO(rklU#kejT9Vp}X`23E_7V>;}~E zGw7`S0}4NAdhqFVy#Y#E|9*kOQB++6)Fb)e(P;At+_-@hvY_PA>3ZcQXvP7g_##*_ z?=N+bV&rfHtygjBc75X0?R(<|sOs!=z0&P^1-jB7)Lg`<9|AyaIauGa)AxZ(r|TV` zPEZNx`=c9_P<;=)P-FrH^qJ$XCqORo==MDTZ}FXfp~4Od=rbTuP)n^Bw2if~_6*qh zJ>cc&$*y2o)PxG&P=G80PpA{10qxOU`=HzR4ycHME~o)D_B}weJe`Mpx_vi*7p8-z z5)OF4n;v0c*PMV4uVVNYlzuxw%SS*%=8y`m2{b*{%ez_)5}b`Tpv6lJC}qHtm!P#U zps){xD6WGlhF5SN-M$~dH5_Qg333UGGM)!ouK=&VKou;c0)qwhg%{gERUT-U#tmpt zUqA}#ovfgsz5~kj;GhOgjl-)i@a_cUN(x>kfR`sB%fN#gv?LBRYz$ha30@uynmmB+ zQwTla0Sad5J_WQ&>^;~eutFAjd;nU1H$MOW|35<~wDRVcM_a#$*?$MOe!=~B)b&+} z_6u~r6>UBhLmo76Ab@Bu2zWHwUIj%S0|Ntpt0yRJ_1dP$gXioaV!&-}v_+hd1wE+sd82J4%*+;Xklo$3K02^2{&7|tsATM6 zr1ic?<15gW%b;!79=)uq6yVKB(E8p^c8^BeU!aB;*lXa96{v|1Sqg6ZL>p!gD2736 zx*O|2l?wx8IRk8Fc7hz-caU)o?z$nXJVH+Ucs5;>UjVU+5Jtlxy?M`#iO%`ft| zfWqDI+fGm%KvzX_fEqhs=fGD(qOZpX?Pmk8)B{y;pw^B@V-+-fLvQf6fD*h%Zz(7e zAY0Pl7Jw#l>cJNHbh|=kcR=exz?;-?mLE{}!dG@c_soIA8I(Hlg;yuIO9Wa4B?xZU zvCfi(Cren81ov8BD1zj>T|XRm08N519CrW}53n_S$oU06J_$kXqpdY z>;yV0`ob7gPW0A(0EKyXfJEaVPy}=aNOT9tz}PY`K$|-t8zQjU4~|dh_>VAXupAyD z*zzk%m-K}(UiAtdy#(A}4DvU!`~Uw3?d5>DAHtS-Q3p~4ZYLwVAKVxL1x#Z-IEeW{ zV>FO0Cmi6}QndJltM7IP75gAH*!&0W|NekB6T0g`%l|)s$IV?o!29e(q!&mt16@DJ zYDnRqhUPx_csV#eK&=kYqE%3K@aQh%@aQg60PPO}3c7l1QKzXkdTFQg!;}?36 zf#3%oovhBv3=AHPwiZy|@V9`Px%)tqryjkc%pj|~S>-`$I*-3de+ID>Y#Y>OP@CW- zc*v%k^}7-S17w{PXo4ADt%CO|gU47sj7`r1U8%S0PZ62j&7KX zY@z19*zxuM{};^vz|I1B3*szr27;9j;P?Zl9?()kNYvuU5Aga9v>wN!m(@!Go{hoj z9@MH603{yO_DL@*BPh_pbLrs11Dsjep+mYaSU?>ja6W{k6bOx+zCi8+?Z*SP_BxNh za6Iw<|4vYNfabAT4e|GmIo-x{QKUP$ZwxC`7Z zyXMo&dJweyzO(j2TBq;3H1NL7+7JBOL*I0UbNF<+3mkWs01X@-cb5Up#CvxB@N7H) zPJ5lT4?shRAXh*Q^XL_Q#t#}OuYKUrcpRh%)N%pM!@KZrcYOmNIOhdh3EB zc^$L`t<&|+|BIk$D^PC&+^qnuBS7m>U`v1S_y&b%w>`Mv1#d0?@IOES5MJ;h5_Ukz=kmg^s!2V>{-0pW&G6T?R}&|8U{o=VJT7vGD-IWb*FXe8?tu%IuILV3(doJbECmzw z==R;<)9nb_dNaeP^LVH06tFaSnIZo+(B$R}umJ95uoL)OEWsrkc*)}ik8bFaNANgGYBgXeZf;PVgcKuu0&e zg})V4@_Ima4{d->#djV9x44hHf>(wb9_TpOSi1*wh*?K(HE6L;FQ{?r0a}^gxC55o z_@^9%$ab}Y)PUj(9L}Ipd`H8y84RE{hVKTC#)FUv{8CVSfoA(b(>owTJUYRvG(g)i zx_d$EHU3}hcHIM=yxQ}!4Aczltv&Ff4z&0PlovoD0rm*Ei;eCa$WAX%=s=gEfJ(&1 zBcMc%t$he@kAvG^(Dv|QZqnvMALCUIX`gl1{(!DA0PRLI6P(OWAxU(X-tg$I zLrrCnndffT3;!>GjCr94TG8$L0-DfXyaX*r1BVKvF^rg>1Fxq=ThH-9*CJB~vVFC5 z3wX}|7$|vyl3lm!7F~->jRT#oYxrA0%X7hof<$dV%idg9@VAD5*0q7uf(Is`)g~yi zU2pJj^I&ZJ3ED#h8H53OihmnN<4;hT2Vc$xYT3QiXG9c*u-$$jk2f9zm0RF2L@xb6 zm47#AC&izaUqLYgZoYQc?sx&>LG#MX+o0wc$ZOyP`M{$y^aOl&3}}A*~V67R~FhiUhR1@wn>&kW%QP z<>Rg=Kps5qdIl8UpiB(fq!PNL+erd6WbecQn%QnV2nmm>43AFV4d6&|+yPpk2cG@| z)t`{!+oKn>B>}!?a|Kvsr|S|Auyc{>Yta5Fa3iVo1!#S@2k876&P|@dz~C09z~TVGF8E`9X_HK%2rqf%DQIT*bLw03~JQEmP2=Q>pTRO>~vl7QWTU}L8qdk$t-vYG8NuRC_M$L zr9qov!8#qm5}@Gktv%(@U3vkwzZGI%3&d2=kY;!73ncqyfb%i5ZfvaG11Z1r!7DxX zfV0a6MEUKEEX=>X;}wMS^SRDObajkQN{!y+AeufL79lzVPT4 z^5_Jm`{O>H*IYVJ!Bc6c>z>A1a65p%1yXeE0cE*dNG3i2nn&{J1TFZ7pVqMpR781n zf{qUYwPi{n>v0jm-R-*p6bax)Oye=AVn{*<%~zzkbaQ%i`<_U1>Gb4*212Ln5{NfJ zYyDyUOVE5NXfG!y`Gd|6>JI$?+a1^$dZOF)3TSOeGpI}0UHS%8;vMwJJPB^OF#Cc= z6;F6{o_YbQO*&m~z>lbc)<7pfOSZZ@K?_$vMF;3ypYGBdouz*|U5~s(ijgbOYU9ew z9!QLUG91LI80$%p-3uBWJ??r3R4alywTOjAA>*c z`UhP6gH~;V>yK^+jA`_@3{s_pr9ql;2A_$s2*s-w03<18~273wmp!77gVCZ1a$>pf`YfP7VIznR#4P} z!rk=_IQ@c&ZdXK*ftI4f6+;{Mpw;y+O+kqZG7WX&Sj$0hTPUqN^cHAkMOx>SgCIA8 zq9xh&PUn_`pezGTC-9I5jnJX@$0a~rQt0@_aaZsuSfCRK8f!m5LJ71yx7+mtIFw$% zef$LyBXEghkhU4*@U(8%56}eg;pLY9(1o%RINFzp@qq5q7yR4Y7;PcdyBo;2pv3^- z6)K>EKztwYZwqAgNIu2CFNA}m@e!zcY5WCBTJV}5#CZu_Bn*lw^hLtZu|ZIz!2AC@ zDnPq24}yXLwlWh`e0REjcyaRscrOI#5D}c?lc4@2Vmu8rZr!{Sc1{wu@CKN)ijK6q55xb5a!Y@=FwQ6SGql^ixvH z^g#-^u&7AP$;nSnEJ;hPF*yTC1E%8CqN4mF zg_Kl~!pyvMylOM^lS^_Gic*tHi;6Sz^FX>%lS@)lbQBVk@{39`^V0PYu1HJF%t=jA zD9KkyE=mPCyEs2NJGBJWsSq&*h{38U3J^`mYOn-EdTNP6Zc=F)l4Xc+OwKQ;Q~({| zt&mofpQ}(>oLW>|keHl`Y$kHJXXX`@mM9b?g4_o3e7-_nYDsy1QMN*HNn&y~k{wVr zCHV?TsS5d}B_MqniNy+e`C!*5WTYmhq!uA*fOrNJ0tJah#mMoNn37VIT3n2z)-AIF z6#7sJg|x)n%$!Pi{BkjH<`<;qDQFaArYNYEYH~4fCg1Z*s1_sprYJQ%v$!O+ zNFg~Ru_!Sa#7apm%S=vHC@#+|NzTxNXaG4mH8;PgQW3;g$WATFOU+S8ttd&&14nFG zDkOqcixq5g6H7`m6N~loGK-6IQi~kYb1U>xQth}Hj0_A-4Gaw}AWpz;pF(Lm)Lc{%xspyX4ckdvBNT%wSlha60q#R^HK#g*`2Qpm|q z&MwB1BH&pAqyQ9-=|%aa1&FkWNFH#Nxuqqk6#7!Upc z?jbQSG=Q3vNa{8~`3<0YoPmMi0+bd2?R5m5Z4PSkBB_Tl13=TQFb)F)LjjaO0n{*I zU|^U4T9OJnW?v4XNCC9_h=GBj0o2$8(V$)xhz1=)1yT=MwFWW=bS@5v2JKCSXvIrD zfT;rwKHyPl09wk)z`(EpO5;%qmf8SXhQh$Wpa43{lYxOD07_4Q(ifn#0;qKj@&}X# zYsN;nLj(h$^ajw1A_fMA4^Y|wR0D(j4W$o2X^1XNvH@z&0w|5Cf;5o}pd(R0T0jeP zK;Z=1Z~&r-OdlIS3;sdr1$qcSEPXUU#i^A(E`T<^g2D+J?+KtIL_pyW>Slq`8|dIp zPO0Ol`3=>zKT1SmZLrVnBa!vko#NdRq{WME)8UQnpzYeAyE#CbK&zrb zVxxF81V%$(Gz3ONU^E0qLtr!nMnhmU1V%%EW+Ct)0lXfM4K%sH$iTpM0LtG1r8hw7 z6;OHsl%4^lCqU^ADBS?1E1+}%lum%s9#Gl=N?Sl_11PNlr6r)W0F;(Ugt$`xN*6%s z3@Dudr6Ztp0F?HC(hgAi0F>SVr8hw76;OHsl%4^lCqU^JQ2GIs7D$G;hXYD8Kr5&LDvVhVCP3%D)elPXJBwFfcH@g7OtWGcODb44?%F zAoUJVKIj-y5WfJ*S7U_uX9ARO2jzbNEf8d2U;s@ngVZko9W=(kz>o!%zX0XeLir5P zahpCUA2u#DAIgV~?|=?^2b%{~54z$2#J>RLgAPam@fkpCoER7wK0);>K>1uu5ce`b z`{ueZKD3YS59LpQ@>8Mw4N!hHl>Y(Bp91A?09}&Ez`(E`%6|amAA<5><4L!mdLiq=ve19na0hFH(;xjWaT!7xCSqkE_Fff49C#Z03 zgYsKI>wp*-7#4!~YzzzwKnaV1fnhC_zXHnN2IX&n^7k<_Fz_=nFf>5J^CFb*0Oh}c z@-IO7KcM^#P(C{gL_cgiNf*lB03BZofbtWd<5rze{sidw)mkWD0JO-6fq~%}j1L{3 z5@Us!F902PbAa+UfF@QM7#Ol)eCRmbbSNJ-ZgvpLhmET}g7RVGc8qKg^BX`JlYxQ3 z3d)}Vb$<|)Zvf?ILHV$8vZ+u$Y<%nxl+OSiH+v1^gBG)Z#t+#c_QA%>Y@z%HXnxIt z@(rv&vCF_P70Q1A9hW-{qY&= zet?02AqvVDfSOkWL5Nd1A_wS zoDfiX2IGSc*8r6VP(A~+K1qe~L5p-47#M1y{069eHpyu~O`Jj8cK_%=$C_e$}o*jbV z_8w^IJV=`102==k8viaD|2-Q2I~xBV8ed2V)jrU{OpFW+aQjuzfM?cC;{ z#-EMG--yQFkH)`&#(#sx|B1$D7efsX2{gU}8eapAZ-BIcWTHG=4i8 ze-avh4jO+28h;BK{~#LwBpUw`8viL8{|6eMOB^-)MA7(iXnchP28JaJ4157lIs!^( zK6X@x|H{tr<42b5+=f{1fKX#pr*k<7rbmVtq<0ZPw+(kr0!1}MEC znSo&)0|VbX4+e&L3=F!*JQx_}Gcf2TdoVC8U|`Ullqky4`@T^Ms3idS_WOvIT#xm7<4&w7#KD&FzCJ%XJFXOz@Qr}!N9PE zfkD?^l7V3>1A}f#00YA|1_oW<5C(?r3=FzG@(c_+7#MVCC_v~JN)YHoF)-|5V9;Ic2cZ{*GBE6AV9+%ShtO@x z3=I1i7<4z;Kj-L6@BuLbpL_ZaxTqJ(Tw3hwv{! zX=ecle?64mqsqW=jDbOSvmyh-aRvt6nNkc4CqVIJ&%kgJ6n+j245t_vbhkP%Fq{Ut z#}Pbcq|4?6p{t!37|t><=yEwTFq~sx(9L&dU^vgfpu5|Nf#CuJgRX-Z1H(lI23>Ut z2t5%>7fM3-=VTzXq%4F^fzmF@5Wcz!gnkF5Ez}@<7flGQrURjyq4ZP(2>%I`&M|`U zf15z)iKY;m!2v?wgVKuwApE2V2+g3zz;KCyL04Rnf#EU(gYG9~2;Ha(p>zEp^zSeT zt*FVsa0Qg#6d4$nrkf#DV?{i{G|=1>TotIWV~n}I>s zS`|Wr+BtU^7<3yn85ltH1XTuxy9^Avm3|O9OO=7)9w>kNLFh1528R0#47#3v5c*^o z1H%JQd7{d|@DP;V{UCHkCUNbQ0{_tU7c*DS;tE$1k@Ror=S6hUE;T;2m?sGW?hW88%x?WlkdZ!cv!v|3L zqXVHg=tAgwP};-?!mp5JVED+uplc<|!0?HILHDx^1H)$q23;Rr28J&T47wH};4xBN zuRsQdZww5&T7e7<-x(NmkB2ZY{9s_v{jb2l@RNZ-w?Gj>Z&HTP7oc>n3WTqw$iVQ6 zfkBs11wvnyV_^6VGG7ZqFL#E}3Jme_QRbj^%PFa4Sy>>SpJifcNq#(N6{fSHYk+x4 z37Cy0or&zOXd4G}SaUx1gjF zq7vB^MmSwTgab`;6SMM*z&c=D@iPf&&^LM%}I?fE=epZ39!u0%}DT&Z3YcwNl9&!+80V%JfoMac+|=Co;*8Rgl>G8MNF14f zgg|;S6LT`FQUkn`K`JdkqG?5`sR3o+++YdfgO^f+xv24GXa-sE9}f>yXlg_YQbPlT zJ+37sAbb4Kl^A8F#V4ku#DiC3yJiJ=8=7UN<)xOyr=;eVR>Y^I7AHepfEta4AdM-h zIWUb_4L1gvoS&BpQxt^7bgUXpGSlLdGg6bY<8w=MN-|voye&W*89-sYR{Gyr9Q zcDktN`!781+oxdNAJNE{<)3oI)0 z@=G$)D&vz1(%=P75+o)t6{BVl)ck=(HMk@L?Nv)nfh7b?RiG3JDv;wLe#^*(m1USp z2^QtpwG^k8fV>x9l33uH72uW`U>+Y2u9#qj9yD!X>NbOI(TWFc(Mm}zbA{G?m`cr) zb5axYN((THcTBYwaAVN+XGk>8yO%e zMp%YRxk+Y9PAbl*!cyO0_zjYepcxKtiiW5J=QzA66jVz=Ht@mICywNasD3b8U00C7Gaom+^U}xk;%opTks`q*i2>py@*H ziNMsErh@jvqA4^j&Ph!zaD`@kxKfyCB{*PU!kE1>kn_#T6SGrGG0cDm9ZWYojerC| zohy`<0VH1_q(EKbX`EJ{k^!Fv>uy$lyb^&X}$#D8#cR1YGAQGEy( zhkFqr0!tHc5qR=Ph`>@kLIkQSBn+k31Pc3*FtnyVR1mGIgNkBgBZxRC>_9OE;lZtC zh==z)8RB6zBvL;DSrDlik1P!DI-m;XmR6t&Kx!gnF-YqdSp-}OAq(W?=NBM)H5f8j z?FQ=scX}|?LrOAaVN4OE`iddmKiI7(H5Ekrg8Og?R(wceIu;>N&kq#FpgIIZ=auI& z#K*@cS0u(4loqANmt_`}lqTjdfU3kq@RoCi_@t`TqI?E$bGEn~OqUg>~X8`w^;}cV|pe)e&0#GJ2?7$bw)PmH! z6etfAlgY)Ux$y<5MQQm(xv5AJV6VkPG6mRK#i=C-(~DC}KrTa=1L8s4nVOrNTfh*X zo0^+kPzk1s!9E6uIYWG2VqSi6YI1&FN^yKietcq5aehu|Noq+ZD3OAC@$m(jDGc$T z!XUmVF)t-Qmm$75HK!;wIlm|c%!HH_;N}vT52?o(;*0YNiZb&`(iq}F?Ow>>0F(_a zg~8$=0_33L5=gEpE-A_byA)zBC{;ku+F*bdO7R8xIho0opkRj!6{V)77NzDTr!vHs zX6DBir51x+U7DE>Dc+!NVqo}nkLLgbgYq>71_sdiXP~t?pksuX7#J8UKnGSaFfeKS zy2k_JhcGaKR%wHjFn|uv0bQ>P(!<5TF#m%HBLj3L5m??eIX_nqRLGWOrWWaeHX&O? zxmbFII!Bp=G2}>0S^jtJY**E*{NJVK@-fDXHEKRtFMD#$7o+0E!F473mk7CEe!6-6 zdB^>0U*5hp(edrewYjY?ul~Lf-DoYg;Un9boo$D1dR*iYKloFTYyaKlWv8A`4c`0e zVB$%|{S$XS_PiA;`J%;5^>X|aVRzGHuhrqH;d-VUgqF`YK7Vr8h1jyQI%fO4=5QW9 z@i{d8(SzGt%@4h~An`)!!M11Tp1m=0K54iu%ypH|vL*Hh;!M;hy86tGV07!WW80y##tz2{YLH8e6XGB7kUGBh$YjS}ZI zGDqSXR2u3UXoGd~sJNt-rRL-pq!uZ7x+vhX2<9Lj0uF-th6mX<$o@5GVpKv75k^)9 z<|amd27@L>E~X|%MuyHZf41mZj_;N#Ycnm5zg}#Az;r`*3zt2cO8xSw_OJcSZ zcj1KH(_D$o@-I5w_h0Aac=A7NhNkHADRXz4F6KJB<-o&7313dV(X4RI%uL9R@0#>y zp7JxRLrR+s{bhE2+GY~z^lrmSCT59=EZa6$=o!m5xbnK@@8*k&uD5!AgX20kpHc4b zHnS%=tB(kF6||_Wn(uP)K$I~Tf>nu zHTtB~oTm+^ts)-|Q168ST8X-}+#HWtL0HqBqg<1y5Jq_0Ew|F4T>`cy#i@6=s!_AgIGgeQ+iz41GSD(Nj{Yqo9O?SFrT^xPAY)4jOE()AD7ZQFdL+3G`i zZpjfn<-m8dmNMrjd|B$TobAx=s7LbhZmxAtrhioz*sh>dlwWk~SU~AfTh;#9#SAa! zoAr2D_HVX+HK9Ro>a2t>73aS2aRu8g`sIH^Ze7dNUZXu>zMU^CBp$4p<+Q8HO}b@K z=Q)uV9Ty|IzpV>9qQk1?x}N){_ev&ylQkX36GJ;)PO2BPziWEx_qD*FiDkDz6Z2w7 zIl#z-97e44D*z143`~qnjSNi;jLo9Nd5ujCj0`NHT)GrOgmU_mi7PqfC*GEG4|vV` zHmtFcyA|(tzKL>$vrsq;Cg+>%|CuWE;##av5#w=yiaz( zG{?>(B}v=@&5rHHU5y(JBHl!?81-aq?w7rnTKqpfE_ILRjk5X1BB=|@r<~M<JiFwJX3i){o zB^jB;3d!(VD^($>QXw&~QlTKRsH9RMvADQ2H?>$HF*!N4pah~PO`#+s6@>E?Kz3v% zCnn{jg3bWTOGzwBQ7B0*$}Lt%%u7)KwOcbm^MKELZj^-~{nE8afeDlWd_PMwnJDb=et z`LAVPS)`&Y_VOl zAhWr6M6sHH()1(P6x!Locg9KytFIMHce^`VJU=CE5xL_@#`z6Dx;xiI2Y>nZX12zO z&YVr<-<5bLyu28YzH7o3HMgKYq1|i#v0Z+w{`a0DLz>2R#|z>+)86cRa``yZf6w;q zk*(((t~2&YUJ>R`m|2kZl6z8G%_RO`FIrjG%DC$uelMD&d}YFy??!p0W^aGJuX`SB z^8Sg`R;?3!y~j^hyWN`XIN{Q)%iq{~d6>7Sx8LOLN||!#Oi7BHcJJF*6|cg?J1rk4 zR&TtrRJL(}R$9;3@HPJyRylRet*QJQ|GQX6_L9Yibskc`BCp*#{MNZW<=x>VH$kbc z>nyn$>-+PzA7S$1dZI4!OeXxwLpJuq&;pW)&7g^i$-n_t-Y_z3ut7{K@jjBP5Q z!pcftKR>y+0I9G7aScp#K_~E~7#Jcor@S`JWfg9FA1C4zRUmjS)lqe$c9sDTsIdcX zPB9rUptPm1w!WGeK~W7ZPlXMd82JsF7`ai()4v9$FefrGifKZfh+3Q?6_JUsRy}&r z$}=>JR+P3QdxL=(D0o#tZAl&jE?B@YGaCpa+LVmEAZbvu5?N3PCddm7US38}M+#h6 zduP5*h@HMyhe4u?g>zz(V(7Ds)aPo^B~!8rN-yPIkbda3k?%`M&Bk($Z~ettL23?N ze;jUeU+Iyav*=8sLS?wWXvk#_mTQ5JCV8%lTfFsDbP&_U8!s8J&i$Wvp}e&-_|Io+ zQ^Dfm7hkvR-kBvUy-(=Dbg7AlKP}X;D^G3G+0E8{_JDZIQeAttoZ73B#`XM*oagb_ z&hPTPyWVO;z-yIN`@L?jFAKN+@w0fQ7)!{c8UNQ+NGI{N>3xZDx!A|@k9%71%|ELQ z8=f#0?d*v6Q!a0wy4gN-9qU}l--314TnGM~Ik@~q%iqfvpGKa|Wtv!FesQW%eB#oh zKmNt5diXtGddsj$=z~F%&>JR3MuW!I0qoZ?p;Qz|9pwd?1`_ai<7763_&rC9CObUx>bbh;#6Dt2i4h3fBrABY86Do9IlY+L$*Z8zh>CV>kEO#)}wxS>N3oB~XIhD`#y z4VnbD!-JQdX+e{~3WFwrB}|OW;5v#`n~#}Eij~2j8c8Q3%Yq!1EQ1UtMn*PPEoK&0 zHUmRYm?OnDi-IZ_%d@Lln*Nnev-L8QUU@5?e0`?u)*Ojx-%Yp7Xqn2y#F4n;eEbT5 z!V?nwpp*CD5pEP^z|6$R$i&I8i))c<{>M%87Bul*Flb_BGH7Cc1#OK~r~G>}a|_dP zkhM@Bfyx4d8bbqc=az+;M;%m=rz(VG=B5^xB<2>-VN3(mATc#GG%ztTGO{oN^|lO6 z4UG)Vpj-n-LsNN?sU<2U8E zj{Cph=gXj7-G6H*9azR1rn6}Cn$XE5FMl7ob>?~LiWNmI!T}0uKQ1nvdC#Dyt;1^h z27@5R)qh)`ad0l`InTwzQ(gOH`R?%J|9cMB>UWjiVoz}kcX@mNqV{aVa~p&|&-)>F z>vOSY!>((#i!@htp1;RDMMd)E`h%%I;+MTM31*yRci;G|kZa?Tc>#}S&l6}YlAjX8 zw0=gR@NCYvLQc{8Ni3@$iABHRN^_oYrNwmWAAYW!|9$(9Xr0eKnpB_rnP>Nr-@$@x zbrz@6&F8wyp80#^T_Ed*k05ahZ&>G9%BSCf5D54Ng*yz;*s+E!pZ zXwbyC7pbNX(J+Z9=-(|8?&$6#aBl-!#s0t@cxrl+v#Ne)@0qt+ER0b5@$-@9y-zZe z4VoCibs4DV#A?t4Drx^gvks)=^ua&_R-Z93ipgND=s|s&)a1lrQnwp}>T-D&9Rn=` zjRk58RN9oFo<5-+SGpTRsOoSrgwk2^N+WRga6so%We<; zD&_k5&04p7+i9!SYi+c%OzVxKWp2)CJ+oAO^^@ue%?2X#n(GfVTQUPhpZ=+hR%nQL@8Zr~I3>A% zF{`p{uK(ef3r~xFzrR!V@BQSimLm_%w`RO8-~P$4%yePX`!({84n___ulIPf=}i88 z=rU8sf{fZID|gY^Tn9p{UAR8JJ|M*Lf?-9LpJMi+V1`~Dn;(lE44PQj4VswVLrcM0 zpYY`QpFeCz3o5#d>VV2RBLfoyQ_ujji3wzA8NnUkl9dS5?u^7h=Z{l<1azfIML^N{oj zzKV|CgGxJgDGJX%^{#8)-RkK7i(g(`+*tST|Fa&?C)Qj)1(p>V@76iu6;;G#8BlUp zBd;>PZutt4^I@CAa+bdQaAe)jR|UL1s#f(pKlw_ zIb7s?&DJS!`mVLIeUmPgb{~$N^YwJkovbXYyRSoP--={^zGgT1L~d0`{3qu=feU3Z zvl)0~{Z84O{q^koA-kgOJMO(OStYt)T}=84o;9=OQa3;5H*hj}x$ZLK<>hysic4z( zom*!m2;5nxeknWsq_J!M$r*ABX4U%&PJWpA|BbinXTMWQeBsxX*qm8gr#YDW7V@(=Ls%+<-ESa%U z-gU$OJpLTT@3+!-Up?O%YV5}Jq_R9!C}R1nKg^+uYiHlMx~W7`Iql5h-8_QM?Xnj2 z!oG~h^ZAN*y6M$V-Tu|5bDEQXrQ6fr%e8F2|2XvU?u=lgv?bMzSDPK!CU&O?FK<}w zH*x+7??v@8kE$cy3EY@BeLZ(mU1?h3#gqKzFGQA^e`HKQ9mgpj_v_JZRZY&7+rqm& go_8s16t7?Zro7!>^K3|Q;ggMB;ME(W#DIkW0A}r=tpET3 literal 0 HcmV?d00001 diff --git a/ext/bin/tap-mac/tap.kext/Contents/_CodeSignature/CodeResources b/ext/bin/tap-mac/tap.kext/Contents/_CodeSignature/CodeResources new file mode 100644 index 000000000..0710b4008 --- /dev/null +++ b/ext/bin/tap-mac/tap.kext/Contents/_CodeSignature/CodeResources @@ -0,0 +1,105 @@ + + + + + files + + files2 + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/ext/installfiles/mac/ZeroTier One.pkgproj b/ext/installfiles/mac/ZeroTier One.pkgproj index afda65546..d962e96dd 100755 --- a/ext/installfiles/mac/ZeroTier One.pkgproj +++ b/ext/installfiles/mac/ZeroTier One.pkgproj @@ -2,670 +2,731 @@ + PACKAGES + + + MUST-CLOSE-APPLICATION-ITEMS + + MUST-CLOSE-APPLICATIONS + + PACKAGE_FILES + + DEFAULT_INSTALL_LOCATION + / + HIERARCHY + + CHILDREN + + + CHILDREN + + + CHILDREN + + GID + 80 + PATH + Utilities + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 80 + PATH + ../../../macui/build/Release/ZeroTier One.app + PATH_TYPE + 1 + PERMISSIONS + 493 + TYPE + 3 + UID + 0 + + + GID + 80 + PATH + Applications + PATH_TYPE + 0 + PERMISSIONS + 509 + TYPE + 1 + UID + 0 + + + CHILDREN + + + CHILDREN + + + CHILDREN + + + CHILDREN + + + CHILDREN + + GID + 0 + PATH + get-proxy-settings.sh + PATH_TYPE + 1 + PERMISSIONS + 493 + TYPE + 3 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + launch.sh + PATH_TYPE + 1 + PERMISSIONS + 493 + TYPE + 3 + UID + 0 + + + CHILDREN + + GID + 80 + PATH + ../../../MacEthernetTapAgent + PATH_TYPE + 1 + PERMISSIONS + 493 + TYPE + 3 + UID + 0 + + + BUNDLE_CAN_DOWNGRADE + + BUNDLE_POSTINSTALL_PATH + + PATH_TYPE + 0 + + BUNDLE_PREINSTALL_PATH + + PATH_TYPE + 0 + + CHILDREN + + GID + 0 + PATH + ../../bin/tap-mac/tap.kext + PATH_TYPE + 1 + PERMISSIONS + 493 + TYPE + 3 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + uninstall.sh + PATH_TYPE + 1 + PERMISSIONS + 493 + TYPE + 3 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + ../../../zerotier-one + PATH_TYPE + 1 + PERMISSIONS + 493 + TYPE + 3 + UID + 0 + + + GID + 80 + PATH + One + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 2 + UID + 0 + + + GID + 80 + PATH + ZeroTier + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 2 + UID + 0 + + + GID + 80 + PATH + Application Support + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Automator + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Documentation + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Filesystems + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Frameworks + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Input Methods + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Internet Plug-Ins + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + LaunchAgents + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + + CHILDREN + + GID + 0 + PATH + com.zerotier.one.plist + PATH_TYPE + 1 + PERMISSIONS + 420 + TYPE + 3 + UID + 0 + + + GID + 0 + PATH + LaunchDaemons + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + PreferencePanes + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Preferences + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 80 + PATH + Printers + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + PrivilegedHelperTools + PATH_TYPE + 0 + PERMISSIONS + 1005 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + QuickLook + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + QuickTime + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Screen Savers + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Scripts + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Services + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Widgets + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Extensions + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + GID + 0 + PATH + Library + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + + CHILDREN + + + CHILDREN + + GID + 0 + PATH + Extensions + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + GID + 0 + PATH + Library + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + GID + 0 + PATH + System + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + + CHILDREN + + GID + 0 + PATH + Shared + PATH_TYPE + 0 + PERMISSIONS + 1023 + TYPE + 1 + UID + 0 + + + GID + 80 + PATH + Users + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + GID + 0 + PATH + / + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + PAYLOAD_TYPE + 0 + PRESERVE_EXTENDED_ATTRIBUTES + + SHOW_INVISIBLE + + SPLIT_FORKS + + TREAT_MISSING_FILES_AS_WARNING + + VERSION + 5 + + PACKAGE_SCRIPTS + + POSTINSTALL_PATH + + PATH + postinst.sh + PATH_TYPE + 1 + + PREINSTALL_PATH + + PATH + preinst.sh + PATH_TYPE + 1 + + RESOURCES + + + PACKAGE_SETTINGS + + AUTHENTICATION + 1 + CONCLUSION_ACTION + 0 + FOLLOW_SYMBOLIC_LINKS + + IDENTIFIER + com.zerotier.pkg.ZeroTierOne + LOCATION + 0 + NAME + ZeroTier One + OVERWRITE_PERMISSIONS + + PAYLOAD_SIZE + -1 + REFERENCE_PATH + + RELOCATABLE + + USE_HFS+_COMPRESSION + + VERSION + 1.4.2 + + TYPE + 0 + UUID + 1B6AFC3A-9EA5-4401-83D4-37F06CD13CD6 + + PROJECT - PACKAGE_FILES - - DEFAULT_INSTALL_LOCATION - / - HIERARCHY - - CHILDREN - - - CHILDREN - - - CHILDREN - - GID - 80 - PATH - Utilities - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 80 - PATH - ../../../macui/build/Release/ZeroTier One.app - PATH_TYPE - 1 - PERMISSIONS - 493 - TYPE - 3 - UID - 0 - - - GID - 80 - PATH - Applications - PATH_TYPE - 0 - PERMISSIONS - 509 - TYPE - 1 - UID - 0 - - - CHILDREN - - - CHILDREN - - - CHILDREN - - - CHILDREN - - - CHILDREN - - GID - 0 - PATH - get-proxy-settings.sh - PATH_TYPE - 1 - PERMISSIONS - 493 - TYPE - 3 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - launch.sh - PATH_TYPE - 1 - PERMISSIONS - 493 - TYPE - 3 - UID - 0 - - - CHILDREN - - GID - 80 - PATH - ../../../MacEthernetTapAgent - PATH_TYPE - 1 - PERMISSIONS - 493 - TYPE - 3 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - uninstall.sh - PATH_TYPE - 1 - PERMISSIONS - 493 - TYPE - 3 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - ../../../zerotier-one - PATH_TYPE - 1 - PERMISSIONS - 493 - TYPE - 3 - UID - 0 - - - GID - 80 - PATH - One - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 2 - UID - 0 - - - GID - 80 - PATH - ZeroTier - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 2 - UID - 0 - - - GID - 80 - PATH - Application Support - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - Automator - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - Documentation - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - Filesystems - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - Frameworks - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - Input Methods - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - Internet Plug-Ins - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - LaunchAgents - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - - CHILDREN - - GID - 0 - PATH - com.zerotier.one.plist - PATH_TYPE - 1 - PERMISSIONS - 420 - TYPE - 3 - UID - 0 - - - GID - 0 - PATH - LaunchDaemons - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - PreferencePanes - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - Preferences - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 80 - PATH - Printers - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - PrivilegedHelperTools - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - QuickLook - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - QuickTime - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - Screen Savers - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - Scripts - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - Services - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - GID - 0 - PATH - Widgets - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - GID - 0 - PATH - Library - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - - CHILDREN - - - CHILDREN - - GID - 0 - PATH - Extensions - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - GID - 0 - PATH - Library - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - GID - 0 - PATH - System - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - CHILDREN - - - CHILDREN - - GID - 0 - PATH - Shared - PATH_TYPE - 0 - PERMISSIONS - 1023 - TYPE - 1 - UID - 0 - - - GID - 80 - PATH - Users - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - - GID - 0 - PATH - / - PATH_TYPE - 0 - PERMISSIONS - 493 - TYPE - 1 - UID - 0 - - PAYLOAD_TYPE - 0 - SHOW_INVISIBLE - - SPLIT_FORKS - - TREAT_MISSING_FILES_AS_WARNING - - VERSION - 3 - - PACKAGE_SCRIPTS - - POSTINSTALL_PATH - - PATH - postinst.sh - PATH_TYPE - 1 - - PREINSTALL_PATH - - PATH - preinst.sh - PATH_TYPE - 1 - - RESOURCES - - - PACKAGE_SETTINGS - - AUTHENTICATION - 1 - CONCLUSION_ACTION - 0 - FOLLOW_SYMBOLIC_LINKS - - IDENTIFIER - com.zerotier.pkg.ZeroTierOne - LOCATION - 0 - NAME - - OVERWRITE_PERMISSIONS - - PAYLOAD_SIZE - -1 - RELOCATABLE - - USE_HFS+_COMPRESSION - - VERSION - 1.4.2 - PROJECT_COMMENTS NOTES @@ -701,8 +762,139 @@ dG1sPgo= + PROJECT_PRESENTATION + + BACKGROUND + + APPAREANCES + + DARK_AQUA + + LIGHT_AQUA + + + SHARED_SETTINGS_FOR_ALL_APPAREANCES + + + INSTALLATION_STEPS + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewIntroductionController + INSTALLER_PLUGIN + Introduction + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewReadMeController + INSTALLER_PLUGIN + ReadMe + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewLicenseController + INSTALLER_PLUGIN + License + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewDestinationSelectController + INSTALLER_PLUGIN + TargetSelect + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewInstallationTypeController + INSTALLER_PLUGIN + PackageSelection + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewInstallationController + INSTALLER_PLUGIN + Install + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewSummaryController + INSTALLER_PLUGIN + Summary + LIST_TITLE_KEY + InstallerSectionTitle + + + INTRODUCTION + + LOCALIZATIONS + + + LICENSE + + LOCALIZATIONS + + MODE + 0 + + README + + LOCALIZATIONS + + + TITLE + + LOCALIZATIONS + + + + PROJECT_REQUIREMENTS + + LIST + + + BEHAVIOR + 3 + DICTIONARY + + IC_REQUIREMENT_OS_DISK_TYPE + 0 + IC_REQUIREMENT_OS_DISTRIBUTION_TYPE + 0 + IC_REQUIREMENT_OS_MINIMUM_VERSION + 100900 + + IC_REQUIREMENT_CHECK_TYPE + 1 + IDENTIFIER + fr.whitebox.Packages.requirement.os + MESSAGE + + NAME + Operating System + STATE + + + + RESOURCES + + ROOT_VOLUME_ONLY + + PROJECT_SETTINGS + BUILD_FORMAT + 0 BUILD_PATH PATH @@ -882,10 +1074,17 @@ ZeroTier One PAYLOAD_ONLY + TREAT_MISSING_PRESENTATION_DOCUMENTS_AS_WARNING + + SHARED_GLOBAL_DATA + + IC_REQUIREMENT_JAVASCRIPT_SHARED_SOURCE_CODE + + TYPE - 1 + 0 VERSION 2 diff --git a/ext/installfiles/mac/postinst.sh b/ext/installfiles/mac/postinst.sh index b4ea2ee23..95301a4e9 100755 --- a/ext/installfiles/mac/postinst.sh +++ b/ext/installfiles/mac/postinst.sh @@ -3,6 +3,7 @@ export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin OSX_RELEASE=`sw_vers -productVersion | cut -d . -f 1,2` +DARWIN_MAJOR=`uname -r | cut -d . -f 1` launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist >>/dev/null 2>&1 sleep 0.5 @@ -43,9 +44,11 @@ rm -f zerotier-cli zerotier-idtool ln -sf "/Library/Application Support/ZeroTier/One/zerotier-one" zerotier-cli ln -sf "/Library/Application Support/ZeroTier/One/zerotier-one" zerotier-idtool -cd "/Library/Application Support/ZeroTier/One" -kextload -r . tap.kext >>/dev/null 2>&1 & -disown %1 +if [ $DARWIN_MAJOR -le 16 ]; then + cd "/Library/Application Support/ZeroTier/One" + kextload -r . tap.kext >>/dev/null 2>&1 & + disown %1 +fi launchctl load /Library/LaunchDaemons/com.zerotier.one.plist >>/dev/null 2>&1 diff --git a/osdep/BSDEthernetTap.hpp b/osdep/BSDEthernetTap.hpp index deefd5c74..5b1fe2dc8 100644 --- a/osdep/BSDEthernetTap.hpp +++ b/osdep/BSDEthernetTap.hpp @@ -38,10 +38,11 @@ #include "../node/MulticastGroup.hpp" #include "../node/MAC.hpp" #include "Thread.hpp" +#include "EthernetTap.hpp" namespace ZeroTier { -class BSDEthernetTap +class BSDEthernetTap : public EthernetTap { public: BSDEthernetTap( @@ -54,18 +55,18 @@ public: void (*handler)(void *,void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int), void *arg); - ~BSDEthernetTap(); + virtual ~BSDEthernetTap(); - void setEnabled(bool en); - bool enabled() const; - bool addIp(const InetAddress &ip); - bool removeIp(const InetAddress &ip); - std::vector ips() const; - void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len); - std::string deviceName() const; - void setFriendlyName(const char *friendlyName); - void scanMulticastGroups(std::vector &added,std::vector &removed); - void setMtu(unsigned int mtu); + virtual void setEnabled(bool en); + virtual bool enabled() const; + virtual bool addIp(const InetAddress &ip); + virtual bool removeIp(const InetAddress &ip); + virtual std::vector ips() const; + virtual void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len); + virtual std::string deviceName() const; + virtual void setFriendlyName(const char *friendlyName); + virtual void scanMulticastGroups(std::vector &added,std::vector &removed); + virtual void setMtu(unsigned int mtu); void threadMain() throw(); diff --git a/osdep/EthernetTap.cpp b/osdep/EthernetTap.cpp new file mode 100644 index 000000000..a10db55fe --- /dev/null +++ b/osdep/EthernetTap.cpp @@ -0,0 +1,117 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2019 ZeroTier, Inc. https://www.zerotier.com/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * -- + * + * You can be released from the requirements of the license by purchasing + * a commercial license. Buying such a license is mandatory as soon as you + * develop commercial closed-source software that incorporates or links + * directly against ZeroTier software without disclosing the source code + * of your own application. + */ + +#include "EthernetTap.hpp" +#include "OSUtils.hpp" + +#include +#include + +#ifdef __APPLE__ +#include +#include +#include "MacEthernetTap.hpp" +#include "MacKextEthernetTap.hpp" +#endif // __APPLE__ + +#ifdef __LINUX__ +#include "LinuxEthernetTap.hpp" +#endif // __LINUX__ + +#ifdef __WINDOWS__ +#include "WindowsEthernetTap.hpp" +#endif // __WINDOWS__ + +#ifdef __FreeBSD__ +#include "BSDEthernetTap.hpp" +#endif // __FreeBSD__ + +#ifdef __NetBSD__ +#include "NetBSDEthernetTap.hpp" +#endif // __NetBSD__ + +#ifdef __OpenBSD__ +#include "BSDEthernetTap.hpp" +#endif // __OpenBSD__ + +namespace ZeroTier { + +std::shared_ptr EthernetTap::newInstance( + const char *tapDeviceType, // OS-specific, NULL for default + const char *homePath, + const MAC &mac, + unsigned int mtu, + unsigned int metric, + uint64_t nwid, + const char *friendlyName, + void (*handler)(void *,void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int), + void *arg) +{ +#ifdef __APPLE__ + char osrelease[256]; + size_t size = sizeof(osrelease); + if (sysctlbyname("kern.osrelease",osrelease,&size,nullptr,0) == 0) { + char *dotAt = strchr(osrelease,'.'); + if (dotAt) { + *dotAt = (char)0; + // The "feth" virtual Ethernet device type appeared in Darwin 17.x.x. Older versions + // (Sierra and earlier) must use the a kernel extension. + if (strtol(osrelease,(char **)0,10) < 17) { + return std::shared_ptr(new MacKextEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg)); + } else { + return std::shared_ptr(new MacEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg)); + } + } + } +#endif // __APPLE__ + +#ifdef __LINUX__ + return std::shared_ptr(new LinuxEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg)); +#endif // __LINUX__ + +#ifdef __WINDOWS__ + return std::shared_ptr(new WindowsEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg)); +#endif // __WINDOWS__ + +#ifdef __FreeBSD__ + return std::shared_ptr(new BSDEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg)); +#endif // __FreeBSD__ + +#ifdef __NetBSD__ + return std::shared_ptr(new NetBSDEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg)); +#endif // __NetBSD__ + +#ifdef __OpenBSD__ + return std::shared_ptr(new BSDEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg)); +#endif // __OpenBSD__ + + return std::shared_ptr(); +} + +EthernetTap::EthernetTap() {} +EthernetTap::~EthernetTap() {} + +} // namespace ZeroTier diff --git a/osdep/EthernetTap.hpp b/osdep/EthernetTap.hpp new file mode 100644 index 000000000..fc8fc8482 --- /dev/null +++ b/osdep/EthernetTap.hpp @@ -0,0 +1,72 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2019 ZeroTier, Inc. https://www.zerotier.com/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * -- + * + * You can be released from the requirements of the license by purchasing + * a commercial license. Buying such a license is mandatory as soon as you + * develop commercial closed-source software that incorporates or links + * directly against ZeroTier software without disclosing the source code + * of your own application. + */ + +#ifndef ZT_ETHERNETTAP_HPP +#define ZT_ETHERNETTAP_HPP + +#include "../node/Constants.hpp" +#include "../node/MAC.hpp" +#include "../node/InetAddress.hpp" +#include "../node/MulticastGroup.hpp" + +#include +#include +#include + +namespace ZeroTier { + +class EthernetTap +{ +public: + static std::shared_ptr newInstance( + const char *tapDeviceType, // OS-specific, NULL for default + const char *homePath, + const MAC &mac, + unsigned int mtu, + unsigned int metric, + uint64_t nwid, + const char *friendlyName, + void (*handler)(void *,void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int), + void *arg); + + EthernetTap(); + virtual ~EthernetTap(); + + virtual void setEnabled(bool en) = 0; + virtual bool enabled() const = 0; + virtual bool addIp(const InetAddress &ip) = 0; + virtual bool removeIp(const InetAddress &ip) = 0; + virtual std::vector ips() const = 0; + virtual void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len) = 0; + virtual std::string deviceName() const = 0; + virtual void setFriendlyName(const char *friendlyName) = 0; + virtual void scanMulticastGroups(std::vector &added,std::vector &removed) = 0; + virtual void setMtu(unsigned int mtu) = 0; +}; + +} // namespace ZeroTier + +#endif diff --git a/osdep/LinuxEthernetTap.cpp b/osdep/LinuxEthernetTap.cpp index 2ea93dd1d..5ed49eef8 100644 --- a/osdep/LinuxEthernetTap.cpp +++ b/osdep/LinuxEthernetTap.cpp @@ -24,6 +24,17 @@ * of your own application. */ +#include "../node/Constants.hpp" + +#ifdef __LINUX__ + +#include "../node/Utils.hpp" +#include "../node/Mutex.hpp" +#include "../node/Dictionary.hpp" +#include "OSUtils.hpp" +#include "LinuxEthernetTap.hpp" +#include "LinuxNetLink.hpp" + #include #include #include @@ -50,14 +61,6 @@ #include #include -#include "../node/Constants.hpp" -#include "../node/Utils.hpp" -#include "../node/Mutex.hpp" -#include "../node/Dictionary.hpp" -#include "OSUtils.hpp" -#include "LinuxEthernetTap.hpp" -#include "LinuxNetLink.hpp" - // ff:ff:ff:ff:ff:ff with no ADI static const ZeroTier::MulticastGroup _blindWildcardMulticastGroup(ZeroTier::MAC(0xff),0); @@ -519,3 +522,5 @@ void LinuxEthernetTap::threadMain() } } // namespace ZeroTier + +#endif // __LINUX__ diff --git a/osdep/LinuxEthernetTap.hpp b/osdep/LinuxEthernetTap.hpp index 050bec343..1acecb4b6 100644 --- a/osdep/LinuxEthernetTap.hpp +++ b/osdep/LinuxEthernetTap.hpp @@ -33,16 +33,15 @@ #include #include #include +#include #include "../node/MulticastGroup.hpp" #include "Thread.hpp" +#include "EthernetTap.hpp" namespace ZeroTier { -/** - * Linux Ethernet tap using kernel tun/tap driver - */ -class LinuxEthernetTap +class LinuxEthernetTap : public EthernetTap { public: LinuxEthernetTap( @@ -55,21 +54,21 @@ public: void (*handler)(void *,void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int), void *arg); - ~LinuxEthernetTap(); + virtual ~LinuxEthernetTap(); - void setEnabled(bool en); - bool enabled() const; - bool addIp(const InetAddress &ip); + virtual void setEnabled(bool en); + virtual bool enabled() const; + virtual bool addIp(const InetAddress &ip); #ifdef __SYNOLOGY__ bool addIpSyn(std::vector ips); #endif - bool removeIp(const InetAddress &ip); - std::vector ips() const; - void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len); - std::string deviceName() const; - void setFriendlyName(const char *friendlyName); - void scanMulticastGroups(std::vector &added,std::vector &removed); - void setMtu(unsigned int mtu); + virtual bool removeIp(const InetAddress &ip); + virtual std::vector ips() const; + virtual void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len); + virtual std::string deviceName() const; + virtual void setFriendlyName(const char *friendlyName); + virtual void scanMulticastGroups(std::vector &added,std::vector &removed); + virtual void setMtu(unsigned int mtu); void threadMain() throw(); @@ -85,7 +84,7 @@ private: unsigned int _mtu; int _fd; int _shutdownSignalPipe[2]; - volatile bool _enabled; + std::atomic_bool _enabled; }; } // namespace ZeroTier diff --git a/osdep/MacEthernetTap.cpp b/osdep/MacEthernetTap.cpp index a11a75e24..237df4704 100644 --- a/osdep/MacEthernetTap.cpp +++ b/osdep/MacEthernetTap.cpp @@ -24,6 +24,17 @@ * of your own application. */ +#include "../node/Constants.hpp" + +#ifdef __APPLE__ + +#include "../node/Utils.hpp" +#include "../node/Mutex.hpp" +#include "../node/Dictionary.hpp" +#include "OSUtils.hpp" +#include "MacEthernetTap.hpp" +#include "MacEthernetTapAgent.h" + #include #include #include @@ -57,14 +68,6 @@ #include #include -#include "../node/Constants.hpp" -#include "../node/Utils.hpp" -#include "../node/Mutex.hpp" -#include "../node/Dictionary.hpp" -#include "OSUtils.hpp" -#include "MacEthernetTap.hpp" -#include "MacEthernetTapAgent.h" - static const ZeroTier::MulticastGroup _blindWildcardMulticastGroup(ZeroTier::MAC(0xff),0); namespace ZeroTier { @@ -463,3 +466,5 @@ void MacEthernetTap::threadMain() } } // namespace ZeroTier + +#endif // __APPLE__ diff --git a/osdep/MacEthernetTap.hpp b/osdep/MacEthernetTap.hpp index fb5bc6dbb..2eef59be6 100644 --- a/osdep/MacEthernetTap.hpp +++ b/osdep/MacEthernetTap.hpp @@ -27,6 +27,14 @@ #ifndef ZT_OSXETHERNETTAP_HPP #define ZT_OSXETHERNETTAP_HPP +#include "../node/Constants.hpp" +#include "../node/MAC.hpp" +#include "../node/InetAddress.hpp" +#include "../node/MulticastGroup.hpp" +#include "../node/Mutex.hpp" +#include "Thread.hpp" +#include "EthernetTap.hpp" + #include #include @@ -34,17 +42,9 @@ #include #include -#include "../node/Constants.hpp" -#include "../node/MAC.hpp" -#include "../node/InetAddress.hpp" -#include "../node/MulticastGroup.hpp" -#include "../node/Mutex.hpp" - -#include "Thread.hpp" - namespace ZeroTier { -class MacEthernetTap +class MacEthernetTap : public EthernetTap { public: MacEthernetTap( @@ -57,18 +57,18 @@ public: void (*handler)(void *,void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int), void *arg); - ~MacEthernetTap(); + virtual ~MacEthernetTap(); - void setEnabled(bool en); - bool enabled() const; - bool addIp(const InetAddress &ip); - bool removeIp(const InetAddress &ip); - std::vector ips() const; - void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len); - std::string deviceName() const; - void setFriendlyName(const char *friendlyName); - void scanMulticastGroups(std::vector &added,std::vector &removed); - void setMtu(unsigned int mtu); + virtual void setEnabled(bool en); + virtual bool enabled() const; + virtual bool addIp(const InetAddress &ip); + virtual bool removeIp(const InetAddress &ip); + virtual std::vector ips() const; + virtual void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len); + virtual std::string deviceName() const; + virtual void setFriendlyName(const char *friendlyName); + virtual void scanMulticastGroups(std::vector &added,std::vector &removed); + virtual void setMtu(unsigned int mtu); void threadMain() throw(); diff --git a/osdep/MacKextEthernetTap.cpp b/osdep/MacKextEthernetTap.cpp new file mode 100644 index 000000000..4f0520a65 --- /dev/null +++ b/osdep/MacKextEthernetTap.cpp @@ -0,0 +1,703 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2018 ZeroTier, Inc. https://www.zerotier.com/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * -- + * + * You can be released from the requirements of the license by purchasing + * a commercial license. Buying such a license is mandatory as soon as you + * develop commercial closed-source software that incorporates or links + * directly against ZeroTier software without disclosing the source code + * of your own application. + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// OSX compile fix... in6_var defines this in a struct which namespaces it for C++ ... why?!? +struct prf_ra { + u_char onlink : 1; + u_char autonomous : 1; + u_char reserved : 6; +} prf_ra; + +#include +#include + +// These are KERNEL_PRIVATE... why? +#ifndef SIOCAUTOCONF_START +#define SIOCAUTOCONF_START _IOWR('i', 132, struct in6_ifreq) /* accept rtadvd on this interface */ +#endif +#ifndef SIOCAUTOCONF_STOP +#define SIOCAUTOCONF_STOP _IOWR('i', 133, struct in6_ifreq) /* stop accepting rtadv for this interface */ +#endif + +// -------------------------------------------------------------------------- +// -------------------------------------------------------------------------- +// This source is from: +// http://www.opensource.apple.com/source/Libinfo/Libinfo-406.17/gen.subproj/getifmaddrs.c?txt +// It's here because OSX 10.6 does not have this convenience function. + +#define SALIGN (sizeof(uint32_t) - 1) +#define SA_RLEN(sa) ((sa)->sa_len ? (((sa)->sa_len + SALIGN) & ~SALIGN) : \ +(SALIGN + 1)) +#define MAX_SYSCTL_TRY 5 +#define RTA_MASKS (RTA_GATEWAY | RTA_IFP | RTA_IFA) + +/* FreeBSD uses NET_RT_IFMALIST and RTM_NEWMADDR from */ +/* We can use NET_RT_IFLIST2 and RTM_NEWMADDR2 on Darwin */ +//#define DARWIN_COMPAT + +//#ifdef DARWIN_COMPAT +#define GIM_SYSCTL_MIB NET_RT_IFLIST2 +#define GIM_RTM_ADDR RTM_NEWMADDR2 +//#else +//#define GIM_SYSCTL_MIB NET_RT_IFMALIST +//#define GIM_RTM_ADDR RTM_NEWMADDR +//#endif + +// Not in 10.6 includes so use our own +struct _intl_ifmaddrs { + struct _intl_ifmaddrs *ifma_next; + struct sockaddr *ifma_name; + struct sockaddr *ifma_addr; + struct sockaddr *ifma_lladdr; +}; + +static inline int _intl_getifmaddrs(struct _intl_ifmaddrs **pif) +{ + int icnt = 1; + int dcnt = 0; + int ntry = 0; + size_t len; + size_t needed; + int mib[6]; + int i; + char *buf; + char *data; + char *next; + char *p; + struct ifma_msghdr2 *ifmam; + struct _intl_ifmaddrs *ifa, *ift; + struct rt_msghdr *rtm; + struct sockaddr *sa; + + mib[0] = CTL_NET; + mib[1] = PF_ROUTE; + mib[2] = 0; /* protocol */ + mib[3] = 0; /* wildcard address family */ + mib[4] = GIM_SYSCTL_MIB; + mib[5] = 0; /* no flags */ + do { + if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) + return (-1); + if ((buf = (char *)malloc(needed)) == NULL) + return (-1); + if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) { + if (errno != ENOMEM || ++ntry >= MAX_SYSCTL_TRY) { + free(buf); + return (-1); + } + free(buf); + buf = NULL; + } + } while (buf == NULL); + + for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { + rtm = (struct rt_msghdr *)(void *)next; + if (rtm->rtm_version != RTM_VERSION) + continue; + switch (rtm->rtm_type) { + case GIM_RTM_ADDR: + ifmam = (struct ifma_msghdr2 *)(void *)rtm; + if ((ifmam->ifmam_addrs & RTA_IFA) == 0) + break; + icnt++; + p = (char *)(ifmam + 1); + for (i = 0; i < RTAX_MAX; i++) { + if ((RTA_MASKS & ifmam->ifmam_addrs & + (1 << i)) == 0) + continue; + sa = (struct sockaddr *)(void *)p; + len = SA_RLEN(sa); + dcnt += len; + p += len; + } + break; + } + } + + data = (char *)malloc(sizeof(struct _intl_ifmaddrs) * icnt + dcnt); + if (data == NULL) { + free(buf); + return (-1); + } + + ifa = (struct _intl_ifmaddrs *)(void *)data; + data += sizeof(struct _intl_ifmaddrs) * icnt; + + memset(ifa, 0, sizeof(struct _intl_ifmaddrs) * icnt); + ift = ifa; + + for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { + rtm = (struct rt_msghdr *)(void *)next; + if (rtm->rtm_version != RTM_VERSION) + continue; + + switch (rtm->rtm_type) { + case GIM_RTM_ADDR: + ifmam = (struct ifma_msghdr2 *)(void *)rtm; + if ((ifmam->ifmam_addrs & RTA_IFA) == 0) + break; + + p = (char *)(ifmam + 1); + for (i = 0; i < RTAX_MAX; i++) { + if ((RTA_MASKS & ifmam->ifmam_addrs & + (1 << i)) == 0) + continue; + sa = (struct sockaddr *)(void *)p; + len = SA_RLEN(sa); + switch (i) { + case RTAX_GATEWAY: + ift->ifma_lladdr = + (struct sockaddr *)(void *)data; + memcpy(data, p, len); + data += len; + break; + + case RTAX_IFP: + ift->ifma_name = + (struct sockaddr *)(void *)data; + memcpy(data, p, len); + data += len; + break; + + case RTAX_IFA: + ift->ifma_addr = + (struct sockaddr *)(void *)data; + memcpy(data, p, len); + data += len; + break; + + default: + data += len; + break; + } + p += len; + } + ift->ifma_next = ift + 1; + ift = ift->ifma_next; + break; + } + } + + free(buf); + + if (ift > ifa) { + ift--; + ift->ifma_next = NULL; + *pif = ifa; + } else { + *pif = NULL; + free(ifa); + } + return (0); +} + +static inline void _intl_freeifmaddrs(struct _intl_ifmaddrs *ifmp) +{ + free(ifmp); +} + +// -------------------------------------------------------------------------- +// -------------------------------------------------------------------------- + +#include +#include +#include +#include + +#include "../node/Constants.hpp" +#include "../node/Utils.hpp" +#include "../node/Mutex.hpp" +#include "../node/Dictionary.hpp" +#include "OSUtils.hpp" +#include "MacKextEthernetTap.hpp" + +// ff:ff:ff:ff:ff:ff with no ADI +static const ZeroTier::MulticastGroup _blindWildcardMulticastGroup(ZeroTier::MAC(0xff),0); + +static inline bool _setIpv6Stuff(const char *ifname,bool performNUD,bool acceptRouterAdverts) +{ + struct in6_ndireq nd; + struct in6_ifreq ifr; + + int s = socket(AF_INET6,SOCK_DGRAM,0); + if (s <= 0) + return false; + + memset(&nd,0,sizeof(nd)); + strncpy(nd.ifname,ifname,sizeof(nd.ifname)); + + if (ioctl(s,SIOCGIFINFO_IN6,&nd)) { + close(s); + return false; + } + + unsigned long oldFlags = (unsigned long)nd.ndi.flags; + + if (performNUD) + nd.ndi.flags |= ND6_IFF_PERFORMNUD; + else nd.ndi.flags &= ~ND6_IFF_PERFORMNUD; + + if (oldFlags != (unsigned long)nd.ndi.flags) { + if (ioctl(s,SIOCSIFINFO_FLAGS,&nd)) { + close(s); + return false; + } + } + + memset(&ifr,0,sizeof(ifr)); + strncpy(ifr.ifr_name,ifname,sizeof(ifr.ifr_name)); + if (ioctl(s,acceptRouterAdverts ? SIOCAUTOCONF_START : SIOCAUTOCONF_STOP,&ifr)) { + close(s); + return false; + } + + close(s); + return true; +} + +namespace ZeroTier { + +static long globalTapsRunning = 0; +static Mutex globalTapCreateLock; + +MacKextEthernetTap::MacKextEthernetTap( + const char *homePath, + const MAC &mac, + unsigned int mtu, + unsigned int metric, + uint64_t nwid, + const char *friendlyName, + void (*handler)(void *,void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *data,unsigned int len), + void *arg) : + _handler(handler), + _arg(arg), + _nwid(nwid), + _homePath(homePath), + _mtu(mtu), + _metric(metric), + _fd(0), + _enabled(true) +{ + char devpath[64],ethaddr[64],mtustr[32],metstr[32],nwids[32]; + struct stat stattmp; + + OSUtils::ztsnprintf(nwids,sizeof(nwids),"%.16llx",nwid); + + Mutex::Lock _gl(globalTapCreateLock); + + if (::stat("/dev/zt0",&stattmp)) { + long kextpid = (long)vfork(); + if (kextpid == 0) { + ::chdir(homePath); + OSUtils::redirectUnixOutputs("/dev/null",(const char *)0); + ::execl("/sbin/kextload","/sbin/kextload","-q","-repository",homePath,"tap.kext",(const char *)0); + ::_exit(-1); + } else if (kextpid > 0) { + int exitcode = -1; + ::waitpid(kextpid,&exitcode,0); + } + ::usleep(500); // give tap device driver time to start up and try again + if (::stat("/dev/zt0",&stattmp)) + throw std::runtime_error("/dev/zt# tap devices do not exist and cannot load tap.kext"); + } + + // Try to reopen the last device we had, if we had one and it's still unused. + std::map globalDeviceMap; + FILE *devmapf = fopen((_homePath + ZT_PATH_SEPARATOR_S + "devicemap").c_str(),"r"); + if (devmapf) { + char buf[256]; + while (fgets(buf,sizeof(buf),devmapf)) { + char *x = (char *)0; + char *y = (char *)0; + char *saveptr = (char *)0; + for(char *f=Utils::stok(buf,"\r\n=",&saveptr);(f);f=Utils::stok((char *)0,"\r\n=",&saveptr)) { + if (!x) x = f; + else if (!y) y = f; + else break; + } + if ((x)&&(y)&&(x[0])&&(y[0])) + globalDeviceMap[x] = y; + } + fclose(devmapf); + } + bool recalledDevice = false; + std::map::const_iterator gdmEntry = globalDeviceMap.find(nwids); + if (gdmEntry != globalDeviceMap.end()) { + std::string devpath("/dev/"); devpath.append(gdmEntry->second); + if (stat(devpath.c_str(),&stattmp) == 0) { + _fd = ::open(devpath.c_str(),O_RDWR); + if (_fd > 0) { + _dev = gdmEntry->second; + recalledDevice = true; + } + } + } + + // Open the first unused tap device if we didn't recall a previous one. + if (!recalledDevice) { + for(int i=0;i<64;++i) { + OSUtils::ztsnprintf(devpath,sizeof(devpath),"/dev/zt%d",i); + if (stat(devpath,&stattmp)) + throw std::runtime_error("no more TAP devices available"); + _fd = ::open(devpath,O_RDWR); + if (_fd > 0) { + char foo[16]; + OSUtils::ztsnprintf(foo,sizeof(foo),"zt%d",i); + _dev = foo; + break; + } + } + } + + if (_fd <= 0) + throw std::runtime_error("unable to open TAP device or no more devices available"); + + if (fcntl(_fd,F_SETFL,fcntl(_fd,F_GETFL) & ~O_NONBLOCK) == -1) { + ::close(_fd); + throw std::runtime_error("unable to set flags on file descriptor for TAP device"); + } + + // Configure MAC address and MTU, bring interface up + OSUtils::ztsnprintf(ethaddr,sizeof(ethaddr),"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",(int)mac[0],(int)mac[1],(int)mac[2],(int)mac[3],(int)mac[4],(int)mac[5]); + OSUtils::ztsnprintf(mtustr,sizeof(mtustr),"%u",_mtu); + OSUtils::ztsnprintf(metstr,sizeof(metstr),"%u",_metric); + long cpid = (long)vfork(); + if (cpid == 0) { + ::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),"lladdr",ethaddr,"mtu",mtustr,"metric",metstr,"up",(const char *)0); + ::_exit(-1); + } else if (cpid > 0) { + int exitcode = -1; + ::waitpid(cpid,&exitcode,0); + if (exitcode) { + ::close(_fd); + throw std::runtime_error("ifconfig failure setting link-layer address and activating tap interface"); + } + } + + _setIpv6Stuff(_dev.c_str(),true,false); + + // Set close-on-exec so that devices cannot persist if we fork/exec for update + fcntl(_fd,F_SETFD,fcntl(_fd,F_GETFD) | FD_CLOEXEC); + + ::pipe(_shutdownSignalPipe); + + ++globalTapsRunning; + + globalDeviceMap[nwids] = _dev; + devmapf = fopen((_homePath + ZT_PATH_SEPARATOR_S + "devicemap").c_str(),"w"); + if (devmapf) { + gdmEntry = globalDeviceMap.begin(); + while (gdmEntry != globalDeviceMap.end()) { + fprintf(devmapf,"%s=%s\n",gdmEntry->first.c_str(),gdmEntry->second.c_str()); + ++gdmEntry; + } + fclose(devmapf); + } + + _thread = Thread::start(this); +} + +MacKextEthernetTap::~MacKextEthernetTap() +{ + ::write(_shutdownSignalPipe[1],"\0",1); // causes thread to exit + Thread::join(_thread); + + ::close(_fd); + ::close(_shutdownSignalPipe[0]); + ::close(_shutdownSignalPipe[1]); + + { + Mutex::Lock _gl(globalTapCreateLock); + if (--globalTapsRunning <= 0) { + globalTapsRunning = 0; // sanity check -- should not be possible + + char tmp[16384]; + sprintf(tmp,"%s/%s",_homePath.c_str(),"tap.kext"); + long kextpid = (long)vfork(); + if (kextpid == 0) { + OSUtils::redirectUnixOutputs("/dev/null",(const char *)0); + ::execl("/sbin/kextunload","/sbin/kextunload",tmp,(const char *)0); + ::_exit(-1); + } else if (kextpid > 0) { + int exitcode = -1; + ::waitpid(kextpid,&exitcode,0); + } + } + } +} + +void MacKextEthernetTap::setEnabled(bool en) +{ + _enabled = en; + // TODO: interface status change +} + +bool MacKextEthernetTap::enabled() const +{ + return _enabled; +} + +bool MacKextEthernetTap::addIp(const InetAddress &ip) +{ + if (!ip) + return false; + + long cpid = (long)vfork(); + if (cpid == 0) { + char tmp[128]; + ::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),(ip.ss_family == AF_INET6) ? "inet6" : "inet",ip.toString(tmp),"alias",(const char *)0); + ::_exit(-1); + } else if (cpid > 0) { + int exitcode = -1; + ::waitpid(cpid,&exitcode,0); + return (exitcode == 0); + } // else return false... + + return false; +} + +bool MacKextEthernetTap::removeIp(const InetAddress &ip) +{ + if (!ip) + return true; + std::vector allIps(ips()); + for(std::vector::iterator i(allIps.begin());i!=allIps.end();++i) { + if (*i == ip) { + long cpid = (long)vfork(); + if (cpid == 0) { + char tmp[128]; + execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),(ip.ss_family == AF_INET6) ? "inet6" : "inet",ip.toIpString(tmp),"-alias",(const char *)0); + _exit(-1); + } else if (cpid > 0) { + int exitcode = -1; + waitpid(cpid,&exitcode,0); + return (exitcode == 0); + } + } + } + return false; +} + +std::vector MacKextEthernetTap::ips() const +{ + struct ifaddrs *ifa = (struct ifaddrs *)0; + if (getifaddrs(&ifa)) + return std::vector(); + + std::vector r; + + struct ifaddrs *p = ifa; + while (p) { + if ((!strcmp(p->ifa_name,_dev.c_str()))&&(p->ifa_addr)&&(p->ifa_netmask)&&(p->ifa_addr->sa_family == p->ifa_netmask->sa_family)) { + switch(p->ifa_addr->sa_family) { + case AF_INET: { + struct sockaddr_in *sin = (struct sockaddr_in *)p->ifa_addr; + struct sockaddr_in *nm = (struct sockaddr_in *)p->ifa_netmask; + r.push_back(InetAddress(&(sin->sin_addr.s_addr),4,Utils::countBits((uint32_t)nm->sin_addr.s_addr))); + } break; + case AF_INET6: { + struct sockaddr_in6 *sin = (struct sockaddr_in6 *)p->ifa_addr; + struct sockaddr_in6 *nm = (struct sockaddr_in6 *)p->ifa_netmask; + uint32_t b[4]; + memcpy(b,nm->sin6_addr.s6_addr,sizeof(b)); + r.push_back(InetAddress(sin->sin6_addr.s6_addr,16,Utils::countBits(b[0]) + Utils::countBits(b[1]) + Utils::countBits(b[2]) + Utils::countBits(b[3]))); + } break; + } + } + p = p->ifa_next; + } + + if (ifa) + freeifaddrs(ifa); + + std::sort(r.begin(),r.end()); + r.erase(std::unique(r.begin(),r.end()),r.end()); + + return r; +} + +void MacKextEthernetTap::put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len) +{ + char putBuf[ZT_MAX_MTU + 64]; + if ((_fd > 0)&&(len <= _mtu)&&(_enabled)) { + to.copyTo(putBuf,6); + from.copyTo(putBuf + 6,6); + *((uint16_t *)(putBuf + 12)) = htons((uint16_t)etherType); + memcpy(putBuf + 14,data,len); + len += 14; + ::write(_fd,putBuf,len); + } +} + +std::string MacKextEthernetTap::deviceName() const +{ + return _dev; +} + +void MacKextEthernetTap::setFriendlyName(const char *friendlyName) +{ +} + +void MacKextEthernetTap::scanMulticastGroups(std::vector &added,std::vector &removed) +{ + std::vector newGroups; + + struct _intl_ifmaddrs *ifmap = (struct _intl_ifmaddrs *)0; + if (!_intl_getifmaddrs(&ifmap)) { + struct _intl_ifmaddrs *p = ifmap; + while (p) { + if (p->ifma_addr->sa_family == AF_LINK) { + struct sockaddr_dl *in = (struct sockaddr_dl *)p->ifma_name; + struct sockaddr_dl *la = (struct sockaddr_dl *)p->ifma_addr; + if ((la->sdl_alen == 6)&&(in->sdl_nlen <= _dev.length())&&(!memcmp(_dev.data(),in->sdl_data,in->sdl_nlen))) + newGroups.push_back(MulticastGroup(MAC(la->sdl_data + la->sdl_nlen,6),0)); + } + p = p->ifma_next; + } + _intl_freeifmaddrs(ifmap); + } + + std::vector allIps(ips()); + for(std::vector::iterator ip(allIps.begin());ip!=allIps.end();++ip) + newGroups.push_back(MulticastGroup::deriveMulticastGroupForAddressResolution(*ip)); + + std::sort(newGroups.begin(),newGroups.end()); + std::unique(newGroups.begin(),newGroups.end()); + + for(std::vector::iterator m(newGroups.begin());m!=newGroups.end();++m) { + if (!std::binary_search(_multicastGroups.begin(),_multicastGroups.end(),*m)) + added.push_back(*m); + } + for(std::vector::iterator m(_multicastGroups.begin());m!=_multicastGroups.end();++m) { + if (!std::binary_search(newGroups.begin(),newGroups.end(),*m)) + removed.push_back(*m); + } + + _multicastGroups.swap(newGroups); +} + +void MacKextEthernetTap::setMtu(unsigned int mtu) +{ + if (mtu != _mtu) { + _mtu = mtu; + long cpid = (long)vfork(); + if (cpid == 0) { + char tmp[64]; + OSUtils::ztsnprintf(tmp,sizeof(tmp),"%u",mtu); + execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),"mtu",tmp,(const char *)0); + _exit(-1); + } else if (cpid > 0) { + int exitcode = -1; + waitpid(cpid,&exitcode,0); + } + } +} + +void MacKextEthernetTap::threadMain() + throw() +{ + fd_set readfds,nullfds; + MAC to,from; + int n,nfds,r; + char getBuf[ZT_MAX_MTU + 64]; + + Thread::sleep(500); + + FD_ZERO(&readfds); + FD_ZERO(&nullfds); + nfds = (int)std::max(_shutdownSignalPipe[0],_fd) + 1; + + r = 0; + for(;;) { + FD_SET(_shutdownSignalPipe[0],&readfds); + FD_SET(_fd,&readfds); + select(nfds,&readfds,&nullfds,&nullfds,(struct timeval *)0); + + if (FD_ISSET(_shutdownSignalPipe[0],&readfds)) // writes to shutdown pipe terminate thread + break; + + if (FD_ISSET(_fd,&readfds)) { + n = (int)::read(_fd,getBuf + r,sizeof(getBuf) - r); + if (n < 0) { + if ((errno != EINTR)&&(errno != ETIMEDOUT)) + break; + } else { + // Some tap drivers like to send the ethernet frame and the + // payload in two chunks, so handle that by accumulating + // data until we have at least a frame. + r += n; + if (r > 14) { + if (r > ((int)_mtu + 14)) // sanity check for weird TAP behavior on some platforms + r = _mtu + 14; + + if (_enabled) { + to.setTo(getBuf,6); + from.setTo(getBuf + 6,6); + unsigned int etherType = ntohs(((const uint16_t *)getBuf)[6]); + // TODO: VLAN support + _handler(_arg,(void *)0,_nwid,from,to,etherType,0,(const void *)(getBuf + 14),r - 14); + } + + r = 0; + } + } + } + } +} + +} // namespace ZeroTier diff --git a/osdep/MacKextEthernetTap.hpp b/osdep/MacKextEthernetTap.hpp new file mode 100644 index 000000000..fbf2694b2 --- /dev/null +++ b/osdep/MacKextEthernetTap.hpp @@ -0,0 +1,93 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2018 ZeroTier, Inc. https://www.zerotier.com/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * -- + * + * You can be released from the requirements of the license by purchasing + * a commercial license. Buying such a license is mandatory as soon as you + * develop commercial closed-source software that incorporates or links + * directly against ZeroTier software without disclosing the source code + * of your own application. + */ + +#ifndef ZT_MacKextEthernetTap_HPP +#define ZT_MacKextEthernetTap_HPP + +#include +#include + +#include +#include +#include + +#include "../node/Constants.hpp" +#include "../node/MAC.hpp" +#include "../node/InetAddress.hpp" +#include "../node/MulticastGroup.hpp" + +#include "Thread.hpp" +#include "EthernetTap.hpp" + +namespace ZeroTier { + +class MacKextEthernetTap : public EthernetTap +{ +public: + MacKextEthernetTap( + const char *homePath, + const MAC &mac, + unsigned int mtu, + unsigned int metric, + uint64_t nwid, + const char *friendlyName, + void (*handler)(void *,void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int), + void *arg); + + virtual ~MacKextEthernetTap(); + + virtual void setEnabled(bool en); + virtual bool enabled() const; + virtual bool addIp(const InetAddress &ip); + virtual bool removeIp(const InetAddress &ip); + virtual std::vector ips() const; + virtual void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len); + virtual std::string deviceName() const; + virtual void setFriendlyName(const char *friendlyName); + virtual void scanMulticastGroups(std::vector &added,std::vector &removed); + virtual void setMtu(unsigned int mtu); + + void threadMain() + throw(); + +private: + void (*_handler)(void *,void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int); + void *_arg; + uint64_t _nwid; + Thread _thread; + std::string _homePath; + std::string _dev; + std::vector _multicastGroups; + unsigned int _mtu; + unsigned int _metric; + int _fd; + int _shutdownSignalPipe[2]; + volatile bool _enabled; +}; + +} // namespace ZeroTier + +#endif diff --git a/osdep/NetBSDEthernetTap.hpp b/osdep/NetBSDEthernetTap.hpp index 32b6dfa61..a174816e7 100644 --- a/osdep/NetBSDEthernetTap.hpp +++ b/osdep/NetBSDEthernetTap.hpp @@ -38,10 +38,11 @@ #include "../node/MulticastGroup.hpp" #include "../node/MAC.hpp" #include "Thread.hpp" +#include "EthernetTap.hpp" namespace ZeroTier { -class NetBSDEthernetTap +class NetBSDEthernetTap : public EthernetTap { public: NetBSDEthernetTap( @@ -54,17 +55,17 @@ public: void (*handler)(void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int), void *arg); - ~NetBSDEthernetTap(); + virtual ~NetBSDEthernetTap(); - void setEnabled(bool en); - bool enabled() const; - bool addIp(const InetAddress &ip); - bool removeIp(const InetAddress &ip); - std::vector ips() const; - void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len); - std::string deviceName() const; - void setFriendlyName(const char *friendlyName); - void scanMulticastGroups(std::vector &added,std::vector &removed); + virtual void setEnabled(bool en); + virtual bool enabled() const; + virtual bool addIp(const InetAddress &ip); + virtual bool removeIp(const InetAddress &ip); + virtual std::vector ips() const; + virtual void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len); + virtual std::string deviceName() const; + virtual void setFriendlyName(const char *friendlyName); + virtual void scanMulticastGroups(std::vector &added,std::vector &removed); void threadMain() throw(); diff --git a/osdep/TestEthernetTap.hpp b/osdep/TestEthernetTap.hpp deleted file mode 100644 index 6b44d48e8..000000000 --- a/osdep/TestEthernetTap.hpp +++ /dev/null @@ -1,161 +0,0 @@ -/* - * ZeroTier One - Network Virtualization Everywhere - * Copyright (C) 2011-2019 ZeroTier, Inc. https://www.zerotier.com/ - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * -- - * - * You can be released from the requirements of the license by purchasing - * a commercial license. Buying such a license is mandatory as soon as you - * develop commercial closed-source software that incorporates or links - * directly against ZeroTier software without disclosing the source code - * of your own application. - */ - -#ifndef ZT_TESTETHERNETTAP_HPP -#define ZT_TESTETHERNETTAP_HPP - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "../node/Constants.hpp" -#include "../node/InetAddress.hpp" -#include "../node/MulticastGroup.hpp" -#include "../node/Mutex.hpp" -#include "../node/Utils.hpp" -#include "../osdep/OSUtils.hpp" - -namespace ZeroTier { - -/** - * Dummy test Ethernet tap that does not actually open a device on the system - */ -class TestEthernetTap -{ -public: - TestEthernetTap( - const char *homePath, - const MAC &mac, - unsigned int mtu, - unsigned int metric, - uint64_t nwid, - const char *friendlyName, - void (*handler)(void *,void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int), - void *arg) : - _nwid(nwid), - _dev("zt_test_"), - _enabled(true) - { - char tmp[32]; - OSUtils::ztsnprintf(tmp,sizeof(tmp),"%.16llx",(unsigned long long)_nwid); - _dev.append(tmp); -#ifdef ZT_TEST_TAP_REPORT_TO - _reportTo.fromString(ZT_TEST_TAP_REPORT_TO); - if (_reportTo.ss_family == AF_INET) - _reportsock = socket(AF_INET,SOCK_DGRAM,0); - else if (_reportTo.ss_family == AF_INET6) - _reportsock = socket(AF_INET6,SOCK_DGRAM,0); - else _reportsock = -1; -#endif - } - - ~TestEthernetTap() - { -#ifdef ZT_TEST_TAP_REPORT_TO - if (_reportsock >= 0) - close(_reportsock); -#endif - } - - inline void setEnabled(bool en) { _enabled = en; } - inline bool enabled() const { return _enabled; } - - inline bool addIp(const InetAddress &ip) - { - Mutex::Lock _l(_lock); - _ips.insert(ip); - return true; - } - - inline bool removeIp(const InetAddress &ip) - { - Mutex::Lock _l(_lock); - _ips.erase(ip); - return true; - } - - inline std::vector ips() const - { - Mutex::Lock _l(_lock); - return std::vector(_ips.begin(),_ips.end()); - } - - inline void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len) - { -#ifdef ZT_TEST_TAP_REPORT_TO - char tmp[10000]; - if ((_reportsock >= 0)&&(len < (sizeof(tmp) - 22))) { - const uint64_t nwid2 = Utils::hton(_nwid); - memcpy(tmp,&nwid2,8); - from.copyTo(tmp + 8,6); - to.copyTo(tmp + 14,6); - const uint16_t etherType2 = Utils::hton((uint16_t)etherType); - memcpy(tmp + 20,ðerType2,2); - memcpy(tmp + 22,data,len); - sendto(_reportsock,tmp,len + 22,0,reinterpret_cast(&_reportTo),(_reportTo.ss_family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6)); - } -#endif - } - - inline std::string deviceName() const - { - return _dev; - } - - inline void setFriendlyName(const char *friendlyName) - { - } - - inline void scanMulticastGroups(std::vector &added,std::vector &removed) - { - } - - inline void setMtu(unsigned int mtu) - { - } - -private: - uint64_t _nwid; - std::string _dev; - std::set _ips; - InetAddress _reportTo; -#ifdef ZT_TEST_TAP_REPORT_TO - int _reportsock; -#endif - bool _enabled; - Mutex _lock; -}; - -} // namespace ZeroTier - -#endif diff --git a/osdep/WindowsEthernetTap.hpp b/osdep/WindowsEthernetTap.hpp index 78a956728..7a8638759 100644 --- a/osdep/WindowsEthernetTap.hpp +++ b/osdep/WindowsEthernetTap.hpp @@ -41,10 +41,11 @@ #include "../node/MulticastGroup.hpp" #include "../node/InetAddress.hpp" #include "../osdep/Thread.hpp" +#include "EthernetTap.hpp" namespace ZeroTier { -class WindowsEthernetTap +class WindowsEthernetTap : public EthernetTap { public: /** @@ -97,18 +98,18 @@ public: void (*handler)(void *,void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int), void *arg); - ~WindowsEthernetTap(); + virtual ~WindowsEthernetTap(); - void setEnabled(bool en); - bool enabled() const; - bool addIp(const InetAddress &ip); - bool removeIp(const InetAddress &ip); - std::vector ips() const; - void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len); - std::string deviceName() const; - void setFriendlyName(const char *friendlyName); - void scanMulticastGroups(std::vector &added,std::vector &removed); - void setMtu(unsigned int mtu); + virtual void setEnabled(bool en); + virtual bool enabled() const; + virtual bool addIp(const InetAddress &ip); + virtual bool removeIp(const InetAddress &ip); + virtual std::vector ips() const; + virtual void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len); + virtual std::string deviceName() const; + virtual void setFriendlyName(const char *friendlyName); + virtual void scanMulticastGroups(std::vector &added,std::vector &removed); + virtual void setMtu(unsigned int mtu); inline const NET_LUID &luid() const { return _deviceLuid; } inline const GUID &guid() const { return _deviceGuid; } @@ -118,7 +119,7 @@ public: void threadMain() throw(); - bool isInitialized() const { return _initialized; }; + bool isInitialized() const { return _initialized; }; private: NET_IFINDEX _getDeviceIndex(); // throws on failure