25 #include "ns3/assert.h" 
   26 #include "ns3/packet.h" 
   28 #include "ns3/boolean.h" 
   29 #include "ns3/ipv6-routing-protocol.h" 
   30 #include "ns3/ipv6-route.h" 
   32 #include "ipv6-raw-socket-factory-impl.h" 
   33 #include "ipv6-l3-protocol.h" 
   34 #include "ipv6-interface.h" 
   35 #include "icmpv6-l4-protocol.h" 
   36 #include "ndisc-cache.h" 
   40 NS_OBJECT_ENSURE_REGISTERED (Icmpv6L4Protocol);
 
   70     .AddConstructor<Icmpv6L4Protocol> ()
 
   71     .AddAttribute (
"DAD", 
"Always do DAD check.",
 
   74                    MakeBooleanChecker ())
 
  100   m_downTarget.Nullify ();
 
  111       Ptr<Node> node = this->GetObject<Node> ();
 
  115           if (ipv6 != 0 && m_downTarget.IsNull ())
 
  120               ipv6->AggregateObject (rawFactory);
 
  183   return IpL4Protocol::RX_ENDPOINT_UNREACH;
 
  194   p->CopyData (&type, 
sizeof(type));
 
  198     case Icmpv6Header::ICMPV6_ND_ROUTER_SOLICITATION:
 
  199       if (ipv6->IsForwarding (ipv6->GetInterfaceForDevice (interface->
GetDevice ())))
 
  204     case Icmpv6Header::ICMPV6_ND_ROUTER_ADVERTISEMENT:
 
  205       if (!ipv6->IsForwarding (ipv6->GetInterfaceForDevice (interface->
GetDevice ())))
 
  210     case Icmpv6Header::ICMPV6_ND_NEIGHBOR_SOLICITATION:
 
  213     case Icmpv6Header::ICMPV6_ND_NEIGHBOR_ADVERTISEMENT:
 
  216     case Icmpv6Header::ICMPV6_ND_REDIRECTION:
 
  219     case Icmpv6Header::ICMPV6_ECHO_REQUEST:
 
  222     case Icmpv6Header::ICMPV6_ECHO_REPLY:
 
  227     case Icmpv6Header::ICMPV6_ERROR_DESTINATION_UNREACHABLE:
 
  230     case Icmpv6Header::ICMPV6_ERROR_PACKET_TOO_BIG:
 
  233     case Icmpv6Header::ICMPV6_ERROR_TIME_EXCEEDED:
 
  236     case Icmpv6Header::ICMPV6_ERROR_PARAMETER_ERROR:
 
  244   return IpL4Protocol::RX_OK;
 
  249                                 const uint8_t payload[8])
 
  251   NS_LOG_FUNCTION (
this << source << icmp << info << ipHeader << payload);
 
  271   uint8_t* buf = 
new uint8_t[packet->
GetSize ()];
 
  305         case Icmpv6Header::ICMPV6_OPT_PREFIX:
 
  307           ipv6->AddAutoconfiguredAddress (ipv6->GetInterfaceForDevice (interface->
GetDevice ()), prefixHdr.GetPrefix (), prefixHdr.GetPrefixLength (),
 
  308                                           prefixHdr.GetFlags (), prefixHdr.GetValidTime (), prefixHdr.GetPreferredTime (), src);
 
  310         case Icmpv6Header::ICMPV6_OPT_MTU:
 
  320         case Icmpv6Header::ICMPV6_OPT_LINK_LAYER_SOURCE:
 
  344   entry = cache->
Lookup (src);
 
  348       entry = cache->
Add (src);
 
  351       entry->MarkReachable ();
 
  352       entry->StartReachableTimer ();
 
  356       std::list<Ptr<Packet> > waiting;
 
  357       if (entry->IsIncomplete ())
 
  359           entry->StopRetransmitTimer ();
 
  361           waiting = entry->MarkReachable (lla.
GetAddress ());
 
  362           entry->StopReachableTimer ();
 
  363           entry->StartReachableTimer ();
 
  365           for (std::list<
Ptr<Packet> >::const_iterator it = waiting.begin (); it != waiting.end (); it++)
 
  369           entry->ClearWaitingPacket ();
 
  373           if (entry->GetMacAddress () != lla.
GetAddress ())
 
  377               entry->SetRouter (
true);
 
  381               if (!entry->IsReachable ())
 
  383                   entry->StopProbeTimer ();
 
  384                   entry->StopDelayTimer ();
 
  385                   waiting = entry->MarkReachable (lla.
GetAddress ());
 
  386                   if (entry->IsProbe ())
 
  388                       for (std::list<
Ptr<Packet> >::const_iterator it = waiting.begin (); it != waiting.end (); it++)
 
  393                   entry->StopReachableTimer ();
 
  394                   entry->StartReachableTimer ();
 
  417       packet->
