24 #include "ns3/abort.h" 25 #include "ns3/assert.h" 26 #include "ns3/unused.h" 27 #include "ns3/random-variable-stream.h" 28 #include "ns3/ipv4-route.h" 30 #include "ns3/names.h" 31 #include "ns3/rip-header.h" 32 #include "ns3/udp-header.h" 34 #include "ns3/uinteger.h" 35 #include "ns3/ipv4-packet-info-tag.h" 36 #include "ns3/loopback-net-device.h" 38 #define RIP_ALL_NODE "224.0.0.9" 48 : m_ipv4 (0), m_splitHorizonStrategy (
Rip::POISON_REVERSE), m_initialized (false)
50 m_rng = CreateObject<UniformRandomVariable> ();
62 .SetGroupName (
"Internet")
63 .AddConstructor<
Rip> ()
64 .AddAttribute (
"UnsolicitedRoutingUpdate",
"The time between two Unsolicited Routing Updates.",
68 .AddAttribute (
"StartupDelay",
"Maximum random delay for protocol startup (send route requests).",
72 .AddAttribute (
"TimeoutDelay",
"The delay to invalidate a route.",
76 .AddAttribute (
"GarbageCollectionDelay",
"The delay to delete an expired route.",
80 .AddAttribute (
"MinTriggeredCooldown",
"Min cooldown delay after a Triggered Update.",
84 .AddAttribute (
"MaxTriggeredCooldown",
"Max cooldown delay after a Triggered Update.",
88 .AddAttribute (
"SplitHorizon",
"Split Horizon strategy.",
94 .AddAttribute (
"LinkDownValue",
"Value for link down in count to infinity.",
97 MakeUintegerChecker<uint32_t> ())
114 bool addedGlobal =
false;
122 for (uint32_t i = 0 ; i <
m_ipv4->GetNInterfaces (); i++)
130 bool activeInterface =
false;
133 activeInterface =
true;
134 m_ipv4->SetForwarding (i,
true);
137 for (uint32_t j = 0; j <
m_ipv4->GetNAddresses (i); j++)
147 socket->BindToNetDevice (
m_ipv4->GetNetDevice (i));
148 int ret = socket->Bind (local);
152 socket->SetIpRecvTtl (
true);
153 socket->SetRecvPktInfo (
true);
208 rtentry =
Lookup (destination, oif);
229 uint32_t iif =
m_ipv4->GetInterfaceForDevice (idev);
237 lcb (p, header, iif);
259 NS_LOG_LOGIC (
"Dropping packet not for me and with dst Broadcast");
268 if (
m_ipv4->IsForwarding (iif) ==
false)
270 NS_LOG_LOGIC (
"Forwarding disabled for this interface");
283 NS_LOG_LOGIC (
"Found unicast destination - calling unicast callback");
284 ucb (rtentry, p, header);
289 NS_LOG_LOGIC (
"Did not find unicast destination - returning false");
304 for (uint32_t j = 0; j <
m_ipv4->GetNAddresses (i); j++)
322 bool sendSocketFound =
false;
325 if (iter->second == i)
327 sendSocketFound =
true;
332 bool activeInterface =
false;
335 activeInterface =
true;
336 m_ipv4->SetForwarding (i,
true);
339 for (uint32_t j = 0; j <
m_ipv4->GetNAddresses (i); j++)
350 socket->BindToNetDevice (
m_ipv4->GetNetDevice (i));
351 socket->Bind (local);
353 socket->SetIpRecvTtl (
true);
354 socket->SetRecvPktInfo (
true);
384 if (it->first->GetInterface () == interface)
392 NS_LOG_INFO (
"Checking socket for interface " << interface);
393 if (iter->second == interface)
395 NS_LOG_INFO (
"Removed socket for interface " << interface);
396 iter->first->Close ();
412 if (!
m_ipv4->IsUp (interface))
437 if (!
m_ipv4->IsUp (interface))
454 if (it->first->GetInterface () == interface
455 && it->first->IsNetwork ()
456 && it->first->GetDestNetwork () == networkAddress
457 && it->first->GetDestNetworkMask () == networkMask)
478 for (i = 0; i <
m_ipv4->GetNInterfaces (); i++)
497 *os <<
"Node: " <<
m_ipv4->GetObject<
Node> ()->GetId ()
498 <<
", Time: " <<
Now().
As (unit)
499 <<
", Local time: " << GetObject<Node> ()->GetLocalTime ().As (unit)
500 <<
", IPv4 RIP table" << std::endl;
504 *os <<
"Destination Gateway Genmask Flags Metric Ref Use Iface" << std::endl;
512 std::ostringstream dest, gw, mask, flags;
514 *os << std::setiosflags (std::ios::left) << std::setw (16) << dest.str ();
516 *os << std::setiosflags (std::ios::left) << std::setw (16) << gw.str ();
518 *os << std::setiosflags (std::ios::left) << std::setw (16) << mask.str ();
528 *os << std::setiosflags (std::ios::left) << std::setw (6) << flags.str ();
529 *os << std::setiosflags (std::ios::left) << std::setw (7) << int(route->
GetRouteMetric ());
566 iter->first->Close ();
584 uint16_t longestMask = 0;
589 NS_ASSERT_MSG (interface,
"Try to send on local multicast address, and no interface index is given!");
590 rtentry = Create<Ipv4Route> ();
591 rtentry->
SetSource (
m_ipv4->SourceAddressSelection (
m_ipv4->GetInterfaceForDevice (interface), dst));
608 NS_LOG_LOGIC (
"Searching for route to " << dst <<
", mask length " << maskLen);
612 NS_LOG_LOGIC (
"Found global network route " << j <<
", mask length " << maskLen);
617 if (maskLen < longestMask)
623 longestMask = maskLen;
627 rtentry = Create<Ipv4Route> ();
655 NS_LOG_FUNCTION (
this << network << networkPrefix << nextHop << interface);
683 if (it->first == route)
688 if (it->second.IsRunning ())
690 it->second.Cancel ();
696 NS_ABORT_MSG (
"RIP::InvalidateRoute - cannot find the route to update");
705 if (it->first == route)
712 NS_ABORT_MSG (
"RIP::DeleteRoute - cannot find the route to delete");
726 uint16_t senderPort = senderAddr.
GetPort ();
730 NS_LOG_LOGIC (
"Received a packet from the multicast socket");
734 NS_LOG_LOGIC (
"Received a packet from one of the unicast sockets");
740 NS_ABORT_MSG (
"No incoming interface on RIP message, aborting.");
742 uint32_t incomingIf = interfaceInfo.
GetRecvIf ();
743 Ptr<Node> node = this->GetObject<Node> ();
745 uint32_t ipInterfaceIndex =
m_ipv4->GetInterfaceForDevice (dev);
750 NS_ABORT_MSG (
"No incoming Hop Count on RIP message, aborting.");
752 uint8_t hopLimit = hoplimitTag.
GetTtl ();
754 int32_t interfaceForAddress =
m_ipv4->GetInterfaceForAddress (senderAddress);
755 if (interfaceForAddress != -1)
772 HandleRequests (hdr, senderAddress, senderPort, ipInterfaceIndex, hopLimit);
783 NS_LOG_FUNCTION (
this << senderAddress <<
int (senderPort) << incomingInterface <<
int (hopLimit) << requestHdr);
785 std::list<RipRte> rtes = requestHdr.
GetRteList ();
793 if (rtes.size () == 1)
796 rtes.begin ()->GetSubnetMask ().GetPrefixLength () == 0 &&
797 rtes.begin ()->GetRouteMetric () ==
m_linkDown)
807 if (iter->second == incomingInterface)
809 sendingSocket = iter->first;
812 NS_ASSERT_MSG (sendingSocket,
"HandleRequest - Impossible to find a socket to send the reply");
814 uint16_t mtu =
m_ipv4->GetMtu (incomingInterface);
835 bool splitHorizoning = (rtIter->first->GetInterface () == incomingInterface);
842 (rtIter->first->GetInterface () != incomingInterface));
844 if ((isGlobal || isDefaultRoute) &&
848 rte.
SetPrefix (rtIter->first->GetDestNetwork ());
903 for (std::list<RipRte>::iterator iter = rtes.begin ();
904 iter != rtes.end (); iter++)
915 requestedAddress.
CombineMask (iter->GetSubnetMask ());
916 Ipv4Address rtAddress = rtIter->first->GetDestNetwork ();
917 rtAddress.
CombineMask (rtIter->first->GetDestNetworkMask ());
919 if (requestedAddress == rtAddress)
921 iter->SetRouteMetric (rtIter->first->GetRouteMetric ());
922 iter->SetRouteTag (rtIter->first->GetRouteTag ());
932 iter->SetRouteTag (0);
945 NS_LOG_FUNCTION (
this << senderAddress << incomingInterface <<
int (hopLimit) << hdr);
949 NS_LOG_LOGIC (
"Ignoring an update message from an excluded interface: " << incomingInterface);
956 for (std::list<RipRte>::iterator iter = rtes.begin ();
957 iter != rtes.end (); iter++)
959 if (iter->GetRouteMetric () == 0 || iter->GetRouteMetric () >
m_linkDown)
961 NS_LOG_LOGIC (
"Ignoring an update message with malformed metric: " <<
int (iter->GetRouteMetric ()));
964 if (iter->GetPrefix ().IsLocalhost () ||
965 iter->GetPrefix ().IsBroadcast () ||
966 iter->GetPrefix ().IsMulticast ())
968 NS_LOG_LOGIC (
"Ignoring an update message with wrong prefixes: " << iter->GetPrefix ());
973 bool changed =
false;
975 for (std::list<RipRte>::iterator iter = rtes.begin ();
976 iter != rtes.end (); iter++)
978 Ipv4Mask rtePrefixMask = iter->GetSubnetMask ();
983 uint32_t interfaceMetric = 1;
988 uint64_t rteMetric = iter->GetRouteMetric () + interfaceMetric;
998 if (it->first->GetDestNetwork () == rteAddr &&
999 it->first->GetDestNetworkMask () == rtePrefixMask)
1002 if (rteMetric < it->
first->GetRouteMetric ())
1004 if (senderAddress != it->first->GetGateway ())
1012 it->first->SetRouteTag (iter->GetRouteTag ());
1013 it->first->SetRouteChanged (
true);
1014 it->second.Cancel ();
1018 else if (rteMetric == it->first->GetRouteMetric ())
1020 if (senderAddress == it->first->GetGateway ())
1022 it->second.Cancel ();
1036 it->second.Cancel ();
1042 else if (rteMetric > it->first->GetRouteMetric () && senderAddress == it->first->GetGateway ())
1044 it->second.Cancel ();
1047 it->first->SetRouteMetric (rteMetric);
1049 it->first->SetRouteTag (iter->GetRouteTag ());
1050 it->first->SetRouteChanged (
true);
1051 it->second.Cancel ();
1064 NS_LOG_LOGIC (
"Received a RTE with new route, adding.");
1089 uint32_t
interface = iter->
second;
1093 uint16_t mtu =
m_ipv4->GetMtu (interface);
1106 bool splitHorizoning = (rtIter->first->GetInterface () == interface);
1109 NS_LOG_DEBUG (
"Processing RT " << rtDestAddr <<
" " <<
int(rtIter->first->IsRouteChanged ()));
1114 (rtIter->first->GetInterface () != interface));
1116 bool sameNetwork =
false;
1117 for (uint32_t index = 0; index <
m_ipv4->GetNAddresses (interface); index++)
1126 if ((isGlobal || isDefaultRoute) &&
1127 (periodic || rtIter->first->IsRouteChanged ()) &&
1131 rte.
SetPrefix (rtIter->first->GetDestNetwork ());
1170 rtIter->first->SetRouteChanged (
false);
1180 NS_LOG_LOGIC (
"Skipping Triggered Update due to cooldown");
1235 std::map<uint32_t, uint8_t>::const_iterator iter =
m_interfaceMetrics.find (interface);
1238 return iter->second;
1276 uint32_t
interface = iter->
second;
1299 : m_tag (0), m_metric (0), m_status (RIP_INVALID), m_changed (false)
1305 m_tag (0), m_metric (0), m_status (RIP_INVALID), m_changed (false)
1311 m_tag (0), m_metric (0), m_status (RIP_INVALID), m_changed (false)
1322 if (
m_tag != routeTag)
1375 os << static_cast<const Ipv4RoutingTableEntry &>(rte);
void SetInterfaceExclusions(std::set< uint32_t > exceptions)
Set the set of interface excluded from the protocol.
static Time GetDelayLeft(const EventId &id)
Get the remaining time until this event will execute.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Ptr< Ipv4 > m_ipv4
IPv4 reference.
void HandleRequests(RipHeader hdr, Ipv4Address senderAddress, uint16_t senderPort, uint32_t incomingInterface, uint8_t hopLimit)
Handle RIP requests.
void HandleResponses(RipHeader hdr, Ipv4Address senderAddress, uint32_t incomingInterface, uint8_t hopLimit)
Handle RIP responses.
bool m_initialized
flag to allow socket's late-creation.
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Ptr< Ipv4Route > RouteOutput(Ptr< Packet > p, const Ipv4Header &header, Ptr< NetDevice > oif, Socket::SocketErrno &sockerr)
Query routing cache for an existing route, for an outbound packet.
void SendTriggeredRouteUpdate()
Send Triggered Routing Updates on all interfaces.
virtual uint32_t GetSerializedSize(void) const
Get the serialized size of the packet.
virtual void DoInitialize(void)
Initialize() implementation.
Simulation virtual time values and global simulation resolution.
virtual void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address)
static Ipv4Address GetAny(void)
Smart pointer class similar to boost::intrusive_ptr.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
void SetPrefix(Ipv4Address prefix)
Set the prefix.
Ptr< Socket > m_multicastRecvSocket
multicast receive socket
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
Time m_garbageCollectionDelay
Delay before deleting an INVALID route.
void SendUnsolicitedRouteUpdate(void)
Send Unsolicited Routing Updates on all interfaces.
bool IsBroadcast(void) const
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
bool IsMatch(Ipv4Address a, Ipv4Address b) const
SocketList m_unicastSocketList
list of sockets for unicast messages (socket, interface index)
Ptr< Ipv4Route > Lookup(Ipv4Address dest, Ptr< NetDevice >=0)
Lookup in the forwarding table for destination.
NS_ASSERT_MSG(false, "Ipv4AddressGenerator::MaskToIndex(): Impossible")
virtual ~RipRoutingTableEntry()
a class to represent an Ipv4 address mask
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
uint32_t GetRecvIf(void) const
Get the tag's receiving interface.
Time m_startupDelay
Random delay before protocol startup.
uint32_t m_linkDown
Link down value.
std::list< std::pair< RipRoutingTableEntry *, EventId > >::iterator RoutesI
Iterator for container for the network routes.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
std::map< uint32_t, uint8_t > m_interfaceMetrics
Map of interface metrics.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Ipv4Address GetDest(void) const
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
virtual void DoDispose(void)
Destructor implementation.
RipRoutingTableEntry(void)
TimeWithUnit As(const enum Unit unit) const
Attach a unit to a Time, to facilitate output in a specific unit.
Ipv4Address GetDestNetwork(void) const
This class implements a tag that carries the socket-specific TTL of a packet to the IP layer...
SocketErrno
Enumeration of the possible errors returned by a socket.
Ipv4Address GetGateway(void) const
a polymophic address class
void SetRouteChanged(bool changed)
Set the route as changed.
EventId m_nextUnsolicitedUpdate
Next Unsolicited Update event.
void DoSendRouteUpdate(bool periodic)
Send Routing Updates on all interfaces.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
void SetRouteMetric(uint32_t routeMetric)
Set the route metric.
void SetSource(Ipv4Address src)
void SetRecvPktInfo(bool flag)
Enable/Disable receive packet information to socket.
bool RouteInput(Ptr< const Packet > p, const Ipv4Header &header, Ptr< const NetDevice > idev, UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb)
Route an input packet (to be forwarded or locally delivered)
bool IsMulticast(void) const
Routes m_routes
the forwarding table for network.
Ipv4Mask GetDestNetworkMask(void) const
A record of an IPv4 routing table entry for Ipv4GlobalRouting and Ipv4StaticRouting.
void InvalidateRoute(RipRoutingTableEntry *route)
Invalidate a route.
virtual void DoDispose()
Dispose this object.
void DeleteRoute(RipRoutingTableEntry *route)
Delete a route.
uint8_t GetInterfaceMetric(uint32_t interface) const
Get the metric for an interface.
Hold variables of type enum.
Ipv4Address CombineMask(Ipv4Mask const &mask) const
Combine this address with a network mask.
void SetTtl(uint8_t ttl)
Set the tag's TTL.
AttributeValue implementation for Time.
RIP Routing Protocol, defined in RFC 2453.
void SetGateway(Ipv4Address gw)
Hold an unsigned integer type.
static Ipv4Mask GetZero(void)
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
void SetRouteTag(uint16_t routeTag)
Set the route tag.
Unit
The unit to use to interpret a number representing time.
void SetSubnetMask(Ipv4Mask subnetMask)
Set the subnet mask.
bool IsLocalMulticast(void) const
std::list< std::pair< RipRoutingTableEntry *, EventId > >::const_iterator RoutesCI
Const Iterator for container for the network routes.
std::set< uint32_t > m_interfaceExclusions
Set of excluded interfaces.
Ipv4Address GetDestination(void) const
std::map< Ptr< Socket >, uint32_t >::iterator SocketListI
Socket list type iterator.
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read.
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
This method wraps the creation of sockets that is performed on a given node by a SocketFactory specif...
void AddNetworkRouteTo(Ipv4Address network, Ipv4Mask networkPrefix, Ipv4Address nextHop, uint32_t interface)
Add route to network.
bool m_changed
route has been updated
Ipv4Mask GetMask(void) const
Get the network mask.
std::ostream & operator<<(std::ostream &os, const Angles &a)
print a struct Angles to output
void SetRouteMetric(uint8_t routeMetric)
Set the route metric.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void SetRouteStatus(Status_e status)
Set the route status.
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address.
uint32_t GetInterface(void) const
virtual void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address)
void SendRouteRequest()
Send Routing Request on all interfaces.
uint16_t GetPort(void) const
void Receive(Ptr< Socket > socket)
Receive RIP packets.
Rip v2 Routing Table Entry (RTE) - see RFC 2453.
Status_e m_status
route status
virtual void NotifyInterfaceUp(uint32_t interface)
std::set< uint32_t > GetInterfaceExclusions() const
Get the set of interface excluded from the protocol.
uint8_t m_metric
route metric
static Ipv4Address GetZero(void)
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Ipv4InterfaceAddress::InterfaceAddressScope_e GetScope(void) const
Get address scope.
void DoInitialize()
Start protocol operation.
Time m_unsolicitedUpdate
time between two Unsolicited Routing Updates
void SetOutputDevice(Ptr< NetDevice > outputDevice)
Equivalent in Linux to dst_entry.dev.
static TypeId GetTypeId(void)
Get the type ID.
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
EventId m_nextTriggeredUpdate
Next Triggered Update event.
This class implements Linux struct pktinfo in order to deliver ancillary information to the socket in...
Ipv4Address GetGateway(void) const
Ptr< const AttributeChecker > MakeEnumChecker(int v1, std::string n1, int v2, std::string n2, int v3, std::string n3, int v4, std::string n4, int v5, std::string n5, int v6, std::string n6, int v7, std::string n7, int v8, std::string n8, int v9, std::string n9, int v10, std::string n10, int v11, std::string n11, int v12, std::string n12, int v13, std::string n13, int v14, std::string n14, int v15, std::string n15, int v16, std::string n16, int v17, std::string n17, int v18, std::string n18, int v19, std::string n19, int v20, std::string n20, int v21, std::string n21, int v22, std::string n22)
Make an EnumChecker pre-configured with a set of allowed values by name.
Ipv4 addresses are stored in host order in this class.
virtual void SetIpv4(Ptr< Ipv4 > ipv4)
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S) const
Print the Routing Table entries.
uint16_t GetRouteTag(void) const
Get the route tag.
SplitHorizonType_e m_splitHorizonStrategy
Split Horizon strategy.
Poison Reverse Split Horizon.
void AddDefaultRouteTo(Ipv4Address nextHop, uint32_t interface)
Add a default route to the router through the nextHop located on interface.
Status_e GetRouteStatus(void) const
Get the route status.
a class to store IPv4 address information on an interface
An identifier for simulation events.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Time Seconds(double value)
Construct a Time in the indicated unit.
bool IsGateway(void) const
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
void SetIpRecvTtl(bool ipv4RecvTtl)
Tells a socket to pass information about IP_TTL up the stack.
bool IsRouteChanged(void) const
Get the route changed status.
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
static std::string FindName(Ptr< Object > object)
Given a pointer to an object, look to see if that object has a name associated with it and...
Ipv4Address GetLocal(void) const
Get the local address.
void SetInterfaceMetric(uint32_t interface, uint8_t metric)
Set the metric for an interface.
Abstract base class for IPv4 routing protocols.
uint16_t GetPrefixLength(void) const
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
void SetRouteTag(uint16_t routeTag)
Set the route tag.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)=0
Read a single packet from the socket and retrieve the sender address.
virtual void NotifyInterfaceDown(uint32_t interface)
Time m_minTriggeredUpdateDelay
Min cooldown delay after a Triggered Update.
virtual int Close(void)=0
Close a socket.
bool IsNull(void) const
Check for null implementation.
Ptr< UniformRandomVariable > m_rng
Rng stream.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
uint8_t GetRouteMetric(void) const
Get the route metric.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
void AddHeader(const Header &header)
Add header to this packet.
uint8_t GetTtl(void) const
Get the tag's TTL.
void SetDestination(Ipv4Address dest)
Ipv4Address GetIpv4(void) const
Time m_maxTriggeredUpdateDelay
Max cooldown delay after a Triggered Update.
static TypeId LookupByName(std::string name)
Get a TypeId by name.
Time m_timeoutDelay
Delay before invalidating a route.