From 701e1654a165fa2235b9a586019346048f4a16a5 Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Tue, 15 Sep 2015 19:06:16 -0400 Subject: [PATCH] moved IP/netif allocation code --- netcon/NetconEthernetTap.cpp | 59 +++++++++++++---------------------- netcon/liblwip.so | Bin 213704 -> 213704 bytes 2 files changed, 21 insertions(+), 38 deletions(-) diff --git a/netcon/NetconEthernetTap.cpp b/netcon/NetconEthernetTap.cpp index 68c505152..20b8fc1b6 100644 --- a/netcon/NetconEthernetTap.cpp +++ b/netcon/NetconEthernetTap.cpp @@ -120,10 +120,28 @@ bool NetconEthernetTap::addIp(const InetAddress &ip) _arp.addLocal((uint32_t)(reinterpret_cast(&ip)->sin_addr.s_addr),_mac); } - // TODO: alloc IP in LWIP - fprintf(stderr, "ASSIGNING IP = %s\n", ip.toIpString().c_str()); + // Set IP + static ip_addr_t ipaddr, netmask, gw; + IP4_ADDR(&gw,0,0,0,0); + ipaddr.addr = *((u32_t *)_ips[0].rawIpData()); + netmask.addr = *((u32_t *)_ips[0].netmask().rawIpData()); + + // Set up the lwip-netif for LWIP's sake + fprintf(stderr, "initializing interface\n"); + lwipstack->netif_add(&interface,&ipaddr, &netmask, &gw, NULL, tapif_init, lwipstack->ethernet_input); + interface.state = this; + interface.output = lwipstack->etharp_output; + _mac.copyTo(interface.hwaddr, 6); + interface.mtu = _mtu; + interface.name[0] = 't'; + interface.name[1] = 'p'; + interface.linkoutput = low_level_output; + interface.hwaddr_len = 6; + interface.flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP; + lwipstack->netif_set_default(&interface); + lwipstack->netif_set_up(&interface); } - return true; // TODO: what is exapected? + return true; } bool NetconEthernetTap::removeIp(const InetAddress &ip) @@ -304,26 +322,6 @@ void NetconEthernetTap::closeConnection(NetconConnection *conn) void NetconEthernetTap::threadMain() throw() { - // Set up IPs (will be moved into add/removeIP later) - static ip_addr_t ipaddr, netmask, gw; - - if(_ips.size() == 0) { - fprintf(stderr, "no IP assigned. Exiting.\n"); - exit(0); - } - - IP4_ADDR(&gw,0,0,0,0); - ipaddr.addr = *((u32_t *)_ips[0].rawIpData()); - netmask.addr = *((u32_t *)_ips[0].netmask().rawIpData()); - - //char ip_str[16] = {0}, nm_str[16] = {0}, gw_str[16] = {0}; - //strncpy(ip_str, lwipstack->ipaddr_ntoa(&ipaddr), sizeof(ip_str)); - //strncpy(nm_str, lwipstack->ipaddr_ntoa(&netmask), sizeof(nm_str)); - //strncpy(gw_str, lwipstack->ipaddr_ntoa(&gw), sizeof(gw_str)); - //fprintf(stderr, "ip_str = %s\n", ip_str); - //fprintf(stderr, "nm_str = %s\n", nm_str); - //fprintf(stderr, "gw_str = %s\n", gw_str); - unsigned long tcp_time = ARP_TMR_INTERVAL / 5000; unsigned long etharp_time = IP_TMR_INTERVAL / 1000; unsigned long prev_tcp_time = 0; @@ -333,21 +331,6 @@ void NetconEthernetTap::threadMain() unsigned long since_etharp; struct timeval tv; - // set up the lwip-netif for LWIP's sake - fprintf(stderr, "initializing interface\n"); - lwipstack->netif_add(&interface,&ipaddr, &netmask, &gw, NULL, tapif_init, lwipstack->ethernet_input); - interface.state = this; - interface.output = lwipstack->etharp_output; - _mac.copyTo(interface.hwaddr, 6); - interface.mtu = _mtu; - interface.name[0] = 't'; - interface.name[1] = 'p'; - interface.linkoutput = low_level_output; - interface.hwaddr_len = 6; - interface.flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP; - lwipstack->netif_set_default(&interface); - lwipstack->netif_set_up(&interface); - // Main timer loop while (_run) { gettimeofday(&tv, NULL); diff --git a/netcon/liblwip.so b/netcon/liblwip.so index 75b8f0a00be1f1b5793a2e3c51484429d9fa1f9b..799b57397cf3660aeedf61c1da8d42487b908496 100755 GIT binary patch delta 16733 zcmZvk30zgh`~UBp%Vkjz(1YxwaGX*!$%I#Z*ZE9Izno6m;6zBh$GxuJ=-=EiuK6B9pJm~dEwMS>qn=%YtZRh z>YC}AD@$Fy(dJ#(1yWsirKMYE)=o)r^JcS@k#5^rjlxyUe96ofsRd9BMVdH!DUMI7`A{l+_^D>?;#vL(HXKXq%xNYWQl@)OD+5C2j2^{w^#{wWCBa+`2L9zRv~JQpn&a{~XI1PF3ax%b=w z`N9)`HUg|hBRKm*Dew2X+?#_AR)8|VNb``?ASSy!1{p5M*C>OuSMvLBlt(=RSS7#! z0TwDz15V1z{{}c9fPzM__&_ljhsnVllnY=KAW@lOTq3V|2=Ijf7tsh7pD0g^gXAt8 zTo7P|0BK6jz+|uQ9{_x7btS;#2g;s-OXPu^7?5EY`$d?;*CeISplq+J_W|4l$P?h7 z`^v6C*W};-0_i2lMwr9INqKMZ40##{c>??ibAVM!n;|3RfBytnEWoD%_$dWLddYh^ zcvFC-0(`D~JLFB-gM(rL{()P#iZU-u^I-DrdmwiN(Fx+BY#usOp31>P0S>|(CT}P~ z!y@Gf4*nM4LjeXTV}@1BL+=7~!tIE$e_N+nOjmlQFO-kp0Z0^JmH=0k)9HC~A_utw zFacgr24`60*?$1MEWjl6htAh3t)GvQV>oz4fZhTORYp8NUEY5iV4(mt2m}`AmCMf$ zkVkN^M1TST<|;9n1LS{h0W24wivYgLTbU!}wH#~_;4ef7SG$$RneF8)4&D>siU70C z-G+B$vd`}zUkY*zA;Kh1nU&Sv>&Ke_=LFa+z|)(`Cs||U>6}~^q@N(GmB8!`@(J8- zhp!880Kvo8HRV*cA_s7w3eZ-71oMm$|8tOYe*?iU+Qve%a+&;L4TxC~JzAlcljgeV4tlxZYmf*rEB@bTWVhlnGg2PHL8Jh# z0=%pk0o*vS=IOteHH*&5s+m`quQGnt53IAfPu@vMUVH(q4h!=wm$X*zDc*Ba=EE)0g{xlrbw?# zysNzej1fRRro3-jFGq4>5#%b$@Rg&azWI`D=0SWW010qS`RvW9a(51@1Q;a11ar@V z`AmBJnX><_f0>tgU*Sq7cQ}l8BgMT$pK6|mn+L8vAjxCV-{I|o+$`6~TV~JoPxMSu zT;C!25bor|x#BLEcR=I6DwcPyu{}yLMYOnNZgfkZGGCyvOpe+IlMTWo8s-?r3+CtE z{fx<@G3>*i3Njb1Kul(NQ?--)`o|zs^t>wWs~sBIW4^cbX9w9-0^%U@_1_OQQfB^b z`(I36_C82=K^~$Ny!}_Xv-3Myc@H32fM@|K%s=c}$K<=4LEaPO6PUv!Kv}vwTsCv? zz5w|GV1{=Ol(RV~5g>vaD5v(M$k`m21xOKKx!G^;P)WXD z40277M`#6;5c7Zb?U&@v?|^uS`(@g@8X2YZHII^yy$#?eKraDqn@i1aFga`kNFPBe zNi%ugJow;sgWP2e$R$Byi!_pJPX2VAB#&MTGEt<<6qFG_k@?1FNe*(e0ua4OgI7=n z>0|DG{1}sam_U{aVn!KchS}w$6O#j0gPaiL0?Hs6O1o1FQ zTEXPFVm|X!Ua}0JP?$&pn3dyazn9l61=uUVAXvlVgn9qx4osf^I>-q@y22df6Xom| z8L}q_KML>%%mMnFqraTMw5G>6?B=O9m>0J2TTtKt@-46;Ib_m6IJFbCTOm?1!-a_x`Z z^0*fP$^UkGpsWmwEL@4VYjlGQOF31Td7 zkJU(knf)0c$>&FdD1t1>)yQon=6;quiG$4o^b}yZvhn`+^88T%M+8`kM(9OR-h2=v z$8c~|fZhTORn9+%l>dAIphAEa0=O$J9>&VMI5;lA9azIvl{x!ik%Mf=23aJgc>V~D zgep&;43$630$46U8v!bm+@~GoNgS*Y;15{C*K+g5r!$!RYbMA)g1m}WAbPXkzeYog zt?7+6x6l}C$`M8>7N*@g{SAd}cOd@|r7RPo_h9irNeyg))`|m={@AIO`U0lKTdDz|% zz-oJ$K5=A0sbgYPb<)ZT_qQunRLnIR3sP&0rmEU-;p$yskuF>n2v_NF^?DOmv&r3w z1qJy<^8QmF6{LHh$#66=p}?@=Q8CX4hNl-OSKkN?infKlvy(Ohez3sIS_kS% z^PE{Qn?vt7vyRM{Dx6t|j#uUf^A6#X$NHVPdZb;UQk#X#d?KcjhYRbKvnN7TZ{ox! zY#Q(>USIZq>$hP3ZsHMy_68R?*G6ZJ|9X@be-Ixyedxjx^Nk&~iPL62K$}EE;XG{! zIo1Tg6&5iECUXU_C4c}!0XCs%tU{Msr(2p_S#V`XeeDLMZXDpK9IN)lrf%N5HX&bFxz-qAcESP z?HU#!5P=v?sgI1y7eCUuZ{W8@Fvj*?p4L^i=xQC+xv_ZG#}d(kF{x!@TUAA*EcG9E zODYez6D4}E|3ww|MGP;BJ!uchh~Xea#4sw<7DExbubn}Op6qa|ypU&HjSHb957wLd zw`BG1y=Q1qyeOjROqs1%PpNqjt!>3dvu$*{6>H=9#&m1GRfzj#4Ef6}AZQ?}aZ}6{ zroC{5jGBv7ujYAfrfivo^-l|Gv>Qa&;DTW7wyK?`d6*(Re2Xi1m~!(NpJTW=+79`_ zebrE<%-SR#3T()ZZpK14&pw!pV%`Rya!|%(WJAPc{HKj=GWMgh+CmEOV*YF?#e1>N z`5Tj9xm8%U5SCX_B`ghg%U;~FHG0L3U5$upF@7FT<}-l|=I*SI&%aSdAnWYz%Fy^2 zy3*C&#$41^1*j_h;>CgnZa~SF?0h)46XE3(5mbfn5@Yu=!tSMzdzk`T+hiW0wARdT zT+B1>Ox)c;;VxIWJBKPU#`|b2f{Nho3^sSzLXoQ1ke=U8v2Lr6OxkYSm8x2^DZ!61 zC8p!(`Vp3@8QLYI9kO7YSi`O~%$s>7#riiL+FQL5%eNwyVg!K+x`-+f%im}$Vu`}c z*E;*tR&Ulmzj|`8w)n-UG%i2su{!nYtvGb}0qW7=EYab5Tp^NK0ILL;B)}p8Cf#D| zY!h_{qrCO}x<)nMYvVSg3Cn51vX5rjHhtQy4tCQ6qG6b5Xia%kH3=U&#-^(_}A%3dQidvoJz!PHQm|2_xA&vGJU) zp}%}tH@Ee0!RMVP;AQIO$3lB6sWG@w@ET@i#oV3+ss9*@jg{97M))c;EU+;&FM#PY zIERY-m>(NOyZu-f7C}Gwv9M?ZY~0Ia&%!~hv8y}%VsxurCHJyawQ=<~6yuLu>M*5o zd7q~Gv+%%qXzO0)AobSI^Lf@_B<=NQFS3W^8Nhl)bxFW{brSQHj56kH5k%xfkhg8V zvV1XLU1(7Np131uV*ra{Aygf}0$5x6B>)fgr{osMg4lNy70B8$3uOedP_}{Q@~c@? z9LT05)}}Pf(T@xb8w!$R)P zBti%l?kZ6wqMmGbw}rb~2zL}4#M=10mmH%r$?RF*@6og%mYjMi4n98;K6k+xX2Rd@ zvl33kjrlj`r1nxvYXTOeT{!H>Z)Vduo{X>3-5?~u7-}BOhDC*PkJgWpeTB#As1i|n z+C2{79z$tWFl)!Yq}{=6n(w`&7~N?HNpe5hkY|<1$7-gbXXdKMh}ZKz***d|YpLD&9BpNArKThQZBjOBmSx-AP~ zr4-+m_0D(Zeys0OX2Ss%Ap=!n%Kmn@`H8~(*E-`8yFfX1z?PGiKkB&PIqVmokJ9#w zP_ch~hAV6&p#b{@Xd}Q!0<_`weBlB-ai)AzqQBa*tmorJ({Rx=LNpDBkDw+#JfHDl z!Z2_C%@e4=@Zbe43_s!GH`>^a?ZM4z3}gMG?nPsaEydxfx{Ef(1c(^pRX5uhz2L6) z9vuq99legOgfaiXxnjh%#zLbrBCoKf-f5%hd~FVSw#ORwrl|HTDzyDbt^ZDE)ka1!m=N?T%cKI$2~-E=(Nyo+Rbh{m7Dg1X?Y8574FCQXP^sW zgl$l3JNWQZ{=;l--I|GYtEG3tS%~LROt-C(2O8a>&%@b?2^)Lx39V>6{}a30mUI4# z=;U63hkKb}cGGrzAL)R01r99X_`F{5w=+xYw6o}R6RwafonaYIbscdM|A8VRSV+rl zaW4PQ`h1WN+m9Kmu~K0S$G)7|}tYtGsUXKpk%k_89Ojumn7kCxbct~QQ2 zn@S^@H%p>3k<33m)Y`JQNJvvhOtHUs9h4EN&G02uiN#syWLws~E|_7HqqZG3asEGw z?S$RsXUguxf~PuiZ&AYA-U!XxFuS)0Fc(P@$-O!Lf4rr4vrlhdOu^OFhH*UHh5;4g z(|Mtxc{jS+39ki9<(T`i%B7U%NC_jL1ks;4#SrVp-=b?wSk{M;ygNc`+{==C_IA{c5xc|S&-$`) z1sq{e4^Slr#YZ9X;Uboyb~pVSjr}#9e7i7z-&j<^S*@`kt-A36Ab`?Vc*+15McWE*cBGrc!zgo)wE@n0NT2G|hqa zQS>{m;DA4ht_om%oL!_NG3-^>HK??nL=@`VmF1=zbPXBAH@hpL81XOzA8K3(hKdn~ zwzZA88jZz>>m`i%idv5`HhE)HMt8fi&M_(X@aZ8IQA`@rIJ_KOS;I>cz#3j38rlty z`du`=8w(136W#Cy;mcy!6BVQDc-(Zsg!3NeQ>!bX-Q8Hc<2az&Ncz1S^LKUEY_j;L zu~_nqWxKmlC!X5#koakj_-E3Arh6Du1O|hfM6BRT_VN6V(mEwQ(VHCOm`~g8nr#-I zqj5JdA$Efnc7qL+632YQj|f`3mGSH~+=`6Rtvhof%V_$=xcqjoY4Po2K0LXfqh)by zA~wR>ICh7vp>Mjg{%kU}>4AMMn!5L3o0vkEdaxCPPX}ppUJ0q)T95fP8U70A12Np@ zva({HE0$y*$7bMlxmsr_BT}+cvQma;qSqXwX>l>yAEA2fwc+`n8iTT5u z=w7T_cIiL$*kcM(_Z0?6Xi#2|?0}Fq@!HdHzA+5X&9r^S!mJNcOlML|HKsZwURgk+ zzQ&>tZVA`crEz;qk9#ry{AA5Hy!3$=m@RB<)~dm*g@~x~5fAnP+PjPP>5bd}3<`9= z9b6&8mxOuoQJH53D%w7*S8p5BYlCDUrrdbkU>N*Mc!=7S8+pz zxEBl3)@7s&?^lraR=L2)^a`?!YIpmm{QIitt(KKWwV)-(8iy~@x0 zg%fK=rHoF=O&OCiHunU=(0(i%lUTN6;5EE++K)FezvH(fUabwr?^^5c%NDm(w#hMU zWtOV)-{c{xsvoAR0U4?~9=|S`q8vV4RZ}fr4rYU$yl4GaRom`U)mNdL@OuKk=#TP# zm0D9yCi9?|hqDYzStg5gppIEAoP2ZGiTqht>QxU%o$lV%dNm$8_jo_R!VP zM^3tY-6Iryki8vm!U1#xGzYp3x)3VgfdgpVT{wWwtb+q++Fx)0UHAa@E;`*-XgstE zngf-vDhr{p&|+v7Zo+b?KT^2{x(0XnBbR*S4z_8ZW;)#yXgqX2p1(QJVR$Mng#HLE zh7QNWs2utl9?~_?9neS6%TS-@IvvBoB_6sF2cjHk6?7pq6K9rU=uv1n^c1uP`UUh+ zJ_>rAn|xfM_)roL?F-F;y5p0~LMZAJzXgyx?l|yggeQOOg5U=I)AE7WD1s{AyDu%{G&CndEODG&b zr$dXOA#LFRx)WLh%?m>S(4|lxcb#rCG#>gdGzU7SJ?x>!pvBN{q2bi7 zT0KowE1<*Y;(!Kiy--!1Tj4HPq^jZ2dy7>y9XjfD1Ppz=6ahm&UWS07A1znaYtS_- za8qKNShP}AgQ02ptFXVLFdRAs`aN_t^y{}&bqCbF5D`OHL2IFr>(H^6PB*Uz9Ye>g zhdp#XbPDt{=xS(|0(U*fbM|y{Sfxhvme7AI(j?oae6xl4fnzQ ze-i~GDt7OJ1L!5_YH0FqIDpnctD)vnIDnQOfCFF5$U!)OPA`K!w8{c|sB#GQ&`+T| zpeql<9$I}2_Ru=0Gq!WT3fTMM{$E=O2dHRv91fsfC*T13`Dr+SzEK4S&~azr0D1=M zj3?}_vv2_Y`b*eD|2zkKsP84%Lv@#74;@_^~O3-TP1!ygl z{~(pLAG$CGFLQF}<`}%k-bbEeSx|`lUA?-NA0<*+c)TG!=jNz?6aSvxS%)D&lg9O1Z7$kM(K=+SqNSPr0dP+YUZIraIoN6`nSRCSB<4UA%<)M-(%T z1*J&W>eYzG-X?0!G;jQsu`4*1w4t}*4g4gyfi8|?{)QVUW>G0TvempMh}BRXmz(4{ z9uiA2kdQDu`ex!&u03}BGzZ(bKf)S$@4|XWQyUk zj54@vpgb;bQxTV5RLW%yU4(>$<#DN}A}+sBDVHzkBA1`3 zj>`%1oCx`eVz{iO3`k0AJQ{-=hc&9v{Nr%I`7}&^!;DU}FY^uXaa78^<sRQye zu$8LzXzX-$!${hJ$5I{lhPS*k>oZq0f^zq4VCV>8&%G$G6$#)uR&r<@IuV^HfKWWi4Yz(PX!etbl z;gw}{6Cz2&so8WGZljp#fH5?3I$#Pdf=Id?+Q{KcREf(F$BB60HW|t-Z7A(f7mE|f zWnwenqnJ8!`HnJXz|}~~bw04o_2wkV-Cl=sK6(#AZUa^Ui|UrdL&iy){e{Y0lm-=khzTIgmaS!et|+a9K&?AtC-aetg=*VOfJiJVnc>gtwkW zm0S+dbuOmvmanWi6FJLQWmQv%JZo>g|gv!&*dXp z%B6}*xLmVT&S%FQ-&w%AWZ1qW=H8F56!v$k23ghirLb7*we4$QgRIxKFMj1(uP0e9 zE@o~n(f}7_JZnu4-(X#ub!Z`c*E?u+{Z}!MW?`*FT{9?PD&{exkB7l{)EL zDYKY^rN4=TT>eiW@FUSuE1=c|tc%OoSW*8NPP}PS0UYPViK?rT*4aC}u1CD68|zQ*JuJ`5pb%YzX+{$<7`)TnmmqffeAO10i zZIHxh#`z57@xCps$=5nh_qoMqf~1SuaAx>^-b}>*M2ODkEazJ#G2CfLrAxe`tDcV} z!%eihj57aWn~&nT?mdfhF}NHtxUPCJxO6c%eu<4=Dl&?}b<^{~Nk#p{*ld@{Vrb%0 zUvwm2EJYms;V+d-^JD2cmYg~VO1>={l2Hppw>OqbcjFm!HBdUqI?zXLq_>p~NUCDpXh*P=j7R0oVCkin4T&r42Y08E^X!PlKUDHIurTV@L5lZC_7TJN8U|&5 z_|R(|;NfdJ(m_hVBk^GesT-R@5#dri7JLGi!?ZbEDw8J0i%^3iB}cm6QEDY^XP*tSV3eR+{Jhc6DxxEnw}bJV6?ZGmcMBsXfzCpPo`zY$mgN zN}X`jdB3MLhYg}uy`&PH+z^_m*a|V4Blgiollr9>4OT7Kxbd56GA(-N!d| zDJeMMuvu46^Pm{(3xind;CLXG7e*{%Lp=Fr7i9^BDhToJw>fNeXE_ z#rpNzcH?+u-yL{k(_jcZ2sN6jCNYo4M8 zDO))}8btR3q$HvNlCP(Iv$fvXxfV3|+L7fF4V6Y>GdvuTGEb4qb1hCvg@eSOk!b{gB8+Iy;DE@ zRZrq)$}Li$g-%N0j73{2PD!PD_RuotjMU75 zePI5x&58$6NGsrZxTp9}pcU(Q#>4spO9rssZ+!;=I#|8Gicco|8}#>kSeCWczrz~c zLm@u;5!fde`5?wz+UcVoi+#<-SHB%;QtGQ8hG!)6)6c}_ndhg!i;Z=>zkV%dt1YUya@fhK?*iw?Duaej|G&Kc- ZbfuCMeIKdbfqqKSC$TmZ(pSIz{{i~W`2PR^ delta 16826 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 N@4^Df&`rPP{{cRTBB=lX