17#include "ns3/ipv4-list-routing.h" 
   19#include "ns3/loopback-net-device.h" 
   55    if constexpr (std::is_same_v<T, Ipv4RoutingProtocol>)
 
   63    static TypeId tid = 
TypeId(
"ns3::" + name + 
"NixVectorRouting")
 
   65                            .SetGroupName(
"NixVectorRouting")
 
   66                            .template AddConstructor<NixVectorRouting<T>>();
 
 
  113        m_ip->SetForwarding(i, 
true);
 
 
  156        rp->FlushIpRouteCache();
 
  157        rp->m_totalNeighbors = 0;
 
 
  203    if (source == destNode)
 
  212        std::vector<Ptr<Node>> parentVector;
 
  216            if (
BuildNixVector(parentVector, source->GetId(), destNode->GetId(), nixVector))
 
 
  251    foundInCache = 
false;
 
 
  288    if (!parentVector.at(dest))
 
  293    Ptr<Node> parentNode = parentVector.at(dest);
 
  295    uint32_t numberOfDevices = parentNode->GetNDevices();
 
  301    for (
uint32_t i = 0; i < numberOfDevices; i++)
 
  307        if (localNetDevice->IsBridge())
 
  328        for (
auto iter = netDeviceContainer.
Begin(); iter != netDeviceContainer.
End(); iter++)
 
  330            Ptr<Node> remoteNode = (*iter)->GetNode();
 
  332            if (remoteNode->GetId() == dest)
 
  334                destId = totalNeighbors + offset;
 
  339        totalNeighbors += netDeviceContainer.
GetN();
 
  341    NS_LOG_LOGIC(
"Adding Nix: " << destId << 
" with " << nixVector->BitCount(totalNeighbors)
 
  342                                << 
" bits, for node " << parentNode->GetId());
 
  343    nixVector->AddNeighborIndex(destId, nixVector->BitCount(totalNeighbors));
 
  347    BuildNixVector(parentVector, source, (parentVector.at(dest))->GetId(), nixVector);
 
 
  360    if (!netDeviceInterface || !netDeviceInterface->IsUp())
 
  362        NS_LOG_LOGIC(
"IpInterface either doesn't exist or is down");
 
  366    uint32_t netDeviceAddresses = netDeviceInterface->GetNAddresses();
 
  368    for (std::size_t i = 0; i < channel->GetNDevices(); i++)
 
  371        if (remoteDevice != netDevice)
 
  375            if (!remoteDeviceInterface || !remoteDeviceInterface->IsUp())
 
  377                NS_LOG_LOGIC(
"IpInterface either doesn't exist or is down");
 
  381            uint32_t remoteDeviceAddresses = remoteDeviceInterface->GetNAddresses();
 
  382            bool commonSubnetFound = 
false;
 
  384            for (
uint32_t j = 0; j < netDeviceAddresses; ++j)
 
  394                for (
uint32_t k = 0; k < remoteDeviceAddresses; ++k)
 
  404                    if (netDeviceIfAddr.IsInSameSubnet(remoteDeviceIfAddr.GetAddress()))
 
  406                        commonSubnetFound = 
true;
 
  411                if (commonSubnetFound)
 
  417            if (!commonSubnetFound)
 
  427                NS_LOG_LOGIC(
"Looking through bridge ports of bridge net device " << bd);
 
  428                for (
uint32_t j = 0; j < bd->GetNBridgePorts(); ++j)
 
  431                    if (ndBridged == remoteDevice)
 
  433                        NS_LOG_LOGIC(
"That bridge port is me, don't walk backward");
 
  446                netDeviceContainer.
Add(channel->GetDevice(i));
 
 
  465            uint32_t numberOfDevices = node->GetNDevices();
 
  467            for (
uint32_t deviceId = 0; deviceId < numberOfDevices; deviceId++)
 
  474                    int32_t interfaceIndex = (ip)->GetInterfaceForDevice(node->GetDevice(deviceId));
 
  475                    if (interfaceIndex != -1)
 
  479                        uint32_t numberOfAddresses = ip->GetNAddresses(interfaceIndex);
 
  480                        for (
uint32_t addressIndex = 0; addressIndex < numberOfAddresses;
 
  484                                ip->GetAddress(interfaceIndex, addressIndex);
 
  489                                "Duplicate IP address (" 
  491                                    << 
") found during NIX Vector map construction for node " 
  495                                         << addr << 
" for node " << node->GetId()
 
  496                                         << 
" to NIX Vector IP address to node map");
 
 
  524        NS_LOG_ERROR(
"Couldn't find dest node given the IP" << dest);
 
  529        destNode = iter->second;
 
 
  551        NS_LOG_ERROR(
"Couldn't find IpInterface node given the NetDevice" << netDevice);
 
  552        ipInterface = 
