A Discrete-Event Network Simulator
API
ipv4-nix-vector-routing.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 The Georgia Institute of Technology
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Authors: Josh Pelkey <jpelkey@gatech.edu>
19  */
20 
21 #ifndef IPV4_NIX_VECTOR_ROUTING_H
22 #define IPV4_NIX_VECTOR_ROUTING_H
23 
24 #include "ns3/channel.h"
25 #include "ns3/node-container.h"
26 #include "ns3/node-list.h"
27 #include "ns3/net-device-container.h"
28 #include "ns3/ipv4-routing-protocol.h"
29 #include "ns3/ipv4-route.h"
30 #include "ns3/nix-vector.h"
31 #include "ns3/bridge-net-device.h"
32 #include "ns3/nstime.h"
33 
34 #include <map>
35 #include <unordered_map>
36 
37 namespace ns3 {
38 
50 typedef std::map<Ipv4Address, Ptr<NixVector> > NixMap_t;
55 typedef std::map<Ipv4Address, Ptr<Ipv4Route> > Ipv4RouteMap_t;
56 
62 {
63 public:
71  static TypeId GetTypeId (void);
78  void SetNode (Ptr<Node> node);
79 
90  void FlushGlobalNixRoutingCache (void) const;
91 
99  void PrintRoutingPath (Ptr<Node> source, Ipv4Address dest, Ptr<OutputStreamWrapper> stream, Time::Unit unit) const;
100 
101 
102 private:
103 
108  void FlushNixCache (void) const;
109 
114  void FlushIpv4RouteCache (void) const;
115 
121  void ResetTotalNeighbors (void);
122 
134 
141 
148 
156  void GetAdjacentNetDevices (Ptr<NetDevice> netDevice, Ptr<Channel> channel, NetDeviceContainer & netDeviceContainer) const;
157 
164  Ptr<Node> GetNodeByIp (Ipv4Address dest) const;
165 
174  bool BuildNixVector (const std::vector< Ptr<Node> > & parentVector, uint32_t source, uint32_t dest, Ptr<NixVector> nixVector) const;
175 
181  bool BuildNixVectorLocal (Ptr<NixVector> nixVector);
182 
189  uint32_t FindTotalNeighbors (Ptr<Node> node) const;
190 
191 
198 
199 
208  uint32_t FindNetDeviceForNixIndex (Ptr<Node> node, uint32_t nodeIndex, Ipv4Address & gatewayIp) const;
209 
219  bool BFS (uint32_t numberOfNodes,
220  Ptr<Node> source,
221  Ptr<Node> dest,
222  std::vector< Ptr<Node> > & parentVector,
223  Ptr<NetDevice> oif) const;
224 
225  void DoDispose (void);
226 
227  /* From Ipv4RoutingProtocol */
228  virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr);
229  virtual bool RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
232  virtual void NotifyInterfaceUp (uint32_t interface);
233  virtual void NotifyInterfaceDown (uint32_t interface);
234  virtual void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address);
235  virtual void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address);
236  virtual void SetIpv4 (Ptr<Ipv4> ipv4);
237  virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S) const;
238 
242  void CheckCacheStateAndFlush (void) const;
243 
247  void BuildIpv4AddressToNodeMap (void) const;
248 
253  static bool g_isCacheDirty;
254 
257 
260 
263 
266 
267 
275  typedef std::unordered_map<Ipv4Address, ns3::Ptr<ns3::Node>, Ipv4AddressHash > Ipv4AddressToNodeMap;
277 };
278 } // namespace ns3
279 
280 #endif /* IPV4_NIX_VECTOR_ROUTING_H */
Callback template class.
Definition: callback.h:1279
Class providing an hash for IPv4 addresses.
Definition: ipv4-address.h:419
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:41
Packet header for IPv4.
Definition: ipv4-header.h:34
a class to store IPv4 address information on an interface
Nix-vector routing protocol.
virtual void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address)
Ptr< Ipv4 > m_ipv4
IPv4 object.
Ptr< NixVector > GetNixVectorInCache(Ipv4Address address) const
Checks the cache based on dest IP for the nix-vector.
virtual void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address)
Ptr< Node > m_node
Node object.
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)
NixMap_t m_nixCache
Cache stores nix-vectors based on destination ip.
virtual void NotifyInterfaceDown(uint32_t interface)
uint32_t FindTotalNeighbors(Ptr< Node > node) const
Simply iterates through the nodes net-devices and determines how many neighbors the node has.
void DoDispose(void)
Destructor implementation.
virtual void NotifyInterfaceUp(uint32_t interface)
void SetNode(Ptr< Node > node)
Set the Node pointer of the node for which this routing protocol is to be placed.
bool BFS(uint32_t numberOfNodes, Ptr< Node > source, Ptr< Node > dest, std::vector< Ptr< Node > > &parentVector, Ptr< NetDevice > oif) const
Breadth first search algorithm.
uint32_t FindNetDeviceForNixIndex(Ptr< Node > node, uint32_t nodeIndex, Ipv4Address &gatewayIp) const
Nix index is with respect to the neighbors.
void BuildIpv4AddressToNodeMap(void) const
Build map from IPv4 Address to Node for faster lookup.
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S) const
Print the Routing Table entries.
static bool g_isCacheDirty
Flag to mark when caches are dirty and need to be flushed.
void FlushGlobalNixRoutingCache(void) const
Called when run-time link topology change occurs which iterates through the node list and flushes any...
Ptr< NixVector > GetNixVector(Ptr< Node > source, Ipv4Address dest, Ptr< NetDevice > oif) const
Takes in the source node and dest IP and calls GetNodeByIp, BFS, accounting for any output interface ...
bool BuildNixVectorLocal(Ptr< NixVector > nixVector)
Special variation of BuildNixVector for when a node is sending to itself.
static Ipv4AddressToNodeMap g_ipv4AddressToNodeMap
Address to node map.
void FlushNixCache(void) const
Flushes the cache which stores nix-vector based on destination IP.
std::unordered_map< Ipv4Address, ns3::Ptr< ns3::Node >, Ipv4AddressHash > Ipv4AddressToNodeMap
Mapping of IPv4 address to ns-3 node.
uint32_t m_totalNeighbors
Total neighbors used for nix-vector to determine number of bits.
void PrintRoutingPath(Ptr< Node > source, Ipv4Address dest, Ptr< OutputStreamWrapper > stream, Time::Unit unit) const
Print the Routing Path according to Nix Routing.
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...
Ptr< BridgeNetDevice > NetDeviceIsBridged(Ptr< NetDevice > nd) const
Determine if the NetDevice is bridged.
Ptr< Ipv4Route > GetIpv4RouteInCache(Ipv4Address address)
Checks the cache based on dest IP for the Ipv4Route.
void ResetTotalNeighbors(void)
Upon a run-time topology change caches are flushed and the total number of neighbors is reset to zero...
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.
Ptr< Node > GetNodeByIp(Ipv4Address dest) const
Iterates through the node list and finds the one corresponding to the given Ipv4Address.
void FlushIpv4RouteCache(void) const
Flushes the cache which stores the Ipv4 route based on the destination IP.
void CheckCacheStateAndFlush(void) const
Flushes routing caches if required.
Ipv4RouteMap_t m_ipv4RouteCache
Cache stores Ipv4Routes based on destination ip.
static TypeId GetTypeId(void)
The Interface ID of the Global Router interface.
bool BuildNixVector(const std::vector< Ptr< Node > > &parentVector, uint32_t source, uint32_t dest, Ptr< NixVector > nixVector) const
Recurses the parent vector, created by BFS and actually builds the nixvector.
virtual void SetIpv4(Ptr< Ipv4 > ipv4)
Abstract base class for IPv4 routing protocols.
holds a vector of ns3::NetDevice pointers
SocketErrno
Enumeration of the possible errors returned by a socket.
Definition: socket.h:82
Unit
The unit to use to interpret a number representing time.
Definition: nstime.h:110
@ S
second
Definition: nstime.h:115
a unique identifier for an interface.
Definition: type-id.h:59
std::map< Ipv4Address, Ptr< Ipv4Route > > Ipv4RouteMap_t
Map of Ipv4Address to Ipv4Route.
std::map< Ipv4Address, Ptr< NixVector > > NixMap_t
Map of Ipv4Address to NixVector.
address
Definition: first.py:44
Every class exported by the ns3 library is enclosed in the ns3 namespace.
channel
Definition: third.py:92