CopyData (&type, 
sizeof(type));
 
  419       if (type != Icmpv6Header::ICMPV6_OPT_LINK_LAYER_SOURCE)
 
  426       entry = cache->
Lookup (src);
 
  429           entry = cache->
Add (src);
 
  453   for (i = 0; i < nb; i++)
 
  488       packet->
CopyData (&type, 
sizeof(type));
 
  490       if (type != Icmpv6Header::ICMPV6_OPT_LINK_LAYER_SOURCE)
 
  498       entry = cache->
Lookup (src);
 
  501           entry = cache->
Add (src);
 
  521   if (ipv6->IsForwarding (ipv6->GetInterfaceForDevice (interface->
GetDevice ())))
 
  526   hardwareAddress = interface->
GetDevice ()->GetAddress ();
 
  541   NS_LOG_LOGIC (
"Send RS ( from " << src << 
" to " << dst << 
")");
 
  547   ipHeader.SetSourceAddress (src);
 
  548   ipHeader.SetDestinationAddress (dst);
 
  550   ipHeader.SetPayloadLength (p->
GetSize ());
 
  551   ipHeader.SetHopLimit (255);
 
  585   std::list<Ptr<Packet> > waiting;
 
  588   entry = cache->
Lookup (target);
 
  598       for (i = 0; i < nb; i++)
 
  621   packet->
CopyData (&type, 
sizeof(type));
 
  623   if (type != Icmpv6Header::ICMPV6_OPT_LINK_LAYER_TARGET)
 
  641           for (std::list<
Ptr<Packet> >::const_iterator it = waiting.begin (); it != waiting.end (); it++)
 
  685                           for (std::list<
Ptr<Packet> >::const_iterator it = waiting.begin (); it != waiting.end (); it++)
 
  722   if (type == Icmpv6Header::ICMPV6_OPT_LINK_LAYER_TARGET)
 
  740       entry = cache->
Lookup (redirTarget);
 
  743           entry = cache->
Add (redirTarget);
 
  746           entry->SetMacAddress (llOptionHeader.
GetAddress ());
 
  751           if (entry->IsIncomplete () || entry->GetMacAddress () != llOptionHeader.
GetAddress ())
 
  754               if (entry->GetMacAddress () != llOptionHeader.
GetAddress ())
 
  756                   entry->SetMacAddress (llOptionHeader.
GetAddress ());
 
  770   if (redirTarget.
IsEqual (redirDestination))
 
  772       ipv6->GetRoutingProtocol ()->NotifyAddRoute (redirDestination, 
Ipv6Prefix (128), 
Ipv6Address (
"::"), ipv6->GetInterfaceForAddress (dst));
 
  776       uint32_t ifIndex = ipv6->GetInterfaceForAddress (dst);
 
  777       ipv6->GetRoutingProtocol ()->NotifyAddRoute (redirDestination, 
Ipv6Prefix (128), redirTarget, ifIndex);
 
  813   Forward (src, timeexceeded, timeexceeded.
GetCode (), ipHeader, payload);
 
  864   NS_ASSERT (ipv6 != 0 && ipv6->GetRoutingProtocol () != 0);
 
  867   Socket::SocketErrno err;
 
  871   header.SetDestinationAddress (dst);
 
  872   route = ipv6->GetRoutingProtocol ()->RouteOutput (packet, header, oif, err);
 
  883       m_downTarget (packet, src, dst, 
PROT_NUMBER, route);
 
  893   NS_LOG_FUNCTION (
this << src << dst << hardwareAddress << static_cast<uint32_t> (flags));
 
  898   NS_LOG_LOGIC (
"Send NA ( from " << src << 
" to " << dst << 
" target " << src << 
")");
 
  899   na.SetIpv6Target (src);
 
  915   na.CalculatePseudoHeaderChecksum (src, dst, p->
GetSize () + na.GetSerializedSize (), 
PROT_NUMBER);
 
  949   NS_LOG_LOGIC (
"Send NS ( from " << src << 
" to " << dst << 
" target " << target << 
")");
 
  952   ns.CalculatePseudoHeaderChecksum (src, dst, p->
GetSize () + ns.GetSerializedSize (), 
PROT_NUMBER);
 
  970   NS_LOG_LOGIC (
"Send RS ( from " << src << 
" to " << dst << 
")");
 
  972   rs.CalculatePseudoHeaderChecksum (src, dst, p->
GetSize () + rs.GetSerializedSize (), 
PROT_NUMBER);
 
  981   uint32_t malformedPacketSize = malformedPacket->
