From 74c5c70ea3056c39c92263b9570da059e416f7f2 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Sun, 18 Mar 2018 11:05:00 +0100 Subject: [PATCH 1/5] Stripped unused ACL functionality --- firmware/0x00000.bin | Bin 37696 -> 35360 bytes firmware/0x10000.bin | Bin 232548 -> 229988 bytes user/acl.c | 310 ------------------------------------------- user/acl.h | 51 ------- user/config_flash.c | 100 +------------- user/config_flash.h | 5 - user/user_config.h | 5 - user/user_main.c | 273 ------------------------------------- 8 files changed, 1 insertion(+), 743 deletions(-) delete mode 100644 user/acl.c delete mode 100644 user/acl.h diff --git a/firmware/0x00000.bin b/firmware/0x00000.bin index 7f4a3e9aa2abcd25c870e01c38e5cb70010f3b8a..d8ca52edab94e5aafc835fba11da54e06f81014c 100644 GIT binary patch delta 4680 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 YLJ}ale87L_yZDcbUgvpxI`7~97iKMLjQ{`u delta 7029 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 diff --git a/firmware/0x10000.bin b/firmware/0x10000.bin index 7532e7a70f6958909a12099eb36a4dc3c9bb6cf5..b8fa86632360489e7eb491c7a10dd8755c5a5de6 100644 GIT binary patch delta 25736 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 a6HhMT4Nj8vCz+9EN@V?sdsp#e^8WxSNSe$5 delta 28349 zcmZU530zah^Z1)hUI_5Ogi9_pc_M-(mKUs|l@g*sv}y&9sD3d zL|G5C@oH^rt%@zyS_^0pE&4@jJzBMDJULv`2YBPChzU;?9A-!?(FRB zKCUnJzP`@8xQJxlTD>xWOux1Ilfi;@eTW)-sx)3rjW_l>-+;)RFjFSNIt1lLXS^Ms zmzO%@i}BfnP>WEHP?=Ny0l7v-S@w2NYm4$@ePVr+pikf4%38gP+Pb^W_$jv#8lCZt zHxcl?9^v~f_y&+SoijabfkJc!?X4|yOTt{AwTcguJ4Gk{osw{>tUQ&{~% zY=_)>1@dP@iG7mlxXj_-N?w?p`=%|9cWk$Ls=E?vgRO_!L@cLmAE?Fd{9i!<;@^Ug z;Oi*UNoF~s%)G79B7NMU4lEpf(QylbmbM-$6&+Y@z%H=x@^nOvf#enL-LlzZH+n| zWAH(6jVCACK^z?6xNTeI-qR~L%ya;oxgX(7V|j!7d&G~w)?P>v6vlCXi!-!BKm9!! z8#_{%uCgu-wG@TgjtLzVmN5~wM&ST4t+Q?QT0yKomP_8J6bgr1gpK&TOf1jJV|)_8 z=V+NT{=PfMJwdpFT5r5tUf}ycMXZgs`N4^aM=^_Y-j6?ninpVZ&*O8)VrTqWd|pA= zgDNnggq$~*dKYmoVjidAxI$l!(_#M3V7+O7woMiCMB!N7p&UZvK;c-}!IscriGrWq z!S-W^*AL2cZ;!13JefA%j7`) zNm=ya`0hc{FHiM;PaFDi5csr`V~UnCWV4+JJijVH@Uebto1^cowY(P~5W!baTIYla zNH@e*rGGr}R7*)9^xBObK6ouA0JXj5Jq^=}@du;HwOzmQ`y!uGtm>Xn! zt#7u1|EP=Y>%N_dwYvP5z6PRjeB8d=BYrseSbGMEGu*6^%7FZ)dV|igw0-$|CKD*E z9>L}N5^fS$XItMt38lH#e*&KuX7amPo@hxV3QPO;wp9ayh@;B(`GB#i{n%zrqs=4f zO9j6nsQh436E<{pVELDW9ux1;I7TyZdgiJ*Zpz*AeM5FCw2tsVak`r|NDxFZ9U(zdGUAs+YA?XCEs@Tt#h!*wtHMRm4IVdbJuox+^_D7!c5!I z^n~6juYP+xcr;yuY=)9a+rtUniQ^wzSZb!i zk`!d4sRPN*d$wz-eSIz6{O;$-0a*%5gx}q3IMmF3HYx2TPe)fj>qNg%BInpqJ~_<_ zs)tCq@|NvE`f3F~+TT_%@qLu-*~HmCmci|72#zDpXy?p!&hmPDTi&D)!hdJmJSm*; zyKFU+610v#e5>`)peK#elY}B4OOq||og%XMUil~QyhnUdSf8pUk_JTN1Rr5juo;BrD1uQBLp8k=7RNk{~crTb-xo7+4y^UUoQ;Dz%&B6Bj z<>ND#DO4sLquIA@f4={-!jkS+UXxv-RORAGIeM>r{JaAY;^-Bu@6__Z99YA1W__^H zK48E$Z=4a9p26kPhdM&|)8)e#jv++cXxp7LTy0sV5eUD|-{zh>s-0!6f8syP-Zmmf z^`GT4a|3|fy;ok47YyXkblcYaWvYljo$+^@Y{o^s6?~SjZRVm;r0~A2X3=6F>rnsy z)|z#Qzir%NG(Hx8+s(yWN$CCZW!4NJO-;531u^{MFjLt5@@`9l!6V|nGrkGisaae; zwD3cK#kLbmH>(C??#}z=Gnb78(%fV_vAj#D)ze=v^7xbP@bDM1toV~}!JiU`yMMW7 z(JM;Q*i>#V-VJ2iz48aE^~AuBY-jMY?CX^8)w|aeZ+t!0(ctB{i$9k9jt}hIgBkE( z26-B1XveScvzgW;EBHZvwl!;hMj@uHjmO{5*FIA?UTRnVX=xECECc*(J=gufgy*cb zXX_kj-ECFt*SK55OeTa>t8M&-bHs72yw}Ee6r}dPZS&?qu0E^0U;gLjS`y*N*4C~* zzol`nI?tyn+N+7<>{zcJ;V8D3D+n{`5bE!jU*0kSprHJZ=!E~Zp_$1ALx zylj*APEc4^dD)KdeFDqNtM}dVQ1C-Kl<)f9%46Di^>2%#K)hfeo(R0&kY2I zmFJz`=Aq)AU`IVE@Ai8EkoqUKeb=)*Oi!Khi3r1<*}C7zCvzLi_uVK3)gH_WeOf;B zRxdYxd6>z*+_vn`gQ}vn&iIJ+<%9m3NMN~b_x%Y$*3Y~bwo6JLohFbtA>HeCVZu^) zDZ{bU-4^~}sKUC~-8SdJ8igg#-RAxG;~=DT{cpW#2WrYE7nem$YjEk}ipo1a?1O&D zW!u<)x~MHng3t=B4YDoyXMw_+B-m7s))4-1dD){#9<^5Ue5*PS(edZ$N+pE1xA5M2W2GpbvsnJ&-%}d|OAjy0O9K5-2_3@u zBktDMJgO8w@SL|n;IBWf)mm*{FDxF%DbdC(zDvD%*h+*(x{rss#QLBjN(Cc>d{59-@x~2NEBfh zLMB2kLNS6JVGlwR`XX2GSyx6AJt2!&kI{pkFhON?3v|p7D>?~~iM?@{uJ(eUV7{kM z+89~AdWwq6%+5-43m>Jb>lKm5_x7Pjz2Jhv(cOpIypWscS+QC3#Ev0kX!DM3n ztKv#KNCwlpVJ5vSW8b&~ym1JPw{cT4Hdh4i1i<}sUG z9P8)>be0xk$gqv{6D>55)Qxn$51jJN#a1KPhE-r7VFvvm5C)OOw`g@Be5aj(9fnYe zU`I%uQL!=zdJ)#cB>0t!A6&rnNVrS?V{GMw8G^TN4 z8o28nYg9u>EJSGeRlamvXLvJsz2wbHc&t=k{UEz>|e?wLAPgl5!u9rbiFGoV0!qHz(J9dM26nv3CE$9ZX zC>)FY>EUh=t+wX+qYVh~uXxlA#)B^(5m2jb8>-W>xqaKqbaE8*flRtJ3I-?~9Rujy zD8L0NBtZ4I%mpG&|BV&l1`xr|606Se@e)M7z|HZon_hloiB!{Z-QgYgOq|gO{WB|0 zbcbMt$02khjw00FsrXZZtqP*qTv750bi^JilB>-5+BJ0|Hz>a5+9;#5V+YH z@9D{L?GWmxSEyctQXqR8D>lc&V1>dO?p|@v3=;{Nd#fVFf|D(HG&(0aUL3aw!HO^r z)2RrPZdJUN1ZMQ{8!Pe$0>PnU@uN!y!M6%aZ$H}aby!LY|EM_iIucP>f|PXIPz8A<&<{r1*C~w~hvfsH81J;h2J7p{B>)zyWW4O64~o&dX|5ZyEBX;9fFln&UDZ zI1I+{j$hS|^YqhU&`2yb6|0k>2RcSO>9OH(pA_Aq2S>nGl@?pNtBj_PgaJG%(4I+m zkAz={-{y*Cqu^DQJAaKwXV@{!m!292FS}bWv!rE+FIBw_og=ftOy?D0rm{YI)0u9f z>HIj+)R#vy{kCY*;?kwVauY&k7EO5@_7jJbs>egThIjhRIxJ_oaRKdlgExPZzBwKa z5bJ%aoq%0!Rr=EI6Cl!^zu!TO;w<1xQzt-bj{Oa$1S}BOAPsi17ar*@J@ZL^y;Hiv)-1G;Eo@ zpgsMQd|YqtFzq&+B<@luxu+OlbT=pkUwAB6a-7-FUAiv|WT3+8O)jE)U=2ow?zpq@ z@l^?E1rqMaVyJSoa&C^_*c2h4>nkMP&Pg}r`56(4SvTbnajsjWVvKUCpFxQ8u5@c_ zSz~Jy1?v~1K>HD*nb!8YwB|SMxSnb35(y+!u*;nV#whH5L z_f@^+lICukH2*D3W2-QY|1FFcYUqV9t!nO%0%RLpS~;#iN%YO~1?_oa5ZonbM};&9 z4Gfc5Y31>&?)NX8zFqZnZwlc~l7LsJDGh?%_IYG^lYlpAS{e+3M7k>ty5|&laFf@z z6TM-Vk2r)2`7`8Fq8rC$Sk=cm1bALbRC3&#z18_xaw!owE``0Mctgmaqjvm_2?Kwu zLsYuJm4!!V*+bInem?FtAV6zS3H}ABxVKdyb;maSmPj~*QUzR!8S&NkYpAw8EbB;QVOpY;?~d`}5am}Ud=-9#_WSbe(e zr?Pz^Zwsm{o(st^9y`5)-=qo|SyVpin6m(dY(V6;bOrkE5?E}WPj}%aL zE>ei}R?n(UJD=Q`@I>;d(xE4yM!{!1XG1^NfWBZS$Hf){2#P2r4BUf!q$hI16WIWc zTp1%nX+g$>R4iU(Oqgo%b`pK35_|3jUoG<}V%y8{b`-rYc5vl$x;q_AG3Ppn9cNb8 zX}TJIt?|b;2^|^+_qC2~zIw?i3Vn^;U+yh6B(zJCev}3#Cwz2!V1nf&)lY;#kL?|- zDb4y{Wb40ZzloraKZ-+l9m1~JVWu?*W%zy?VK8IXt!*?_J;I2XQQ$6Ub)BQ#rQ4v> zWs8Hk(-ls-Z6d_vSi+w(Eri7MCRcYjBfLwEP*<(LBEzsxv89%<=MmnXVx;#~$G^*d zkzpV!vx;qHVuxu)yQXW5uUX&(MK3>IYLJZz4!(CH*6Df~`!*n-<8R5hpT?ocw<9S6 zXWq70e?m42_DREf*l>$2_=6iwn*_cdH?avSRQ{0X^rJ}-q_Iqp6CTTPf>@=qj+d)u z(@!TsbWR`>fl1DZO#2Ss7X5YETEKoC51eKp!-#=BJ7?-_v-D_b?UQPK#|^Gt;hwB; z#tYcTIs^f?Bt7uSt-=ifJ{Kb-p$3caxdveug02Yn>j;Ms&L9-6$U)U3kxA}y{AF*B z+k@}*2dY`K~s#h5Ojs;NaWzllK^y6aDYYQaxw+e*$4{|79)gWUJ*XmAZ$mdL@)R#!cKhO zgKz-hD8hM!D+rp^SO=j8LSKZz2qO@(5f&g+;`myO&owNK9h6gsFMAO7BOF4gM7V-* z7oizJC_zaPq7nKd3`Q7-Fa;qKVKIUo;Q&G{!W9J0hC(2OVap@%8H->-7>zIqVFAKA zgzYwGPW&N!If`%{p%LK;g5Mfvd>}#uLK4C-giM5Ngf$3d2)huz!Qr(ZpGOe};CmfD z&m#zEgVo(NCe2Trsec!ZsqZ|EsrV{x47+irCkRnmmm#~5d^%^YT(U#=RB9m+UhcDw zr(H`^7Hcb^iJ75$1cz#MgEH1@2<`~sF3U4l>5SV)2>hM9eR>##(Eceyxs(K*b%lJ7 zT&&i2ai*~H?GdEUD}tY}BW3V*(6iZ-Sf=0_qWq=txU#}rmNV)BFTEv;IXD?!l93Nz zAWLJ|i?y38X_ci>u4E+pwJesU;jUzaE4fIPhOrk%S64D$mWH~L;jUz!T#$>-04EJ( z?8dp+`SAJyvLi>v-_t8wsx0!=L|Jz!H%AndINehONEb+!pb*i`7x*i$=_0j^yk35{ zjMAGPa3;N6@Y89#sSxCT#fd5qPDt0NG!;aD zhu|VGSKgHS)NqooI$P( z)xGV7Y%ESDgk!WU1-Iy5Ybo?iQcUql4s3}avtDhn7lL%aIhvpArt6kq8kAtq08^4q zm!V_wJ!2IuBW3>Q7PCD)+y`Uxlf|5Br_nxB*Uu(>;VOROYT|I2-~U|N=^Vl)5&zi5 zFN;4jEy4JD zop!yxL=Bad(t4>xP1Yyms})O=E%#guljO?EhZqt{>ac>uF*S`+Ki7ZJY!nS=7jdH4 z{jA8t2%M$Z|%_J1doj1rP)rH#yYFWr+^YE%b8{0K1DIwH>q=M z%>25k!kEy3QN8<~By6LR0HcT^ef!bijMOOmdEEW9G!mRferzQig1imh(ABMu&YB4}ccH)pQvBE>5^ae}BvBa(i(h%2p>g`H3NP}2WPnO8vp%G$&3wx_~ z`6TuwuCW=ZOypV1g@E9ZQ~4ZpAG0tK5j-bxcX*o$ks*gZRIh+xx#pp~A2P%a38K0k(y3Y0n(O=?NSKMGUimpk{7ED}oC5#1kK=47f z>F1RBJN%5{ubRXAq=fg@6y~OfM_xkK zz)AO5g0FU}?&e_X4x{}eqkXsJlkT3 z)n%-AxdqR);Cohaln>nO?vQ?ENY+D6>+$A-pFuj$2!HJ=&vy^+7>WkI<__dzBhS0W zlf9)f2hGrz4CCTH>FRSqX;7H^eF>ddcS$E)EGwL9?DMcLeU$%hNC7w^!x6e_6o2)iIU45(nqy^HL0M;qb zr0p(>Upi|jNLv}bIjzD%g1tquw+Q~o5Mz>#&z*^@&|{U#7|zTb7m_)hO|>nu8OPEY z9RC4QDQoUzS0VApc#RZv!zEPU7|vI2b%< z29K=XzP($o;KHfAU^sECx7v*3tACQxWU$9FD__AHfcU{9N3%#p&YNGVr3Edpmt}`s zy0xi3y-Fv2(2PS>|GarnB5!vxJ?oz|OS78IhW7l&&V)J7rCBf9lfiFx*1QGM3?}cZ zOx`#$YM(m%wajY!_7f+~b`$1rWWbAn^?C+Bd2!8{RHt^W~n z<$noj5SWM~T43o55l=G_hqy#M(`-u2b*yzJGLJ=H-z+6DAsuU+(je9ymNm|r9v~$# z;ry6z7fVD#d+=ee35n08el0m-{|rQQtajFP0|{*#jz_vksY8)a5iqg^w&a_+lwwnB1P z&hrHi2l7%xOLFJuSke5BfnVxORO0|)lH6u^IHE;+hc`t*(z%A%5@#X@Tw1_$sYA;c zRhmDmH-t~gFj%e5nx~u;$Xa{B#i2xngTrOK+e__SoPT2Z7fX^2t$e+6T9Wxz#@(%X z&cr)hE8`#km$8a5w&pk!uW?*jr{|J_F@F54jd6GWBWKO8oaAgq#^14;cYX3*lUx+r z!vU6&faB+Bv)G?mc>Y6YVmS|MgiyL34G=RH?BU$v8f6)*Qw_4-(PA=2jYRRSnNV6=LYLt}$xd`oWWDNE(wF zJ{X#QYDSsP;H+*BHWvfkLvdWrv`|IYaxdvDBWa!GO#B=r%kWVO#M<;!6wU~KM!V9H zi+=4HJOzg9jG$E4Y!02q@Mk&`HzU4O>k?w2O9-M!K|Vjb_{?kLgHA|NOTuW@h|ixT zjKoGvkq)^y=1gp1 zHFb9VLR~}B57rE4;zvw?U9A4wF8)5O&#Q4oifS({Y=$4$ARU6iy5!|(qZm)~JJI|^ zXJRJDAxe&;SAZ^GSGD+=w7EIg#HiTs?!`59WW_KT7u>iV{ivU z6Vn+(8)KNz%8<`ThUZ-j)0$!1zZt&wOj_Q`P~yiq6GylhI-&zskkwP4Nmf>rn`6rU z55K9Bb&RuM5Yp$Qk6bE^baALA{~jBTC{}&UGii>i`v256Iz~EGuVUR-ITu$5; zr!ag-JAr_ORluF;2JQbJ)8e@BnWVtOnRujy6Q+l+Bsm3cPSsB>(uL=^8l7Uy(MKZA zM7*6OHL<+oEH7Z|s)8X-4)gwCc}HD&4aEgXPU$z6QQ2Ct;9*NmOADf9V@$iglPmZX zi$Pr$O%3n&>Z9Rq;l4>K7VvoVey?f~%txN*U>p@EmdUsX8~-=ko}51ayr>AHMMXyR zr*{Pj1fxX-N_3)uSIVsA`r9%r*@~F|6{9|n(TGBXxd@dAwFq1_aJ#a@Oga=qjeofq zUdhFDUjz=J@_jrZ%fX){1V4l`DD{4XH3-EBb(2Jsa;|8~MPkFEG^SyLInx4+Vg|mX zF@=S(*41BFo%YYO(~q9H?>)ZdcHYxj7zs?|j6*mn@44WeJnwnJ+~>Cy(gk@O#;?ct zO6O$PY$tB#;5U}4a(@;nz$NzD z`a4=kYNvO|xb1e#LI?i2{)i0mOg~ktpEBF%id#z?pBucd_2c+Ocn`&z&k3Rhe~f%i zKBqq*!%0TYWhmVY-qtNo@m0!uni6F&M|B^gkanP?XeVQQgnojbHTs1$-1d~!ii*CP z|Ew-wzf+F%uHo=6(pxY(5}%90ZfU!$6N{sb#eMp|9wYehxh z{)SHBA2*9pQrR_&>UnyUloAzVjxxr9K&HYN{Xnhty%xL`;O+QV5VlQFio%!XerTa* z=vT_1V$IaAkU{BsSuO){y)2VK-olEO%FyC^DU{*4>!m=3r>+;P43D-{jz^@$GCXu; zEt27Z>m^TyCiWr_NAc4{T#Px6--ChK2J5zGRSTX;^JP@58P|i?w<8vAwYEGIlo-7H z+QmIvPRPcXu;9;sK_`3wM)e0_rV$9ybo~b~&G%~;Wuc%4m+`fy{;CXnw^Rho0Rwpn z<-uqVx-y|AZs?Y`NvkyKy#}w^E$3G^<~^C!c3H&l13GgaL=w#wx_%yrUQ4cG#ZUsj zG~$z9oeL6uIuD|94l{yZL|qZJZ1JjRoh+S_LrJBMyRCo>R!e;!ssDG(p5wSP80RY< z;<^UmF5x1avCm8YT!ssF#1{z8K|#?Pvlo2S7%a!zs2q1duQ5ejmg6-D-2S6V9ml28 z?eoD*`d+1t^C8-EHme?on^j99?ffB_d`|5&S#&7MKqk*9UW@O&iHlbn1_q}fOhQQAO#l24dXsxsXygJs?ECEsOvFSiYcn&m z8?@?bt;aqH6v(5b#4QbS=;dXfmw0gWwcfdfO_hz>+?AE}h1#6r+fBJE?N=*hQ;glcea@f1si!0|!-__qUU6W1@Tql#kfTw-2A@6YAS5n9smFuYO#VZ9t4i&0AdG z;R9kw%@{6=@0`weG4rC456hjS&CSr72I!DMZnhSgnUWHaAIr(mnM@B;Qy=2`z)5b{ zcS(v6#xDn3r5d7=mdm=B+!6&B@U8oQM#6`3mYu_)kgxD73S6?`{X)gAq#jvi%u@J=h>;WBZp|!Eaa`AcyCHLM=+RG!>att_+(P#n)DS1Q>4(et zA{UUPe87iX<2xB$GKqZ0241(1?@+?)b7gJrpITjaU35GXk$YR4`yJ>;>T=gZbYGpl zn=blQ-LNq^x=J;t%hI_`ZYLdiVsL9y3y(ac!~aPGrVAKf@_+pVc5D}lry@}ZxX`)p z?VT{n#!1g)>jy0b?Kv)a_6gJ6*~2Dja(h5@FCF#?_R_Es8XOP9Vsdn4F@iFre^ZRs zWXc}ZPY(TiKunOShpsms^=ncImjF0> zqD>D+E#@RV`kL8-HW@|XXSTeUKe%oAufvTTcDfOZ71VRfdOArSW{)bR##Y= zQl*J5+>_#%f2~$iZRb+bBE?fp##0ZI6tNhroNc)$8#{97)f5Md)`zlq>WT4Gb8A_u z^$%IpM;bc<|F>-PR;E;?rrV3nRkKTu;7&>toUxD(_+63W&F`(36YAw*cBTDw8#)48 zPRYZPmBaejQuL9%^ut|sINLc8O+^l0+_~Ev_lHG19)iaSkiQwlVOIkMrNxuSqyInUT5Vkx*mq#Q;{dc>uF+s!9l~N1qqcx< z{s@A}%+2)RM-WOfHq-MTL3H~l)-q`SG2y1&Ej9?!RkX!$&`vw$KzFYYR%kuQ)jXA> z=hCq`@KW-tjPV6N{stWHsS@6=A%kYd5x_WanJ(~la(>fe+`3rxs%<~Bup~29|UZ()@F4}c7gqwA4 zGZ`Sjb(UExH72X|KI}|d=%BhG>(|L}g%voy;8aaAhwizl#gj{XAaf>ceG)<}N}mhS z;ZHXqS`FbW=Vkq0=EADPh|6!p76ybTDb^%Xd|zo2tvM~u+H(qol2K$lwS;S{eESVVcM4!Tg_zFQoQ|g zJfr&NUOb2$6lsdMY|og-atgv?=qK`Ba13y^3hGyx)@$2J>I9^EQavF z-J1~i+RM4dEm2)#NI@hg1PFXW%O(17F+_UJWwotFBKW|?tF)UHov*c<=ol-+c*b60 zgk{`fY@*bP7x0FDOpjaP^|!li#N%Jo?E!3~9iMv;Dp?w@K)Kp{TRN`2fEPDTd&^h% zUT!8Bi66(BW$;e8FNfL$f8z)aAAayA%f)X<1U_ZRiIgFAkXuG)72q71TSiwGfNz|I zAzbOMGungDQ}*9`UJl)`^(_ueEMK%wvh>8cP(9>?{;UjB${4XTI3aKimtayEy;=b6 zgQD9=nC*am=@DipjKes1X%p2hfzCNc?XHe$NK=qBIDOKISA-f2K2<)O>KiIian(_| zeRb#d%t8GOWlkdAua02d^*T#nxuo7??3^o}JXLw5l3WZVm1nx{8KD0IjSF}%#>Q=p zm4-^O`V>6d$f_&jh~OUqpk#%x&q>RdfIs={B0aGLUWU2!*%G{~a-Fp#0)%aXa#q^* zDJKR0%naSslkgkMXCHK&92TjCUsy^s_#z89@n6KX@G~n>pX7Rng~x>9<%J;vv@itB zS{fD}tJNQIN=KaLt+U{Ri;SWy>v>tH)0|87hqE$AKP|+sJfb$zn}uME%ti&}wOuy7 zpg*p?EnTax z)(wm1H12g^VLbF3WiXe~JS*tOk*;8o4rb zWiQe@TWIIypeG&hBJgt1d7GI4;#W@N?)X_n+i3Q37#iB$)o_o!$(OcH@AH}Gzi&k1 zwFx`Dyc_~eO$;^_l9%zR+>7 z1MGk-x7B^N$%Fsae+(M_VK*QSOSGsux^a}ozRY%u5p)vVM zTAP8_UzFkfjr6Y-aE^4}Kxgr&+zWdGb+n-jJ}yF23d32uAQV7$;GX+LK-}hb9Gj2Wou@pLVt1S^t`%&7X z7&oimB$|phi>8Mki>6q+XgYupQ7W2t?hsA5VfUf%iux<2&b(4PeS^aAzUy3lG_F~~ z&l8of)|CPoLqeEZ?MkUy&=JJcN>>WE@cj}_$-*lTevw|LFk5qB9g`}pO{#P2=)`r< zEr*Z1DW<6}68#U)q{?UJPp85A=Ua7+(KMqyFv2G?8Jf3ZR;V>8uW(lW2+x!e9@1Ys zlJD(E@)@Jz}KBh?sLta&spwg%GEbn)?8)r91Ttbe4VFE z{$5VIhPhN&51m4@=t6abc_~;n-5#B%r|V+ZB9id#0xs?T7CK-(EDOW|*LtrXT|U@O zQ5=1jXVQa@>FxCp;r;JY^eWa;+GzvcR)+KR-3{24f1jgUHb7?1SXSvp*R?IjaOP=j z<++JkVUn>j4nmmXZ~|)*UG`9y{Q^502TZHWQv39{mT<3}B!@WgVfw^aLANMExT0cc z$I=2Rz$=N-Ml%PVEFC9=nz2t#uJ^{ozYSWgoo?O;!9gudrX)!IT~1Pt?Qc|ao-xM$ z96X`)^hR80?og^JgTkD?$iE5OsF{xeA_Nlx8|hkiybr7Qy>NE{{NPfF_5yPra4|pR zO8zaQSApTi{@vk5DRN2-<(P|ijlGAXzZ;b<-Np-e-Ft-&%LonA!v*-#RZl)IB|US| z`JAN_^_FM+X|4u${n+3q=iBuE=sfx!=sTp?0k$wa^g67kxP+h49k1@+ojD%0jFZdp z07of(dlS6jF#_8%4CSw%N59zw2L0^Tnz`0+E_SdUBLls|U^A;G%*Lf5p>Z=+ZicQQ zYg}2XsdfL>A(Hb>kYOQ9Bzj|SB-d`HOE=@{`+h0?WHX4Q z=nHycGemn-yL!tfVJ9;97<3-YO^ro2_2>=S{bLA@I(`;Opv5uPLqfngeUInnFpMvA z<}iivNG^VNY~Gp;^Uotr+T`;z`(x;v*`50b{ zzV2!Rfl!9%Sj-s(LxyjW5Re>o4u`wBi#4@Bn;hnMT;A)h%XFw626WoEZd4C`*eg17 zXTU<79HKZNR)Ky3-`R8Zfl|8PjvuTPtfRN>XivwUrEXiGZ|6a6(p#Hk{k?Oro^jUy zaZc*-w5`KROKHXyh$S&+seKC!C$mcFKU-j2lv`WH)oY(@-Od#kYwYWFTX)CX*K10q zE7QW(p$Pfm1M;WCti)2fa4T3Mdzaq1Tb1pMBas4zg`appbSWY==-S-s#F$pMI`=I7 zV=KDV&)DM1566fSjQ@q|x8eRPpp?dKgOEta&sfx^a-XyM=x0gF2$Iy}Kl+|?4iUh! zl;&-N@j3UHkw7m?-?X-`u3J>sXi|Vi!v`XMK`bHPF`o577nZi);BL>rW1bs&1CSJxss2H)zVD*K4ceXL)@h`sPle__Q58mz;O z(S(Kj>-Bq_(jN2|`$6u{bmn%5@oJlzdRz~y*3#YEA*9#TwszrVqcWr3=9Fw$V?0c3 z%jWQ`JxY1&M(X1mZ{taa^(YtaGXi$3E!_d5Jl8Ugcz+J2P@1*_BIEX))gOO6>xi84 z3FlU^F73;+Zaqt8IW~+Q><*bDHDd-(E_TcN*M?lHZt36>p*u9UWCRU#81dZuEG%40 zkL`d?!m+cG_K9nHzrU6~*a4~Scb$bXjFJBHv(n#>+lI)1#WoJ^7-PzPS?; zwKyGgoN*q)lU$VUF{_CqHG=<^vK{5=cTWfp^Oz>iO&9} zGbuPL>krHLnK$+Q9A1ha&zR~zlM~W$*UdJA1lNwSE=k(_+U+P~>rymU7CAjTg+>MG z(cytN*3gBYLl_ybhHm>DdieJK?-n%S2SZKs>7CCZt;b-OXsy1#aHQs;oVm>z|I^o^ zNtdKCHNV!XOf3Y;gzFs%8Jb=otf4tyKnLFoYq#3p-} z*(%o8tV+R28TPRkTwu%ocY*!VRql}CbM}(1=Vq;u)5E#UjNB9z=Q%P3FHdZ@QQemi z7PNt3?1a6G<((b}Ss2}OJ;uXft&P6@CG705|BGS6Mr3B|>~pl4BXwg`HIL<7)aG3L zzZcmklX+)o=5Fv0S!7S*Gy7{=jr>5~qT*`YxQx(H=x3vLL?H1tTCp1p0c{Oa@#jcMIb`fNA68hfe%#lfkC!KQ2Y!~20}RzTNw5Xi)gSP)wVH<>!Y zpQZ7*^g2uBdD!TTuh7!E+vw7-Ad1K(wBjomW4cw+ij~i>s_wPGb(XPJi1Yk>>)<%S zNA;JSVXV-9DT5a)fM472KXCClUqXlNfkKiyiT<(&()~ubK0Rq-TVdvy6q$h{#$H%S zvP_eTm?T;5wCH~=c98&nXPKuo~ zM=A9fb;Uw+YoTS-AF5wvjx(*J%l4xMJG6mT><1G8N}ukBh)_Gz_T7B501=YdAd6z` zfRd01c&RU}x6!z-QR6FZ^xdyfh_tDuzb`UWO+7*mWDL~oU`jB~^*@}`w$m2nS-a9N|dw3($e zq5|H~4ljLRdEMN_w|W$p(#4N|bek4dK$lk%OOxH3)4z&sElhut65b@Stw1e<&_-w}kv zQCR~NX*Fw8HgS2!*JjxPZC1)CE}?cUt^5|EI=;^og#ln2+g2%B$38j*u3g=XV(M`a z9jG@}(f$V^f>>73nFpbxs%*H%GuHiqQU<# z6GC6}3_o)<_Yot~BlYmzDthb?9@l=giat05V(_O7#UQAmw$<{Zs@Svw`zqS~dl19d z{eR^I1N+%u?<2OYgjG0eM-QPh55qLoCwFm4d7WN9 zjFI_i>uBl^Fo29+M?d=k{n3Xj>E$1wGr7BxDk@0CB-}UN7>RE-8Yse`YTLmLX{dT&t3a0UYt=+qBbwx`R^iu>MNYewK*un9Fi!eJ*&^O4SV6SRD3#uEuo}`^ma9J1pe>Kpu z97_Z*)e|%Z`t7nvlwM6|cVKWE`4oRhH`GF$_f3X_v3@-+X}>S0H)^4`!fJa$^~d2| zVqHmB9tZpv3k6T;U&rAUe(yf%ts)wE0!m0$J^lU!boYB_J?bc>vo&=j+YY2mv?fek zPvsL3M6&nM;2+VB&)7$M{)hu>!ah3vN6a6yk1qKUx^#cE3|WVW|8`r}b-_U37x>N0 zX$*oj;BhxTD=*-;GH-CEDU<0hKSF;JiXoOdm}h8NCk#S%>ryM%Gp8S4*Qe(Fy>8Y+ z=JQWU&CSqYs1;wQrY1M7qcwGqK<*V&_mi-l94)3_odiAkwwN}Ygzny{$kJts1%*C+ zIrTmT`cB)5u`Y~WzAv>v=!UN)T`#wCDVcmZuV@_|dI~Jz$;DX;MT!E_6h zL2~B+m!U=8vxY3goU~rc>9?ogqmJ#DH~S(TqqvHT(Xf~FRf#IR^xMNgWpv-aAktG_H4By{H^^ysm(iR5!n2D5%jh@tu$q(>(SfHi1eLUu zo;wZSlX**NX#*@Fj|yq0pI{k@T1vn839XENDLwNOei-aelRK}X#xu}0I%t)kM%NYZ z56rr>a!UtU@K2~{K?Ni!(I@TC@7?80u34IN6ooWrEP~fp)1_x%iRSq#Xl9dm!7VIE z+q9JGe#S7{Z!4+kXUI?&txSF-=gnVAcmE7Y@QpMW-&Vy5Q3PfbVs7Ln*H?;) z)%YGKM8K3y<}DNEs`4s|Gtr;A1t43AqE7BJAS3itOB zOR+@oI3IN(;lQ93-$s45qBa4-SY|{keV6%2DvJnJ4|ey7Rl=s?nm8_FVrEo6lW@UQ zK<5Xsnbhi5sdL~p{0}|nz%QpaD`}JSEHgtd?{{6-BjBmJ z>NC97!x+&j!FrZtM+|MIrA_GZF5K0ua7&zgz~kG{qT?R0lBHGbUjW#z z;u68^&2Q+F|qavY)J}_~Ih;0y4RPUcZD> zc3c6~T!y=3^9|~}46pi)`ms{SrHf}WGuV7jPd}49XDuD_8y*x-T0yga!$55BAL&=W z!40?YjY1YUPtc85@UT*`fa7 znoEs0;1`dzO`_>RSlzL@?RjVA)w^ox@3&zy*|Ll-x&tf7x*OEz52z)E zT6*yhF!}y*oteukBu!PF=9a%5&l_s#%Xc9;x&r^fiY(_iIgX2#W%&v|L-F}9dE6m7+!k}Uy>U+ z^xk9Kx_?thRZn0nQRdS0C+Ki|R9JES3Ctu!Z>1xi!$VRxj}B^vY`>IRq#BvrJ7Kgw zNs8kQN*G#88=B!|KeMZ3b?>~JtjUQz0V!9cQcM9L6OE-zdw5Q&^#xHg_dlA48Ur;+)p5bUMu>tEj?8$eZ#T{-jy zT}H@Tr0YU@i;$N|@Io4>z*^o5>FWxzmt0*yoeB~_eqBHVl;mx4WC5M6BrkWUSb&mu zYbX4ks{>txR2frQFIGm2`ElN`X92BJlCI>J>lJsDL`%r+4HYdaG66j5k@=Y^bh0NIN%mc* zhds&g?l@)_;sMH)-k@*6QxSHKa+1HKoRF z{$v{Ywt#N%CzHt9gQWpv40&T-#ajV{2lDDcn%r~GMGfquP_G_JiPI9am0HR!eW634NKMhDUZs1j{ikdf$={c zJY5(>SmeS`&!wdyB-;3V4wLjn?h}?uJS&e%{Ri`WUG@HUVZ5OH*BtsJgy1dA8`K<1 z=923N=%G*&O>{TtpP^)?uRD%WZZ11=K^vz$o~-|^g1*-QNB$=(=&26aH>k(kL`+zoajp??1yW&-)Z?1k)ExS;o}QQy%%ok(!Xbe4m@HXc2| zR9C49N9o>y-)()Vet}WG@1T0Q?vm#b&oMd&IsAkthE->osY!&aQ zcDg}7=|skQM4-ss5Tb5Wc<9Jh5_k#c81{N=8%P5-Lt5~ls@+_ARKzLun~iqqOnxTj z1+=*{sU-h=OAm*U?!-EW{uxFVxBrt(#*)saHjj6rDesm%>!%fTX%{j;)F2;O&TQU4 zU1LHo^2J84nZ;Q2csZv39QvRO*-T2mrvI<2=M0GI*qS-RqTm9{s@MqGT@V(ecMxPj zP_Q6K5yZlRL5hG;*NJ{muoS z-^=?k?47x1X70?KHZ$iOmfL}^)%+5vWZGNtMBBq|&hYfHvBj&Ols?mhyT!~VGPEOV znqGn?_Cz(v6sMmj|@0x9(Svdub)Nlf- zrsFv^^n`aa@QxY^T@KVwyH!WuIof`ec7Oexc##u@+OJLtlNp3rM29INEjHHIQ(1*Q zE;HJVl@2fyj<3Wnj>KHA?m`boNP)SPxY7}V!L1N~cLXKa7vf7tNQ0g8ar^+-2a{(C zy`6v}r0Mc8&zS&9^KrQ|*g<~2u-_R>82m`sebr9^mm$`w2ybO!2OVTkE>g(7U)DAKks{(+<2h}~WJL)hj9OS&3W z(L_w0MTWH?Kw2KY@FzMQornGbupa7)@p1rt&xAaD9YCCUmN0rCi3n)T#Rq`|zcXLh z5(GXBDvR*OAPDv>D)KXo_Eh*A9{9oP_915r)sbe_J(rN6Dd>@+sqlQ1(@h%-h2oiX z1v3|mwZ(HWCK!}5F6QW{jts0LZ8SgqAyfpzXy$T(##Kv9{i!*r4`t%HQSEuH{E4;) zXk`xPk{+jOEstm|ZfU#UH$2?7M}QFM#$Zj3U>*v)7&ztN;laex9rxg!!7$0>AhmXY z(#?mpL%<29 zl?V+(U<8xU$J{JK%LsS}m$K0^l4kp4HV%t~rEE4{iG-iv^L$)842mEzdyB7$!8-9O4E(2DdhX&3sR)-#ieH>JN^_P4%#^(+y@ zZv6)nfc*6JF<;*ZIXM&WCxA<_ht-zUG6}JlFyB zANjaH1J5Rs7_P{|*NKobd&NJRSSsckuj&&HwSTBz`H%Vw#N3eI^uT@6W!4{n%KrgW zCgzMz>Jy@$d=SDjIw1b@twmyP{$V{gn9+uJlOS$Te189PV)>^x{g&9QQ;mt zoxzXdl%Mn(*0VFlKP}6I`7^BI8hbXRQrs zolV-7=z7-Loaxzxf z%0f10VRja2S2{~vp9Q^*DXx!GYD)oyR!81Qbv(QP^4n5`aRwfh+}I_CNx&o8#f|kL z4*0PipI5*BHYlyIOrPgbBCHXABTe%f`ieQ zbb&ap67v_*2Ba+=Pc06_;C@1Hi4DZf@>9oGYGB5>5E}4 z^s5%+OMs42?8oBprNjk$j>Q#AiGEGS;(?{027|Hq=Tg!L?r>#1DbyFb@ ztA>XXdOT2wgO))7Y@3ANFN0<%O%j$Y2NwozN%+$W7$)m6i6((=`OXKKT7|JSOR)D! zSZ_u(cTi*BQ;MT0IJy#$OV-@M@vGo0msH(Bm(_3vREhX@HFe)35xtQJvR5M7)Ib$H z9fP}T;Cq-?B&4qa52E9CVeMKN#i0KfJZ#3hyWlG9E5+p9aDm|6_P`|=St=NRPq+>ZGjTvYgfNMaQx8uWG)%@+0fu}u zt^>cx;*qStT%R>tsPjdiv=)Bfko8Z-1_34;#SzGqBj~Xg(m!@OYNJ_KEYoCA3Zx{X zWNT!Ql1MO0^8^(3(w?Cq2QTj>WP2QsuKNgcj*Pi2<<2`&9NN{PMnLhycg%~-fF@BlcI#v3PO9fae|sNrrm_W@CY-_JBg zxHb~a4nr@CGl?B|v<}22vt^kH=yMpd!FMihK1^!7?uKycFlfZqq(`AQ4SpZm9V4ty zX~(t4;1`;#)CNfClhHXB%@!@7+)h)XP8CB?vQ1;~Tm#JRCV}gRex2JbkSXIaxe;jB z*^VWRpoNSPLQ5lfGn(A)$Kl@$UT$7}5|;4rpIUI)NmvBCH>1@l*bdIa@x&=;>GemE z+h`fxPAJqNw1si=kh$3^+#e_6!PBtcZ0;}`OpxhYD1E|iM5FEuJhm>blETpMp;1M) z4WsD*tsaaN26H^wkS+%9al>%sSrQL%MR@Nl)buqF>nDcv%Tw$sOi3wpmPj{ehU|-B zNzu6BS6J>dg+}S#VRCL|XzbqbQ2+j{q?*dNZ`-!5ihge{co%$~(n5NkM`=zwrZ+)W z--gKI9^Euy)zNX}nq=t_ZxGU=_ed~^`8g8rHo*m06p4qS<7-+<-DJ?Z_qsrwUfCdPxeq#7i~CbOyAeeLayQEi zP`N+UD~=bELHm^`T=P5a^t3f-d6D`X6@kMq5~jsR;EIdj4=xdS_9A3LR0R58B8=Qr zi(@ZAqM79SU-nkc$E68QZ%dLz6kxU5=%Z_Donfz z6-?ygQ;3QEbq&sgP9gl*0y~Xh!g?XQ4f>eC%66Rp0P=d@5)VT@T~@R4uY)r6$3b1L zsG6bZmoX~@eWoZ5E*f*PAf)I z1nrL85{^U);?bPvnwgAKQutsh_h|1K?eomjMKJ%1@ zF`Gg7P!Im{9{*D=8?-8b|6o-8g2D~HsBh=RY=ES_HC^7FyrgCB3fp%gza%4tgEO6rAUl{YREEf;#7^RUB^+g8N zV$?mhaG)^OgqwopF9GzDOdCzfSci@b)S^+~kpP?}<&%{wX)xkuM0xnFo+96ZmY?6O zr*Pf6nr8QxmxnLDtv2;z3Qsq+g*`VScQq!dx{c3G`68GV zfOE`vFysYvNIJN;PPk~sdo#1}v26}9WO$y`=AaG#NO)t;SA)64tCsG7qK>6(}Opf zCyCSW;q0{%b9?d={cQfb@Y9cNHBvWQO`22M7(r#GJnIRV(c4{wAmzIe3{9|@~`(XlT- z(`BMBRf({`n|*i>l=tJ_Fwz$z`*C}d3$C`B3L^dWH9|>0PD;rWA7PsnPaPU~66qQ+C!fHD{PG z;a%&4S5||`MT>nWw%5@bHNNqEd$r!eJ0%Y#@#u@8HhdUtsKF&R{3CGp#&2!-1nA=} znA-9c3jOk$x*=Y8P~q z^ND!Ij(3AhFT7&MmqC~p=GgO(`;1d`SP(VGv;b8DFZ{}$XRG>&tBWk;|M)v~=J@X8+PP_otdZWKHp9eF%@n>gl2?gGG$(g&s;_+zg!Usd?c#Lx4$+iU^ z)Nu=_3C*melN?NkJF`5oNO|m?8XSV86)ejG&$w`R7&U&iD-Rve&~|+!DC6~X_Yo-q zR_T>7`bWVE$vHi_;|>*zEEn53Q@BhI%yH%U@W=~WUHN=>iTEl*TlKB8X(n;0&Yb9( zDh;FjDv>ZVw5roq6dfd0Yoz<~rcmR?U$WSl?(~NI3yvt|=am+>l(LtP<%gq9AMrIb zKRz9J_^+`_lUIXs9Pahx&Q@;XswFayU(=#Tk!Lvlk1D1~EK!77Vruj=uq@T<>aN?#9~(Gn4yi(Jsw~u?P%I;FZgE3! zRHme0St2_NVxpOK-&Q|1$A-Cec61^c`+4&+I64qN_vXPo{O9Y~;>}&SWYcvt^Wj6K zm7QJxOUf3wq1J~-NQ*j3Oi!4yd^fE3;RCpC<#oL6!v~o)Z0r0g@>_3MdL3PTxwV;O z>xVMQ;_H~~%Tujg#3pFY%>0-G3EbgM%uy_nRx}5aT?t0ESNAf-l zvg3tiQT(a|p2Z5ealA|dU)l=~l6YSbWaIcZriM= MAX_NO_ACLS) - { - return true; - } - return acl_freep[acl_no] == 0; -} - -void ICACHE_FLASH_ATTR -acl_clear(uint8_t acl_no) -{ - if (acl_no >= MAX_NO_ACLS) - { - return; - } - acl_freep[acl_no] = 0; - acl_clear_stats(acl_no); -} - -void ICACHE_FLASH_ATTR -acl_clear_stats(uint8_t acl_no) -{ - int i; - - if (acl_no >= MAX_NO_ACLS) - { - return; - } - my_deny_cb = NULL; - for(i=0; i< MAX_ACL_ENTRIES; i++) - acl[acl_no][i].hit_count = 0; -} - -bool ICACHE_FLASH_ATTR -acl_add(uint8_t acl_no, - uint32_t src, - uint32_t s_mask, - uint32_t dest, - uint32_t d_mask, - uint8_t proto, - uint16_t s_port, - uint16_t d_port, - uint8_t allow) -{ - acl_entry *my_entry; - - if (acl_no >= MAX_NO_ACLS || acl_freep[acl_no] >= MAX_ACL_ENTRIES) - { - return false; - } - - my_entry = &acl[acl_no][acl_freep[acl_no]]; - my_entry->src = src & s_mask; - my_entry->s_mask = s_mask; - my_entry->dest = dest & d_mask; - my_entry->d_mask = d_mask; - my_entry->proto = proto; - my_entry->s_port = s_port; - my_entry->d_port = d_port; - my_entry->allow = allow; - my_entry->hit_count = 0; - - acl_freep[acl_no]++; - return true; -} - -uint8_t ICACHE_FLASH_ATTR -acl_check_packet(uint8_t acl_no, struct pbuf *p) -{ - struct eth_hdr *mac_h; - struct ip_hdr *ip_h; - uint8_t proto; - struct udp_hdr *udp_h; - struct tcp_hdr *tcp_h; - uint16_t src_port, dest_port; - uint8_t *packet; - int i; - acl_entry *my_entry; - uint8_t allow; - - if (acl_no >= MAX_NO_ACLS) - { - return ACL_DENY; - } - - if (p->len < sizeof(struct eth_hdr)) - { - return ACL_DENY; - } - - mac_h = (struct eth_hdr *)p->payload; - - // Allow ARP - if (ntohs(mac_h->type) == ETHTYPE_ARP) - { - acl_allow_count++; - return ACL_ALLOW; - } - - // Drop anything else if not IPv4 - if (ntohs(mac_h->type) != ETHTYPE_IP) - { - acl_deny_count++; - return ACL_DENY; - } - - if (p->len < sizeof(struct eth_hdr)+sizeof(struct ip_hdr)) - { - acl_deny_count++; - return ACL_DENY; - } - - allow = ACL_DENY; - packet = (uint8_t*)p->payload; - ip_h = (struct ip_hdr *)&packet[sizeof(struct eth_hdr)]; - proto = IPH_PROTO(ip_h); - - switch (proto) { - case IP_PROTO_UDP: - { - if (p->len < sizeof(struct eth_hdr)+sizeof(struct ip_hdr)+sizeof(struct udp_hdr)) - { - return; - } - udp_h = (struct udp_hdr *)&packet[sizeof(struct eth_hdr)+sizeof(struct ip_hdr)]; - src_port = ntohs(udp_h->src); - dest_port = ntohs(udp_h->dest); - } break; - - case IP_PROTO_TCP: - { - if (p->len < sizeof(struct eth_hdr)+sizeof(struct ip_hdr)+sizeof(struct tcp_hdr)) - { - return; - } - tcp_h = (struct tcp_hdr *)&packet[sizeof(struct eth_hdr)+sizeof(struct ip_hdr)]; - src_port = ntohs(tcp_h->src); - dest_port = ntohs(tcp_h->dest); - } break; - - case IP_PROTO_ICMP: - { - src_port = dest_port = 0; - } break; - - // Drop anything that is not UDP, TCP, or ICMP - default: - { - acl_deny_count++; - return ACL_DENY; - } break; - } - - // os_printf("Src: %d.%d.%d.%d Dst: %d.%d.%d.%d Proto: %s SP:%d DP:%d\n", - // IP2STR(&ip_h->src), IP2STR(&ip_h->dest), - // proto==IP_PROTO_TCP?"TCP":proto==IP_PROTO_UDP?"UDP":"IP4", src_port, dest_port); - - for(i=0; iproto == 0 || proto == my_entry->proto) && - (my_entry->src == 0 || my_entry->src == (ip_h->src.addr&my_entry->s_mask)) && - (my_entry->dest == 0 || my_entry->dest == (ip_h->dest.addr&my_entry->d_mask)) && - (my_entry->s_port == 0 || my_entry->s_port == src_port) && - (my_entry->d_port == 0 || my_entry->d_port == dest_port)) - { - allow = my_entry->allow; - my_entry->hit_count++; - goto done; - } - } - -done: - if (!(allow & ACL_ALLOW) && my_deny_cb != NULL) - { - allow = my_deny_cb(proto, ip_h->src.addr, src_port, - ip_h->dest.addr, dest_port, allow); - } - if (allow & ACL_ALLOW) - { - acl_allow_count++; - } - else - { - acl_deny_count++; - } - - // os_printf(" allow: %d\r\n", allow); - return allow; -} - -void -acl_set_deny_cb(packet_deny_cb cb) -{ - my_deny_cb = cb; -} - -void ICACHE_FLASH_ATTR -addr2str(uint8_t *buf, uint32_t addr, uint32_t mask) -{ - uint8_t clidr; - - if (addr == 0) - { - os_sprintf(buf, "any"); - return; - } - - mask = ntohl(mask); - for (clidr = 0; mask; mask <<= 1,clidr++); - if (clidr < 32) - { - os_sprintf(buf, "%d.%d.%d.%d/%d", IP2STR((ip_addr_t*)&addr), clidr); - } - else - { - os_sprintf(buf, "%d.%d.%d.%d", IP2STR((ip_addr_t*)&addr)); - } -} - -void ICACHE_FLASH_ATTR -port2str(uint8_t *buf, uint16_t port) -{ - if (port == 0) - { - os_sprintf(buf, "any"); - } - else - { - os_sprintf(buf, "%d", port); - } -} - -void ICACHE_FLASH_ATTR -acl_show(uint8_t acl_no, uint8_t *buf) -{ - int i; - acl_entry *my_entry; - uint8_t line[80], addr1[21], addr2[21], port1[6], port2[6]; - - buf[0] = 0; - - if (acl_no >= MAX_NO_ACLS) - { - return; - } - - for(i = 0; i < acl_freep[acl_no]; i++) - { - my_entry = &acl[acl_no][i]; - addr2str(addr1, my_entry->src, my_entry->s_mask); - port2str(port1, my_entry->s_port); - addr2str(addr2, my_entry->dest, my_entry->d_mask); - port2str(port2, my_entry->d_port); - if (my_entry->proto != 0) - { - os_sprintf(line, "%s %s:%s %s:%s %s%s (%d hits)\r\n", - my_entry->proto==IP_PROTO_TCP?"TCP":"UDP", - addr1, port1, addr2, port2, - (my_entry->allow & ACL_ALLOW)?"allow":"deny", - (my_entry->allow & ACL_MONITOR)?"_monitor":"", - my_entry->hit_count); - } - else - { - os_sprintf(line, "IP %s %s %s%s (%d hits)\r\n", - addr1, addr2, - (my_entry->allow & ACL_ALLOW)?"allow":"deny", - (my_entry->allow & ACL_MONITOR)?"_monitor":"", - my_entry->hit_count); - } - os_memcpy(&buf[os_strlen(buf)], line, os_strlen(line)+1); - } -} diff --git a/user/acl.h b/user/acl.h deleted file mode 100644 index 59f8859..0000000 --- a/user/acl.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef _ACL_H_ -#define _ACL_H_ - -#include "lwip/ip.h" -#include "lwip/pbuf.h" - -#define MAX_NO_ACLS 4 -#define MAX_ACL_ENTRIES 30 - -#define ACL_DENY 0x0 -#define ACL_ALLOW 0x1 -#define ACL_MONITOR 0x2 - -typedef struct _acl_entry -{ - uint32_t src; - uint32_t s_mask; - uint32_t dest; - uint32_t d_mask; - uint16_t s_port; - uint16_t d_port; - uint8_t proto; - uint8_t allow; - uint32_t hit_count; -} acl_entry; - -extern acl_entry acl[MAX_NO_ACLS][MAX_ACL_ENTRIES]; -extern uint8_t acl_freep[MAX_NO_ACLS]; -extern uint32_t acl_allow_count; -extern uint32_t acl_deny_count; - -typedef uint8_t (*packet_deny_cb)(uint8_t proto, uint32_t saddr, uint16_t s_port, uint32_t daddr, uint16_t d_port, uint8_t allow); - -void acl_init(); -bool acl_is_empty(uint8_t acl_no); -void acl_clear(uint8_t acl_no); -void acl_clear_stats(uint8_t acl_no); -bool acl_add(uint8_t acl_no, - uint32_t src, - uint32_t s_mask, - uint32_t dest, - uint32_t d_mask, - uint8_t proto, - uint16_t s_port, - uint16_t d_port, - uint8_t allow); -uint8_t acl_check_packet(uint8_t acl_no, struct pbuf *p); -void acl_set_deny_cb(packet_deny_cb cb); -void acl_show(uint8_t acl_no, uint8_t *buf); - -#endif /* _ACL_H_ */ diff --git a/user/config_flash.c b/user/config_flash.c index 96152d4..0af7b51 100644 --- a/user/config_flash.c +++ b/user/config_flash.c @@ -45,9 +45,6 @@ config_load_default(sysconfig_p config) wifi_get_macaddr(STATION_IF, config->STA_MAC_address); config->dhcps_entries = 0; -#ifdef ACLS - acl_init(); // initializes the ACLs, written in config during save -#endif config->current_mac_address = 0; // Interval to change mac address in seconds @@ -73,94 +70,6 @@ config_load_default(sysconfig_p config) ets_str2macaddr(config->mac_list[13], "4E:53:50:4F:4F:4D"); ets_str2macaddr(config->mac_list[14], "4E:53:50:4F:4F:4E"); ets_str2macaddr(config->mac_list[15], "4E:53:50:4F:4F:4F"); - - // Streetpass relay whitelist - uint32_t daddr; - uint32_t dmask; - - // Clear all acl rules - acl_clear(0); - acl_clear(1); - acl_clear(2); - acl_clear(3); - - // Whitelist broadcast to enable DHCP - parse_IP_addr("255.255.255.255", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - // Whitelist DNS - acl_add(0, 0, 0, 0, 0, IP_PROTO_UDP, 0, 53, ACL_ALLOW); - - // Whitelist Streetpass relays - // acl from_sta IP any 52.43.174.40 allow - parse_IP_addr("52.43.174.40", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("104.70.153.178", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("104.74.48.110", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("23.7.18.146", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("23.7.24.35", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("52.11.210.152", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("52.25.179.65", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("52.89.56.205", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("54.148.137.96", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("54.218.98.74", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("54.218.99.79", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("54.244.22.201", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("69.25.139.140", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("192.195.204.216", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("52.10.249.207", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - // NOTE(m): New IP addresses found by Dal78 - // NOTE(m): The list of Streetpass IP addresses may be dynamic :-/ - parse_IP_addr("52.24.183.161", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("52.39.19.157", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("34.208.213.200", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("104.103.189.191", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("23.2.226.76", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - parse_IP_addr("35.167.248.201", &daddr, &dmask); - acl_add(0, 0, 0, daddr, dmask, 0, 0, 0, ACL_ALLOW); - - // Default implementation denies everything not matched above. - // This last rule is not necessary and commented out to save memory space: - // acl_add(0, 0, 0, 0, 0, 0, 0, 0, ACL_DENY); } int @@ -193,10 +102,7 @@ config_load(sysconfig_p config) config_save(config); return -1; } -#ifdef ACLS - os_memcpy(&acl, &(config->acl), sizeof(acl)); - os_memcpy(&acl_freep, &(config->acl_freep), sizeof(acl_freep)); -#endif + return 0; } @@ -204,10 +110,6 @@ void config_save(sysconfig_p config) { uint16_t base_address = FLASH_BLOCK_NO; -#ifdef ACLS - os_memcpy(&(config->acl), &acl, sizeof(acl)); - os_memcpy(&(config->acl_freep), &acl_freep, sizeof(acl_freep)); -#endif os_printf("Saving configuration\r\n"); spi_flash_erase_sector(base_address); spi_flash_write(base_address * SPI_FLASH_SEC_SIZE, diff --git a/user/config_flash.h b/user/config_flash.h index bd920aa..7e31b55 100644 --- a/user/config_flash.h +++ b/user/config_flash.h @@ -11,7 +11,6 @@ #include "lwip/app/dhcpserver.h" #include "user_config.h" -#include "acl.h" #define FLASH_BLOCK_NO 0xc @@ -60,10 +59,6 @@ typedef struct uint16_t dhcps_entries; // number of allocated entries in the following table struct dhcps_pool dhcps_p[MAX_DHCP]; // DHCP entries -#ifdef ACLS - acl_entry acl[MAX_NO_ACLS][MAX_ACL_ENTRIES]; // ACL entries - uint8_t acl_freep[MAX_NO_ACLS]; // ACL free pointers -#endif // HomePass mac list // Allow 20 slots diff --git a/user/user_config.h b/user/user_config.h index 19287e3..d58f160 100644 --- a/user/user_config.h +++ b/user/user_config.h @@ -27,11 +27,6 @@ // #define PHY_MODE 1 -// -// Define this if you want to have ACLs for the SoftAP. -// -#define ACLS 1 - // Internal typedef enum {SIG_DO_NOTHING=0, SIG_START_SERVER=1, SIG_SEND_DATA, SIG_UART0, SIG_CONSOLE_RX, SIG_CONSOLE_TX, SIG_CONSOLE_TX_RAW, SIG_GPIO_INT} USER_SIGNALS; diff --git a/user/user_main.c b/user/user_main.c index 89b5b09..ac563ce 100644 --- a/user/user_main.c +++ b/user/user_main.c @@ -23,10 +23,6 @@ #include "easygpio.h" -#ifdef ACLS -#include "acl.h" -#endif - /* System Task, for signals refer to user_config.h */ #define user_procTaskPrio 0 #define user_procTaskQueueLen 1 @@ -83,24 +79,6 @@ my_input_ap(struct pbuf *p, struct netif *inp) client_watchdog_cnt = config.client_watchdog; -#ifdef ACLS - // Check ACLs - store result - uint8_t acl_check = ACL_ALLOW; - if (!acl_is_empty(0)) - { - acl_check = acl_check_packet(0, p); - } -#endif - -#ifdef ACLS - // If not allowed, drop packet - if (!(acl_check&ACL_ALLOW)) - { - pbuf_free(p); - return; - } -#endif - Bytes_in += p->tot_len; Packets_in++; @@ -117,24 +95,6 @@ my_output_ap(struct netif *outp, struct pbuf *p) easygpio_outputSet (config.status_led, 0); } -#ifdef ACLS - // Check ACLs - store result - uint8_t acl_check = ACL_ALLOW; - if (!acl_is_empty(1)) - { - acl_check = acl_check_packet(1, p); - } -#endif - -#ifdef ACLS - // If not allowed, drop packet - if (!(acl_check&ACL_ALLOW)) - { - pbuf_free(p); - return; - } -#endif - Bytes_out += p->tot_len; Packets_out++; @@ -145,26 +105,12 @@ err_t ICACHE_FLASH_ATTR my_input_sta(struct pbuf *p, struct netif *inp) { ap_watchdog_cnt = config.ap_watchdog; -#ifdef ACLS - if (!acl_is_empty(2) && !(acl_check_packet(2, p) & ACL_ALLOW)) - { - pbuf_free(p); - return; - } -#endif orig_input_sta (p, inp); } err_t ICACHE_FLASH_ATTR my_output_sta(struct netif *outp, struct pbuf *p) { -#ifdef ACLS - if (!acl_is_empty(3) && !(acl_check_packet(3, p) & ACL_ALLOW)) - { - pbuf_free(p); - return; - } -#endif orig_output_sta (outp, p); } @@ -304,67 +250,6 @@ console_send_response(struct espconn *pespconn, uint8_t do_cmd) } } - -#ifdef ACLS -void ICACHE_FLASH_ATTR -parse_IP_addr(uint8_t *str, uint32_t *addr, uint32_t *mask) -{ - int i; - uint32_t net; - if (strcmp(str, "any") == 0) - { - *addr = 0; - *mask = 0; - return; - } - - for(i=0; str[i]!=0 && str[i]!='/'; i++); - - *mask = 0xffffffff; - if (str[i]!=0) - { - str[i]=0; - *mask <<= (32 - atoi(&str[i+1])); - } - *mask = htonl(*mask); - *addr = ipaddr_addr(str); -} - -struct espconn *deny_cb_conn = 0; -uint8_t acl_debug = 0; - -uint8_t -acl_deny_cb(uint8_t proto, - uint32_t saddr, - uint16_t s_port, - uint32_t daddr, - uint16_t d_port, - uint8_t allow) -{ - char response[128]; - - if (!acl_debug) - { - return allow; - } - - os_sprintf(response, - "\rdeny: %s Src: %d.%d.%d.%d:%d Dst: %d.%d.%d.%d:%d\r\n", - proto==IP_PROTO_TCP?"TCP":proto==IP_PROTO_UDP?"UDP":"IP4", - IP2STR((ip_addr_t *)&saddr), - s_port, - IP2STR((ip_addr_t *)&daddr), - d_port); - - if (acl_debug) - { - to_console(response); - system_os_post(0, SIG_CONSOLE_TX, (ETSParam) deny_cb_conn); - } - return allow; -} -#endif /* ACLS */ - // Use this from ROM instead int ets_str2macaddr(uint8 *mac, char *str_mac); #define parse_mac ets_str2macaddr @@ -431,10 +316,6 @@ console_handle_command(struct espconn *pespconn) to_console(response); #endif -#ifdef ACLS - os_sprintf(response, "acl [from_sta|to_sta|from_ap|to_ap] clear\r\nacl [from_sta|to_sta|from_ap|to_ap] [IP|TCP|UDP] [] [] [allow|deny|allow_monitor|deny_monitor]\r\n"); - to_console(response); -#endif goto command_handled_2; } @@ -579,144 +460,8 @@ console_handle_command(struct espconn *pespconn) } goto command_handled_2; } -#ifdef ACLS - if (nTokens == 2 && strcmp(tokens[1], "acl") == 0) - { - char *txt[] = {"From STA:\r\n", - "To STA:\r\n", "From AP:\r\n", "To AP:\r\n"}; - for (i = 0; i 1) @@ -947,15 +692,6 @@ console_handle_command(struct espconn *pespconn) goto command_handled; } -#ifdef ACLS - if (strcmp(tokens[1], "acl_debug") == 0) - { - acl_debug = atoi(tokens[2]); - os_sprintf(response, "ACL debug set\r\n"); - goto command_handled; - } -#endif - if (strcmp(tokens[1], "speed") == 0) { uint16_t speed = atoi(tokens[2]); @@ -1478,15 +1214,6 @@ user_init() // Load config config_load(&config); -#ifdef ACLS - acl_debug = 0; - int i; - for(i=0; i< MAX_NO_ACLS; i++) - { - acl_clear_stats(i); - } - acl_set_deny_cb(acl_deny_cb); -#endif // Config GPIO pin as output if (config.status_led == 1) { From 2f50ebad61af222026fc98c516c3036f63ff9fd0 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Sun, 18 Mar 2018 11:44:22 +0100 Subject: [PATCH 2/5] Remove DNS support. --- user/config_flash.c | 1 - user/config_flash.h | 1 - user/user_main.c | 58 +++------------------------------------------ 3 files changed, 3 insertions(+), 57 deletions(-) diff --git a/user/config_flash.c b/user/config_flash.c index 0af7b51..f5f56ce 100644 --- a/user/config_flash.c +++ b/user/config_flash.c @@ -32,7 +32,6 @@ config_load_default(sysconfig_p config) config->client_watchdog = -1; IP4_ADDR(&config->network_addr, 192, 168, 4, 1); - config->dns_addr.addr = 0; // use DHCP config->my_addr.addr = 0; // use DHCP config->my_netmask.addr = 0; // use DHCP config->my_gw.addr = 0; // use DHCP diff --git a/user/config_flash.h b/user/config_flash.h index 7e31b55..e06068c 100644 --- a/user/config_flash.h +++ b/user/config_flash.h @@ -44,7 +44,6 @@ typedef struct int32_t client_watchdog; ip_addr_t network_addr; // Address of the internal network - ip_addr_t dns_addr; // Optional: address of the dns server ip_addr_t my_addr; // Optional (if not DHCP): IP address of the uplink side ip_addr_t my_netmask; // Optional (if not DHCP): IP netmask of the uplink side diff --git a/user/user_main.c b/user/user_main.c index ac563ce..0b5c9db 100644 --- a/user/user_main.c +++ b/user/user_main.c @@ -6,7 +6,6 @@ #include "os_type.h" #include "lwip/ip.h" #include "lwip/netif.h" -#include "lwip/dns.h" #include "lwip/lwip_napt.h" #include "lwip/app/dhcpserver.h" #include "lwip/app/espconn.h" @@ -46,7 +45,6 @@ sysconfig_t config; static ringbuf_t console_rx_buffer, console_tx_buffer; static ip_addr_t my_ip; -static ip_addr_t dns_ip; bool connected; uint8_t my_channel; bool do_ip_config; @@ -305,7 +303,7 @@ console_handle_command(struct espconn *pespconn) os_sprintf(response, "show [config|stats]\r\n"); to_console(response); - os_sprintf(response, "set [ssid|password|auto_connect|ap_ssid] \r\nset [sta_mac|sta_hostname] \r\nset [dns|ip|netmask|gw] \r\n"); + os_sprintf(response, "set [ssid|password|auto_connect|ap_ssid] \r\nset [sta_mac|sta_hostname] \r\nset [ip|netmask|gw] \r\n"); to_console(response); os_sprintf(response, "set [speed|status_led|config_port] \r\nsave [config|dhcp]\r\nconnect | disconnect| reset [factory] | quit\r\n"); to_console(response); @@ -369,12 +367,6 @@ console_handle_command(struct espconn *pespconn) IP2STR(&config.network_addr)); to_console(response); - // if static DNS, add it - os_sprintf(response, - config.dns_addr.addr?" DNS: %d.%d.%d.%d\r\n":"\r\n", - IP2STR(&config.dns_addr)); - to_console(response); - // if static IP, add it os_sprintf(response, config.my_addr.addr?"Static IP: %d.%d.%d.%d Netmask: %d.%d.%d.%d Gateway: %d.%d.%d.%d\r\n":"", @@ -757,27 +749,6 @@ console_handle_command(struct espconn *pespconn) goto command_handled; } - if (strcmp(tokens[1], "dns") == 0) - { - if (os_strcmp(tokens[2], "dhcp") == 0) - { - config.dns_addr.addr = 0; - os_sprintf(response, "DNS from DHCP\r\n"); - } - else - { - config.dns_addr.addr = ipaddr_addr(tokens[2]); - os_sprintf(response, "DNS set to %d.%d.%d.%d\r\n", - IP2STR(&config.dns_addr)); - if (config.dns_addr.addr) - { - dns_ip.addr = config.dns_addr.addr; - dhcps_set_DNS(&dns_ip); - } - } - goto command_handled; - } - if (strcmp(tokens[1], "ip") == 0) { if (os_strcmp(tokens[2], "dhcp") == 0) @@ -1041,17 +1012,10 @@ wifi_handle_event_cb(System_Event_t *evt) case EVENT_STAMODE_GOT_IP: { - if (config.dns_addr.addr == 0) - { - dns_ip = dns_getserver(0); - } - dhcps_set_DNS(&dns_ip); - - os_printf("ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR ",dns:" IPSTR "\n", + os_printf("ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR "\n", IP2STR(&evt->event_info.got_ip.ip), IP2STR(&evt->event_info.got_ip.mask), - IP2STR(&evt->event_info.got_ip.gw), - IP2STR(&dns_ip)); + IP2STR(&evt->event_info.got_ip.gw)); my_ip = evt->event_info.got_ip.ip; connected = true; @@ -1145,9 +1109,6 @@ user_set_softap_ip_config(void) wifi_softap_dhcps_start(); - // Change the DNS server again - dhcps_set_DNS(&dns_ip); - // Enter any saved dhcp enties if they are in this network for (i = 0; i Date: Sun, 18 Mar 2018 12:25:48 +0100 Subject: [PATCH 3/5] Implemented random mac selection on startup. --- user/config_flash.c | 1 - user/config_flash.h | 6 +++--- user/user_main.c | 50 +++++++++++++++++++++------------------------ 3 files changed, 26 insertions(+), 31 deletions(-) diff --git a/user/config_flash.c b/user/config_flash.c index f5f56ce..a9a5706 100644 --- a/user/config_flash.c +++ b/user/config_flash.c @@ -45,7 +45,6 @@ config_load_default(sysconfig_p config) config->dhcps_entries = 0; - config->current_mac_address = 0; // Interval to change mac address in seconds // Default: 3600 (1 hour) // This should rotate every mac address in the list roughly every 16 hours. diff --git a/user/config_flash.h b/user/config_flash.h index e06068c..0d1c1bb 100644 --- a/user/config_flash.h +++ b/user/config_flash.h @@ -16,7 +16,8 @@ #define MAGIC_NUMBER 0x112005fc -#define MAX_MAC_LIST_LENGTH 15 +// Number of mac addresses in StreetPass relay mac list +#define MAC_LIST_LENGTH 16 typedef struct { @@ -35,7 +36,6 @@ typedef struct uint8_t sta_hostname[32]; // Name of the station uint8_t ap_ssid[32]; // SSID of the own AP uint8_t first_run; // Has ESPerPass been configured yet? - uint8_t current_mac_address; // Holds currently broadcasted HomePass mac address index int32_t mac_change_interval; // Interval to rotate HomePass mac address (in seconds) // Seconds without ap traffic will cause reset (-1 off, default) @@ -61,7 +61,7 @@ typedef struct // HomePass mac list // Allow 20 slots - uint8_t mac_list[19][6]; + uint8_t mac_list[MAC_LIST_LENGTH][6]; } sysconfig_t, *sysconfig_p; diff --git a/user/user_main.c b/user/user_main.c index 0b5c9db..fa0bae5 100644 --- a/user/user_main.c +++ b/user/user_main.c @@ -59,6 +59,14 @@ void ICACHE_FLASH_ATTR user_set_softap_wifi_config(void); void ICACHE_FLASH_ATTR user_set_softap_ip_config(void); void ICACHE_FLASH_ATTR user_set_station_config(void); +uint8_t current_mac_address_index = 0;; + +int +ICACHE_FLASH_ATTR random_mac_index() +{ + return rand() % sizeof(config.mac_list) / sizeof(config.mac_list[0]); +} + void ICACHE_FLASH_ATTR to_console(char *str) { @@ -323,7 +331,7 @@ console_handle_command(struct espconn *pespconn) int16_t i; to_console("HomePass mac list:\r\n"); - for (i = 0; i < MAX_MAC_LIST_LENGTH; i++) + for (i = 0; i <= MAC_LIST_LENGTH - 1; i++) { os_sprintf(response, "%02x:%02x:%02x:%02x:%02x:%02x\r\n", config.mac_list[i][0], config.mac_list[i][1], @@ -857,40 +865,23 @@ timer_func(void *arg) if (mac_cnt >= config.mac_change_interval) { mac_cnt = 0; - // os_printf("Rotating mac address...\r\n"); - // os_printf("config.current_mac_address = %d\r\n", config.current_mac_address); - // os_printf("OLD MAC: %02x:%02x:%02x:%02x:%02x:%02x\r\n", - // config.mac_list[config.current_mac_address][0], - // config.mac_list[config.current_mac_address][1], - // config.mac_list[config.current_mac_address][2], - // config.mac_list[config.current_mac_address][3], - // config.mac_list[config.current_mac_address][4], - // config.mac_list[config.current_mac_address][5]); + os_printf("Changing mac address.\r\n"); + os_printf("Old index: %d\r\n\r\n", current_mac_address_index); - if (config.current_mac_address >= (MAX_MAC_LIST_LENGTH - 1)) + if (current_mac_address_index >= MAC_LIST_LENGTH - 1) { - config.current_mac_address = 0; + current_mac_address_index = 0; } else { - config.current_mac_address++; + current_mac_address_index++; } - // os_printf("NEW MAC: %02x:%02x:%02x:%02x:%02x:%02x\r\n\r\n", - // config.mac_list[config.current_mac_address][0], - // config.mac_list[config.current_mac_address][1], - // config.mac_list[config.current_mac_address][2], - // config.mac_list[config.current_mac_address][3], - // config.mac_list[config.current_mac_address][4], - // config.mac_list[config.current_mac_address][5]); - - // Save current mac address config to flash - config_save(&config); + os_printf("New index: %d\r\n", current_mac_address_index); // Start using new mac address - // wifi_set_macaddr(SOFTAP_IF, config.mac_list[config.current_mac_address]); - system_restart(); + wifi_set_macaddr(SOFTAP_IF, config.mac_list[current_mac_address_index]); } else { @@ -1153,6 +1144,11 @@ user_set_station_config(void) void ICACHE_FLASH_ATTR user_init() { + // Generate random seed for rand() function + srand(system_get_rtc_time()); + // Generate random mac address index + current_mac_address_index = random_mac_index(); + struct ip_info info; connected = false; @@ -1192,7 +1188,7 @@ user_init() } wifi_set_opmode(STATIONAP_MODE); - wifi_set_macaddr(SOFTAP_IF, config.mac_list[config.current_mac_address]); + wifi_set_macaddr(SOFTAP_IF, config.mac_list[current_mac_address_index]); user_set_softap_wifi_config(); do_ip_config = true; @@ -1244,7 +1240,7 @@ user_init() os_timer_setfn(&ptimer, timer_func, 0); os_timer_arm(&ptimer, 500, 0); - //Start task + // Start task system_os_task(user_procTask, user_procTaskPrio, user_procTaskQueue, user_procTaskQueueLen); } From 3b6a2d89059773728784823f8714f65bd42cdfa0 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Sun, 18 Mar 2018 14:18:45 +0100 Subject: [PATCH 4/5] Restored DNS functionality. Simulating random StreetPass encounters. --- user/config_flash.c | 13 ++++-- user/config_flash.h | 6 ++- user/user_config.h | 2 +- user/user_main.c | 104 +++++++++++++++++++++++++++++++++----------- 4 files changed, 94 insertions(+), 31 deletions(-) diff --git a/user/config_flash.c b/user/config_flash.c index a9a5706..9515a69 100644 --- a/user/config_flash.c +++ b/user/config_flash.c @@ -32,6 +32,7 @@ config_load_default(sysconfig_p config) config->client_watchdog = -1; IP4_ADDR(&config->network_addr, 192, 168, 4, 1); + config->dns_addr.addr = 0; // use DHCP config->my_addr.addr = 0; // use DHCP config->my_netmask.addr = 0; // use DHCP config->my_gw.addr = 0; // use DHCP @@ -45,10 +46,14 @@ config_load_default(sysconfig_p config) config->dhcps_entries = 0; - // Interval to change mac address in seconds - // Default: 3600 (1 hour) - // This should rotate every mac address in the list roughly every 16 hours. - config->mac_change_interval = 3600; + // NOTE(m): Interval at which to restart the system to select a new + // random StreetPass MAC from the list. + // In seconds. Default: 900 (15 minutes) + config->system_restart_interval = 900; + + // NOTE(m): How long to keep the "attwifi" AP up during one MAC cycle + // In seconds. Default: 90 seconds. + config->ap_enable_duration = 90; // list of mac addresses // from https://docs.google.com/spreadsheets/d/1su5u-vPrQwkTixR6YnOTWSi_Ls9lV-_XNJHaWIJspv4/edit#gid=0 diff --git a/user/config_flash.h b/user/config_flash.h index 0d1c1bb..bd66a72 100644 --- a/user/config_flash.h +++ b/user/config_flash.h @@ -35,8 +35,11 @@ typedef struct uint8_t bssid[6]; // Optional: BSSID the AP uint8_t sta_hostname[32]; // Name of the station uint8_t ap_ssid[32]; // SSID of the own AP + + // ESPerPass specific configuration uint8_t first_run; // Has ESPerPass been configured yet? - int32_t mac_change_interval; // Interval to rotate HomePass mac address (in seconds) + int32_t system_restart_interval; + int32_t ap_enable_duration; // Seconds without ap traffic will cause reset (-1 off, default) int32_t ap_watchdog; @@ -44,6 +47,7 @@ typedef struct int32_t client_watchdog; ip_addr_t network_addr; // Address of the internal network + ip_addr_t dns_addr; // Optional: address of the dns server ip_addr_t my_addr; // Optional (if not DHCP): IP address of the uplink side ip_addr_t my_netmask; // Optional (if not DHCP): IP netmask of the uplink side diff --git a/user/user_config.h b/user/user_config.h index d58f160..338deb5 100644 --- a/user/user_config.h +++ b/user/user_config.h @@ -1,7 +1,7 @@ #ifndef _USER_CONFIG_ #define _USER_CONFIG_ -#define ESPERPASS_VERSION "V0.0.6" +#define ESPERPASS_VERSION "V0.1.0" #define WIFI_SSID "ssid" #define WIFI_PASSWORD "password" diff --git a/user/user_main.c b/user/user_main.c index fa0bae5..cda5fa5 100644 --- a/user/user_main.c +++ b/user/user_main.c @@ -6,6 +6,7 @@ #include "os_type.h" #include "lwip/ip.h" #include "lwip/netif.h" +#include "lwip/dns.h" #include "lwip/lwip_napt.h" #include "lwip/app/dhcpserver.h" #include "lwip/app/espconn.h" @@ -32,7 +33,8 @@ static os_timer_t ptimer; int32_t ap_watchdog_cnt; int32_t client_watchdog_cnt; -int32_t mac_cnt; +int32_t awake_cnt = 0; +int32_t ap_enabled_cnt = 0; /* Some stats */ uint64_t Bytes_in, Bytes_out, Bytes_in_last, Bytes_out_last; @@ -45,6 +47,7 @@ sysconfig_t config; static ringbuf_t console_rx_buffer, console_tx_buffer; static ip_addr_t my_ip; +static ip_addr_t dns_ip; bool connected; uint8_t my_channel; bool do_ip_config; @@ -311,7 +314,7 @@ console_handle_command(struct espconn *pespconn) os_sprintf(response, "show [config|stats]\r\n"); to_console(response); - os_sprintf(response, "set [ssid|password|auto_connect|ap_ssid] \r\nset [sta_mac|sta_hostname] \r\nset [ip|netmask|gw] \r\n"); + os_sprintf(response, "set [ssid|password|auto_connect|ap_ssid] \r\nset [sta_mac|sta_hostname] \r\nset [dns|ip|netmask|gw] \r\n"); to_console(response); os_sprintf(response, "set [speed|status_led|config_port] \r\nsave [config|dhcp]\r\nconnect | disconnect| reset [factory] | quit\r\n"); to_console(response); @@ -375,6 +378,12 @@ console_handle_command(struct espconn *pespconn) IP2STR(&config.network_addr)); to_console(response); + // if static DNS, add it + os_sprintf(response, + config.dns_addr.addr?" DNS: %d.%d.%d.%d\r\n":"\r\n", + IP2STR(&config.dns_addr)); + to_console(response); + // if static IP, add it os_sprintf(response, config.my_addr.addr?"Static IP: %d.%d.%d.%d Netmask: %d.%d.%d.%d Gateway: %d.%d.%d.%d\r\n":"", @@ -757,6 +766,27 @@ console_handle_command(struct espconn *pespconn) goto command_handled; } + if (strcmp(tokens[1], "dns") == 0) + { + if (os_strcmp(tokens[2], "dhcp") == 0) + { + config.dns_addr.addr = 0; + os_sprintf(response, "DNS from DHCP\r\n"); + } + else + { + config.dns_addr.addr = ipaddr_addr(tokens[2]); + os_sprintf(response, "DNS set to %d.%d.%d.%d\r\n", + IP2STR(&config.dns_addr)); + if (config.dns_addr.addr) + { + dns_ip.addr = config.dns_addr.addr; + dhcps_set_DNS(&dns_ip); + } + } + goto command_handled; + } + if (strcmp(tokens[1], "ip") == 0) { if (os_strcmp(tokens[2], "dhcp") == 0) @@ -859,33 +889,34 @@ timer_func(void *arg) // Check if watchdogs if (toggle) { - // Rotate HomePass mac address if necessary if (config.auto_connect == 1) { - if (mac_cnt >= config.mac_change_interval) + // NOTE(m): Restart the system after a while to set a new random + // StreetPass MAC address from the list. + if (awake_cnt >= config.system_restart_interval) { - mac_cnt = 0; - - os_printf("Changing mac address.\r\n"); - os_printf("Old index: %d\r\n\r\n", current_mac_address_index); - - if (current_mac_address_index >= MAC_LIST_LENGTH - 1) - { - current_mac_address_index = 0; - } - else - { - current_mac_address_index++; - } - - os_printf("New index: %d\r\n", current_mac_address_index); - - // Start using new mac address - wifi_set_macaddr(SOFTAP_IF, config.mac_list[current_mac_address_index]); + system_restart(); } else { - mac_cnt++; + awake_cnt++; + } + + // NOTE(m): Switch off the access point after a while if + // it's not switched off already. + if (wifi_get_opmode() == STATIONAP_MODE) + { + if (ap_enabled_cnt >= config.ap_enable_duration) + { + ap_enabled_cnt = 0; + { + wifi_set_opmode(STATION_MODE); + } + } + else + { + ap_enabled_cnt++; + } } } @@ -1003,10 +1034,17 @@ wifi_handle_event_cb(System_Event_t *evt) case EVENT_STAMODE_GOT_IP: { - os_printf("ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR "\n", + if (config.dns_addr.addr == 0) + { + dns_ip = dns_getserver(0); + } + dhcps_set_DNS(&dns_ip); + + os_printf("ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR ",dns:" IPSTR "\n", IP2STR(&evt->event_info.got_ip.ip), IP2STR(&evt->event_info.got_ip.mask), - IP2STR(&evt->event_info.got_ip.gw)); + IP2STR(&evt->event_info.got_ip.gw), + IP2STR(&dns_ip)); my_ip = evt->event_info.got_ip.ip; connected = true; @@ -1100,6 +1138,9 @@ user_set_softap_ip_config(void) wifi_softap_dhcps_start(); + // Change the DNS server again + dhcps_set_DNS(&dns_ip); + // Enter any saved dhcp enties if they are in this network for (i = 0; i Date: Sun, 18 Mar 2018 14:18:57 +0100 Subject: [PATCH 5/5] Compiled new firmware. --- firmware/0x00000.bin | Bin 35360 -> 35360 bytes firmware/0x10000.bin | Bin 229988 -> 230084 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/firmware/0x00000.bin b/firmware/0x00000.bin index d8ca52edab94e5aafc835fba11da54e06f81014c..3e81e013f0d884945688229d8a753d8d8bdccd68 100644 GIT binary patch delta 3639 zcmYk83tSY}^~dK7yJjV`WKptJ0i78Z1Z8mt5to+?3m8y{;0sYuKmF0k`Ivyis?;m0}Od(ORc z@7%{+dmU@9WA!~A45MKTGDE6p)<4IxZN9jWts24Pnq*6^<4g7n7HV<7HUp9!x3nUw zwdb4UCiK=VgBGmRZSd+O?j4Y4*>K!o;>}4Wev+6cfDq@EMM%1_Ad2+xA9${HLP6hFh08n zpu+J-<5~}Id$CCdhN);F+fC|pn8zV_F(oEBgT#|8C5|tBy&#$WN$ul z#RrpLTknc5A+96KKXJwHAltD_lzT~=$$x#PD?WwduaiF}Pn2s(zau}G%0jmU$Tv~) zF8~Sa{C@xot{ZRn+(*$ys%6sP_zB{uJm zAp$S2Hpv58-uo0iS6Azbk06=Q6>lZA9Mb^S1uWmxYUW^@vxQ-VYYL}t`_LtHDL-~8 zAzVV2A~v*k&)~%zc2y|MbWu*iw@RFs*bxMYDsgO_UQ8?E3dN3Ms8ZXQ3z`DZ+Q38l zQV~1KA!ZejP-WSWl#Ih;E1%>n3B$ipYa51MehZS>Hh1Lv$~8f$S=GtqjYPu+BaXd}@XWs_R5k#H;FNABPsiFOd3bkk9yH;6uT(-ERNqT_Bl zL{v|7%uRnFvJ)L~(?O#5h#K5fPt-_s&`tY@P7>8CEoOTB?+H&6zU2-g(Pu=clCH8n z|J%%)38T*P`d(%qHU#H;fWH**&14Fq7|LgE{r;BpcLAzH0yn|T$=D& zpnpVLtYYParOL$7BZLRaOdZYh10{L4t0k7Fs-0%OEn2bpvEdD^qMe!U^Bdu|l8j+N z(UWU}6)VW0-s$?bDauec+@0Y0b>cbwsI$GY=q<~AY`#Y_Vo-!n=M(Dg->;eVT2YbB z-f@u5CF9?N!oAyaU6%nVi^9%%^0u45Y*q{;nLU^whTL0}NdiF>u8O2E{unSjB+F;u0%q$;>hqV#HJwg9CA)SpE{2*hz_EgVPB$xAh*&df9{n;Zi&9-HhB)A9V|B3O*(&={DF zD?_KVnosdiXf_1lK@fn*n>LG(->fkEy_=d&<>eXR@?&GVac?PfOy%^i zFwEt!C)?fNNzhP|ZtJhVrxonQi#alpCPK8cR6! z=d>jfLhznN0)G^wnea50NE5&VcSwFPfbU8@a29um`@$!9Je-GJ%J=m_7=Hif~D_ za9>T_vhGpY=FDgCXR8czFgQx^@>7F4a4*f~%a|2455C9aQ9r;rd@b4pXRs+c3U=eI z=tQW;u$cX@7TaTLVU8m^_WuCx;nlbua0&BfM8juzV8#?Ui5F)i1ASxS1842+rM79j zFtMLyn5X=`1*u<>`fcw%2X79Cg8a-uv6K8pT@cwDe-00~w@mj76>ie5(LNav0{f*P z%3cgLxH;Yeo!A^NKm~psALLcjJ0NKKB@KnQ!E$^`E{K@@Ym@S`A>8dl!gZ%~-D!I- z5|V}kR*s+AVqEJfeD9RLr-%eI90%n;06f7sn`LTp?*QylQ-z(q!7RL{y4t>e=uvn1 zOiw1<4)kJa4~FNZ`L#wt93-RNHbtyf6U|)Po34&M@bSM0Hr}6Uppu&L%r%zEPU638 zA#fCZ6Ys)uhi8(@!)xL_N;_NQYENtDU?mz;=70foN9t+@SD_W@E&rr%%*O&S7uHpv`g;wAe6YIm9B&v z3UuC~h&q#39l5i%1N;N8&%Q`ki{`X)0LO&%EkGBFhUaBg%i>SZZ=qeWV$RnP<%r67 zhJ}wYb*>dIIkwKd4d91s=1&FQad`ebfQ$I=1*>5+7A?F^i#jc<%g?3uZV?SNZ-F5r zC!tF#e5goGitUgM<~x!WnE`HMRdx{k758UHkN!%{W`j=hLu!-%I7f zCytoK9ss|`_$A{e;4Ny&5^E4eCJMT$q}{isbEC{&+69A|?<)zf;R{RRXh(gtWZvlI zJwsy^&bXvcT(%=Wz*6+fc>|*Hc+SMpmS3aWUD9@nehQ&@J%=A{`nCKem$ZS(H^T%R zlbhnHA1>c=4@+~Spc{|mif|P#(F6q|Vdl=@jn$mo$i!MLUVv|yGj9Sb|L zdg-K*4Y&EE%ZrmTSv=dY*3?NELqoWL9T(eN0Bf_VYS zN1gmR-YB~0&~JsW)Jkm~OcyKo4obd*wxieJFSxg0&NFR|&huT0nUgvc+tDA}@L@q9 zY(?MY$HnA5&TFi(V89C0zy`H}nvc~6&JRcz1`;kPunKQ3pKZ|YbDsZ3G3%ulm4uUu zb}uFtM!-mXp)ixxZpDj*5ngRCI|tdBEE9V!;j+?(`V~9`V%Ul(Fk;CH|6t9}L!*!5 zVq4*9^*LMZ-FxfNNCWmZ;V`^iSy-G=z&im=2m02?%D6QSD_&$`1lc3D8zE}&8 zh#O1t;G*MNi3rfMr*x6FX{||a#N5)z-)Nt6>V_`_40B{V-9%>v$Uc#d_e%p<`i^~B zCP)7C%O&>mTi0m?*vvT@Ne0y^&k1i(&zSJ?CBow#a#-_{p`|U_3)%7|(2PmtF`&oI z_uc)6|p}+@LLgpidZk;#E1EC+e)l+FY<<(hqjPF~$3;u*bYi#tDTDisq zGx3czMdo0-Ge?kONylEL8z)%{X?}Bn++G(T+fN6`8T$j|jmL-`Ld7JYQ#h@1k>}f$ z204i?&|^;HiOQf6?SzFL_+4d?wvXIi)K*O%8C+$MgVzVhwHQ^km|k>URg|UapR!0d zq>63c#%~AB9_otEUwg|^Whu6OQ=IrSzrEVBx7yhA$Y^!e?r3R9#lb2&Bstz$Yt#Ab z?uc@ii}Z^qcT}6?+j)%KsmebFi7 z?k1fe)f!FmJHs-PmH&r}hx|bK6>=8NH_7!2P4eR`lRR~iNoKN#{5-N>lTfM-cJ#iC r>=-G`!Z7oySM%xlRlH>7rHE+yi->R>*ixz*ahdTG4|Cj$C{cc}Z delta 3696 zcmYk93se+mvd6m`21n9N21KF)+TDx@$Ow&q1A^0x!JrWXz7U1TOmsj61w`}EE3%u3 zk2MLgNPMhjQDZO$Bc?gVWRo0pL0N+dvL4MI^@`r;szD{u809g2s|Rw=opb(F{p$Ow z`g`?*+8VaDhV{GS#W3ECQD#UL$NXMkSzQRuXUlzR^GtGkp7K3=mW5c{rON`Ba#ts^ zI@xZLv(R6^7z(gVzs^ufTurJaHQ1FN{RBv8BENl$57SBZz@;K4)
qX`Vt*zC;| zkY7sLNXpIGI+7vFEBU^E1*le@KJ$=e8yw1g!wi;faw^IG%e`m_2Lo5JolYfa_;vuJ z@=4HYFMqkvBm={g7LeUYDpky*5Dc~Cc9WV&?S;zs!3LODx`M9oyW5&Uw(GIm8cY70 zyWLhj@n*7?r*7+dvTch+xtml${+R)Kn*0$3qFhaSjr>-MHEj%&*P|5bppn&t zUV|8{7+veTjaus|>x37M9wP?0-eUO9M;0!h%`})HtLag?GJDK+5F<)VvXNm5LP!j$ zfzmk5r}!u2cNL?LPz33?O1KrAK9AwED)uDsa>WauL8igNnf+wB!sySt4wQ;u>ZGJT z9q->r*VR|Mt??ui(u_z=hrGdPU>K|pd!_P%nS(#|G%<{DMdkclN8Q3@_4;Ksl1sa+ ziu*2fPT|Eoc11L#yQxpwB{kI`wuOUDBaTh=6K6WPC1P74lxa0)gSP{8Ht>?psbX6R zSUgGJsbcNhsfMU%h}U@iuVS%TES?~oR=L1Ru{ef{6Z4AlSTS!|T~dJam-kHKMPGDjBJsa0B6SPvc>tH;EJv)e&taI_jZ=MAby~9@VP$PX=tNq99+i3wO zdB1LkVJx(%48;RZcAv7d=UAan9V)qM+}x@3iK_5aP33I+E~F=`dZ|?iIBE3cG*C_r zDT_3a$J)I*>~M|^y5W7k3m=Rf67Nb;Eu4_AjvMA9JXELYX`LUcx_8}8DLfTyH}kG! z)fU3W?Ykh>GLr(I6S`C#MujIolOCa3K#um$^mE~=@G+pncf;cYe|Sn`ynNN{*CMF0 z**_IBIUQaKj~nmGcb{V~1(ZjVFoUZp2Y6_8b6HAg|YY~ z`mE*m-%g}$4+5SyZ4|+NOl5ZYH#9UB6d0lXNl<3cj^)rck@I_tVa}VMZt{RH!M}5P?6(N)Upf z(zGeQk7!yxs;V84e+uW=2zIFd6;?RlmOgUZ_B(+cY|low{-EXkF1cP2_PC`z)K~(& zxKFwRP576%VE7X2;&?cww8l*ZdZcsl7ARBF<6nf4>aPQr2okYWEG>?5r0m)25iGhD#Qi80WMD-yqh_i@ssx8Xf(nUn+TFx2v1La)|e z>QRM}kDGXg75Bz6yyiIeLb5jEXc5{p3%_U`t5!cQ-k5E`|FOt03r$IaAy{kFgJ*+| zwd0(mIdB#0lCHr?+>~sB6Ih>|1n=OjtUTBUS-c;SbhuLwa|g;N2^EQ}ds}fnKs>)QrKB;qvfEu4}(=vq!qw zWBWJ}redW$5>l02^4|cSV3I91NY~v5+qC||mhK1^wrXz6L#(ug(4DZy79&<@5i{5F zp1W;39RG!2{jbxE6mgAauCf$6hWBid@G(9&^*%ThpXc3PhVTc}?WD`yIaMF-S(u4c85Y{(uQH-wBHql%t-N%f5};T0 z<%R++%(iM6p^b!N-wI+Z5X_5H85pKT!0dL`dvk#{IVqY=sc0#WBP0hv?&{AcL4&=FL&JUb*=jZSUZ{*Gzva6fo!k5aVg3SYXVuiUneu0cMI$a@Epur6=hu$VtuH@T%v z)cOsK$Lo3gu&_VkZ@8s(6yFG=F)%;Fmm7>%-A8AB5?sUDd=W0in{GRSJ@y(p9QGE z8(IO^7g~YSebSk}v@?gghrhTrqe1O&^@u0_wCE09C6`olV zZ*Xns>1U_0Ov9C3$S3p`vF?$bv2IZ0&Jd2S(-j`^EnPabI~O diff --git a/firmware/0x10000.bin b/firmware/0x10000.bin index b8fa86632360489e7eb491c7a10dd8755c5a5de6..96b51c4a50e703dc2d499bb9b741ffa95404ccef 100644 GIT binary patch delta 21450 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 delta 21261 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