nullptr;
 
  556        ipInterface = iter->second;
 
 
  568    uint32_t numberOfDevices = node->GetNDevices();
 
  573    for (
uint32_t i = 0; i < numberOfDevices; i++)
 
  590        totalNeighbors += netDeviceContainer.
GetN();
 
  593    return totalNeighbors;
 
 
  603    uint32_t nDevices = node->GetNDevices();
 
  611    for (
uint32_t i = 0; i < nDevices; ++i)
 
  616        if (ndTest->IsBridge())
 
  618            NS_LOG_LOGIC(
"device " << i << 
" is a bridge net device");
 
  622                "NixVectorRouting::NetDeviceIsBridged (): GetObject for <BridgeNetDevice> failed");
 
  624            for (
uint32_t j = 0; j < bnd->GetNBridgePorts(); ++j)
 
  626                NS_LOG_LOGIC(
"Examine bridge port " << j << 
" " << bnd->GetBridgePort(j));
 
  627                if (bnd->GetBridgePort(j) == nd)
 
  629                    NS_LOG_LOGIC(
"Net device " << nd << 
" is bridged by " << bnd);
 
 
  647    uint32_t numberOfDevices = node->GetNDevices();
 
  653    for (
uint32_t i = 0; i < numberOfDevices; i++)
 
  671        if (nodeIndex < (totalNeighbors + netDeviceContainer.
GetN()))
 
  675            Ptr<NetDevice> gatewayDevice = netDeviceContainer.
Get(nodeIndex - totalNeighbors);
 
  678            gatewayIp = ifAddr.GetAddress();
 
  681        totalNeighbors += netDeviceContainer.
GetN();
 
 
  702    IpAddress destAddress = header.GetDestination();
 
  706    if (destAddress.IsLocalhost())
 
  709        rtentry->SetSource(IpAddress::GetLoopback());
 
  710        rtentry->SetDestination(destAddress);
 
  711        rtentry->SetGateway(IpAddress::GetZero());
 
  718                rtentry->SetOutputDevice(loNetDevice);
 
  728        if (destAddress.IsLinkLocalMulticast())
 
  732                "Try to send on link-local multicast address, and no interface index is given!");
 
  735                m_ip->SourceAddressSelection(
m_ip->GetInterfaceForDevice(oif), destAddress));
 
  736            rtentry->SetDestination(destAddress);
 
  738            rtentry->SetOutputDevice(oif);
 
  743    bool foundInCache = 
false;
 
  753        if (nixVectorInCache)
 
  756            m_nixCache.insert(
typename NixMap_t::value_type(destAddress, nixVectorInCache));
 
  761    if (nixVectorInCache)
 
  763        NS_LOG_LOGIC(
"Nix-vector contents: " << *nixVectorInCache);
 
  767        nixVectorForPacket = nixVectorInCache->Copy();
 
  779        uint32_t nodeIndex = nixVectorForPacket->ExtractNeighborIndex(numberOfBits);
 
  785        if (!rtentry || !(rtentry->GetOutputDevice() == oif))
 
  804                interfaceIndex = (
m_ip)->GetInterfaceForDevice(
m_node->GetDevice(index));
 
  808                interfaceIndex = (
m_ip)->GetInterfaceForDevice(oif);
 
  811            NS_ASSERT_MSG(interfaceIndex != -1, 
"Interface index not found for device");
 
  813            IpAddress sourceIPAddr = 
m_ip->SourceAddressSelection(interfaceIndex, destAddress);
 
  817            rtentry->SetSource(sourceIPAddr);
 
  819            rtentry->SetGateway(gatewayIp);
 
  820            rtentry->SetDestination(destAddress);
 
  824                rtentry->SetOutputDevice(
m_ip->GetNetDevice(interfaceIndex));
 
  828                rtentry->SetOutputDevice(oif);
 
  834            m_ipRouteCache.insert(
typename IpRouteMap_t::value_type(destAddress, rtentry));
 
  837        NS_LOG_LOGIC(
"Nix-vector contents: " << *nixVectorInCache << 
" : Remaining bits: " 
  838                                             << nixVectorForPacket->GetRemainingBits());
 
  844            NS_LOG_LOGIC(
"Adding Nix-vector to packet: " << *nixVectorForPacket);
 
  845            p->SetNixVector(nixVectorForPacket);
 
 
  867    NS_LOG_FUNCTION(
this << p << header << header.GetSource() << header.GetDestination() << idev);
 
  878    IpAddress destAddress = header.GetDestination();
 
  883        if (
m_ip->IsDestinationAddress(destAddress, iif))
 
  888                p->SetNixVector(
nullptr);
 
  905        if (destAddress.IsMulticast())
 
  907            NS_LOG_LOGIC(
"Multicast route not supported by Nix-Vector routing " << destAddress);
 
  912        if (
m_ip->IsForwarding(iif) == 
false)
 
  931    if (nixVector->GetEpoch() != 
g_epoch)
 
  934                                                  << 
