|
A Discrete-Event Network Simulator
|
API
|
Go to the documentation of this file.
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++)
148 int ret = socket->
Bind (local);
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++)
351 socket->
Bind (local);
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 std::ios oldState (
nullptr);
498 oldState.copyfmt (*os);
500 *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
502 *os <<
"Node: " <<
m_ipv4->GetObject<
Node> ()->GetId ()
503 <<
", Time: " <<
Now().
As (unit)
504 <<
", Local time: " <<
m_ipv4->GetObject<
Node> ()->GetLocalTime ().As (unit)
505 <<
", IPv4 RIP table" << std::endl;
509 *os <<
"Destination Gateway Genmask Flags Metric Ref Use Iface" << std::endl;
517 std::ostringstream dest, gw, mask, flags;
519 *os << std::setw (16) << dest.str ();
521 *os << std::setw (16) << gw.str ();
523 *os << std::setw (16) << mask.str ();
533 *os << std::setw (6) << flags.str ();
553 (*os).copyfmt (oldState);
573 iter->first->Close ();
591 uint16_t longestMask = 0;
596 NS_ASSERT_MSG (interface,
"Try to send on local multicast address, and no interface index is given!");
597 rtentry = Create<Ipv4Route> ();
598 rtentry->SetSource (
m_ipv4->SourceAddressSelection (
m_ipv4->GetInterfaceForDevice (interface), dst));
599 rtentry->SetDestination (dst);
601 rtentry->SetOutputDevice (interface);
615 NS_LOG_LOGIC (
"Searching for route to " << dst <<
", mask length " << maskLen);
619 NS_LOG_LOGIC (
"Found global network route " << j <<
", mask length " << maskLen);
624 if (maskLen < longestMask)
630 longestMask = maskLen;
634 rtentry = Create<Ipv4Route> ();
638 rtentry->SetSource (
m_ipv4->SourceAddressSelection (interfaceIdx, route->
GetGateway ()));
642 rtentry->SetSource (
m_ipv4->SourceAddressSelection (interfaceIdx, route->
GetDest ()));
645 rtentry->SetDestination (route->
GetDest ());
647 rtentry->SetOutputDevice (
m_ipv4->GetNetDevice (interfaceIdx));
655 NS_LOG_LOGIC (
"Matching route via " << rtentry->GetDestination () <<
" (through " << rtentry->GetGateway () <<
") at the end");
662 NS_LOG_FUNCTION (
this << network << networkPrefix << nextHop << interface);
690 if (it->first == route)
695 if (it->second.IsRunning ())
697 it->second.Cancel ();
703 NS_ABORT_MSG (
"RIP::InvalidateRoute - cannot find the route to update");
712 if (it->first == route)
719 NS_ABORT_MSG (
"RIP::DeleteRoute - cannot find the route to delete");
733 uint16_t senderPort = senderAddr.
GetPort ();
737 NS_LOG_LOGIC (
"Received a packet from the multicast socket");
741 NS_LOG_LOGIC (
"Received a packet from one of the unicast sockets");
747 NS_ABORT_MSG (
"No incoming interface on RIP message, aborting.");
749 uint32_t incomingIf = interfaceInfo.
GetRecvIf ();
750 Ptr<Node> node = this->GetObject<Node> ();
752 uint32_t ipInterfaceIndex =
m_ipv4->GetInterfaceForDevice (dev);
757 NS_ABORT_MSG (
"No incoming Hop Count on RIP message, aborting.");
759 uint8_t hopLimit = hoplimitTag.
GetTtl ();
761 int32_t interfaceForAddress =
m_ipv4->GetInterfaceForAddress (senderAddress);
762 if (interfaceForAddress != -1)
779 HandleRequests (hdr, senderAddress, senderPort, ipInterfaceIndex, hopLimit);
790 NS_LOG_FUNCTION (
this << senderAddress <<
int (senderPort) << incomingInterface <<
int (hopLimit) << requestHdr);
792 std::list<RipRte> rtes = requestHdr.
GetRteList ();
800 if (rtes.size () == 1)
803 rtes.begin ()->GetSubnetMask ().GetPrefixLength () == 0 &&
804 rtes.begin ()->GetRouteMetric () ==
m_linkDown)
814 if (iter->second == incomingInterface)
816 sendingSocket = iter->first;
819 NS_ASSERT_MSG (sendingSocket,
"HandleRequest - Impossible to find a socket to send the reply");
821 uint16_t mtu =
m_ipv4->GetMtu (incomingInterface);
842 bool splitHorizoning = (rtIter->first->GetInterface () == incomingInterface);
849 (rtIter->first->GetInterface () != incomingInterface));
851 if ((isGlobal || isDefaultRoute) &&
855 rte.
SetPrefix (rtIter->first->GetDestNetwork ());
910 for (std::list<RipRte>::iterator iter = rtes.begin ();
911 iter != rtes.end (); iter++)
922 requestedAddress.
CombineMask (iter->GetSubnetMask ());
923 Ipv4Address rtAddress = rtIter->first->GetDestNetwork ();
924 rtAddress.
CombineMask (rtIter->first->GetDestNetworkMask ());
926 if (requestedAddress == rtAddress)
928 iter->SetRouteMetric (rtIter->first->GetRouteMetric ());
929 iter->SetRouteTag (rtIter->first->GetRouteTag ());
939 iter->SetRouteTag (0);
952 NS_LOG_FUNCTION (
this << senderAddress << incomingInterface <<
int (hopLimit) << hdr);
956 NS_LOG_LOGIC (
"Ignoring an update message from an excluded interface: " << incomingInterface);
963 for (std::list<RipRte>::iterator iter = rtes.begin ();
964 iter != rtes.end (); iter++)
966 if (iter->GetRouteMetric () == 0 || iter->GetRouteMetric () >
m_linkDown)
968 NS_LOG_LOGIC (
"Ignoring an update message with malformed metric: " <<
int (iter->GetRouteMetric ()));
971 if (iter->GetPrefix ().IsLocalhost () ||
972 iter->GetPrefix ().IsBroadcast () ||
973 iter->GetPrefix ().IsMulticast ())
975 NS_LOG_LOGIC (
"Ignoring an update message with wrong prefixes: " << iter->GetPrefix ());
980 bool changed =
false;
982 for (std::list<RipRte>::iterator iter = rtes.begin ();
983 iter != rtes.end (); iter++)
985 Ipv4Mask rtePrefixMask = iter->GetSubnetMask ();
990 uint32_t interfaceMetric = 1;
995 uint64_t rteMetric = iter->GetRouteMetric () + interfaceMetric;
1005 if (it->first->GetDestNetwork () == rteAddr &&
1006 it->first->GetDestNetworkMask () == rtePrefixMask)
1009 if (rteMetric < it->
first->GetRouteMetric ())
1011 if (senderAddress != it->first->GetGateway ())
1019 it->first->SetRouteTag (iter->GetRouteTag ());
1020 it->first->SetRouteChanged (
true);
1021 it->second.Cancel ();
1025 else if (rteMetric == it->first->GetRouteMetric ())
1027 if (senderAddress == it->first->GetGateway ())
1029 it->second.Cancel ();
1043 it->second.Cancel ();
1049 else if (rteMetric > it->first->GetRouteMetric () && senderAddress == it->first->GetGateway ())
1051 it->second.Cancel ();
1054 it->first->SetRouteMetric (rteMetric);
1056 it->first->SetRouteTag (iter->GetRouteTag ());
1057 it->first->SetRouteChanged (
true);
1058 it->second.Cancel ();
1071 NS_LOG_LOGIC (
"Received a RTE with new route, adding.");
1096 uint32_t
interface = iter->
second;
1100 uint16_t mtu =
m_ipv4->GetMtu (interface);
1113 bool splitHorizoning = (rtIter->first->GetInterface () == interface);
1116 NS_LOG_DEBUG (
"Processing RT " << rtDestAddr <<
" " <<
int(rtIter->first->IsRouteChanged ()));
1121 (rtIter->first->GetInterface () != interface));
1123 bool sameNetwork =
false;
1124 for (uint32_t index = 0; index <
m_ipv4->GetNAddresses (interface); index++)
1133 if ((isGlobal || isDefaultRoute) &&
1134 (periodic || rtIter->first->IsRouteChanged ()) &&
1138 rte.
SetPrefix (rtIter->first->GetDestNetwork ());
1177 rtIter->first->SetRouteChanged (
false);
1187 NS_LOG_LOGIC (
"Skipping Triggered Update due to cooldown");
1242 std::map<uint32_t, uint8_t>::const_iterator iter =
m_interfaceMetrics.find (interface);
1245 return iter->second;
1283 uint32_t
interface = iter->
second;
1306 : m_tag (0), m_metric (0), m_status (RIP_INVALID), m_changed (false)
1312 m_tag (0), m_metric (0), m_status (RIP_INVALID), m_changed (false)
1318 m_tag (0), m_metric (0), m_status (RIP_INVALID), m_changed (false)
1329 if (
m_tag != routeTag)
1382 os << static_cast<const Ipv4RoutingTableEntry &>(rte);
a unique identifier for an interface.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
static Ipv4Mask GetZero(void)
Time m_startupDelay
Random delay before protocol startup.
void DoInitialize()
Start protocol operation.
bool IsGateway(void) const
uint32_t m_linkDown
Link down value.
Routes m_routes
the forwarding table for network.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
bool IsRouteChanged(void) const
Get the route changed status.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
uint8_t GetInterfaceMetric(uint32_t interface) const
Get the metric for an interface.
virtual ~RipRoutingTableEntry()
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
An identifier for simulation events.
uint32_t GetInterface(void) const
void AddHeader(const Header &header)
Add header to this packet.
SocketErrno
Enumeration of the possible errors returned by a socket.
uint16_t GetPort(void) const
void SendTriggeredRouteUpdate()
Send Triggered Routing Updates on all interfaces.
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.
virtual void SetIpv4(Ptr< Ipv4 > ipv4)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool IsNull(void) const
Check for null implementation.
Ptr< const AttributeChecker > MakeEnumChecker(int v, std::string n, Ts... args)
Make an EnumChecker pre-configured with a set of allowed values by name.
void DeleteRoute(RipRoutingTableEntry *route)
Delete a route.
void SetSubnetMask(Ipv4Mask subnetMask)
Set the subnet mask.
Ipv4Mask GetMask(void) const
Get the network mask.
static Time GetDelayLeft(const EventId &id)
Get the remaining time until this event will execute.
RipRoutingTableEntry(void)
virtual void DoDispose()
Dispose this object.
void SetRecvPktInfo(bool flag)
Enable/Disable receive packet information to socket.
uint32_t GetRecvIf(void) const
Get the tag's receiving interface.
Time m_timeoutDelay
Delay before invalidating a route.
Ipv4InterfaceAddress::InterfaceAddressScope_e GetScope(void) const
Get address scope.
Ptr< UniformRandomVariable > m_rng
Rng stream.
bool m_initialized
flag to allow socket's late-creation.
Ipv4 addresses are stored in host order in this class.
Status_e GetRouteStatus(void) const
Get the route status.
Ipv4Mask GetDestNetworkMask(void) const
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
void SetTtl(uint8_t ttl)
Set the tag's TTL.
Ipv4Address GetGateway(void) const
std::map< uint32_t, uint8_t > m_interfaceMetrics
Map of interface metrics.
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
uint8_t GetRouteMetric(void) const
Get the route metric.
virtual void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address)
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
A record of an IPv4 routing table entry for Ipv4GlobalRouting and Ipv4StaticRouting.
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
Ipv4Address GetDestNetwork(void) const
Ptr< Ipv4Route > Lookup(Ipv4Address dest, Ptr< NetDevice >=0)
Lookup in the forwarding table for destination.
void Receive(Ptr< Socket > socket)
Receive RIP packets.
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
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)
@ NO_SPLIT_HORIZON
No Split Horizon.
Hold variables of type enum.
bool IsMulticast(void) const
Smart pointer class similar to boost::intrusive_ptr.
std::set< uint32_t > m_interfaceExclusions
Set of excluded interfaces.
static Ipv4Address GetZero(void)
void SendUnsolicitedRouteUpdate(void)
Send Unsolicited Routing Updates on all interfaces.
Ipv4Address GetDest(void) const
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
void SetRecvCallback(Callback< void, Ptr< Socket > > receivedData)
Notify application when new data is available to be read.
uint16_t GetRouteTag(void) const
Get the route tag.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
a polymophic address class
static TypeId GetTypeId(void)
Get the type ID.
a class to store IPv4 address information on an interface
void SetRouteStatus(Status_e status)
Set the route status.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
virtual uint32_t GetSerializedSize(void) const
Get the serialized size of the packet.
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.
Ipv4Address GetIpv4(void) const
bool IsLocalMulticast(void) const
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,...
@ SPLIT_HORIZON
Split Horizon.
Time m_minTriggeredUpdateDelay
Min cooldown delay after a Triggered Update.
void SetPrefix(Ipv4Address prefix)
Set the prefix.
void DoSendRouteUpdate(bool periodic)
Send Routing Updates on all interfaces.
virtual void NotifyInterfaceDown(uint32_t interface)
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Ptr< Ipv4 > m_ipv4
IPv4 reference.
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
virtual void NotifyInterfaceUp(uint32_t interface)
void HandleResponses(RipHeader hdr, Ipv4Address senderAddress, uint32_t incomingInterface, uint8_t hopLimit)
Handle RIP responses.
Simulation virtual time values and global simulation resolution.
virtual int Close(void)=0
Close a socket.
Ptr< Socket > m_multicastRecvSocket
multicast receive socket
std::list< std::pair< RipRoutingTableEntry *, EventId > >::const_iterator RoutesCI
Const Iterator for container for the network routes.
void SetRouteTag(uint16_t routeTag)
Set the route tag.
bool IsBroadcast(void) const
void InvalidateRoute(RipRoutingTableEntry *route)
Invalidate a route.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
virtual void DoInitialize(void)
Initialize() implementation.
EventId m_nextTriggeredUpdate
Next Triggered Update event.
EventId m_nextUnsolicitedUpdate
Next Unsolicited Update event.
This class implements Linux struct pktinfo in order to deliver ancillary information to the socket in...
uint16_t GetPrefixLength(void) const
Time m_unsolicitedUpdate
time between two Unsolicited Routing Updates
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...
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S) const
Print the Routing Table entries.
Abstract base class for IPv4 routing protocols.
void AddDefaultRouteTo(Ipv4Address nextHop, uint32_t interface)
Add a default route to the router through the nextHop located on interface.
void HandleRequests(RipHeader hdr, Ipv4Address senderAddress, uint16_t senderPort, uint32_t incomingInterface, uint8_t hopLimit)
Handle RIP requests.
Rip v2 Routing Table Entry (RTE) - see RFC 2453.
Status_e m_status
route status
uint8_t GetTtl(void) const
Get the tag's TTL.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
static Ipv4Address GetAny(void)
void SendRouteRequest()
Send Routing Request on all interfaces.
std::set< uint32_t > GetInterfaceExclusions() const
Get the set of interface excluded from the protocol.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
SplitHorizonType_e m_splitHorizonStrategy
Split Horizon strategy.
void SetInterfaceMetric(uint32_t interface, uint8_t metric)
Set the metric for an interface.
Time Seconds(double value)
Construct a Time in the indicated unit.
void SetRouteChanged(bool changed)
Set the route as changed.
This class implements a tag that carries the socket-specific TTL of a packet to the IP layer.
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
void SetRouteMetric(uint32_t routeMetric)
Set the route metric.
std::map< Ptr< Socket >, uint32_t >::iterator SocketListI
Socket list type iterator.
void SetIpRecvTtl(bool ipv4RecvTtl)
Tells a socket to pass information about IP_TTL up the stack.
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
AttributeValue implementation for Time.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
bool IsMatch(Ipv4Address a, Ipv4Address b) const
a class to represent an Ipv4 address mask
Ipv4Address GetLocal(void) const
Get the local address.
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
Hold an unsigned integer type.
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 SetRouteTag(uint16_t routeTag)
Set the route tag.
void AddNetworkRouteTo(Ipv4Address network, Ipv4Mask networkPrefix, Ipv4Address nextHop, uint32_t interface)
Add route to network.
RIP Routing Protocol, defined in RFC 2453.
Time m_garbageCollectionDelay
Delay before deleting an INVALID route.
Ipv4Address CombineMask(Ipv4Mask const &mask) const
Combine this address with a network mask.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
SocketList m_unicastSocketList
list of sockets for unicast messages (socket, interface index)
@ POISON_REVERSE
Poison Reverse Split Horizon.
std::ostream & operator<<(std::ostream &os, const Angles &a)
bool m_changed
route has been updated
Time m_maxTriggeredUpdateDelay
Max cooldown delay after a Triggered Update.
void SetRouteMetric(uint8_t routeMetric)
Set the route metric.
static TypeId LookupByName(std::string name)
Get a TypeId by name.
uint8_t m_metric
route metric
virtual void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address)
std::list< std::pair< RipRoutingTableEntry *, EventId > >::iterator RoutesI
Iterator for container for the network routes.
virtual void DoDispose(void)
Destructor implementation.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Unit
The unit to use to interpret a number representing time.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
void SetInterfaceExclusions(std::set< uint32_t > exceptions)
Set the set of interface excluded from the protocol.
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.