# HG changeset patch # User Tommaso Pecorella # Date 1459618349 -7200 # Parent c0943e24cccca0530a36b8f576472e879ba13463 internet: (fixes #2057) ARP and NDisc caches should be updated by L4 diff --git a/src/aodv/test/bug-606-test-0-0.pcap b/src/aodv/test/bug-606-test-0-0.pcap index c98c7055aab1fd1ad46a2ae75e304560ce0d2dcc..e0765c5ca6c7f48a8bafc02dc72a7ad52d0da370 GIT binary patch literal 5314 zc%02xziSjh6n-Vw2i?|Qw_HN$He&2iVo44HVeEal_nj6 zFScV{70nb?Ba6mHXkzs+g2Xyq1N%^|2Ejf^?=p%bw%=U?`#^estO8sCF;cWZW#3Y3 z(!wdFCM>DRVL%F*dYt$wF@CNZ7=+UM_!gPJVZ22Cl6cenrSU#lH{?%?sO_qLpw{En zx{ZD3Ho#pF!(1&bf0$-yv-IqEsfTD(EA^i&O&wF_I6h9!hu z!%I3#X4G&gwz&BZP#Q+>cjl^iG{(|U@zN}hdQ`>Hd&+lJ{3*p!t$1mc=X_hm*DjL% zV94?{)epF#A0%Bx0PT%5Rc)1}-<$MA|NS3ctG%FXl% zt=X*r4EW?H%Ebt`vwjHN-jrCHL-MejkUa`z~fs&Y%SJWeVXy>8_KBUF`3xw!LJ z?ulvQ6EB`;*m7D2izEQcOzoHWuZhok0^U?p~aoMW|k9$+q;PEA_29LEv)!+d~ zs=?#!HCJ!w>Ahj9SZ|1z=XjH(J)IYD*7zo=k*wyKH#}V4s2{pw+0|nSow0B=7A#MF z-i5KJW7LXc%rDQn-n=m_U(?ond6|4A-%&rG+p~^X>iV;1#u}6!Ppl=gzt3XV>8*JMBH+eV@PgzGut(pLX9mPyscD zLx6ko@4X2V*#*kf+W&J1$0H5#Sv9Fc`{co`ss_(MU_Q5CM1L)|T~oU5K%A{n*XRU zUMyM|1S-0BO=n=!ua?DNNH7@v`U8crdxy-C)U;;LQKV^-qa^3=S1dV-cak+sXU(aIy_aVSzh!1^nqjzBu-Q>RCef z!NM!f2hBV_NP0`7OZq^1w{FklxI-B}xZcg`6u-NcJQ|&`HIc{0f5_vH*ICu}Ws9sf zsYysxo2%D!+3|HNOUq~57M6ws*C;Kg%Ch~2(h?y)0O#DM$x>LITZ%0%?gQmqjGhr( zU3Ml|TI#Yi%i~U#mfsz&E=eu*jF)El%f>QL(I+lfmoF(Tr^@nvB}>cgIqsdMMfK`j z?<|OMaFxW6O7tiU$AaNN@;k;@TIQZPsrzt>J#%oL_i(DyI93lQ&xoT8Tugfyqr8XT zO|Z0hxHL=J!x-f~OlqmSqcls}!x&vlSxjc*$YtK0kr!XqT zJd9uBstr!7svt0OX*H7zqh?~v6vIFUNH>Zgn#!6O$@&n1{ThrOB_bi V#0ZLE%tHLFH5;R4V$2r9_y;M2>XiTh diff --git a/src/aodv/test/bug-606-test-2-0.pcap b/src/aodv/test/bug-606-test-2-0.pcap index 7fa88f2358a5153bafbebf2f5dc41ae30064e197..7ee5289fe1b4440edfee0f1d69e99336e6b73257 GIT binary patch literal 4220 zc$}?QziSjh82x7UvbzzKv#}C9weV1pQzWDiJV>Hob%ljxnuvA*5d@nn1tp}2QArcq zAbR8h>%*YwTob3ckZ{dGtTVIx8F_n2IhXuyP5aqeQ$Pej}LY~OK5;@qY=RK z;&Z1B@B~y(`-ox7p+vv#>_mvd62M&?66XQV2qCjRl527eTG?0|1VY&u{uuH6yXJhe z0MG^1OFXH5EqG!ODa4IpZi*|aUn8ep@9m#4bkStZq4v2A7Rodea6 z`^8|Q(O((*7*scGiLJhAyVS8JWYHDO^{(Hr-g3GPj+ITnb+^D683Eq;1#IuKT*qeJ+N$W zUntL!&n#54?QK?_#IqkfDjiR{V=BACoC8zIx=ntp@^bEzN2QayRm#h$sl-M80F_rn z4+U58zN=DrD_%=2PW~yViX(bcaux55sq|F5w#v&9RdGabH@J$gQ(jJ0W%C+$pICOU zsv_(@fgH~sk{rcew*hoOVyE^DjA-tzt_3b(Wf{jIvqGbCl^sZxkK0O$eUdAAK^3& zC)3GAluz#Zm`YD_YpbM_i|7S5xhIsDQ&q_)7lf0lC@i@+v-f~YZt0pEg(VlC4!_^w zI0i09BaCAPy}HVA?7JK@VH{X~{#mJXC5gj0u&BdZ9LLb*NWwVMiRy9Ua-?A#vsoX^ MaU7-W&W3UP1IMXvqW}N^ diff --git a/src/aodv/test/tcp-chain-test-0-0.pcap b/src/aodv/test/tcp-chain-test-0-0.pcap index 777179bee2e21aad30feb98a2bb1ec43941f5f32..8e10185cb3e70f18141c26832078156c3fde9604 GIT binary patch literal 52874 zc%1E>e{39A5y#)|-VdLz=iJ3Mt#O=OfT(fQgcC$y5hE@t6rvWe6hMRquz`wF3OFjQ zpb=oyMkG>|I#QxSsS;Z%QWZgQTZ9@>Qip^>TmEpG0FfG~)1oRRLNP58w4w?(`@HL$ z_vYt^=$vor5|zPmYn{LyJ&WmKd~mz4U-;{SJdEADw|8y%zE9Al&M zh#1wzeQU$thWk2IQ@kk7`FA_x^hE!nI7`Rk8*#j(ICu7Ws^0in5918$JA0es#K)6U zUWdwM!l$QkKSa{M-S}S+Jzk;TQ(cXpa63Jrnjf#BU-magqmHU-M)Q`U>EB*Ff>3Ar ziR^ot&xZAQI_K{AQI?LQp}SWQ*>^{)UmEb5_!@3rUCh4b;tS4+*Th!`J|D%$q8Q&C zATsEQR$m@)K7WhHTce-9@Ob0rFFxKIRuRu1I-)vv_Pd+U$M#i8*&lAKZinAeuCrBd ze*T8wu6i!Mb~^`Bcu95=eg zMy=!i!2fyN4<1a)Qa59 zSQxSDD8WKl%O=YD;lng;!Kv(;O5$M4G?4{5GZR)8#FkwwVC`2Dr*D z=V*iT#1k(PH3^{EA1KFF0IOYjf=+Z5Oj>ka&Q&0EiZ}r@u%}Mmw~ym}m7i|k4tJ~^ zB(8woXmxH-*?j=@#VM-~5Ph+6^ZU>hu&{U)EXJ9qvgnCcH>^`?t*>u%muT)rentgU zm+;;!Qgw;=7Bnnc3p7qVfYVw|S9`9Lw*Pb