") - rebuilding it");
 
  936        p->SetNixVector(nixVector);
 
  946    uint32_t nodeIndex = nixVector->ExtractNeighborIndex(numberOfBits);
 
  960        rtentry->SetSource(ifAddr.GetAddress());
 
  962        rtentry->SetGateway(gatewayIp);
 
  963        rtentry->SetDestination(destAddress);
 
  964        rtentry->SetOutputDevice(
m_ip->GetNetDevice(interfaceIndex));
 
  967        m_ipRouteCache.insert(
typename IpRouteMap_t::value_type(destAddress, rtentry));
 
  971                            << 
" bits from Nix-vector: " << nixVector << 
" : " << *nixVector);
 
  979        ucb(rtentry, p, header);
 
  983        ucb(idev, rtentry, p, header);
 
 
  997    std::ostream* os = stream->GetStream();
 
  999    std::ios oldState(
nullptr);
 
 1000    oldState.copyfmt(*os);
 
 1002    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
 
 1004    *os << 
"Node: " << 
m_node->GetId() << 
", Time: " << 
Now().
As(unit)
 
 1005        << 
", Local time: " << 
m_node->GetLocalTime().As(unit) << 
", Nix Routing" << std::endl;
 
 1007    *os << 
"NixCache:" << std::endl;
 
 1010        *os << std::setw(30) << 
"Destination";
 
 1011        *os << 
"NixVector" << std::endl;
 
 1014            std::ostringstream dest;
 
 1016            *os << std::setw(30) << dest.str();
 
 1019                *os << *(it->second) << std::endl;
 
 1023                *os << 
"-" << std::endl;
 
 1028    *os << 
"IpRouteCache:" << std::endl;
 
 1031        *os << std::setw(30) << 
"Destination";
 
 1032        *os << std::setw(30) << 
"Gateway";
 
 1033        *os << std::setw(30) << 
"Source";
 
 1034        *os << 
"OutputDevice" << std::endl;
 
 1037            std::ostringstream dest;
 
 1038            std::ostringstream gw;
 
 1039            std::ostringstream src;
 
 1040            dest << it->second->GetDestination();
 
 1041            *os << std::setw(30) << dest.str();
 
 1042            gw << it->second->GetGateway();
 
 1043            *os << std::setw(30) << gw.str();
 
 1044            src << it->second->GetSource();
 
 1045            *os << std::setw(30) << src.str();
 
 1053                *os << it->second->GetOutputDevice()->GetIfIndex();
 
 1060    (*os).copyfmt(oldState);
 
 
 1064template <
typename T>
 
 1071template <
typename T>
 
 1078template <
typename T>
 
 1085template <
typename T>
 
 1092template <
typename T>
 
 1103template <
typename T>
 
 1114template <
