22 #include "ns3/uinteger.h"
41 .AddAttribute (
"UnresolvedQueueSize",
42 "Size of the queue for packets pending an NA reply.",
45 MakeUintegerChecker<uint32_t> ())
107 entry->SetIpv6Address (to);
118 if ((*i).second == entry)
156 m_reachableTimer (
Timer::CANCEL_ON_DESTROY),
157 m_retransTimer (
Timer::CANCEL_ON_DESTROY),
158 m_probeTimer (
Timer::CANCEL_ON_DESTROY),
159 m_delayTimer (
Timer::CANCEL_ON_DESTROY),
160 m_lastReachabilityConfirmation (Seconds (0.0)),
182 if (m_waiting.size () >=
m_ndCache->GetUnresQlen ())
186 m_waiting.remove (0);
188 m_waiting.push_back (p);
211 if (m_ipv6Address.IsLinkLocal ())
213 addr =
m_ndCache->GetInterface ()->GetLinkLocalAddress ().GetAddress ();;
215 else if (!m_ipv6Address.IsAny ())
217 addr =
m_ndCache->GetInterface ()->GetAddressMatchingDestination (m_ipv6Address).GetAddress ();
227 if (GetNSRetransmit () < icmpv6->MAX_MULTICAST_SOLICIT)
233 StartRetransmitTimer ();
238 if (malformedPacket == 0)
240 malformedPacket = Create<Packet> ();
259 if (m_ipv6Address.IsLinkLocal ())
261 addr =
m_ndCache->GetInterface ()->GetLinkLocalAddress ().GetAddress ();
263 else if (!m_ipv6Address.IsAny ())
265 addr =
m_ndCache->GetInterface ()->GetAddressMatchingDestination (m_ipv6Address).GetAddress ();
279 Ptr<Packet> p = icmpv6->ForgeNS (addr, m_ipv6Address, m_ipv6Address,
m_ndCache->GetDevice ()->GetAddress ());
282 ResetNSRetransmit ();
293 if (GetNSRetransmit () < icmpv6->MAX_UNICAST_SOLICIT)
297 if (m_ipv6Address.IsLinkLocal ())
299 addr =
m_ndCache->GetInterface ()->GetLinkLocalAddress ().GetAddress ();
301 else if (!m_ipv6Address.IsAny ())
303 addr =
m_ndCache->GetInterface ()->GetAddressMatchingDestination (m_ipv6Address).GetAddress ();
319 Ptr<Packet> p = icmpv6->ForgeNS (addr, m_ipv6Address, m_ipv6Address,
m_ndCache->GetDevice ()->GetAddress ());
335 m_ipv6Address = ipv6Address;
341 return m_nsRetransmit;
359 return m_lastReachabilityConfirmation;
372 m_reachableTimer.Schedule ();
378 m_reachableTimer.Cancel ();
386 m_probeTimer.Schedule ();
392 m_probeTimer.Cancel ();
393 ResetNSRetransmit ();
402 m_delayTimer.Schedule ();
408 m_delayTimer.Cancel ();
409 ResetNSRetransmit ();
417 m_retransTimer.Schedule ();
423 m_retransTimer.Cancel ();
424 ResetNSRetransmit ();
430 m_state = INCOMPLETE;
434 m_waiting.push_back (p);
481 return (m_state == STALE);
487 return (m_state == REACHABLE);
493 return (m_state ==
DELAY);
499 return (m_state == INCOMPLETE);
505 return (m_state == PROBE);