A Discrete-Event Network Simulator
API
global-router-interface.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright 2007 University of Washington
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: Craig Dowell (craigdo@ee.washington.edu)
19  * Tom Henderson (tomhend@u.washington.edu)
20  */
21 
22 #ifndef GLOBAL_ROUTER_INTERFACE_H
23 #define GLOBAL_ROUTER_INTERFACE_H
24 
25 #include <stdint.h>
26 #include <list>
27 #include "ns3/object.h"
28 #include "ns3/ptr.h"
29 #include "ns3/node.h"
30 #include "ns3/channel.h"
31 #include "ns3/ipv4-address.h"
32 #include "ns3/net-device-container.h"
33 #include "ns3/bridge-net-device.h"
34 #include "ns3/global-route-manager.h"
35 #include "ns3/ipv4-routing-table-entry.h"
36 
37 namespace ns3 {
38 
39 class GlobalRouter;
40 class Ipv4GlobalRouting;
41 
52 {
53 public:
54  friend class GlobalRoutingLSA;
62  enum LinkType {
63  Unknown = 0,
68  };
69 
78 
91  LinkType linkType,
92  Ipv4Address linkId,
93  Ipv4Address linkData,
94  uint16_t metric);
95 
102 
114  Ipv4Address GetLinkId (void) const;
115 
127  void SetLinkId (Ipv4Address addr);
128 
140  Ipv4Address GetLinkData (void) const;
141 
153  void SetLinkData (Ipv4Address addr);
154 
164  LinkType GetLinkType (void) const;
165 
175  void SetLinkType (LinkType linkType);
176 
188  uint16_t GetMetric (void) const;
189 
201  void SetMetric (uint16_t metric);
202 
203 private:
215 
225  Ipv4Address m_linkData; // for links to RouterLSA,
226 
232 
242  uint16_t m_metric;
243 };
244 
254 {
255 public:
260  enum LSType {
261  Unknown = 0,
267  };
273  enum SPFStatus {
277  };
285 
295  GlobalRoutingLSA(SPFStatus status, Ipv4Address linkStateId,
296  Ipv4Address advertisingRtr);
297 
307 
314 
328 
339  void CopyLinkRecords (const GlobalRoutingLSA& lsa);
340 
347  uint32_t AddLinkRecord (GlobalRoutingLinkRecord* lr);
348 
354  uint32_t GetNLinkRecords (void) const;
355 
362  GlobalRoutingLinkRecord* GetLinkRecord (uint32_t n) const;
363 
368  void ClearLinkRecords (void);
369 
376  bool IsEmpty (void) const;
377 
383  void Print (std::ostream &os) const;
384 
388  LSType GetLSType (void) const;
392  void SetLSType (LSType typ);
393 
402  Ipv4Address GetLinkStateId (void) const;
403 
411  void SetLinkStateId (Ipv4Address addr);
412 
421  Ipv4Address GetAdvertisingRouter (void) const;
422 
432 
438 
445  Ipv4Mask GetNetworkLSANetworkMask (void) const;
446 
453  uint32_t AddAttachedRouter (Ipv4Address addr);
454 
460  uint32_t GetNAttachedRouters (void) const;
461 
468  Ipv4Address GetAttachedRouter (uint32_t n) const;
469 
476  SPFStatus GetStatus (void) const;
477 
483  void SetStatus (SPFStatus status);
484 
489  Ptr<Node> GetNode (void) const;
490 
495  void SetNode (Ptr<Node> node);
496 
497 private:
511 
520 
524  typedef std::list<GlobalRoutingLinkRecord*> ListOfLinkRecords_t;
525 
536  ListOfLinkRecords_t m_linkRecords;
537 
542 
546  typedef std::list<Ipv4Address> ListOfAttachedRouters_t;
547 
556  ListOfAttachedRouters_t m_attachedRouters;
557 
565  uint32_t m_node_id;
566 };
567 
575 std::ostream& operator<< (std::ostream& os, GlobalRoutingLSA& lsa);
576 
586 class GlobalRouter : public Object
587 {
588 public:
593  static TypeId GetTypeId (void);
594 
598  GlobalRouter ();
599 
605 
611 
621  Ipv4Address GetRouterId (void) const;
622 
640  uint32_t DiscoverLSAs (void);
641 
655  uint32_t GetNumLSAs (void) const;
656 
677  bool GetLSA (uint32_t n, GlobalRoutingLSA &lsa) const;
678 
686  void InjectRoute (Ipv4Address network, Ipv4Mask networkMask);
687 
693  uint32_t GetNInjectedRoutes (void);
694 
702 
714  void RemoveInjectedRoute (uint32_t i);
715 
725  bool WithdrawRoute (Ipv4Address network, Ipv4Mask networkMask);
726 
727 private:
728  virtual ~GlobalRouter ();
729 
733  void ClearLSAs (void);
734 
745 
760  bool FindInterfaceForDevice (Ptr<Node> node, Ptr<NetDevice> nd, uint32_t &index) const;
761 
774 
785  bool AnotherRouterOnLink (Ptr<NetDevice> nd) const;
786 
795 
804 
813 
821 
829 
844 
852 
853 
854  typedef std::list<GlobalRoutingLSA*> ListOfLSAs_t;
855  ListOfLSAs_t m_LSAs;
856 
859 
860  typedef std::list<Ipv4RoutingTableEntry *> InjectedRoutes;
861  typedef std::list<Ipv4RoutingTableEntry *>::const_iterator InjectedRoutesCI;
862  typedef std::list<Ipv4RoutingTableEntry *>::iterator InjectedRoutesI;
863  InjectedRoutes m_injectedRoutes;
864 
865  // Declared mutable so that const member functions can clear it
866  // (supporting the logical constness of the search methods of this class)
870  mutable std::vector<Ptr<BridgeNetDevice> > m_bridgesVisited;
874  void ClearBridgesVisited (void) const;
889  void MarkBridgeAsVisited (Ptr<BridgeNetDevice> device) const;
890 
891  // inherited from Object
892  virtual void DoDispose (void);
893 
898 
903 };
904 
905 } // namespace ns3
906 
907 #endif /* GLOBAL_ROUTER_INTERFACE_H */
void SetRoutingProtocol(Ptr< Ipv4GlobalRouting > routing)
Set the specific Global Routing Protocol to be used.
LSType GetLSType(void) const
Return the LSType field of the LSA.
Ptr< Ipv4GlobalRouting > GetRoutingProtocol(void)
Get the specific Global Routing Protocol used.
GlobalRoutingLinkRecord * GetLinkRecord(uint32_t n) const
Return a pointer to the specified Global Routing Link Record.
std::list< GlobalRoutingLSA * > ListOfLSAs_t
container for the GlobalRoutingLSAs
virtual void DoDispose(void)
Destructor implementation.
Record represents a leaf node network.
~GlobalRoutingLSA()
Destroy an existing Global Routing Link State Advertisement.
Ipv4Address m_advertisingRtr
The Advertising Router is defined by the OSPF spec.
Ipv4RoutingTableEntry * GetInjectedRoute(uint32_t i)
Return the injected route indexed by i.
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:257
std::list< Ipv4RoutingTableEntry * >::const_iterator InjectedRoutesCI
Const Iterator to container of Ipv4RoutingTableEntry.
static TypeId GetTypeId(void)
Get the type ID.
bool WithdrawRoute(Ipv4Address network, Ipv4Mask networkMask)
Withdraw a route from the global unicast routing table.
bool FindInterfaceForDevice(Ptr< Node > node, Ptr< NetDevice > nd, uint32_t &index) const
Given a node and a net device, find an IPV4 interface index that corresponds to that net device...
uint32_t DiscoverLSAs(void)
Walk the connected channels, discover the adjacent routers and build the associated number of Global ...
void SetAdvertisingRouter(Ipv4Address rtr)
Set the Advertising Router as defined by the OSPF spec.
LSType m_lsType
The type of the LSA.
uint32_t AddLinkRecord(GlobalRoutingLinkRecord *lr)
Add a given Global Routing Link Record to the LSA.
GlobalRouter & operator=(GlobalRouter &sr)
Global Router assignment operator is disallowed.
NetDeviceContainer FindAllNonBridgedDevicesOnLink(Ptr< Channel > ch) const
Return a container of all non-bridged NetDevices on a link.
Ipv4Mask m_networkLSANetworkMask
Each Network LSA contains the network mask of the attached network.
bool GetLSA(uint32_t n, GlobalRoutingLSA &lsa) const
Get a Global Routing Link State Advertisements that this router has said that it can export...
uint32_t GetNInjectedRoutes(void)
Get the number of injected routes that have been added to the routing table.
void ProcessSingleBroadcastLink(Ptr< NetDevice > nd, GlobalRoutingLSA *pLSA, NetDeviceContainer &c)
Process a single broadcast link.
Ipv4Address FindDesignatedRouterForLink(Ptr< NetDevice > ndLocal) const
Finds a designated router.
uint32_t AddAttachedRouter(Ipv4Address addr)
Add an attached router to the list in the NetworkLSA.
InjectedRoutes m_injectedRoutes
Routes we are exporting.
Ipv4Mask GetNetworkLSANetworkMask(void) const
For a Network LSA, get the Network Mask field that precedes the list of attached routers.
void SetNode(Ptr< Node > node)
Set the Node pointer of the node that originated this LSA.
void ProcessBridgedBroadcastLink(Ptr< NetDevice > nd, GlobalRoutingLSA *pLSA, NetDeviceContainer &c)
Process a bridged broadcast link.
Ipv4Address GetAdvertisingRouter(void) const
Get the Advertising Router as defined by the OSPF spec.
void ClearLinkRecords(void)
Release all of the Global Routing Link Records present in the Global Routing Link State Advertisement...
LSType
corresponds to LS type field of RFC 2328 OSPF LSA header
Ptr< Ipv4GlobalRouting > m_routingProtocol
the Ipv4GlobalRouting in use
A record of an IPv4 routing table entry for Ipv4GlobalRouting and Ipv4StaticRouting.
a Link State Advertisement (LSA) for a router, used in global routing.
bool BridgeHasAlreadyBeenVisited(Ptr< BridgeNetDevice > device) const
When recursively checking for devices on the link, check whether a given device has already been visi...
void InjectRoute(Ipv4Address network, Ipv4Mask networkMask)
Inject a route to be circulated to other routers as an external route.
void ClearLSAs(void)
Clear list of LSAs.
Unused – for future OSPF compatibility.
LinkType
Enumeration of the possible types of Global Routing Link Records.
holds a vector of ns3::NetDevice pointers
void SetLSType(LSType typ)
Set the LS type field of the LSA.
void Print(std::ostream &os) const
Print the contents of the Global Routing Link State Advertisement and any Global Routing Link Records...
std::list< Ipv4Address > ListOfAttachedRouters_t
A convenience typedef to avoid too much writers cramp.
void RemoveInjectedRoute(uint32_t i)
Withdraw a route from the global unicast routing table.
SPFStatus GetStatus(void) const
Get the SPF status of the advertisement.
Record representing a point to point channel.
SPFStatus m_status
This is a tristate flag used internally in the SPF computation to mark if an SPFVertex (a data struct...
Vertex is in the SPF candidate queue.
std::ostream & operator<<(std::ostream &os, const Angles &a)
print a struct Angles to output
Definition: angles.cc:42
void ClearBridgesVisited(void) const
Clear the list of bridges visited on the link.
void SetStatus(SPFStatus status)
Set the SPF status of the advertisement.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
uint32_t GetNAttachedRouters(void) const
Return the number of attached routers listed in the NetworkLSA.
uint32_t GetNLinkRecords(void) const
Return the number of Global Routing Link Records in the LSA.
ListOfLSAs_t m_LSAs
database of GlobalRoutingLSAs
std::list< Ipv4RoutingTableEntry * > InjectedRoutes
container of Ipv4RoutingTableEntry
std::vector< Ptr< BridgeNetDevice > > m_bridgesVisited
Container of bridges visited.
An interface aggregated to a node to provide global routing info.
Ipv4Address m_routerId
router ID (its IPv4 address)
Ptr< BridgeNetDevice > NetDeviceIsBridged(Ptr< NetDevice > nd) const
Decide whether or not a given net device is being bridged by a BridgeNetDevice.
Ipv4Address m_linkStateId
The Link State ID is defined by the OSPF spec.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:40
void CopyLinkRecords(const GlobalRoutingLSA &lsa)
Copy any Global Routing Link Records in a given Global Routing Link State Advertisement to the curren...
GlobalRoutingLSA & operator=(const GlobalRoutingLSA &lsa)
Assignment operator for a Global Routing Link State Advertisement.
void SetNetworkLSANetworkMask(Ipv4Mask mask)
For a Network LSA, set the Network Mask field that precedes the list of attached routers.
Unused – for future OSPF compatibility.
SPFStatus
Enumeration of the possible values of the status flag in the Routing Link State Advertisements.
uint32_t GetNumLSAs(void) const
Get the Number of Global Routing Link State Advertisements that this router can export.
GlobalRouter()
Create a Global Router class.
Ipv4Address GetRouterId(void) const
Get the Router ID associated with this Global Router.
Ipv4Address GetAttachedRouter(uint32_t n) const
Return an Ipv4Address corresponding to the specified attached router.
Ptr< Node > GetNode(void) const
Get the Node pointer of the node that originated this LSA.
void BuildNetworkLSAs(NetDeviceContainer c)
Build one NetworkLSA for each net device talking to a network that we are the designated router for...
ListOfAttachedRouters_t m_attachedRouters
Each Network LSA contains a list of attached routers.
bool IsEmpty(void) const
Check to see if the list of Global Routing Link Records present in the Global Routing Link State Adve...
A base class which provides memory management and object aggregation.
Definition: object.h:87
Ptr< NetDevice > GetAdjacent(Ptr< NetDevice > nd, Ptr< Channel > ch) const
Link through the given channel and find the net device that's on the other end.
std::list< GlobalRoutingLinkRecord * > ListOfLinkRecords_t
A convenience typedef to avoid too much writers cramp.
GlobalRoutingLSA()
Create a blank Global Routing Link State Advertisement.
void ProcessPointToPointLink(Ptr< NetDevice > ndLocal, GlobalRoutingLSA *pLSA)
Process a point to point link.
ListOfLinkRecords_t m_linkRecords
Each Link State Advertisement contains a number of Link Records that describe the kinds of links that...
a unique identifier for an interface.
Definition: type-id.h:58
void SetLinkStateId(Ipv4Address addr)
Set the Link State ID is defined by the OSPF spec.
Ipv4Address GetLinkStateId(void) const
Get the Link State ID as defined by the OSPF spec.
void MarkBridgeAsVisited(Ptr< BridgeNetDevice > device) const
When recursively checking for devices on the link, mark a given device as having been visited...
std::list< Ipv4RoutingTableEntry * >::iterator InjectedRoutesI
Iterator to container of Ipv4RoutingTableEntry.
void ProcessBroadcastLink(Ptr< NetDevice > nd, GlobalRoutingLSA *pLSA, NetDeviceContainer &c)
Process a generic broadcast link.
bool AnotherRouterOnLink(Ptr< NetDevice > nd) const
Checks for the presence of another router on the NetDevice.