typename T>
 
 1122    NS_LOG_FUNCTION(
this << numberOfNodes << source << dest << parentVector << oif);
 
 1124    NS_LOG_LOGIC(
"Going from Node " << source->GetId() << 
" to Node " << dest->GetId());
 
 1125    std::queue<Ptr<Node>> greyNodeList; 
 
 1128    parentVector.assign(numberOfNodes, 
nullptr); 
 
 1131    greyNodeList.push(source);
 
 1132    parentVector.at(source->GetId()) = source;
 
 1135    while (!greyNodeList.empty())
 
 1137        Ptr<Node> currNode = greyNodeList.front();
 
 1140        if (currNode == dest)
 
 1149        if (currNode == source && oif)
 
 1154                uint32_t interfaceIndex = (ip)->GetInterfaceForDevice(oif);
 
 1155                if (!(ip->IsUp(interfaceIndex)))
 
 1161            if (!(oif->IsLinkUp()))
 
 1181            for (
auto iter = netDeviceContainer.
Begin(); iter != netDeviceContainer.
End(); iter++)
 
 1183                Ptr<Node> remoteNode = (*iter)->GetNode();
 
 1185                if (!remoteIpInterface || !(remoteIpInterface->IsUp()))
 
 1187                    NS_LOG_LOGIC(
"IpInterface either doesn't exist or is down");
 
 1195                if (!parentVector.at(remoteNode->GetId()))
 
 1197                    parentVector.at(remoteNode->GetId()) = currNode;
 
 1198                    greyNodeList.push(remoteNode);
 
 1206            for (
uint32_t i = 0; i < (currNode->GetNDevices()); i++)
 
 1216                    uint32_t interfaceIndex = (ip)->GetInterfaceForDevice(currNode->GetDevice(i));
 
 1217                    if (!(ip->IsUp(interfaceIndex)))
 
 1223                if (!(localNetDevice->IsLinkUp()))
 
 1243                for (
auto iter = netDeviceContainer.
Begin(); iter != netDeviceContainer.
End();
 
 1246                    Ptr<Node> remoteNode = (*iter)->GetNode();
 
 1248                    if (!remoteIpInterface || !(remoteIpInterface->IsUp()))
 
 1250                        NS_LOG_LOGIC(
"IpInterface either doesn't exist or is down");
 
 1258                    if (!parentVector.at(remoteNode->GetId()))
 
 1260                        parentVector.at(remoteNode->GetId()) = currNode;
 
 1261                        greyNodeList.push(remoteNode);
 
 
 1276template <
typename T>
 
 1298    std::ostream* os = stream->GetStream();
 
 1300    std::ios oldState(
nullptr);
 
 1301    oldState.copyfmt(*os);
 
 1303    *os << std::resetiosflags(std::ios::adjustfield) << std::setiosflags(std::ios::left);
 
 1304    *os << 
"Time: " << 
Now().
As(unit) << 
", Nix Routing" << std::endl;
 
 1305    *os << 
"Route path from ";
 
 1306    *os << 
"Node " << source->GetId() << 
" to Node " << destNode->GetId() << 
", ";
 
 1307    *os << 
"Nix Vector: ";
 
 1310    bool foundInCache = 
true;
 
 1319        nixVectorInCache = 
GetNixVector(source, dest, 
nullptr);
 
 1322    if (nixVectorInCache || (!nixVectorInCache && source == destNode))
 
 1327        if (nixVectorInCache)
 
 1332            nixVector = nixVectorInCache->Copy();
 
 1338        if (source == destNode)
 
 1340            std::ostringstream addr;
 
 1341            std::ostringstream node;
 
 1343            node << 
"(Node " << destNode->GetId() << 
")";
 
 1344            *os << std::setw(25) << addr.str();
 
 1345            *os << std::setw(10) << node.str();
 
 1347            *os << std::setw(25) << addr.str();
 
 1348            *os << node.str() << std::endl;
 
 1351        while (curr != destNode)
 
 1356            uint32_t numberOfBits = nixVector->BitCount(totalNeighbors);
 
 1358            uint32_t nixIndex = nixVector->ExtractNeighborIndex(numberOfBits);
 
 1369            uint32_t interfaceIndex = ip->GetInterfaceForDevice(outDevice);
 
 1373                sourceIPAddr = ip->SourceAddressSelection(interfaceIndex, dest);
 
 1379                sourceIPAddr = ip->GetAddress(interfaceIndex, 0).GetAddress();
 
 1382            std::ostringstream currAddr;
 
 1383            std::ostringstream currNode;
 
 1384            std::ostringstream nextAddr;
 
 1385            std::ostringstream nextNode;
 
 1386            currAddr << sourceIPAddr;
 
 1387            currNode << 
"(Node " << curr->GetId() << 
")";
 
 1388            *os << std::setw(25) << currAddr.str();
 
 1389            *os << std::setw(10) << currNode.str();
 
 1392            nextAddr << ((curr == destNode) ? dest : gatewayIp);
 
 1393            nextNode << 
"(Node " << curr->GetId() << 
")";
 
 1395            *os << std::setw(25) << nextAddr.str();
 
 1396            *os << nextNode.str() << std::endl;
 
 1402        *os << 
")" << std::endl;
 
 1404        *os << 
"There does not exist a path from Node " << source->GetId() << 
" to Node " 
 1405            << destNode->GetId() << 
"." << std::endl;
 
 1408    (*os).copyfmt(oldState);
 
 
 1411template <
typename T>
 
a virtual net device that bridges multiple LAN segments
 
bool IsNull() const
Check for null implementation.
 
Abstract base class for IPv4 routing protocols.
 
static Ipv6Address GetZero()
Get the 0 (::) Ipv6Address.
 
@ LINKLOCAL
Link-local address (fe80::/64).
 
Describes an IPv6 prefix.
 
Abstract base class for IPv6 routing protocols.
 
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,...
 
holds a vector of ns3::NetDevice pointers
 
uint32_t GetN() const
Get the number of Ptr<NetDevice> stored in this container.
 
Iterator Begin() const
Get an iterator which refers to the first NetDevice in the container.
 
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
 
Iterator End() const
Get an iterator which indicates past-the-last NetDevice in the container.
 
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
 
Nix-vector routing protocol.
 
void PrintRoutingPath(Ptr< Node > source, IpAddress dest, Ptr< OutputStreamWrapper > stream, Time::Unit unit) const
Print the Routing Path according to Nix Routing.
 
void BuildIpAddressToNodeMap() const
Build map from IP Address to Node for faster lookup.
 
typename std::conditional_t< IsIpv4, Ipv4InterfaceAddress, Ipv6InterfaceAddress > IpInterfaceAddress
Alias for Ipv4InterfaceAddress and Ipv6InterfaceAddress classes.
 
Ptr< IpRoute > GetIpRouteInCache(IpAddress address)
Checks the cache based on dest IP for the IpRoute.
 
virtual void NotifyRemoveRoute(IpAddress dst, Ipv6Prefix mask, IpAddress nextHop, uint32_t interface, IpAddress prefixToUse=IpAddress::GetZero())
Notify route removing.
 
virtual void NotifyAddRoute(IpAddress dst, Ipv6Prefix mask, IpAddress nextHop, uint32_t interface, IpAddress prefixToUse=IpAddress::GetZero())
Notify a new route.
 
bool BFS(uint32_t numberOfNodes, Ptr< Node > source, Ptr< Node > dest, std::vector< Ptr< Node > > &parentVector, Ptr< NetDevice > oif) const
Breadth first search algorithm.
 
static uint32_t g_epoch
Nix Epoch, incremented each time a flush is performed.
 
virtual void NotifyInterfaceUp(uint32_t interface)
 
void GetAdjacentNetDevices(Ptr< NetDevice > netDevice, Ptr< Channel > channel, NetDeviceContainer &netDeviceContainer) const
Given a net-device returns all the adjacent net-devices, essentially getting the neighbors on that ch...
 
std::conditional_t< IsIpv4, UnicastForwardCallbackv4, UnicastForwardCallbackv6 > UnicastForwardCallback
Callback for unicast packets to be forwarded.
 
NixMap_t m_nixCache
Cache stores nix-vectors based on destination ip.
 
virtual void NotifyInterfaceDown(uint32_t interface)
 
typename std::conditional_t< IsIpv4, Ipv4Address, Ipv6Address > IpAddress
Alias for Ipv4Address and Ipv6Address classes.
 
void FlushGlobalNixRoutingCache() const
Called when run-time link topology change occurs which iterates through the node list and flushes any...
 
virtual void SetIpv6(Ptr< Ip > ipv6)
Typically, invoked directly or indirectly from ns3::Ipv6::SetRoutingProtocol.
 
Callback< void, Ptr< const Packet >, const IpHeader &, Socket::SocketErrno > ErrorCallback
Callback for routing errors (e.g., no route found).
 
uint32_t m_totalNeighbors
Total neighbors used for nix-vector to determine number of bits.
 
virtual Ptr< IpRoute > RouteOutput(Ptr< Packet > p, const IpHeader &header, Ptr< NetDevice > oif, Socket::SocketErrno &sockerr)
Query routing cache for an existing route, for an outbound packet.
 
virtual void SetIpv4(Ptr< Ip > ipv4)
Typically, invoked directly or indirectly from ns3::Ipv4::SetRoutingProtocol.
 
Ptr< IpInterface > GetInterfaceByNetDevice(Ptr< NetDevice > netDevice) const
Iterates through the node list and finds the one corresponding to the given IpAddress.
 
uint32_t FindTotalNeighbors(Ptr< Node > node) const
Simply iterates through the nodes net-devices and determines how many neighbors the node has.
 
virtual void NotifyAddAddress(uint32_t interface, IpInterfaceAddress address)
 
std::conditional_t< IsIpv4, MulticastForwardCallbackv4, MulticastForwardCallbackv6 > MulticastForwardCallback
Callback for multicast packets to be forwarded.
 
void FlushIpRouteCache() const
Flushes the cache which stores the Ip route based on the destination IP.
 
virtual bool RouteInput(Ptr< const Packet > p, const IpHeader &header, Ptr< const NetDevice > idev, const UnicastForwardCallback &ucb, const MulticastForwardCallback &mcb, const LocalDeliverCallback &lcb, const ErrorCallback &ecb)
Route an input packet (to be forwarded or locally delivered).
 
Ptr< NixVector > GetNixVector(Ptr< Node > source, IpAddress dest, Ptr< NetDevice > oif) const
Takes in the source node and dest IP and calls GetNodeByIp, BFS, accounting for any output interface ...
 
typename std::conditional_t< IsIpv4, Ipv4Header, Ipv6Header > IpHeader
Alias for Ipv4Header and Ipv6Header classes.
 
bool BuildNixVector(const std::vector< Ptr< Node > > &parentVector, uint32_t source, uint32_t dest, Ptr< NixVector > nixVector) const
Recurses the T vector, created by BFS and actually builds the nixvector.
 
Ptr< NixVector > GetNixVectorInCache(const IpAddress &address, bool &foundInCache) const
Checks the cache based on dest IP for the nix-vector.
 
uint32_t FindNetDeviceForNixIndex(Ptr< Node > node, uint32_t nodeIndex, IpAddress &gatewayIp) const
Nix index is with respect to the neighbors.
 
void SetNode(Ptr< Node > node)
Set the Node pointer of the node for which this routing protocol is to be placed.
 
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S) const
Print the Routing Table entries.
 