GetSize ();
 
  984   NS_LOG_LOGIC (
"Send Destination Unreachable ( to " << dst << 
" code " << (uint32_t)code << 
" )");
 
  987   if (malformedPacketSize <= 1280 - 48)
 
 1005   uint32_t malformedPacketSize = malformedPacket->
GetSize ();
 
 1011   if (malformedPacketSize <= 1280 - 48)
 
 1028   NS_LOG_FUNCTION (
this << malformedPacket << dst << static_cast<uint32_t> (code));
 
 1030   uint32_t malformedPacketSize = malformedPacket->
GetSize ();
 
 1033   NS_LOG_LOGIC (
"Send Time Exceeded ( to " << dst << 
" code " << (uint32_t)code << 
" )");
 
 1036   if (malformedPacketSize <= 1280 - 48)
 
 1052   NS_LOG_FUNCTION (
this << malformedPacket << dst << static_cast<uint32_t> (code) << ptr);
 
 1054   uint32_t malformedPacketSize = malformedPacket->
GetSize ();
 
 1057   NS_LOG_LOGIC (
"Send Parameter Error ( to " << dst << 
" code " << (uint32_t)code << 
" )");
 
 1060   if (malformedPacketSize <= 1280 - 48 )
 
 1077   NS_LOG_FUNCTION (
this << redirectedPacket << dst << redirTarget << redirDestination << redirHardwareTarget);
 
 1078   uint32_t llaSize = 0;
 
 1080   uint32_t redirectedPacketSize = redirectedPacket->
GetSize ();
 
 1083   NS_LOG_LOGIC (
"Send Redirection ( to " << dst << 
" target " << redirTarget << 
" destination " << redirDestination << 
" )");
 
 1087   if ((redirectedPacketSize % 8) != 0)
 
 1089       Ptr<Packet> pad = Create<Packet> (8 - (redirectedPacketSize % 8));
 
 1100   if (redirectedPacketSize <= (1280 - 56 - llaSize))
 
 1102       redirectedOptionHeader.
SetPacket (redirectedPacket);
 
 1107       redirectedOptionHeader.
SetPacket (fragment);
 
 1118   redirectionHeader.
SetTarget (redirTarget);
 
 1125   NS_LOG_FUNCTION (
this << src << dst << hardwareAddress << (uint32_t)flags);
 
 1131   NS_LOG_LOGIC (
"Send NA ( from " << src << 
" to " << dst << 
")");
 
 1154   ipHeader.SetSourceAddress (src);
 
 1155   ipHeader.SetDestinationAddress (dst);
 
 1157   ipHeader.SetPayloadLength (p->
GetSize ());
 
 1158   ipHeader.SetHopLimit (255);
 
 1179   NS_LOG_LOGIC (
"Send NS ( from " << src << 
" to " << dst << 
" target " << target << 
")");
 
 1185   ipHeader.SetSourceAddress (src);
 
 1186   ipHeader.SetDestinationAddress (dst);
 
 1188   ipHeader.SetPayloadLength (p->
GetSize ());
 
 1189   ipHeader.SetHopLimit (255);
 
 1202       if ((*i)->GetDevice () == device)
 
 1227   NS_LOG_FUNCTION (
this << dst << device << cache << hardwareDestination);
 
 1235   return cache->
Lookup (dst);
 
 1240   NS_LOG_FUNCTION (
this << p << dst << device << cache << hardwareDestination);
 
 1318   for (i = 0; i < nb; i++)
 
 1342       if (!ipv6->IsForwarding (ipv6->GetInterfaceForDevice (interface->
GetDevice ())) && addr.
IsLinkLocal ())
 
 1362   m_downTarget = callback;
 
 1365 IpL4Protocol::DownTargetCallback
 
 1373 Icmpv6L4Protocol::GetDownTarget6 (
void)
 const 
 1376   return m_downTarget;
 
