14#ifndef NIX_VECTOR_ROUTING_H 
   15#define NIX_VECTOR_ROUTING_H 
   17#include "ns3/bridge-net-device.h" 
   18#include "ns3/channel.h" 
   19#include "ns3/ipv4-interface.h" 
   20#include "ns3/ipv4-l3-protocol.h" 
   21#include "ns3/ipv4-route.h" 
   22#include "ns3/ipv4-routing-protocol.h" 
   23#include "ns3/ipv6-interface.h" 
   24#include "ns3/ipv6-l3-protocol.h" 
   25#include "ns3/ipv6-route.h" 
   26#include "ns3/ipv6-routing-protocol.h" 
   27#include "ns3/net-device-container.h" 
   28#include "ns3/nix-vector.h" 
   29#include "ns3/node-container.h" 
   30#include "ns3/node-list.h" 
   31#include "ns3/nstime.h" 
   34#include <unordered_map> 
   58class NixVectorRouting : 
public std::enable_if_t<std::is_same_v<Ipv4RoutingProtocol, T> ||
 
   59                                                     std::is_same_v<Ipv6RoutingProtocol, T>,
 
   63    static constexpr bool IsIpv4 = std::is_same_v<Ipv4RoutingProtocol, T>;
 
   66    using Ip = 
typename std::conditional_t<IsIpv4, Ipv4, Ipv6>;
 
   69    using IpAddress = 
typename std::conditional_t<IsIpv4, Ipv4Address, Ipv6Address>;
 
   72    using IpRoute = 
typename std::conditional_t<IsIpv4, Ipv4Route, Ipv6Route>;
 
   75    using IpAddressHash = 
typename std::conditional_t<IsIpv4, Ipv4AddressHash, Ipv6AddressHash>;
 
   78    using IpHeader = 
typename std::conditional_t<IsIpv4, Ipv4Header, Ipv6Header>;
 
   82        typename std::conditional_t<IsIpv4, Ipv4InterfaceAddress, Ipv6InterfaceAddress>;
 
   85    using IpInterface = 
typename std::conditional_t<IsIpv4, Ipv4Interface, Ipv6Interface>;
 
   88    using IpL3Protocol = 
typename std::conditional_t<IsIpv4, Ipv4L3Protocol, Ipv6L3Protocol>;
 
  276    typedef std::map<IpAddress, Ptr<NixVector>> 
NixMap_t;
 
  289    typedef typename std::conditional_t<IsIpv4, UnicastForwardCallbackv4, UnicastForwardCallbackv6>
 
  306        typename std::conditional_t<IsIpv4, MulticastForwardCallbackv4, MulticastForwardCallbackv6>
 
  443                                IpAddress prefixToUse = IpAddress::GetZero());
 
  460                                   IpAddress prefixToUse = IpAddress::GetZero());
 
 
Describes an IPv6 prefix.
 
holds a vector of ns3::NetDevice pointers
 
Nix-vector routing protocol.
 
Callback< void, Ptr< IpRoute >, Ptr< const Packet >, const IpHeader & > UnicastForwardCallbackv4
Callback for IPv4 unicast packets to be forwarded.
 
std::map< IpAddress, Ptr< IpRoute > > IpRouteMap_t
Map of IpAddress to IpRoute.
 
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.
 
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.
 
typename std::conditional_t< IsIpv4, Ipv4AddressHash, Ipv6AddressHash > IpAddressHash
Alias for Ipv4AddressHash and Ipv6AddressHash classes.
 
std::map< IpAddress, Ptr< NixVector > > NixMap_t
Map of IpAddress to NixVector.
 
typename std::conditional_t< IsIpv4, Ipv4Route, Ipv6Route > IpRoute
Alias for Ipv4Route and Ipv6Route classes.
 
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...
 
Callback< void, Ptr< Ipv4MulticastRoute >, Ptr< const Packet >, const IpHeader & > MulticastForwardCallbackv4
Callback for IPv4 multicast packets to be forwarded.
 
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
 
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, Ipv4Interface, Ipv6Interface > IpInterface
Alias for Ipv4Interface and Ipv6Interface classes.
 
typename std::conditional_t< IsIpv4, Ipv4, Ipv6 > Ip
Alias for Ipv4 and Ipv6 classes.
 
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.
 
Callback< void, Ptr< const NetDevice >, Ptr< Ipv6MulticastRoute >, Ptr< const Packet >, const IpHeader & > MulticastForwardCallbackv6
Callback for IPv6 multicast packets to be forwarded.
 
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.
 
void ResetTotalNeighbors()
Upon a run-time topology change caches are flushed and the total number of neighbors is reset to zero...
 
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
 
static IpAddressToNodeMap g_ipAddressToNodeMap
 
void CheckCacheStateAndFlush() const
Flushes routing caches if required.
 
Callback< void, Ptr< const NetDevice >, Ptr< IpRoute >, Ptr< const Packet >, const IpHeader & > UnicastForwardCallbackv6
Callback for IPv6 unicast packets to be forwarded.
 
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
 
static NetDeviceToIpInterfaceMap g_netdeviceToIpInterfaceMap
 
IpRouteMap_t m_ipRouteCache
 
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.
 
Smart pointer class similar to boost::intrusive_ptr.
 
SocketErrno
Enumeration of the possible errors returned by a socket.
 
Unit
The unit to use to interpret a number representing time.
 
a unique identifier for an interface.
 
NixVectorRouting< Ipv6RoutingProtocol > Ipv6NixVectorRouting
Create the typedef Ipv6NixVectorRouting with T as Ipv6RoutingProtocol.
 
NixVectorRouting< Ipv4RoutingProtocol > Ipv4NixVectorRouting
Create the typedef Ipv4NixVectorRouting with T as Ipv4RoutingProtocol.
 
Every class exported by the ns3 library is enclosed in the ns3 namespace.