21 #include "ns3/names.h"
23 #include "ns3/simulator.h"
24 #include "ns3/object.h"
25 #include "ns3/packet.h"
26 #include "ns3/net-device.h"
27 #include "ns3/ipv4-route.h"
28 #include "ns3/ipv4-routing-table-entry.h"
29 #include "ns3/boolean.h"
44 .AddAttribute (
"RandomEcmpRouting",
45 "Set to true if packets are randomly routed among ECMP; set to false for using only one route consistently",
48 MakeBooleanChecker ())
49 .AddAttribute (
"RespondToInterfaceEvents",
50 "Set to true if you want to dynamically recompute the global routes upon Interface notification events (up/down, or add/remove address)",
53 MakeBooleanChecker ())
59 : m_randomEcmpRouting (false),
60 m_respondToInterfaceEvents (false)
64 m_rand = CreateObject<UniformRandomVariable> ();
99 NS_LOG_FUNCTION (
this << network << networkMask << nextHop << interface);
127 NS_LOG_FUNCTION (
this << network << networkMask << nextHop << interface);
141 NS_LOG_LOGIC (
"Looking for route for destination " << dest);
144 typedef std::vector<Ipv4RoutingTableEntry*> RouteVec_t;
145 RouteVec_t allRoutes;
153 if ((*i)->GetDest ().IsEqual (dest))
157 if (oif !=
m_ipv4->GetNetDevice ((*i)->GetInterface ()))
163 allRoutes.push_back (*i);
164 NS_LOG_LOGIC (allRoutes.size () <<
"Found global host route" << *i);
167 if (allRoutes.size () == 0)
174 Ipv4Mask mask = (*j)->GetDestNetworkMask ();
176 if (mask.
IsMatch (dest, entry))
180 if (oif !=
m_ipv4->GetNetDevice ((*j)->GetInterface ()))
186 allRoutes.push_back (*j);
187 NS_LOG_LOGIC (allRoutes.size () <<
"Found global network route" << *j);
191 if (allRoutes.size () == 0)
197 Ipv4Mask mask = (*k)->GetDestNetworkMask ();
199 if (mask.
IsMatch (dest, entry))
204 if (oif !=
m_ipv4->GetNetDevice ((*k)->GetInterface ()))
210 allRoutes.push_back (*k);
215 if (allRoutes.size () > 0 )
220 uint32_t selectIndex;
231 rtentry = Create<Ipv4Route> ();
405 *os <<
"Destination Gateway Genmask Flags Metric Ref Use Iface" << std::endl;
408 std::ostringstream dest, gw, mask, flags;
411 *os << std::setiosflags (std::ios::left) << std::setw (16) << dest.str ();
413 *os << std::setiosflags (std::ios::left) << std::setw (16) << gw.str ();
415 *os << std::setiosflags (std::ios::left) << std::setw (16) << mask.str ();
425 *os << std::setiosflags (std::ios::left) << std::setw (6) << flags.str ();
455 NS_LOG_LOGIC (
"Multicast destination-- returning false");
481 uint32_t iif =
m_ipv4->GetInterfaceForDevice (idev);
485 NS_LOG_LOGIC (
"Multicast destination-- returning false");
502 for (uint32_t j = 0; j <
m_ipv4->GetNInterfaces (); j++)
504 for (uint32_t i = 0; i <
m_ipv4->GetNAddresses (j); i++)
512 NS_LOG_LOGIC (
"For me (destination " << addr <<
" match)");
518 lcb (p, header, iif);
524 lcb (p, header, iif);
531 if (
m_ipv4->IsForwarding (iif) ==
false)
533 NS_LOG_LOGIC (
"Forwarding disabled for this interface");
538 NS_LOG_LOGIC (
"Unicast destination- looking up global route");
542 NS_LOG_LOGIC (
"Found unicast destination- calling unicast callback");
543 ucb (rtentry, p, header);
548 NS_LOG_LOGIC (
"Did not find unicast destination- returning false");
std::list< Ipv4RoutingTableEntry * >::iterator HostRoutesI
virtual void NotifyInterfaceUp(uint32_t interface)
#define NS_LOG_FUNCTION(parameters)
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream.
static void InitializeRoutes()
Compute routes using a Dijkstra SPF computation and populate per-node forwarding tables.
Ipv4GlobalRouting()
Construct an empty Ipv4GlobalRouting routing protocol,.
bool IsMatch(Ipv4Address a, Ipv4Address b) const
Ipv4Address GetLocal(void) const
a class to represent an Ipv4 address mask
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream) const
Print the Routing Table entries.
virtual 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)
bool IsMulticast(void) const
virtual void DoDispose(void)
virtual void NotifyInterfaceDown(uint32_t interface)
void RemoveRoute(uint32_t i)
Remove a route from the global unicast routing table.
Ipv4RoutingTableEntry * GetRoute(uint32_t i) const
Get a route from the global unicast routing table.
std::list< Ipv4RoutingTableEntry * >::const_iterator ASExternalRoutesCI
ASExternalRoutes m_ASexternalRoutes
void SetSource(Ipv4Address src)
uint32_t GetInterface(void) const
Ptr< UniformRandomVariable > m_rand
A uniform random number generator for randomly routing packets among ECMP.
bool IsGateway(void) const
static Ipv4RoutingTableEntry CreateHostRouteTo(Ipv4Address dest, Ipv4Address nextHop, uint32_t interface)
void SetGateway(Ipv4Address gw)
static Ipv4RoutingTableEntry CreateNetworkRouteTo(Ipv4Address network, Ipv4Mask networkMask, Ipv4Address nextHop, uint32_t interface)
bool m_respondToInterfaceEvents
Set to true if this interface should respond to interface events by globallly recomputing routes...
NS_OBJECT_ENSURE_REGISTERED(AntennaModel)
bool IsBroadcast(void) const
static void DeleteGlobalRoutes()
Delete all static routes on all nodes that have a GlobalRouterInterface.
std::list< Ipv4RoutingTableEntry * >::const_iterator NetworkRoutesCI
#define NS_LOG_LOGIC(msg)
bool m_randomEcmpRouting
Set to true if packets are randomly routed among ECMP; set to false for using only one route consiste...
int64_t AssignStreams(int64_t stream)
Ptr< Ipv4Route > LookupGlobal(Ipv4Address dest, Ptr< NetDevice > oif=0)
bool IsEqual(const Ipv4Address &other) const
Comparison operation between two Ipv4Addresses.
virtual ~Ipv4GlobalRouting()
static void BuildGlobalRoutingDatabase()
Build the routing database by gathering Link State Advertisements from each node exporting a GlobalRo...
Ipv4Address GetDest(void) const
std::list< Ipv4RoutingTableEntry * >::const_iterator HostRoutesCI
virtual 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.
void SetOutputDevice(Ptr< NetDevice > outputDevice)
std::list< Ipv4RoutingTableEntry * >::iterator ASExternalRoutesI
void AddNetworkRouteTo(Ipv4Address network, Ipv4Mask networkMask, Ipv4Address nextHop, uint32_t interface)
Add a network route to the global routing table.
Ipv4 addresses are stored in host order in this class.
std::list< Ipv4RoutingTableEntry * >::iterator NetworkRoutesI
Ipv4Address GetBroadcast(void) const
a class to store IPv4 address information on an interface
Ipv4Address GetGateway(void) const
virtual void SetIpv4(Ptr< Ipv4 > ipv4)
static std::string FindName(Ptr< Object > object)
NetworkRoutes m_networkRoutes
a base class which provides memory management and object aggregation
static TypeId GetTypeId(void)
Ipv4Mask GetDestNetworkMask(void) const
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
virtual void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address)
std::ostream * GetStream(void)
uint32_t GetNRoutes(void) const
Get the number of individual unicast routes that have been added to the routing table.
void SetDestination(Ipv4Address dest)
void AddASExternalRouteTo(Ipv4Address network, Ipv4Mask networkMask, Ipv4Address nextHop, uint32_t interface)
Add an external route to the global routing table.
virtual void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address)
void AddHostRouteTo(Ipv4Address dest, Ipv4Address nextHop, uint32_t interface)
Add a host route to the global routing table.