24 #include "ns3/abort.h"
25 #include "ns3/assert.h"
26 #include "ns3/random-variable-stream.h"
27 #include "ns3/ipv6-route.h"
29 #include "ns3/names.h"
30 #include "ns3/ripng-header.h"
31 #include "ns3/udp-header.h"
33 #include "ns3/uinteger.h"
34 #include "ns3/ipv6-packet-info-tag.h"
35 #include "ns3/simulator.h"
37 #define RIPNG_ALL_NODE "ff02::9"
38 #define RIPNG_PORT 521
47 : m_ipv6 (0), m_splitHorizonStrategy (
RipNg::POISON_REVERSE), m_initialized (false)
49 m_rng = CreateObject<UniformRandomVariable> ();
61 .SetGroupName (
"Internet")
62 .AddConstructor<
RipNg> ()
63 .AddAttribute (
"UnsolicitedRoutingUpdate",
"The time between two Unsolicited Routing Updates.",
67 .AddAttribute (
"StartupDelay",
"Maximum random delay for protocol startup (send route requests).",
71 .AddAttribute (
"TimeoutDelay",
"The delay to invalidate a route.",
75 .AddAttribute (
"GarbageCollectionDelay",
"The delay to delete an expired route.",
79 .AddAttribute (
"MinTriggeredCooldown",
"Min cooldown delay after a Triggered Update.",
83 .AddAttribute (
"MaxTriggeredCooldown",
"Max cooldown delay after a Triggered Update.",
87 .AddAttribute (
"SplitHorizon",
"Split Horizon strategy.",
93 .AddAttribute (
"LinkDownValue",
"Value for link down in count to infinity.",
96 MakeUintegerChecker<uint8_t> ())
113 bool addedGlobal =
false;
121 for (uint32_t i = 0 ; i <
m_ipv6->GetNInterfaces (); i++)
123 bool activeInterface =
false;
126 activeInterface =
true;
127 m_ipv6->SetForwarding (i,
true);
130 for (uint32_t j = 0; j <
m_ipv6->GetNAddresses (i); j++)
141 int ret = socket->
Bind (local);
199 rtentry =
Lookup (destination,
true, oif);
220 uint32_t iif =
m_ipv6->GetInterfaceForDevice (idev);
225 NS_LOG_LOGIC (
"Multicast route not supported by RIPng");
232 NS_LOG_LOGIC (
"Dropping packet not for me and with src or dst LinkLocal");
241 if (
m_ipv6->IsForwarding (iif) ==
false)
243 NS_LOG_LOGIC (
"Forwarding disabled for this interface");
256 NS_LOG_LOGIC (
"Found unicast destination - calling unicast callback");
257 ucb (idev, rtentry, p, header);
262 NS_LOG_LOGIC (
"Did not find unicast destination - returning false");
271 for (uint32_t j = 0; j <
m_ipv6->GetNAddresses (i); j++)
289 bool sendSocketFound =
false;
292 if (iter->second == i)
294 sendSocketFound =
true;
299 bool activeInterface =
false;
302 activeInterface =
true;
303 m_ipv6->SetForwarding (i,
true);
306 for (uint32_t j = 0; j <
m_ipv6->GetNAddresses (i); j++)
318 socket->
Bind (local);
351 if (it->first->GetInterface () == interface)
359 NS_LOG_INFO (
"Checking socket for interface " << interface);
360 if (iter->second == interface)
362 NS_LOG_INFO (
"Removed socket for interface " << interface);
363 iter->first->Close ();
379 if (!
m_ipv6->IsUp (interface))
404 if (!
m_ipv6->IsUp (interface))
421 if (it->first->GetInterface () == interface
422 && it->first->IsNetwork ()
423 && it->first->GetDestNetwork () == networkAddress
424 && it->first->GetDestNetworkPrefix () == networkMask)
439 NS_LOG_INFO (
this << dst << mask << nextHop << interface << prefixToUse);
457 for (i = 0; i <
m_ipv6->GetNInterfaces (); i++)
475 *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
477 *os <<
"Node: " <<
m_ipv6->GetObject<
Node> ()->GetId ()
478 <<
", Time: " <<
Now().
As (unit)
479 <<
", Local time: " <<
m_ipv6->GetObject<
Node> ()->GetLocalTime ().As (unit)
480 <<
", IPv6 RIPng table" << std::endl;
484 *os <<
"Destination Next Hop Flag Met Ref Use If" << std::endl;
492 std::ostringstream dest, gw, mask, flags;
495 *os << std::setw (31) << dest.str ();
497 *os << std::setw (27) << gw.str ();
507 *os << std::setw (5) << flags.str ();
545 iter->first->Close ();
562 uint16_t longestMask = 0;
567 NS_ASSERT_MSG (interface,
"Try to send on link-local multicast address, and no interface index is given!");
568 rtentry = Create<Ipv6Route> ();
569 rtentry->SetSource (
m_ipv6->SourceAddressSelection (
m_ipv6->GetInterfaceForDevice (interface), dst));
570 rtentry->SetDestination (dst);
572 rtentry->SetOutputDevice (interface);
586 NS_LOG_LOGIC (
"Searching for route to " << dst <<
", mask length " << maskLen);
590 NS_LOG_LOGIC (
"Found global network route " << j <<
", mask length " << maskLen);
595 if (maskLen < longestMask)
601 longestMask = maskLen;
605 rtentry = Create<Ipv6Route> ();
611 rtentry->SetSource (
m_ipv6->SourceAddressSelection (interfaceIdx, route->
GetDest ()));
619 rtentry->SetSource (
m_ipv6->SourceAddressSelection (interfaceIdx, route->
GetDest ()));
623 rtentry->SetDestination (route->
GetDest ());
625 rtentry->SetOutputDevice (
m_ipv6->GetNetDevice (interfaceIdx));
633 NS_LOG_LOGIC (
"Matching route via " << rtentry->GetDestination () <<
" (through " << rtentry->GetGateway () <<
") at the end");
640 NS_LOG_FUNCTION (
this << network << networkPrefix << nextHop << interface << prefixToUse);
644 NS_LOG_WARN (
"Ripng::AddNetworkRouteTo - Next hop should be link-local");
673 if (it->first == route)
678 if (it->second.IsRunning ())
680 it->second.Cancel ();
686 NS_ABORT_MSG (
"Ripng::InvalidateRoute - cannot find the route to update");
695 if (it->first == route)
702 NS_ABORT_MSG (
"Ripng::DeleteRoute - cannot find the route to delete");
713 NS_LOG_INFO (
"Received " << *packet <<
" from " << senderAddr);
716 uint16_t senderPort = senderAddr.
GetPort ();
721 NS_ABORT_MSG (
"No incoming interface on RIPng message, aborting.");
723 uint32_t incomingIf = interfaceInfo.
GetRecvIf ();
724 Ptr<Node> node = this->GetObject<Node> ();
726 uint32_t ipInterfaceIndex =
m_ipv6->GetInterfaceForDevice (dev);
731 NS_ABORT_MSG (
"No incoming Hop Count on RIPng message, aborting.");
735 int32_t interfaceForAddress =
m_ipv6->GetInterfaceForAddress (senderAddress);
736 if (interfaceForAddress != -1)
751 HandleRequests (hdr, senderAddress, senderPort, ipInterfaceIndex, hopLimit);
762 NS_LOG_FUNCTION (
this << senderAddress <<
int (senderPort) << incomingInterface <<
int (hopLimit) << requestHdr);
764 std::list<RipNgRte> rtes = requestHdr.
GetRteList ();
772 if (rtes.size () == 1 && senderAddress.
IsLinkLocal ())
775 rtes.begin ()->GetPrefixLen () == 0 &&
776 rtes.begin ()->GetRouteMetric () ==
m_linkDown)
786 if (iter->second == incomingInterface)
788 sendingSocket = iter->first;
791 NS_ASSERT_MSG (sendingSocket,
"HandleRequest - Impossible to find a socket to send the reply");
793 uint16_t mtu =
m_ipv6->GetMtu (incomingInterface);
807 bool splitHorizoning = (rtIter->first->GetInterface () == incomingInterface);
814 (rtIter->first->GetInterface () != incomingInterface));
816 if ((isGlobal || isDefaultRoute) &&
820 rte.
SetPrefix (rtIter->first->GetDestNetwork ());
821 rte.
SetPrefixLen (rtIter->first->GetDestNetworkPrefix ().GetPrefixLength ());
866 if (iter->second == incomingInterface)
868 sendingSocket = iter->first;
886 for (std::list<RipNgRte>::iterator iter = rtes.begin ();
887 iter != rtes.end (); iter++)
898 Ipv6Address rtAddress = rtIter->first->GetDestNetwork ();
899 rtAddress.
CombinePrefix (rtIter->first->GetDestNetworkPrefix ());
901 if (requestedAddress == rtAddress)
903 iter->SetRouteMetric (rtIter->first->GetRouteMetric ());
904 iter->SetRouteTag (rtIter->first->GetRouteTag ());
914 iter->SetRouteTag (0);
927 NS_LOG_FUNCTION (
this << senderAddress << incomingInterface <<
int (hopLimit) << hdr);
931 NS_LOG_LOGIC (
"Ignoring an update message from an excluded interface: " << incomingInterface);
937 NS_LOG_LOGIC (
"Ignoring an update message from a non-link-local source: " << senderAddress);
943 NS_LOG_LOGIC (
"Ignoring an update message with suspicious hop count: " <<
int (hopLimit));
950 for (std::list<RipNgRte>::iterator iter = rtes.begin ();
951 iter != rtes.end (); iter++)
953 if (iter->GetRouteMetric () == 0 || iter->GetRouteMetric () >
m_linkDown)
955 NS_LOG_LOGIC (
"Ignoring an update message with malformed metric: " <<
int (iter->GetRouteMetric ()));
958 if (iter->GetPrefixLen () > 128)
960 NS_LOG_LOGIC (
"Ignoring an update message with malformed prefix length: " <<
int (iter->GetPrefixLen ()));
963 if (iter->GetPrefix ().IsLocalhost () ||
964 iter->GetPrefix ().IsLinkLocal () ||
965 iter->GetPrefix ().IsMulticast ())
967 NS_LOG_LOGIC (
"Ignoring an update message with wrong prefixes: " << iter->GetPrefix ());
972 bool changed =
false;
974 for (std::list<RipNgRte>::iterator iter = rtes.begin ();
975 iter != rtes.end (); iter++)
982 uint8_t interfaceMetric = 1;
987 uint16_t rteMetric = iter->GetRouteMetric () + interfaceMetric;
996 if (it->first->GetDestNetwork () == rteAddr &&
997 it->first->GetDestNetworkPrefix () == rtePrefix)
1000 if (rteMetric < it->
first->GetRouteMetric ())
1002 if (senderAddress != it->first->GetGateway ())
1010 it->first->SetRouteTag (iter->GetRouteTag ());
1011 it->first->SetRouteChanged (
true);
1012 it->second.Cancel ();
1016 else if (rteMetric == it->first->GetRouteMetric ())
1018 if (senderAddress == it->first->GetGateway ())
1020 it->second.Cancel ();
1034 it->second.Cancel ();
1040 else if (rteMetric > it->first->GetRouteMetric () && senderAddress == it->first->GetGateway ())
1042 it->second.Cancel ();
1045 it->first->SetRouteMetric (rteMetric);
1047 it->first->SetRouteTag (iter->GetRouteTag ());
1048 it->first->SetRouteChanged (
true);
1049 it->second.Cancel ();
1062 NS_LOG_LOGIC (
"Received a RTE with new route, adding.");
1087 uint32_t
interface = iter->
second;
1091 uint16_t mtu =
m_ipv6->GetMtu (interface);
1104 bool splitHorizoning = (rtIter->first->GetInterface () == interface);
1107 NS_LOG_DEBUG (
"Processing RT " << rtDestAddr <<
" " <<
int(rtIter->first->IsRouteChanged ()));
1112 (rtIter->first->GetInterface () != interface));
1114 if ((isGlobal || isDefaultRoute) &&
1115 (periodic || rtIter->first->IsRouteChanged ()))
1118 rte.
SetPrefix (rtIter->first->GetDestNetwork ());
1119 rte.
SetPrefixLen (rtIter->first->GetDestNetworkPrefix ().GetPrefixLength ());
1157 rtIter->first->SetRouteChanged (
false);
1167 NS_LOG_LOGIC (
"Skipping Triggered Update due to cooldown");
1222 std::map<uint32_t, uint8_t>::const_iterator iter =
m_interfaceMetrics.find (interface);
1225 return iter->second;
1263 uint32_t
interface = iter->
second;
1286 : m_tag (0), m_metric (0), m_status (RIPNG_INVALID), m_changed (false)
1292 m_tag (0), m_metric (0), m_status (RIPNG_INVALID), m_changed (false)
1298 m_tag (0), m_metric (0), m_status (RIPNG_INVALID), m_changed (false)
1309 if (
m_tag != routeTag)
1362 os << static_cast<const Ipv6RoutingTableEntry &>(rte);
a polymophic address class
bool IsNull(void) const
Check for null implementation.
Hold variables of type enum.
An identifier for simulation events.
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
static Inet6SocketAddress ConvertFrom(const Address &addr)
Convert the address to a InetSocketAddress.
Ipv6Address GetIpv6(void) const
Get the IPv6 address.
uint16_t GetPort(void) const
Get the port.
Describes an IPv6 address.
bool IsLinkLocal() const
If the IPv6 address is a link-local address (fe80::/64).
static Ipv6Address GetAny()
Get the "any" (::) Ipv6Address.
Ipv6Address CombinePrefix(Ipv6Prefix const &prefix) const
Combine this address with a prefix.
bool IsLinkLocalMulticast() const
If the IPv6 address is link-local multicast (ff02::/16).
static Ipv6Address GetZero()
Get the 0 (::) Ipv6Address.
bool IsMulticast() const
If the IPv6 address is multicast (ff00::/8).
bool IsAny() const
If the IPv6 address is the "Any" address.
IPv6 address associated with an interface.
Ipv6InterfaceAddress::Scope_e GetScope() const
Get address scope.
@ LINKLOCAL
Link-local address (fe80::/64)
@ GLOBAL
Global address (2000::/3)
This class implements a tag that carries socket ancillary data to the socket interface.
uint32_t GetRecvIf(void) const
Get the tag's receiving interface.
Describes an IPv6 prefix.
uint8_t GetPrefixLength() const
Get prefix length.
static Ipv6Prefix GetZero()
Get the zero prefix ( /0).
bool IsMatch(Ipv6Address a, Ipv6Address b) const
If the Address match the type.
Abstract base class for IPv6 routing protocols.
A record of an IPv6 route.
Ipv6Address GetDest() const
Get the destination.
Ipv6Address GetDestNetwork() const
Get the destination network.
Ipv6Address GetPrefixToUse() const
Get the prefix to use (for multihomed link).
bool IsHost() const
Is the route entry correspond to a host ?
uint32_t GetInterface() const
Get the interface index.
Ipv6Prefix GetDestNetworkPrefix() const
Get the destination prefix.
Ipv6Address GetGateway() const
Get the gateway.
bool IsGateway() const
Is it the gateway ?
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,...
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
virtual void DoDispose(void)
Destructor implementation.
virtual void DoInitialize(void)
Initialize() implementation.
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
void AddHeader(const Header &header)
Add header to this packet.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
RIPng Routing Protocol, defined in RFC 2080.
virtual void DoDispose()
Dispose this object.
virtual void NotifyRemoveAddress(uint32_t interface, Ipv6InterfaceAddress address)
Notify when specified interface add an address.
Ptr< Socket > m_multicastRecvSocket
multicast receive socket
void DoSendRouteUpdate(bool periodic)
Send Routing Updates on all interfaces.
Time m_startupDelay
Random delay before protocol startup.
std::list< std::pair< RipNgRoutingTableEntry *, EventId > >::const_iterator RoutesCI
Const Iterator for container for the network routes.
virtual void NotifyInterfaceDown(uint32_t interface)
Notify when specified interface goes DOWN.
SplitHorizonType_e m_splitHorizonStrategy
Split Horizon strategy.
@ SPLIT_HORIZON
Split Horizon.
@ POISON_REVERSE
Poison Reverse Split Horizon.
@ NO_SPLIT_HORIZON
No Split Horizon.
EventId m_nextTriggeredUpdate
Next Triggered Update event.
static TypeId GetTypeId(void)
Get the type ID.
Time m_minTriggeredUpdateDelay
Min cooldown delay after a Triggered Update.
void SetInterfaceExclusions(std::set< uint32_t > exceptions)
Set the set of interface excluded from the protocol.
std::map< Ptr< Socket >, uint32_t >::iterator SocketListI
Socket list type iterator.
virtual void NotifyAddRoute(Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse=Ipv6Address::GetZero())
Notify a new route.
virtual void NotifyInterfaceUp(uint32_t interface)
Notify when specified interface goes UP.
EventId m_nextUnsolicitedUpdate
Next Unsolicited Update event.
uint8_t m_linkDown
Link down value.
Time m_maxTriggeredUpdateDelay
Max cooldown delay after a Triggered Update.
virtual void NotifyRemoveRoute(Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse=Ipv6Address::GetZero())
Notify route removing.
bool m_initialized
flag to allow socket's late-creation.
SocketList m_unicastSocketList
list of sockets for unicast messages (socket, interface index)
uint8_t GetInterfaceMetric(uint32_t interface) const
Get the metric for an interface.
void DoInitialize()
Start protocol operation.
Ptr< Ipv6Route > Lookup(Ipv6Address dest, bool setSource, Ptr< NetDevice >=0)
Lookup in the forwarding table for destination.
Time m_unsolicitedUpdate
time between two Unsolicited Routing Updates
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S) const
Print the Routing Table entries.
std::set< uint32_t > m_interfaceExclusions
Set of excluded interfaces.
void SetInterfaceMetric(uint32_t interface, uint8_t metric)
Set the metric for an interface.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
void DeleteRoute(RipNgRoutingTableEntry *route)
Delete a route.
virtual void NotifyAddAddress(uint32_t interface, Ipv6InterfaceAddress address)
Notify when specified interface add an address.
void AddNetworkRouteTo(Ipv6Address network, Ipv6Prefix networkPrefix, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse)
Add route to network.
Time m_garbageCollectionDelay
Delay before deleting an INVALID route.
std::map< uint32_t, uint8_t > m_interfaceMetrics
Map of interface metrics.
std::list< std::pair< RipNgRoutingTableEntry *, EventId > >::iterator RoutesI
Iterator for container for the network routes.
void SendRouteRequest()
Send Routing Request on all interfaces.
Ptr< Ipv6 > m_ipv6
IPv6 reference.
Ptr< Ipv6Route > RouteOutput(Ptr< Packet > p, const Ipv6Header &header, Ptr< NetDevice > oif, Socket::SocketErrno &sockerr)
Query routing cache for an existing route, for an outbound packet.
virtual void SetIpv6(Ptr< Ipv6 > ipv6)
Typically, invoked directly or indirectly from ns3::Ipv6::SetRoutingProtocol.
Routes m_routes
the forwarding table for network.
std::set< uint32_t > GetInterfaceExclusions() const
Get the set of interface excluded from the protocol.
void SendTriggeredRouteUpdate()
Send Triggered Routing Updates on all interfaces.
bool RouteInput(Ptr< const Packet > p, const Ipv6Header &header, Ptr< const NetDevice > idev, UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb)
Route an input packet (to be forwarded or locally delivered)
void HandleRequests(RipNgHeader hdr, Ipv6Address senderAddress, uint16_t senderPort, uint32_t incomingInterface, uint8_t hopLimit)
Handle RIPng requests.
Ptr< UniformRandomVariable > m_rng
Rng stream.
void HandleResponses(RipNgHeader hdr, Ipv6Address senderAddress, uint32_t incomingInterface, uint8_t hopLimit)
Handle RIPng responses.
void InvalidateRoute(RipNgRoutingTableEntry *route)
Invalidate a route.
void Receive(Ptr< Socket > socket)
Receive RIPng packets.
void AddDefaultRouteTo(Ipv6Address nextHop, uint32_t interface)
Add a default route to the router through the nextHop located on interface.
Time m_timeoutDelay
Delay before invalidating a route.
void SendUnsolicitedRouteUpdate(void)
Send Unsolicited Routing Updates on all interfaces.
RipNg Routing Table Entry.
Status_e GetRouteStatus(void) const
Get the route status.
bool m_changed
route has been updated
uint8_t GetRouteMetric(void) const
Get the route metric.
void SetRouteTag(uint16_t routeTag)
Set the route tag.
uint16_t GetRouteTag(void) const
Get the route tag.
RipNgRoutingTableEntry(void)
void SetRouteMetric(uint8_t routeMetric)
Set the route metric.
uint8_t m_metric
route metric
bool IsRouteChanged(void) const
Get the route changed status.
Status_e m_status
route status
void SetRouteChanged(bool changed)
Set the route as changed.
virtual ~RipNgRoutingTableEntry()
void SetRouteStatus(Status_e status)
Set the route status.
RipNg Routing Table Entry (RTE) - see RFC 2080
void SetPrefix(Ipv6Address prefix)
Set the prefix.
void SetPrefixLen(uint8_t prefixLen)
Set the prefix length.
void SetRouteMetric(uint8_t routeMetric)
Set the route metric.
virtual uint32_t GetSerializedSize(void) const
Get the serialized size of the packet.
void SetRouteTag(uint16_t routeTag)
Set the route tag.
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static Time GetDelayLeft(const EventId &id)
Get the remaining time until this event will execute.
void SetRecvPktInfo(bool flag)
Enable/Disable receive packet information to socket.
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
virtual int Close(void)=0
Close a socket.
void SetRecvCallback(Callback< void, Ptr< Socket > > receivedData)
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...
SocketErrno
Enumeration of the possible errors returned by a socket.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
void SetIpv6RecvHopLimit(bool ipv6RecvHopLimit)
Tells a socket to pass information about IPv6 Hop Limit up the stack.
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 int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
This class implements a tag that carries the socket-specific HOPLIMIT of a packet to the IPv6 layer.
void SetHopLimit(uint8_t hopLimit)
Set the tag's Hop Limit.
uint8_t GetHopLimit(void) const
Get the tag's Hop Limit.
Simulation virtual time values and global simulation resolution.
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.
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
AttributeValue implementation for Time.
a unique identifier for an interface.
static TypeId LookupByName(std::string name)
Get a TypeId by name.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Hold an unsigned integer type.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Time Seconds(double value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeEnumChecker(int v, std::string n, Ts... args)
Make an EnumChecker pre-configured with a set of allowed values by name.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
std::ostream & operator<<(std::ostream &os, const Angles &a)
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...