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>>();
111 for (
uint32_t i = 0; i < m_ip->GetNInterfaces(); i++)
113 m_ip->SetForwarding(i,
true);
156 rp->FlushIpRouteCache();
157 rp->m_totalNeighbors = 0;
162 g_ipAddressToNodeMap.clear();
178 m_ipRouteCache.clear();
188 nixVector->SetEpoch(g_epoch);
203 if (source == destNode)
212 std::vector<Ptr<Node>> parentVector;
216 if (BuildNixVector(parentVector, source->GetId(), destNode->GetId(), nixVector))
240 CheckCacheStateAndFlush();
242 auto iter = m_nixCache.find(address);
243 if (iter != m_nixCache.end())
251 foundInCache =
false;
261 CheckCacheStateAndFlush();
263 auto iter = m_ipRouteCache.find(address);
264 if (iter != m_ipRouteCache.end())
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())
320 GetAdjacentNetDevices(localNetDevice, channel, netDeviceContainer);
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)
374 Ptr<IpInterface> remoteDeviceInterface = GetInterfaceByNetDevice(remoteDevice);
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)
387 if constexpr (!IsIpv4)
394 for (
uint32_t k = 0; k < remoteDeviceAddresses; ++k)
397 if constexpr (!IsIpv4)
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");
441 GetAdjacentNetDevices(ndBridged, chBridged, netDeviceContainer);
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)
477 g_netdeviceToIpInterfaceMap[device] = (ip)->GetInterface(interfaceIndex);
479 uint32_t numberOfAddresses = ip->GetNAddresses(interfaceIndex);
480 for (
uint32_t addressIndex = 0; addressIndex < numberOfAddresses;
484 ip->GetAddress(interfaceIndex, addressIndex);
488 g_ipAddressToNodeMap.count(addr),
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");
497 g_ipAddressToNodeMap[addr] = node;
513 if (g_ipAddressToNodeMap.empty())
515 BuildIpAddressToNodeMap();
520 auto iter = g_ipAddressToNodeMap.find(dest);
522 if (iter == g_ipAddressToNodeMap.end())
524 NS_LOG_ERROR(
"Couldn't find dest node given the IP" << dest);
529 destNode = iter->second;
540 if (g_netdeviceToIpInterfaceMap.empty())
542 BuildIpAddressToNodeMap();
547 auto iter = g_netdeviceToIpInterfaceMap.find(netDevice);
549 if (iter == g_netdeviceToIpInterfaceMap.end())
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++)
588 GetAdjacentNetDevices(localNetDevice, channel, netDeviceContainer);
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++)
668 GetAdjacentNetDevices(localNetDevice, channel, netDeviceContainer);
671 if (nodeIndex < (totalNeighbors + netDeviceContainer.
GetN()))
675 Ptr<NetDevice> gatewayDevice = netDeviceContainer.
Get(nodeIndex - totalNeighbors);
678 gatewayIp = ifAddr.GetAddress();
681 totalNeighbors += netDeviceContainer.
GetN();
700 CheckCacheStateAndFlush();
702 IpAddress destAddress = header.GetDestination();
706 if (destAddress.IsLocalhost())
709 rtentry->SetSource(IpAddress::GetLoopback());
710 rtentry->SetDestination(destAddress);
711 rtentry->SetGateway(IpAddress::GetZero());
712 for (
uint32_t i = 0; i < m_ip->GetNInterfaces(); i++)
718 rtentry->SetOutputDevice(loNetDevice);
725 if constexpr (!IsIpv4)
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;
744 nixVectorInCache = GetNixVectorInCache(destAddress, foundInCache);
752 nixVectorInCache = GetNixVector(m_node, destAddress, oif);
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();
771 if (m_totalNeighbors == 0)
773 m_totalNeighbors = FindTotalNeighbors(m_node);
778 uint32_t numberOfBits = nixVectorForPacket->BitCount(m_totalNeighbors);
779 uint32_t nodeIndex = nixVectorForPacket->ExtractNeighborIndex(numberOfBits);
783 rtentry = GetIpRouteInCache(destAddress);
785 if (!rtentry || !(rtentry->GetOutputDevice() == oif))
794 m_ipRouteCache.erase(destAddress);
799 uint32_t index = FindNetDeviceForNixIndex(m_node, nodeIndex, gatewayIp);
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);
869 CheckCacheStateAndFlush();
873 NS_ASSERT(m_ip->GetInterfaceForDevice(idev) >= 0);
874 uint32_t iif = m_ip->GetInterfaceForDevice(idev);
878 IpAddress destAddress = header.GetDestination();
880 if constexpr (IsIpv4)
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)
933 NS_LOG_LOGIC(
"NixVector epoch mismatch (" << nixVector->GetEpoch() <<
" Vs " << g_epoch
934 <<
") - rebuilding it");
935 nixVector = GetNixVector(m_node, destAddress,
nullptr);
936 p->SetNixVector(nixVector);
941 if (m_totalNeighbors == 0)
943 m_totalNeighbors = FindTotalNeighbors(m_node);
945 uint32_t numberOfBits = nixVector->BitCount(m_totalNeighbors);
946 uint32_t nodeIndex = nixVector->ExtractNeighborIndex(numberOfBits);
948 rtentry = GetIpRouteInCache(destAddress);
954 uint32_t index = FindNetDeviceForNixIndex(m_node, nodeIndex, gatewayIp);
955 uint32_t interfaceIndex = (m_ip)->GetInterfaceForDevice(m_node->GetDevice(index));
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));
970 NS_LOG_LOGIC(
"At Node " << m_node->GetId() <<
", Extracting " << numberOfBits
971 <<
" bits from Nix-vector: " << nixVector <<
" : " << *nixVector);
977 if constexpr (IsIpv4)
979 ucb(rtentry, p, header);
983 ucb(idev, rtentry, p, header);
995 CheckCacheStateAndFlush();
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;
1008 if (m_nixCache.size() > 0)
1010 *os << std::setw(30) <<
"Destination";
1011 *os <<
"NixVector" << std::endl;
1012 for (
auto it = m_nixCache.begin(); it != m_nixCache.end(); it++)
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;
1029 if (m_ipRouteCache.size() > 0)
1031 *os << std::setw(30) <<
"Destination";
1032 *os << std::setw(30) <<
"Gateway";
1033 *os << std::setw(30) <<
"Source";
1034 *os <<
"OutputDevice" << std::endl;
1035 for (
auto it = m_ipRouteCache.begin(); it != m_ipRouteCache.end(); it++)
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>
1068 g_isCacheDirty =
true;
1071template <
typename T>
1075 g_isCacheDirty =
true;
1078template <
typename T>
1082 g_isCacheDirty =
true;
1085template <
typename T>
1089 g_isCacheDirty =
true;
1092template <
typename T>
1100 g_isCacheDirty =
true;
1103template <
typename T>
1111 g_isCacheDirty =
true;
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()))
1175 GetAdjacentNetDevices(oif, channel, netDeviceContainer);
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()))
1237 GetAdjacentNetDevices(localNetDevice, channel, netDeviceContainer);
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>
1289 CheckCacheStateAndFlush();
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;
1311 nixVectorInCache = GetNixVectorInCache(dest, foundInCache);
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)
1353 totalNeighbors = FindTotalNeighbors(curr);
1356 uint32_t numberOfBits = nixVector->BitCount(totalNeighbors);
1358 uint32_t nixIndex = nixVector->ExtractNeighborIndex(numberOfBits);
1363 uint32_t netDeviceIndex = FindNetDeviceForNixIndex(curr, nixIndex, gatewayIp);
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();
1391 curr = GetNodeByIp(gatewayIp);
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>
1417 FlushGlobalNixRoutingCache();
1419 g_isCacheDirty =
false;
a virtual net device that bridges multiple LAN segments
bool IsNull() const
Check for null implementation.
static Ipv6Address GetZero()
Get the 0 (::) Ipv6Address.
@ LINKLOCAL
Link-local address (fe80::/64)
Describes an IPv6 prefix.
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.
virtual void NotifyInterfaceDown(uint32_t interface)
typename std::conditional_t< IsIpv4, Ipv4Address, Ipv6Address > IpAddress
Alias for Ipv4Address and Ipv6Address classes.
static IpAddressToNodeMap g_ipAddressToNodeMap
Address to node map.
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.
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.
static NetDeviceToIpInterfaceMap g_netdeviceToIpInterfaceMap
NetDevice pointer to IpInterface pointer map.
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)
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.
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.
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.