typename std::conditional_t< IsIpv4, Ipv4L3Protocol, Ipv6L3Protocol > IpL3Protocol
Alias for Ipv4L3Protocol and Ipv4L3Protocol classes.
 
virtual void NotifyRemoveAddress(uint32_t interface, IpInterfaceAddress address)
 
Callback< void, Ptr< const Packet >, const IpHeader &, uint32_t > LocalDeliverCallback
Callback for packets to be locally delivered.
 
static TypeId GetTypeId()
The Interface ID of the Global Router interface.
 
static bool g_isCacheDirty
Flag to mark when caches are dirty and need to be flushed.
 
Ptr< Node > m_node
Node object.
 
static IpAddressToNodeMap g_ipAddressToNodeMap
Address to node map.
 
void CheckCacheStateAndFlush() const
Flushes routing caches if required.
 
std::unordered_map< IpAddress, ns3::Ptr< ns3::Node >, IpAddressHash > IpAddressToNodeMap
Mapping of IP address to ns-3 node.
 
std::unordered_map< Ptr< NetDevice >, Ptr< IpInterface > > NetDeviceToIpInterfaceMap
Mapping of Ptr<NetDevice> to Ptr<IpInterface>.
 
Ptr< BridgeNetDevice > NetDeviceIsBridged(Ptr< NetDevice > nd) const
Determine if the NetDevice is bridged.
 
