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 */
void FlushGlobalNixRoutingCache(void) const
Called when run-time link topology change occurs which iterates through the node list and flushes any...
void BuildIpv4AddressToNodeMap(void) const
Build map from IPv4 Address to Node for faster lookup.
Callback template class.
Definition: callback.h:1278
bool BuildNixVectorLocal(Ptr< NixVector > nixVector)
Special variation of BuildNixVector for when a node is sending to itself.
Ptr< Node > GetNodeByIp(Ipv4Address dest) const
Iterates through the node list and finds the one corresponding to the given Ipv4Address.
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S) const
Print the Routing Table entries.
void DoDispose(void)
Destructor implementation.
Ptr< Ipv4 > m_ipv4
IPv4 object.
void FlushIpv4RouteCache(void) const
Flushes the cache which stores the Ipv4 route based on the destination IP.
std::map< Ipv4Address, Ptr< NixVector > > NixMap_t
Map of Ipv4Address to NixVector.
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 ...
uint32_t FindTotalNeighbors(Ptr< Node > node) const
Simply iterates through the nodes net-devices and determines how many neighbors the node has...
SocketErrno
Enumeration of the possible errors returned by a socket.
Definition: socket.h:82
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.
bool BFS(uint32_t numberOfNodes, Ptr< Node > source, Ptr< Node > dest, std::vector< Ptr< Node > > &parentVector, Ptr< NetDevice > oif) const
Breadth first search algorithm.
channel
Definition: third.py:92
void FlushNixCache(void) const
Flushes the cache which stores nix-vector based on destination IP.
Packet header for IPv4.
Definition: ipv4-header.h:33
Ptr< Node > m_node
Node object.
void SetNode(Ptr< Node > node)
Set the Node pointer of the node for which this routing protocol is to be placed. ...
Nix-vector routing protocol.
Unit
The unit to use to interpret a number representing time.
Definition: nstime.h:109
holds a vector of ns3::NetDevice pointers
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::unordered_map< Ipv4Address, ns3::Ptr< ns3::Node >, Ipv4AddressHash > Ipv4AddressToNodeMap
Mapping of IPv4 address to ns-3 node.
Ptr< Ipv4Route > GetIpv4RouteInCache(Ipv4Address address)
Checks the cache based on dest IP for the Ipv4Route.
static TypeId GetTypeId(void)
The Interface ID of the Global Router interface.
Ptr< BridgeNetDevice > NetDeviceIsBridged(Ptr< NetDevice > nd) const
Determine if the NetDevice is bridged.
virtual void NotifyInterfaceDown(uint32_t interface)
virtual void NotifyInterfaceUp(uint32_t interface)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
address
Definition: first.py:44
Ptr< NixVector > GetNixVectorInCache(Ipv4Address address) const
Checks the cache based on dest IP for the nix-vector.
NixMap_t m_nixCache
Cache stores nix-vectors based on destination ip.
static bool g_isCacheDirty
Flag to mark when caches are dirty and need to be flushed.
void ResetTotalNeighbors(void)
Upon a run-time topology change caches are flushed and the total number of neighbors is reset to zero...
void PrintRoutingPath(Ptr< Node > source, Ipv4Address dest, Ptr< OutputStreamWrapper > stream, Time::Unit unit) const
Print the Routing Path according to Nix Routing.
virtual void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address)
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.
virtual void SetIpv4(Ptr< Ipv4 > ipv4)
uint32_t m_totalNeighbors
Total neighbors used for nix-vector to determine number of bits.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:41
a class to store IPv4 address information on an interface
Ipv4RouteMap_t m_ipv4RouteCache
Cache stores Ipv4Routes based on destination ip.
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)
Abstract base class for IPv4 routing protocols.
second
Definition: nstime.h:115
void CheckCacheStateAndFlush(void) const
Flushes routing caches if required.
std::map< Ipv4Address, Ptr< Ipv4Route > > Ipv4RouteMap_t
Map of Ipv4Address to Ipv4Route.
virtual void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address)
uint32_t FindNetDeviceForNixIndex(Ptr< Node > node, uint32_t nodeIndex, Ipv4Address &gatewayIp) const
Nix index is with respect to the neighbors.
a unique identifier for an interface.
Definition: type-id.h:58
static Ipv4AddressToNodeMap g_ipv4AddressToNodeMap
Address to node map.
Class providing an hash for IPv4 addresses.
Definition: ipv4-address.h:419