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 int ret = socket->Bind (local);
149 socket->BindToNetDevice (
m_ipv4->GetNetDevice (i));
150 socket->SetIpRecvTtl (
true);
167 m_recvSocket->Bind (local);
169 m_recvSocket->SetIpRecvTtl (
true);
170 m_recvSocket->SetRecvPktInfo (
true);
204 rtentry =
Lookup (destination, oif);
225 uint32_t iif =
m_ipv4->GetInterfaceForDevice (idev);
233 lcb (p, header, iif);
255 NS_LOG_LOGIC (
"Dropping packet not for me and with dst Broadcast");
264 if (
m_ipv4->IsForwarding (iif) ==
false)
266 NS_LOG_LOGIC (
"Forwarding disabled for this interface");
279 NS_LOG_LOGIC (
"Found unicast destination - calling unicast callback");
280 ucb (rtentry, p, header);
285 NS_LOG_LOGIC (
"Did not find unicast destination - returning false");
300 for (uint32_t j = 0; j <
m_ipv4->GetNAddresses (i); j++)
318 bool sendSocketFound =
false;
321 if (iter->second == i)
323 sendSocketFound =
true;
328 bool activeInterface =
false;
331 activeInterface =
true;
332 m_ipv4->SetForwarding (i,
true);
335 for (uint32_t j = 0; j <
m_ipv4->GetNAddresses (i); j++)
346 socket->Bind (local);
347 socket->BindToNetDevice (
m_ipv4->GetNetDevice (i));
348 socket->SetIpRecvTtl (
true);
364 m_recvSocket->Bind (local);
366 m_recvSocket->SetIpRecvTtl (
true);
367 m_recvSocket->SetRecvPktInfo (
true);
378 if (it->first->GetInterface () == interface)
386 NS_LOG_INFO (
"Checking socket for interface " << interface);
387 if (iter->second == interface)
389 NS_LOG_INFO (
"Removed socket for interface " << interface);
390 iter->first->Close ();
406 if (!
m_ipv4->IsUp (interface))
431 if (!
m_ipv4->IsUp (interface))
448 if (it->first->GetInterface () == interface
449 && it->first->IsNetwork ()
450 && it->first->GetDestNetwork () == networkAddress
451 && it->first->GetDestNetworkMask () == networkMask)
472 for (i = 0; i <
m_ipv4->GetNInterfaces (); i++)
491 *os <<
"Node: " <<
m_ipv4->GetObject<
Node> ()->GetId ()
493 <<
", Local time: " << GetObject<Node> ()->GetLocalTime ().As (
Time::S)
494 <<
", IPv4 RIP table" << std::endl;
498 *os <<
"Destination Gateway Genmask Flags Metric Ref Use Iface" << std::endl;
506 std::ostringstream dest, gw, mask, flags;
508 *os << std::setiosflags (std::ios::left) << std::setw (16) << dest.str ();
510 *os << std::setiosflags (std::ios::left) << std::setw (16) << gw.str ();
512 *os << std::setiosflags (std::ios::left) << std::setw (16) << mask.str ();
522 *os << std::setiosflags (std::ios::left) << std::setw (6) << flags.str ();
523 *os << std::setiosflags (std::ios::left) << std::setw (7) << int(route->
GetRouteMetric ());
560 iter->first->Close ();
578 uint16_t longestMask = 0;
583 NS_ASSERT_MSG (interface,
"Try to send on local multicast address, and no interface index is given!");
584 rtentry = Create<Ipv4Route> ();
585 rtentry->
SetSource (
m_ipv4->SourceAddressSelection (
m_ipv4->GetInterfaceForDevice (interface), dst));
602 NS_LOG_LOGIC (
"Searching for route to " << dst <<
", mask length " << maskLen);
606 NS_LOG_LOGIC (
"Found global network route " << j <<
", mask length " << maskLen);
611 if (maskLen < longestMask)
617 longestMask = maskLen;
621 rtentry = Create<Ipv4Route> ();
649 NS_LOG_FUNCTION (
this << network << networkPrefix << nextHop << interface);
677 if (it->first == route)
682 if (it->second.IsRunning ())
684 it->second.Cancel ();
690 NS_ABORT_MSG (
"RIP::InvalidateRoute - cannot find the route to update");
699 if (it->first == route)
706 NS_ABORT_MSG (
"RIP::DeleteRoute - cannot find the route to delete");
717 NS_LOG_INFO (
"Received " << *packet <<
" from " << senderAddr);
720 uint16_t senderPort = senderAddr.
GetPort ();
725 NS_ABORT_MSG (
"No incoming interface on RIP message, aborting.");
727 uint32_t incomingIf = interfaceInfo.
GetRecvIf ();
728 Ptr<Node> node = this->GetObject<Node> ();
730 uint32_t ipInterfaceIndex =
m_ipv4->GetInterfaceForDevice (dev);
735 NS_ABORT_MSG (
"No incoming Hop Count on RIP message, aborting.");
737 uint8_t hopLimit = hoplimitTag.
GetTtl ();
739 int32_t interfaceForAddress =
m_ipv4->GetInterfaceForAddress (senderAddress);
740 if (interfaceForAddress != -1)
755 HandleRequests (hdr, senderAddress, senderPort, ipInterfaceIndex, hopLimit);
766 NS_LOG_FUNCTION (
this << senderAddress <<
int (senderPort) << incomingInterface <<
int (hopLimit) << requestHdr);
768 std::list<RipRte> rtes = requestHdr.
GetRteList ();
776 if (rtes.size () == 1)
779 rtes.begin ()->GetSubnetMask ().GetPrefixLength () == 0 &&
780 rtes.begin ()->GetRouteMetric () ==
m_linkDown)
790 if (iter->second == incomingInterface)
792 sendingSoket = iter->first;
795 NS_ASSERT_MSG (sendingSoket,
"HandleRequest - Impossible to find a socket to send the reply");
797 uint16_t mtu =
m_ipv4->GetMtu (incomingInterface);
818 bool splitHorizoning = (rtIter->first->GetInterface () == incomingInterface);
825 (rtIter->first->GetInterface () != incomingInterface));
827 if ((isGlobal || isDefaultRoute) &&
831 rte.
SetPrefix (rtIter->first->GetDestNetwork ());
886 for (std::list<RipRte>::iterator iter = rtes.begin ();
887 iter != rtes.end (); iter++)
898 requestedAddress.
CombineMask (iter->GetSubnetMask ());
899 Ipv4Address rtAddress = rtIter->first->GetDestNetwork ();
900 rtAddress.
CombineMask (rtIter->first->GetDestNetworkMask ());
902 if (requestedAddress == rtAddress)
904 iter->SetRouteMetric (rtIter->first->GetRouteMetric ());
905 iter->SetRouteTag (rtIter->first->GetRouteTag ());
915 iter->SetRouteTag (0);
928 NS_LOG_FUNCTION (
this << senderAddress << incomingInterface <<
int (hopLimit) << hdr);
932 NS_LOG_LOGIC (
"Ignoring an update message from an excluded interface: " << incomingInterface);
939 for (std::list<RipRte>::iterator iter = rtes.begin ();
940 iter != rtes.end (); iter++)
942 if (iter->GetRouteMetric () == 0 || iter->GetRouteMetric () >
m_linkDown)
944 NS_LOG_LOGIC (
"Ignoring an update message with malformed metric: " <<
int (iter->GetRouteMetric ()));
947 if (iter->GetPrefix ().IsLocalhost () ||
948 iter->GetPrefix ().IsBroadcast () ||
949 iter->GetPrefix ().IsMulticast ())
951 NS_LOG_LOGIC (
"Ignoring an update message with wrong prefixes: " << iter->GetPrefix ());
956 bool changed =
false;
958 for (std::list<RipRte>::iterator iter = rtes.begin ();
959 iter != rtes.end (); iter++)
961 Ipv4Mask rtePrefixMask = iter->GetSubnetMask ();
966 uint32_t interfaceMetric = 1;
971 uint64_t rteMetric = iter->GetRouteMetric () + interfaceMetric;
981 if (it->first->GetDestNetwork () == rteAddr &&
982 it->first->GetDestNetworkMask () == rtePrefixMask)
985 if (rteMetric < it->first->GetRouteMetric ())
987 if (senderAddress != it->first->GetGateway ())
995 it->first->SetRouteTag (iter->GetRouteTag ());
996 it->first->SetRouteChanged (
true);
997 it->second.Cancel ();
1001 else if (rteMetric == it->first->GetRouteMetric ())
1003 if (senderAddress == it->first->GetGateway ())
1005 it->second.Cancel ();
1019 it->second.Cancel ();
1025 else if (rteMetric > it->first->GetRouteMetric () && senderAddress == it->first->GetGateway ())
1027 it->second.Cancel ();
1030 it->first->SetRouteMetric (rteMetric);
1032 it->first->SetRouteTag (iter->GetRouteTag ());
1033 it->first->SetRouteChanged (
true);
1034 it->second.Cancel ();
1047 NS_LOG_LOGIC (
"Received a RTE with new route, adding.");
1055 (
m_routes.begin ())->second = invalidateEvent;
1072 uint32_t
interface = iter->second;
1076 uint16_t mtu =
m_ipv4->GetMtu (interface);
1089 bool splitHorizoning = (rtIter->first->GetInterface () == interface);
1092 NS_LOG_DEBUG (
"Processing RT " << rtDestAddr <<
" " <<
int(rtIter->first->IsRouteChanged ()));
1097 (rtIter->first->GetInterface () != interface));
1099 bool sameNetwork =
false;
1100 for (uint32_t index = 0; index <
m_ipv4->GetNAddresses (interface); index++)
1109 if ((isGlobal || isDefaultRoute) &&
1110 (periodic || rtIter->first->IsRouteChanged ()) &&
1114 rte.
SetPrefix (rtIter->first->GetDestNetwork ());
1153 rtIter->first->SetRouteChanged (
false);
1163 NS_LOG_LOGIC (
"Skipping Triggered Update due to cooldown");
1218 std::map<uint32_t, uint8_t>::const_iterator iter =
m_interfaceMetrics.find (interface);
1221 return iter->second;
1259 uint32_t
interface = iter->second;
1282 : m_tag (0), m_metric (0), m_status (RIP_INVALID), m_changed (false)
1288 m_tag (0), m_metric (0), m_status (RIP_INVALID), m_changed (false)
1294 m_tag (0), m_metric (0), m_status (RIP_INVALID), m_changed (false)
1305 if (
m_tag != routeTag)
1358 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.
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 void DoInitialize(void)
Initialize() implementation.
Simulation virtual time values and global simulation resolution.
virtual void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address)
Ipv4Address GetIpv4(void) const
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 this RNG stream.
void SetPrefix(Ipv4Address prefix)
Set the prefix.
Ipv4Mask GetMask(void) const
Get the network mask.
#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.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
bool IsMatch(Ipv4Address a, Ipv4Address b) const
Ptr< Ipv4Route > Lookup(Ipv4Address dest, Ptr< NetDevice >=0)
Lookup in the forwarding table for destination.
Ipv4Address GetLocal(void) const
Get the local address.
virtual ~RipRoutingTableEntry()
a class to represent an Ipv4 address mask
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
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.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
std::map< uint32_t, uint8_t > m_interfaceMetrics
Map of interface metrics.
bool IsLocalMulticast(void) const
bool IsNull(void) const
Check for null implementation.
Status_e GetRouteStatus(void) const
Get the route status.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Ipv4Address GetDestNetwork(void) const
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
bool IsMulticast(void) const
Ipv4Address CombineMask(Ipv4Mask const &mask) const
Combine this address with a network mask.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
virtual void DoDispose(void)
Destructor implementation.
RipRoutingTableEntry(void)
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.
a polymophic address class
void SetRouteChanged(bool changed)
Set the route as changed.
EventId m_nextUnsolicitedUpdate
Next Unsolicited Update event.
bool IsRouteChanged(void) const
Get the route changed status.
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.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
void SetSource(Ipv4Address src)
uint32_t GetInterface(void) const
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)
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Routes m_routes
the forwarding table for network.
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.
Hold variables of type enum.
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
void SetTtl(uint8_t ttl)
Set the tag's TTL.
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream) const
Print the Routing Table entries.
AttributeValue implementation for Time.
bool IsGateway(void) const
uint8_t GetInterfaceMetric(uint32_t interface) const
Get the metric for an interface.
RIP Routing Protocol, defined in RFC 2453.
void SetGateway(Ipv4Address gw)
uint32_t GetRecvIf(void) const
Get the tag's receiving interface.
Hold an unsigned integer type.
static Ipv4Mask GetZero(void)
void SetRouteTag(uint16_t routeTag)
Set the route tag.
bool IsBroadcast(void) const
void SetSubnetMask(Ipv4Mask subnetMask)
Set the subnet mask.
std::list< std::pair< RipRoutingTableEntry *, EventId > >::const_iterator RoutesCI
Const Iterator for container for the network routes.
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
std::set< uint32_t > m_interfaceExclusions
Set of excluded interfaces.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
std::map< Ptr< Socket >, uint32_t >::iterator SocketListI
Socket list type iterator.
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
uint16_t GetRouteTag(void) const
Get the route tag.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Ipv4Address GetGateway(void) const
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 uint32_t GetSerializedSize(void) const
Get the serialized size of the packet.
void SetRouteStatus(Status_e status)
Set the route status.
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address.
virtual void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address)
void SendRouteRequest()
Send Routing Request on all interfaces.
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)
Ipv4Address GetDest(void) const
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...
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.
EventId m_nextTriggeredUpdate
Next Triggered Update event.
This class implements Linux struct pktinfo in order to deliver ancillary information to the socket in...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Ipv4Address GetDestination(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)
SplitHorizonType_e m_splitHorizonStrategy
Split Horizon strategy.
Poison Reverse Split Horizon.
TimeWithUnit As(const enum Unit unit) const
Attach a unit to a Time, to facilitate output in a specific unit.
void AddDefaultRouteTo(Ipv4Address nextHop, uint32_t interface)
Add a default route to the router through the nextHop located on interface.
a class to store IPv4 address information on an interface
An identifier for simulation events.
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
Ptr< Socket > m_recvSocket
receive socket
Ipv4Address GetGateway(void) const
#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.
uint8_t GetRouteMetric(void) const
Get the route metric.
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
Ipv4InterfaceAddress::InterfaceAddressScope_e GetScope(void) const
Get address scope.
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...
void SetInterfaceMetric(uint32_t interface, uint8_t metric)
Set the metric for an interface.
Abstract base class for IPv4 routing protocols.
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.
uint16_t GetPort(void) const
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)
uint8_t GetTtl(void) const
Get the tag's TTL.
Time m_minTriggeredUpdateDelay
Min cooldown delay after a Triggered Update.
virtual int Close(void)=0
Close a socket.
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...
Ipv4Mask GetDestNetworkMask(void) const
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
uint16_t GetPrefixLength(void) const
void AddHeader(const Header &header)
Add header to this packet.
void SetDestination(Ipv4Address dest)
Time m_maxTriggeredUpdateDelay
Max cooldown delay after a Triggered Update.
SocketList m_sendSocketList
list of sockets for sending (socket, interface index)
static TypeId LookupByName(std::string name)
Get a TypeId by name.
Time m_timeoutDelay
Delay before invalidating a route.
std::set< uint32_t > GetInterfaceExclusions() const
Get the set of interface excluded from the protocol.