bool IsAny() const 
If the IPv6 address is the "Any" address. 
uint32_t RemoveHeader(Header &header)
void SetPacket(Ptr< Packet > packet)
Set the redirected packet. 
ICMPv6 redirected option. 
uint16_t GetId() const 
Get the ID of the packet. 
static const uint8_t MAX_ANYCAST_DELAY_TIME
Neighbor Discovery node constants : max anycast delay. 
uint32_t GetNsDadUid() const 
Get the latest DAD probe packet UID. 
bool Lookup(Ipv6Address dst, Ptr< NetDevice > device, Ptr< NdiscCache > cache, Address *hardwareDestination)
Lookup in the ND cache for the IPv6 address. 
#define NS_LOG_FUNCTION(parameters)
void MarkIncomplete(Ptr< Packet > p)
Changes the state to this entry to INCOMPLETE. 
ICMPv6 Error Parameter Error header. 
void SetState(Ipv6Address address, Ipv6InterfaceAddress::State_e state)
Update state of an interface address. 
ICMPv6 Router Advertisement header. 
ICMPv6 Neighbor Advertisement header. 
void SendNA(Ipv6Address src, Ipv6Address dst, Address *hardwareAddress, uint8_t flags)
Send a Neighbor Adverstisement. 
void HandleNS(Ptr< Packet > p, Ipv6Address const &src, Ipv6Address const &dst, Ptr< Ipv6Interface > interface)
Receive Neighbor Solicitation method. 
virtual uint32_t GetSerializedSize() const 
Get the serialized size. 
Address GetMacAddress() const 
Get the MAC address of this entry. 
NdiscCache::Entry * Add(Ipv6Address to)
Add an entry. 
static const uint8_t MAX_INITIAL_RTR_ADVERTISEMENTS
Neighbor Discovery router constants : max initial RA transmission. 
Ptr< Packet > GetPacket() const 
Get the incorrect packet. 
Ipv6Address GetTarget() const 
Get the IPv6 target address. 
Access to the IPv6 forwarding table, interfaces, and configuration. 
virtual uint32_t GetSerializedSize() const 
Get the serialized size. 
static const uint8_t MAX_FINAL_RTR_ADVERTISEMENTS
Neighbor Discovery router constants : max final RA transmission. 
void Send(Ptr< Packet > packet, Ipv6Address source, Ipv6Address destination, uint8_t protocol, Ptr< Ipv6Route > route)
Higher-level layers call this method to send a packet down the stack to the MAC and PHY layers...
ICMPv6 Error Time Exceeded header. 
IPv6 layer implementation. 
Ptr< Node > m_node
The node. 
void AddPacketTag(const Tag &tag) const 
ICMPv6 Router Solicitation header. 
void SendRS(Ipv6Address src, Ipv6Address dst, Address hardwareAddress)
Send a Router Solicitation. 
ICMPv6 Neighbor Solicitation header. 
bool IsLinkLocal() const 
If the IPv6 address is a link-local address (fe80::/64). 
uint64_t GetUid(void) const 
#define NS_ASSERT(condition)
virtual void ReceiveIcmp(Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo, Ipv4Address payloadSource, Ipv4Address payloadDestination, const uint8_t payload[8])
static Ipv6Address GetAny()
Get the "any" (::) Ipv6Address. 
Ipv6InterfaceAddress GetAddress(uint32_t index) const 
Get an address from IPv6 interface. 
#define NS_LOG_COMPONENT_DEFINE(name)
IPv6 address associated with an interface. 
void SetPtr(uint32_t ptr)
Set the pointer field. 
static const uint8_t PROT_NUMBER
ICMPv6 protocol number (58). 
bool GetFlagS() const 
Get the S flag. 
uint32_t GetSize(void) const 
bool IsEqual(const Ipv6Address &other) const 
Comparison operation between two Ipv6Addresses. 
virtual ~Icmpv6L4Protocol()
Destructor. 
static const uint8_t RTR_SOLICITATION_INTERVAL
Neighbor Discovery host constants : RS interval. 
void StopReachableTimer()
Stop the reachable timer. 
virtual void DoDispose(void)
static const uint8_t MAX_RTR_SOLICITATIONS
Neighbor Discovery host constants : max RS transmission. 
#define NS_LOG_FUNCTION_NOARGS()
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
void SetMtu(uint32_t mtu)
Set the MTU. 
void SetNode(Ptr< Node > node)
Set the node. 
void SetPacket(Ptr< Packet > p)
Set the incorrect packet. 
This class implements a tag that carries the socket-specific TTL of a packet to the IP layer...
void SetTarget(Ipv6Address target)
Set the IPv6 target address. 
virtual int GetProtocolNumber() const 
Get the protocol number. 
std::list< Ptr< Packet > > MarkReachable(Address mac)
Changes the state to this entry to REACHABLE. 
Icmpv6L4Protocol()
Constructor. 
a polymophic address class 
void SetPacket(Ptr< Packet > p)
Set the incorrect packet. 
static void FunctionDadTimeout(Ptr< Icmpv6L4Protocol > icmpv6, Ipv6Interface *interface, Ipv6Address addr)
Function called when DAD timeout. 
virtual enum IpL4Protocol::RxStatus Receive(Ptr< Packet > p, Ipv4Header const &header, Ptr< Ipv4Interface > interface)
Receive method. 
void SendRedirection(Ptr< Packet > redirectedPacket, Ipv6Address dst, Ipv6Address redirTarget, Ipv6Address redirDestination, Address redirHardwareTarget)
Send an ICMPv6 Redirection. 
void SendErrorTooBig(Ptr< Packet > malformedPacket, Ipv6Address dst, uint32_t mtu)
Send an error Too Big. 
Ptr< Ipv6Interface > GetInterface() const 
Get the Ipv6Interface associated with this cache. 
void NotifyNewAggregate()
This method is called by AddAgregate and completes the aggregation by setting the node in the ICMPv6 ...
bool IsDelay() const 
Is the entry DELAY. 
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const 
void AddAtEnd(Ptr< const Packet > packet)
bool GetFlagR() const 
Get the R flag. 
The IPv6 representation of a network interface. 
ICMPv6 Error Destination Unreachable header. 
void HandleRedirection(Ptr< Packet > p, Ipv6Address const &src, Ipv6Address const &dst, Ptr< Ipv6Interface > interface)
Receive Redirection method. 
Ipv6Address GetAddress() const 
Get the IPv6 address. 
Ipv6Address GetIpv6Target() const 
Get the IPv6 target field. 
uint32_t GetNAddresses(void) const 
Get number of addresses on this IPv6 interface. 
static const uint32_t MAX_RA_DELAY_TIME
Neighbor Discovery router constants : max delay between RA. 
void Forward(Ipv6Address source, Icmpv6Header icmp, uint32_t info, Ipv6Header ipHeader, const uint8_t payload[8])
Notify an ICMPv6 reception to upper layers (if requested). 
void SendErrorParameterError(Ptr< Packet > malformedPacket, Ipv6Address dst, uint8_t code, uint32_t ptr)
Send an error Parameter Error. 
Ptr< Packet > GetPacket() const 
Get the incorrect packet. 
void SetIpv6Target(Ipv6Address target)
Set the IPv6 target field. 
void HandleTimeExceeded(Ptr< Packet > p, Ipv6Address const &src, Ipv6Address const &dst, Ptr< Ipv6Interface > interface)
Receive Time Exceeded method. 
void Flush()
Flush the cache. 
void SendErrorTimeExceeded(Ptr< Packet > malformedPacket, Ipv6Address dst, uint8_t code)
Send an error Time Exceeded. 
bool IsAlwaysDad() const 
Is the node must do DAD. 
uint8_t GetLength(void) const 
static const uint32_t REACHABLE_TIME
Neighbor Discovery node constants : reachable time. 
ICMPv6 Redirection header. 
Ptr< Packet > GetPacket() const 
Get the incorrect packet. 
static const double MIN_RANDOM_FACTOR
Neighbor Discovery node constants : min random factor. 
Ptr< NdiscCache > FindCache(Ptr< NetDevice > device)
Get the cache corresponding to the device. 
virtual Ptr< NetDevice > GetDevice() const 
Get the NetDevice. 
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Ptr< Packet > ForgeNA(Ipv6Address src, Ipv6Address dst, Address *hardwareAddress, uint8_t flags)
Forge a Neighbor Advertisement. 
void SetPacket(Ptr< Packet > p)
Set the incorrect packet. 
bool GetFlagO() const 
Get the O flag. 
void HandleRS(Ptr< Packet > p, Ipv6Address const &src, Ipv6Address const &dst, Ptr< Ipv6Interface > interface)
Receive Router Solicitation method. 
void Send(Ptr< Packet > p, Ipv6Address dest)
Send a packet through this interface. 
#define NS_LOG_LOGIC(msg)
void StopProbeTimer()
Stop probe timer. 
Ptr< Packet > ForgeNS(Ipv6Address src, Ipv6Address dst, Ipv6Address target, Address hardwareAddress)
Forge a Neighbor Solicitation. 
void StartRetransmitTimer()
Start retransmit timer. 
uint16_t GetSeq() const 
Get the sequence number. 
void SetNsDadUid(Ipv6Address address, uint32_t uid)
Update NS DAD packet UID of an interface address. 
void ClearWaitingPacket()
Clear the waiting packet list. 
virtual uint32_t GetSerializedSize() const 
Get the serialized size. 
void HandleEchoRequest(Ptr< Packet > p, Ipv6Address const &src, Ipv6Address const &dst, Ptr< Ipv6Interface > interface)
Receive Echo Request method. 
void HandleParameterError(Ptr< Packet > p, Ipv6Address const &src, Ipv6Address const &dst, Ptr< Ipv6Interface > interface)
Receive Parameter Error method. 
virtual void NotifyNewAggregate(void)
Ptr< Packet > Copy(void) const 
static const uint8_t MAX_MULTICAST_SOLICIT
Neighbor Discovery node constants : max multicast solicitations. 
bool IsProbe() const 
Is the entry PROBE. 
void SendErrorDestinationUnreachable(Ptr< Packet > malformedPacket, Ipv6Address dst, uint8_t code)
Send an error Destination Unreachable. 
void SendEchoReply(Ipv6Address src, Ipv6Address dst, uint16_t id, uint16_t seq, Ptr< Packet > data)
Send a Echo Reply. 
static TypeId GetTypeId()
Interface ID. 
static const uint8_t MAX_NEIGHBOR_ADVERTISEMENT
Neighbor Discovery node constants : max NA transmission. 
virtual IpL4Protocol::DownTargetCallback GetDownTarget(void) const 
static uint16_t GetStaticProtocolNumber()
Get ICMPv6 protocol number. 
Ipv6InterfaceAddress::State_e GetState() const 
Get the address state. 
void AddWaitingPacket(Ptr< Packet > p)
Add a packet (or replace old value) in the queue. 
void StartDelayTimer()
Start delay timer. 
static const uint8_t MAX_INITIAL_RTR_ADVERT_INTERVAL
Neighbor Discovery router constants : max initial RA initial interval. 
bool IsMulticast() const 
If the IPv6 address is multicast (ff00::/8). 
static Ipv6Address GetAllNodesMulticast()
Get the "all nodes multicast" address. 
void StartReachableTimer()
Start the reachable timer. 
bool m_alwaysDad
Always do DAD ? 
bool IsIncomplete() const 
Is the entry INCOMPLETE. 
L4 Protocol abstract base class. 
void SendMessage(Ptr< Packet > packet, Ipv6Address src, Ipv6Address dst, uint8_t ttl)
Send a packet via ICMPv6, note that packet already contains ICMPv6 header. 
virtual void SetDownTarget(IpL4Protocol::DownTargetCallback cb)
Ptr< Packet > ForgeRS(Ipv6Address src, Ipv6Address dst, Address hardwareAddress)
Forge a Router Solicitation. 
void Remove(NdiscCache::Entry *entry)
Delete an entry. 
static const uint8_t MIN_DELAY_BETWEEN_RAS
Neighbor Discovery router constants : min delay between RA. 
void SetFlagR(bool r)
Set the R flag. 
virtual uint32_t GetSerializedSize() const 
Get the serialized size. 
std::list< Ptr< Packet > > MarkStale(Address mac)
Changes the state to this entry to STALE. 
void SetMacAddress(Address mac)
Set the MAC address of this entry. 
static const double MAX_RANDOM_FACTOR
Neighbor Discovery node constants : max random factor. 
void SetFlagS(bool s)
Set the S flag. 
CacheList m_cacheList
A list of cache by device. 
void DoDAD(Ipv6Address target, Ptr< Ipv6Interface > interface)
Do the Duplication Address Detection (DAD). It consists in sending a NS with our IPv6 as target...
Ipv6InterfaceAddress GetLinkLocalAddress() const 
Get link-local address from IPv6 interface. 
Describes an IPv6 address. 
Time Seconds(double seconds)
create ns3::Time instances in units of seconds. 
NdiscCache::Entry * Lookup(Ipv6Address dst)
Lookup in the cache. 
void HandleRA(Ptr< Packet > p, Ipv6Address const &src, Ipv6Address const &dst, Ptr< Ipv6Interface > interface)
Receive Router Advertisement method. 
void ReceiveLLA(Icmpv6OptionLinkLayerAddress lla, Ipv6Address const &src, Ipv6Address const &dst, Ptr< Ipv6Interface > interface)
Link layer address option processing. 
void MarkDelay()
Change the state to this entry to DELAY. 
virtual int GetVersion() const 
Get the version of the protocol. 
uint32_t GetSerializedSize(void) const 
static const uint32_t RETRANS_TIMER
Neighbor Discovery node constants : retransmission timer. 
void SetDestination(Ipv6Address destination)
Set the IPv6 destination address. 
void StopRetransmitTimer()
Stop retransmit timer. 
Ptr< Packet > ForgeEchoRequest(Ipv6Address src, Ipv6Address dst, uint16_t id, uint16_t seq, Ptr< Packet > data)
Forge an Echo Request. 
void StopDelayTimer()
Stop delay timer. 
void SetDevice(Ptr< NetDevice > device, Ptr< Ipv6Interface > interface)
Set the device and interface. 
Describes an IPv6 prefix. It is just a bitmask like Ipv4Mask. 
virtual void DoDispose()
Dispose this object. 
Ipv6Address GetDestination() const 
Get the IPv6 destination address. 
Ipv6Address GetIpv6Target() const 
Get the IPv6 target field. 
uint32_t CopyData(uint8_t *buffer, uint32_t size) const 
static const uint8_t MAX_RTR_SOLICITATION_DELAY
Neighbor Discovery host constants : max RS delay. 
A record that holds information about an NdiscCache entry. 
void HandleNA(Ptr< Packet > p, Ipv6Address const &src, Ipv6Address const &dst, Ptr< Ipv6Interface > interface)
Receive Neighbor Advertisement method. 
void SetRouter(bool router)
Set the node type. 
ICMPv6 link-layer address option. 
static const uint8_t DELAY_FIRST_PROBE_TIME
Neighbor Discovery node constants : delay for the first probe. 
void SetSeq(uint16_t seq)
Set the sequence number. 
Address GetAddress() const 
Get the hardware address. 
void HandlePacketTooBig(Ptr< Packet > p, Ipv6Address const &src, Ipv6Address const &dst, Ptr< Ipv6Interface > interface)
Receive Packet Too Big method. 
bool IsReachable() const 
Is the entry REACHABLE. 
void SetPacket(Ptr< Packet > p)
Set the incorrect packet. 
uint32_t GetMtu() const 
Get the MTU field. 
virtual uint32_t GetSerializedSize() const 
Get the serialized size. 
Ptr< T > GetObject(void) const 
ICMPv6 Error Too Big header. 
a unique identifier for an interface. 
Ptr< Packet > GetPacket() const 
Get the incorrect packet. 
Ipv6InterfaceAddress GetAddressMatchingDestination(Ipv6Address dst)
Get an address which is in the same network prefix as destination. 
void SetFlagO(bool o)
Set the O flag. 
Ptr< NetDevice > GetDevice() const 
Get the NetDevice associated with this cache. 
TypeId SetParent(TypeId tid)
void SendNS(Ipv6Address src, Ipv6Address dst, Ipv6Address target, Address hardwareAddress)
Send a Neighbor Solicitation. 
bool IsStale() const 
Is the entry STALE. 
void AddHeader(const Header &header)
Ptr< NdiscCache > CreateCache(Ptr< NetDevice > device, Ptr< Ipv6Interface > interface)
Create a neighbor cache. 
void SetId(uint16_t id)
Set the ID of the packet. 
void HandleDestinationUnreachable(Ptr< Packet > p, Ipv6Address const &src, Ipv6Address const &dst, Ptr< Ipv6Interface > interface)
Receive Destination Unreachable method. 
static Ipv6Address MakeSolicitedAddress(Ipv6Address addr)
Make the solicited IPv6 address. 
static Ipv6Address GetAllRoutersMulticast()
Get the "all routers multicast" address. 
void SetAddress(Address addr)
Set the hardware address. 
static const uint8_t MAX_UNICAST_SOLICIT
Neighbor Discovery node constants : max unicast solicitations.