HM1R?NOZ4aw3a(&w68HHF?iEg?ATOs)FY% z@0j_9&P3FDf|EVjOHdV8-rrtDP=zY*f<={Gd4;NWQb^TY!0abyaL3M3)hK^bncTc6 z+=!9|{JrCJkWkeQ{+XZ?RW;?AblO!-=oFR7P-jPTd80&ZS- zzKNUN!i|U*aMSZbQa9Z4B2kU-JC8h*D!UsBRqZ6;=8w5d!mA=b$Y+>WMXDZpRU~k| zDpGg_QT2E29-}z-<%ulfS4GY|o@IQ9@ycNbRWXZ4l)-lP^Ewle$R*(K)+e$FmG|W* z2|7{bt$8M$cI6d1Md=m(U1c`Q_>g(LpDa+-v1IvR;jeWC+&pk1%lHuCMuY|2ocvu< zH@xr+QH@YHta~O^b~hBN+DX98ORo}C#XjV~YgxvJj9?#>;Dn}4if71>(iqm_F$RhS3H}5GhKBSCydRI^tvwM#+ z*v@U!nTSL#0e}C!r;t#2@0cX$#Gik)=(H=Z&?!o#{mX0Q** zxqL|PG@@!uJKQMFcaITS#6DzZN0IR%#yelSsET>z4rQ|aC!L8%8^ev5cyYeYOu4{#sVyr**$mWPFHlBfe=YmSzjnC%>%a~~)s6aTT%iIHR3<6ld44 zYw{DU@^et8u%GIoD*xLDm2r)Bd{k#561fEYx#yt3DnAEh)Hmt0JBZLJN-yAV(}KtN zsTsU4?xm{Z8q3cMf2}Lv=K6nmjGq#2L|DMh#J`ie;r(wA)d+u2gKtu0cSE77odn!G zIpCV+1*_dt!A2K+IsCrI2+$hd? z;F_NUtNi?&dF(^3qAKRP*OkF`;lnx;k;o!i@+ExOv;}le*#Xv)ufgIp3tp?uJ5DI|;aX=SA22 z99TVfk(-}0kA27$E+4YKf~fkqcDPZTe^Ob*K7^m2qwr4etyIO_a88+QpU|0zL@oh; z?)f>e%FoYPu;{cauh1zV_8{<>u$8z@*CVhC)?43Am|HlWSrha-5x?Qx1?1DY<+|?R7-eAGE`b;+%5M&w*8b zeva{p<`q=MeAm;;V7qg(&O{_~3HWo*&k6q$&CbuM1}2?$_~Q^!7}%jH8hoEd)&d&+I z73?lko1BbH=d`S?2N~Lr){Bp3)9Ciu3+MuK78z z%FoX+zLBU(Rm}JONEvJwH|b17BA0+a_xv1K&5aRsqRKlFm~`5eSLhU_SNQk1F>Zd7 z@eMVrsp>dv`C#F%bp_mvuyc5X8xa<8v&%V$C-fm-<>sJF1}0T@Hx#PcNx+SNuWJrU h_|Euyxj86P*oTx|K4kb2MAfz0;YM*zP+5c#{s)m2?%DtV diff --git a/src/aodv/test/tcp-chain-test-9-0.pcap b/src/aodv/test/tcp-chain-test-9-0.pcap index a95bccf4176dd435fc21e7ee33168edfd2bf15d1..e805b21b12c216d935df4722a968e16d4a2f0ecf GIT binary patch literal 29480 zc%1EAYitx%6uvXF&n{cGRFu+IT8$AjnAM;mN^~1hF=`}1jYbj*#-Jv~qC`!6q~aej zh(%N|qPB^mK{4RFl8^?F2pVijB_c}dBMKxaNPIL=an9bI>7G01+>55}kIns(rMd^^ zd^`Ql`EIxUI=J<%9#_OffaAx7xV`k>f4nNhbwWN;olpZ5OHIL_>(+Tt6_*K-ho_u6 zA!;0_#(x}lm%Gd1@3=xfC&G`({-EEF9|%zp@}cx-4E`+jNC+n-5;5V(=lv_C<=+mj z4M_KvUvGveyHbgBPQ9KhpAWB6ymD~8_x$VC3i%l9EIrv2RG;{;{0_}1ua?;7xI2`F zer0zk<^MmtGDq^LpBMCa;X{H!V^F>IW7GX>Ig$I93a&S82hnX}P@TS$c)b(LyXAGS zHx<6#Lhw3^HJ?%D?V!hNpRlSc^(g3isH#hg@Z*T;R{lV!1ig;gv`R*_F|quvZTV4m z*RFoV(Nx_fj+pCzoGUmDwU@u%>BY}OLf$vHhkcF+)!OCC%X^-i3P++0_j^MwndkADJ}0s?*jkzj~wp@kYUY2D-|bOoPuS zp{?Rx>deW@7irvqsqCj%6g$8_UD3=<2UIhyLUg$DL38Xbv2M7O6ajS?rLUdPTDoN+z@uT7&SZIL7~h}>{dHF7J7jGZb=jB3}p~X>I(C(mTG4t25K9Bu> zedhmOnLe|IE7RwtKXn_F7DzZqlj+=;m%;H=1{W_QW;X z{%&vF;NAu7-YH6RnO>o2E;O{dLb(-# zKDGM@7NL9pwvS+ezvJepEa?4jVDWX_;4`Ds=jHvC>60C*OrQG>=r&yLaAjC5JQ_E+ zcRP0PG_^^yk*|a7Caqo+)q7O80XJ?=YP5a!mZZVGJFt7#P?{UtBUH_OCG~A#!2$Gl z(H26Tp>~)0RlR#F-@%V_?p@c5)cL*Kib0!RmuJE>I*(9QZm-GmLVO=~oF&$_hfr&F*yjG;7Fzf>riOWY*Y zZ(+fqxDnS8>I}6z;8*qT(2d<8!MVfu9;D9saw`UXUVNQk5xT?THwYH^r&Ao21?>)c z7K_%W4PS+fPM=pcRHo0pZ&#+z=bLmJ?&r;E(@*taSItrzZhYkYYd2i=0(5hHvu-oB zJ(1}Et8z9HY`Qz z+%LCc(C3Gh1dGsBS3ga#K<+T)s4QrA(6jjYnT)}OMyJpFt1Hu||M|-F8SJS{pXc7t zZPLr%tqhBwdNYPo!V!E*7)x#JhUnKpc4Jp9KsSH)>Nf4t`?4Bsdkf6GC1L&{*0YaUjcIW$5{VAajpAu5sDWQ20Qs>QbD+Ybed5~Zco)Qi| zNU%WrKj*3}=>4x}vG!@*r1q`K8r-49Mea~XO=@%GJZ~qpdQm*9t>PvOk`{b!5US?f zU>>`}I7)Mq+JvgPeyM&73l5+^J~s$eb8fI7yF;3Dht`{rI=_%xG3dkR2BCW3G*fP{ z;HoTWchIvqcA;)kvlp9kgR`+a)Kin%8a>C^Nv&FdZkjLFO;}-#DK|KTGkvc3SGhrW zzUwnnZm`{DdYn*h5T56AgHSc+20O6JokY#f=~ILGx9rBQdNQTCGkvF5G`CZ#-@<|e z=#S4^Le-qN6!?2O8O~LwOhM}0Ew^IOhtFF=b+<8ZxxrOg(C(mTahox3IXZp5{Y$qI z{uHL%U>|m&Q>cwFC3?=b8=-0ex*6kexxwPQKx}Rhs^;8aKX#!Bl;+MF7K-N5S4j0+ zSa2x5YscmWp=!~7PLF)S=1Zze52E6 zw=vH*I(=?Aq}x0X9X93cj$pTIpf=Cc$obc9p6UhY=840)jlt*aplZ(92@kp5L`rk# zd?QrNZIkM^u;2jt<8yXUHRtS<-%pa|+%7+i)cL90ia{SfX9v~A#++TwQ(4gNpl9** zM@fSVjZUAlcIh_4%mGuLuf;N>gw69o)tu+cV;5?o zGHusyUZd!0s@XbBF0WkUF=^tr+y-b7@dLXw0Q`cq$9p9rP^jeo;56 z%X&cZ~OLTT>8=Y*oU%tccD78V?e z-=kpjNKiHBk(A%jm*d=F#zv&hOXXG!`tW%qsGj_gDUa0csVr!B(6d;!TsNs}SD5lh a8?ZaHQjytjgzuzvs~F6`3) diff --git a/src/aodv/test/udp-chain-test-0-0.pcap b/src/aodv/test/udp-chain-test-0-0.pcap index c899b56d52fd35572794f48251c516ef05bf6a38..e23406fe4dc74e056ec1a436b7036611e9eb912f GIT binary patch literal 36402 zc%1E=KWGzC9LIm}k~F!bt!+V2Yik6D3@QPOQ^71k#||PonMKgaIyos>U1}Fsv5QJ^ zs7}Q}3W|d`WGLd`kkLU((M1QT`MuCCVNkg$dMzW(Q%MN4fEU>Zti}}q;o9sFIoMl_uCr!-P~3k_hpcRckQ}2 z&#*7vJdu${<>fhkQc$pZUg|iux@O03jsIM&gw=4Hv)iUSU1+b7INIkOGlss*?a03^e@vGcx^<3=8Rbf`+kjXbwh1#ScYxv*~3H_HJxV$7));YI+Ej9yUk zvYg{aKD~CRO2&NSP8NJ@@K`qCPTz}|Lm5dwdTB-s!0)SjtH~!q53b+wt zPPGg-0)S-ndb3+oId0_HZHKC4+(^$-6}S-q!ujr#;R~507!;)!(TUrqv5(Kb!Dmw z+z0@2VciJVO`)uA)Zj({kPPdFzitXg!*x@dma4#w03a9Ejd0x*V@`DvZUg|y=zsZo z>!xrtTsNg-IP^JRp3SdkPGWZxNeFu zr#cNc0)S-ndNXg`6pn`LrnD_pfg1rpF032jx+%t->M^(x03@T=n|bS|a5P*uWzA9* JxDf#4@*iwz2ou$!uR0)>y3c&BpHv1 z9#7u?J0QA4$td@@#>AyL`F3+N$5pyX)Z!`8AgTyaiN-is4OZy_Q9#KYsn^oJ?Dyic zwMRp~we$!LJwj5iNe>Z?`E}Pm>Us}xx_xkuqjyAYN``qKsz;GTnTq-N%c6OH+T^q4 z+FS^?)9Wo!YNg3DH~(KRNap1#$;xuQH_>`Cl#GMk5xp`}z+K7BLmyHH7; zP&xXTmlVl!oP8jBbaxC-(2&)KA6@6yn&$k(>}A`noBC$2{50GWZ66);Em3!a>giM4I?6h=yDvpX_54uKd?XSc z<~!6)?KdAQ=X$c=_zZUig}D;~0C)m>uB#0bms(c4gfyG-ndsZSVcK!?^hwiIsM~;!#V4^b8>JF z06xRscz$fKigHflYbnDy-wsO-=WOZD$-_AS_)PqtkVAu2lymNHhZ)YfJPIAo+0~s> zfO7!w8TQ7)$Y2%aoQ;iYhI1Ybst)Ju>&_{{IRN+!d*jK#U=`(@-%o29&KdS=4(I&P zol}By0Pq?1#;9+wN^A^{_54||rFXdcc99&;InkX{hI0V$8TQ79MO$u@tLZ8*7E$?7iUITSb9vAq~v*f&WNk-oKan9?hN5h0DOkMVb2+H)t)orsyk=Y)SXj- za{%xe_J%!Y#8rFFh^y|LQA>AD70v;`XV@F|oDo;;IU}yRb4G35IcMM;0DOkMVb2+H z)t)orsyk=2tUIR$=K$a{> +ArpCache::LookupInverse (Address to) +{ + NS_LOG_FUNCTION (this << to); + + std::list entryList; + for (CacheI i = m_arpCache.begin (); i != m_arpCache.end (); i++) + { + ArpCache::Entry *entry = (*i).second; + if (entry->GetMacAddress () == to) + { + entryList.push_back (entry); + } + } + return entryList; +} + + ArpCache::Entry * ArpCache::Lookup (Ipv4Address to) { diff --git a/src/internet/model/arp-cache.h b/src/internet/model/arp-cache.h --- a/src/internet/model/arp-cache.h +++ b/src/internet/model/arp-cache.h @@ -148,6 +148,13 @@ */ ArpCache::Entry *Lookup (Ipv4Address destination); /** + * \brief Do lookup in the ARP cache against a MAC address + * \param destination The destination MAC address to lookup + * of + * \return A std::list of ArpCache::Entry with info about layer 2 + */ + std::list LookupInverse (Address destination); + /** * \brief Add an Ipv4Address to this ARP cache */ ArpCache::Entry *Add (Ipv4Address to); @@ -269,6 +276,11 @@ */ void ClearRetries (void); + /** + * \brief Update the entry when seeing a packet + */ + void UpdateSeen (void); + private: /** * \brief ARP cache entry states @@ -281,11 +293,6 @@ }; /** - * \brief Update the entry when seeing a packet - */ - void UpdateSeen (void); - - /** * \brief Returns the entry timeout * \returns the entry timeout */ diff --git a/src/internet/model/ipv4-l3-protocol.cc b/src/internet/model/ipv4-l3-protocol.cc --- a/src/internet/model/ipv4-l3-protocol.cc +++ b/src/internet/model/ipv4-l3-protocol.cc @@ -36,6 +36,7 @@ #include "loopback-net-device.h" #include "arp-l3-protocol.h" +#include "arp-cache.h" #include "ipv4-l3-protocol.h" #include "icmpv4-l4-protocol.h" #include "ipv4-interface.h" @@ -598,6 +599,36 @@ return; } + // the packet is valid, we update the ARP cache entry (if present) + Ptr arpCache = ipv4Interface->GetArpCache (); + if (arpCache) + { + // case one, it's a a direct routing. + ArpCache::Entry *entry = arpCache->Lookup (ipHeader.GetSource ()); + if (entry) + { + if (entry->IsAlive ()) + { + entry->UpdateSeen (); + } + } + else + { + // It's not in the direct routing, so it's the router, and it could have multiple IP addresses. + // In doubt, update all of them. + // Note: it's a confirmed behavior for Linux routers. + std::list entryList = arpCache->LookupInverse (from); + std::list::iterator iter; + for (iter = entryList.begin (); iter != entryList.end (); iter ++) + { + if ((*iter)->IsAlive ()) + { + (*iter)->UpdateSeen (); + } + } + } + } + for (SocketList::iterator i = m_sockets.begin (); i != m_sockets.end (); ++i) { NS_LOG_LOGIC ("Forwarding to raw socket"); diff --git a/src/internet/model/ipv6-l3-protocol.cc b/src/internet/model/ipv6-l3-protocol.cc --- a/src/internet/model/ipv6-l3-protocol.cc +++ b/src/internet/model/ipv6-l3-protocol.cc @@ -975,6 +975,32 @@ packet->RemoveAtEnd (packet->GetSize () - hdr.GetPayloadLength ()); } + // the packet is valid, we update the NDISC cache entry (if present) + Ptr ndiscCache = ipv6Interface->GetNdiscCache (); + if (ndiscCache) + { + // case one, it's a a direct routing. + NdiscCache::Entry *entry = ndiscCache->Lookup (hdr.GetSourceAddress ()); + if (entry) + { + entry->UpdateReachableTimer (); + } + else + { + // It's not in the direct routing, so it's the router, and it could have multiple IP addresses. + // In doubt, update all of them. + // Note: it's a confirmed behavior for Linux routers. + std::list entryList = ndiscCache->LookupInverse (from); + std::list::iterator iter; + for (iter = entryList.begin (); iter != entryList.end (); iter ++) + { + (*iter)->UpdateReachableTimer (); + } + } + } + + + /* forward up to IPv6 raw sockets */ for (SocketList::iterator it = m_sockets.begin (); it != m_sockets.end (); ++it) { diff --git a/src/internet/model/ndisc-cache.cc b/src/internet/model/ndisc-cache.cc --- a/src/internet/model/ndisc-cache.cc +++ b/src/internet/model/ndisc-cache.cc @@ -100,6 +100,23 @@ return 0; } +std::list NdiscCache::LookupInverse (Address dst) +{ + NS_LOG_FUNCTION (this << dst); + + std::list entryList; + for (CacheI i = m_ndCache.begin (); i != m_ndCache.end (); i++) + { + NdiscCache::Entry *entry = (*i).second; + if (entry->GetMacAddress () == dst) + { + entryList.push_back (entry); + } + } + return entryList; +} + + NdiscCache::Entry* NdiscCache::Add (Ipv6Address to) { NS_LOG_FUNCTION (this << to); @@ -397,11 +414,6 @@ return m_lastReachabilityConfirmation; } -void NdiscCache::Entry::UpdateLastReachabilityconfirmation () -{ - NS_LOG_FUNCTION_NOARGS (); -} - void NdiscCache::Entry::StartReachableTimer () { NS_LOG_FUNCTION_NOARGS (); @@ -410,11 +422,27 @@ m_nudTimer.Cancel (); } + m_lastReachabilityConfirmation = Simulator::Now (); m_nudTimer.SetFunction (&NdiscCache::Entry::FunctionReachableTimeout, this); m_nudTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::REACHABLE_TIME)); m_nudTimer.Schedule (); } +void NdiscCache::Entry::UpdateReachableTimer () +{ + NS_LOG_FUNCTION_NOARGS (); + + if (m_state == REACHABLE) + { + m_lastReachabilityConfirmation = Simulator::Now (); + if (m_nudTimer.IsRunning ()) + { + m_nudTimer.Cancel (); + } + m_nudTimer.Schedule (); + } +} + void NdiscCache::Entry::StartProbeTimer () { NS_LOG_FUNCTION_NOARGS (); diff --git a/src/internet/model/ndisc-cache.h b/src/internet/model/ndisc-cache.h --- a/src/internet/model/ndisc-cache.h +++ b/src/internet/model/ndisc-cache.h @@ -83,12 +83,19 @@ /** * \brief Lookup in the cache. - * \param dst destination address - * \return the entry if found, 0 otherwise + * \param dst destination address. + * \return the entry if found, 0 otherwise. */ NdiscCache::Entry* Lookup (Ipv6Address dst); /** + * \brief Lookup in the cache for a MAC address. + * \param dst destination MAC address. + * \return a list of matching entries. + */ + std::list LookupInverse (Address dst); + + /** * \brief Add an entry. * \param to address to add * \return an new Entry @@ -273,16 +280,16 @@ Time GetLastReachabilityConfirmation () const; /** - * \brief Update the time of last reachability confirmation. - */ - void UpdateLastReachabilityconfirmation (); - - /** * \brief Start the reachable timer. */ void StartReachableTimer (); /** + * \brief Update the reachable timer. + */ + void UpdateReachableTimer (); + + /** * \brief Start retransmit timer. */ void StartRetransmitTimer ();