static constexpr bool IsIpv4
Alias for determining whether the parent is Ipv4RoutingProtocol or Ipv6RoutingProtocol.
 
static NetDeviceToIpInterfaceMap g_netdeviceToIpInterfaceMap
NetDevice pointer to IpInterface pointer map.
 
IpRouteMap_t m_ipRouteCache
Cache stores IpRoutes based on destination ip.
 
void FlushNixCache() const
Flushes the cache which stores nix-vector based on destination IP.
 
Ptr< Node > GetNodeByIp(IpAddress dest) const
Iterates through the node list and finds the one corresponding to the given IpAddress.
 
static uint32_t GetNNodes()
 
Smart pointer class similar to boost::intrusive_ptr.
 
SocketErrno
Enumeration of the possible errors returned by a socket.
 
TimeWithUnit As(const Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
 
Unit
The unit to use to interpret a number representing time.
 
a unique identifier for an interface.
 
TypeId SetParent(TypeId tid)
Set the parent TypeId.
 
#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...
 
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if a condition is false, with a message.
 
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
 
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
 
#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_NOARGS()
Output the name of the function.
 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
 
#define NS_OBJECT_TEMPLATE_CLASS_DEFINE(type, param)
Explicitly instantiate a template class with one template parameter and register the resulting instan...
 
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
 
Time Now()
create an ns3::Time instance which contains the current simulation time.
 
Every class exported by the ns3 library is enclosed in the ns3 namespace.
 
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.