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
37namespace ns3 {
38
39class GlobalRouter;
40class Ipv4GlobalRouting;
41
52{
53public:
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
203private:
215
225 Ipv4Address m_linkData; // for links to RouterLSA,
226
232
242 uint16_t m_metric;
243};
244
254{
255public:
260 enum LSType {
267 };
277 };
285
295 GlobalRoutingLSA(SPFStatus status, Ipv4Address linkStateId,
296 Ipv4Address advertisingRtr);
297
307
314
328
339 void CopyLinkRecords (const GlobalRoutingLSA& lsa);
340
348
354 uint32_t GetNLinkRecords (void) const;
355
363
368 void ClearLinkRecords (void);
369
376 bool IsEmpty (void) const;
377
383 void Print (std::ostream &os) const;
384
389 LSType GetLSType (void) const;
394 void SetLSType (LSType typ);
395
404 Ipv4Address GetLinkStateId (void) const;
405
413 void SetLinkStateId (Ipv4Address addr);
414
424
434
441
449
457
463 uint32_t GetNAttachedRouters (void) const;
464
472
479 SPFStatus GetStatus (void) const;
480
486 void SetStatus (SPFStatus status);
487
492 Ptr<Node> GetNode (void) const;
493
498 void SetNode (Ptr<Node> node);
499
500private:
514
523
527 typedef std::list<GlobalRoutingLinkRecord*> ListOfLinkRecords_t;
528
540
545
549 typedef std::list<Ipv4Address> ListOfAttachedRouters_t;
550
560
569};
570
578std::ostream& operator<< (std::ostream& os, GlobalRoutingLSA& lsa);
579
589class GlobalRouter : public Object
590{
591public:
596 static TypeId GetTypeId (void);
597
601 GlobalRouter ();
602
608
614
624 Ipv4Address GetRouterId (void) const;
625
643 uint32_t DiscoverLSAs (void);
644
658 uint32_t GetNumLSAs (void) const;
659
680 bool GetLSA (uint32_t n, GlobalRoutingLSA &lsa) const;
681
689 void InjectRoute (Ipv4Address network, Ipv4Mask networkMask);
690
697
705
718
728 bool WithdrawRoute (Ipv4Address network, Ipv4Mask networkMask);
729
730private:
731 virtual ~GlobalRouter ();
732
736 void ClearLSAs (void);
737
748
763 bool FindInterfaceForDevice (Ptr<Node> node, Ptr<NetDevice> nd, uint32_t &index) const;
764
777
788 bool AnotherRouterOnLink (Ptr<NetDevice> nd) const;
789
798
807
816
824
832
848
856
857
858 typedef std::list<GlobalRoutingLSA*> ListOfLSAs_t;
860
863
864 typedef std::list<Ipv4RoutingTableEntry *> InjectedRoutes;
865 typedef std::list<Ipv4RoutingTableEntry *>::const_iterator InjectedRoutesCI;
866 typedef std::list<Ipv4RoutingTableEntry *>::iterator InjectedRoutesI;
868
869 // Declared mutable so that const member functions can clear it
870 // (supporting the logical constness of the search methods of this class)
874 mutable std::vector<Ptr<BridgeNetDevice> > m_bridgesVisited;
878 void ClearBridgesVisited (void) const;
893 void MarkBridgeAsVisited (Ptr<BridgeNetDevice> device) const;
894
895 // inherited from Object
896 virtual void DoDispose (void);
897
903
910};
911
912} // namespace ns3
913
914#endif /* GLOBAL_ROUTER_INTERFACE_H */
An interface aggregated to a node to provide global routing info.
static TypeId GetTypeId(void)
Get the type ID.
std::list< GlobalRoutingLSA * > ListOfLSAs_t
container for the GlobalRoutingLSAs
Ipv4Address FindDesignatedRouterForLink(Ptr< NetDevice > ndLocal) const
Finds a designated router.
void MarkBridgeAsVisited(Ptr< BridgeNetDevice > device) const
When recursively checking for devices on the link, mark a given device as having been visited.
Ptr< Ipv4GlobalRouting > m_routingProtocol
the Ipv4GlobalRouting in use
bool GetLSA(uint32_t n, GlobalRoutingLSA &lsa) const
Get a Global Routing Link State Advertisements that this router has said that it can export.
void ProcessSingleBroadcastLink(Ptr< NetDevice > nd, GlobalRoutingLSA *pLSA, NetDeviceContainer &c)
Process a single broadcast link.
bool WithdrawRoute(Ipv4Address network, Ipv4Mask networkMask)
Withdraw a route from the global unicast routing table.
virtual void DoDispose(void)
Destructor implementation.
NetDeviceContainer FindAllNonBridgedDevicesOnLink(Ptr< Channel > ch) const
Return a container of all non-bridged NetDevices on a link.
GlobalRouter(GlobalRouter &sr)
Global Router copy construction is disallowed.
std::list< Ipv4RoutingTableEntry * > InjectedRoutes
container of Ipv4RoutingTableEntry
bool BridgeHasAlreadyBeenVisited(Ptr< BridgeNetDevice > device) const
When recursively checking for devices on the link, check whether a given device has already been visi...
InjectedRoutes m_injectedRoutes
Routes we are exporting.
void InjectRoute(Ipv4Address network, Ipv4Mask networkMask)
Inject a route to be circulated to other routers as an external route.
uint32_t DiscoverLSAs(void)
Walk the connected channels, discover the adjacent routers and build the associated number of Global ...
Ptr< BridgeNetDevice > NetDeviceIsBridged(Ptr< NetDevice > nd) const
Decide whether or not a given net device is being bridged by a BridgeNetDevice.
void ClearBridgesVisited(void) const
Clear the list of bridges visited on the link.
uint32_t GetNInjectedRoutes(void)
Get the number of injected routes that have been added to the routing table.
ListOfLSAs_t m_LSAs
database of GlobalRoutingLSAs
Ptr< Ipv4GlobalRouting > GetRoutingProtocol(void)
Get the specific Global Routing Protocol used.
void ProcessBridgedBroadcastLink(Ptr< NetDevice > nd, GlobalRoutingLSA *pLSA, NetDeviceContainer &c)
Process a bridged broadcast link.
GlobalRouter()
Create a Global Router class.
void ClearLSAs(void)
Clear list of LSAs.
GlobalRouter & operator=(GlobalRouter &sr)
Global Router assignment operator is disallowed.
Ipv4RoutingTableEntry * GetInjectedRoute(uint32_t i)
Return the injected route indexed by i.
std::list< Ipv4RoutingTableEntry * >::iterator InjectedRoutesI
Iterator to container of Ipv4RoutingTableEntry.
uint32_t GetNumLSAs(void) const
Get the Number of Global Routing Link State Advertisements that this router can export.
Ipv4Address m_routerId
router ID (its IPv4 address)
void RemoveInjectedRoute(uint32_t i)
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.
bool AnotherRouterOnLink(Ptr< NetDevice > nd) const
Checks for the presence of another router on the NetDevice.
std::list< Ipv4RoutingTableEntry * >::const_iterator InjectedRoutesCI
Const Iterator to container of Ipv4RoutingTableEntry.
void SetRoutingProtocol(Ptr< Ipv4GlobalRouting > routing)
Set the specific Global Routing Protocol to be used.
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::vector< Ptr< BridgeNetDevice > > m_bridgesVisited
Container of bridges visited.
void ProcessPointToPointLink(Ptr< NetDevice > ndLocal, GlobalRoutingLSA *pLSA)
Process a point to point link.
Ipv4Address GetRouterId(void) const
Get the Router ID associated with this Global Router.
void ProcessBroadcastLink(Ptr< NetDevice > nd, GlobalRoutingLSA *pLSA, NetDeviceContainer &c)
Process a generic broadcast link.
void BuildNetworkLSAs(NetDeviceContainer c)
Build one NetworkLSA for each net device talking to a network that we are the designated router for.
a Link State Advertisement (LSA) for a router, used in global routing.
void SetStatus(SPFStatus status)
Set the SPF status of the advertisement.
void Print(std::ostream &os) const
Print the contents of the Global Routing Link State Advertisement and any Global Routing Link Records...
SPFStatus
Enumeration of the possible values of the status flag in the Routing Link State Advertisements.
@ LSA_SPF_NOT_EXPLORED
New vertex not yet considered.
@ LSA_SPF_IN_SPFTREE
Vertex is in the SPF tree.
@ LSA_SPF_CANDIDATE
Vertex is in the SPF candidate queue.
SPFStatus GetStatus(void) const
Get the SPF status of the advertisement.
uint32_t GetNLinkRecords(void) const
Return the number of Global Routing Link Records in the LSA.
std::list< Ipv4Address > ListOfAttachedRouters_t
A convenience typedef to avoid too much writers cramp.
uint32_t AddLinkRecord(GlobalRoutingLinkRecord *lr)
Add a given Global Routing Link Record to the LSA.
uint32_t GetNAttachedRouters(void) const
Return the number of attached routers listed in the NetworkLSA.
LSType
corresponds to LS type field of RFC 2328 OSPF LSA header
@ Unknown
Uninitialized Type.
Ipv4Address m_linkStateId
The Link State ID is defined by the OSPF spec.
LSType GetLSType(void) const
Return the LSType field of the LSA.
Ipv4Address GetAdvertisingRouter(void) const
Get the Advertising Router as defined by the OSPF spec.
Ptr< Node > GetNode(void) const
Get the Node pointer of the node that originated this LSA.
GlobalRoutingLSA()
Create a blank Global Routing Link State Advertisement.
ListOfLinkRecords_t m_linkRecords
Each Link State Advertisement contains a number of Link Records that describe the kinds of links that...
Ipv4Address GetAttachedRouter(uint32_t n) const
Return an Ipv4Address corresponding to the specified attached router.
void SetNode(Ptr< Node > node)
Set the Node pointer of the node that originated this LSA.
uint32_t AddAttachedRouter(Ipv4Address addr)
Add an attached router to the list in the NetworkLSA.
std::list< GlobalRoutingLinkRecord * > ListOfLinkRecords_t
A convenience typedef to avoid too much writers cramp.
~GlobalRoutingLSA()
Destroy an existing Global Routing Link State Advertisement.
Ipv4Address m_advertisingRtr
The Advertising Router is defined by the OSPF spec.
void SetLSType(LSType typ)
Set the LS type field of the LSA.
void SetAdvertisingRouter(Ipv4Address rtr)
Set the Advertising Router as defined by the OSPF spec.
SPFStatus m_status
This is a tristate flag used internally in the SPF computation to mark if an SPFVertex (a data struct...
LSType m_lsType
The type of the LSA.
ListOfAttachedRouters_t m_attachedRouters
Each Network LSA contains a list of attached routers.
void ClearLinkRecords(void)
Release all of the Global Routing Link Records present in the Global Routing Link State Advertisement...
Ipv4Mask GetNetworkLSANetworkMask(void) const
For a Network LSA, get the Network Mask field that precedes the list of attached routers.
GlobalRoutingLinkRecord * GetLinkRecord(uint32_t n) const
Return a pointer to the specified Global Routing Link Record.
void SetNetworkLSANetworkMask(Ipv4Mask mask)
For a Network LSA, set the Network Mask field that precedes the list of attached routers.
Ipv4Mask m_networkLSANetworkMask
Each Network LSA contains the network mask of the attached network.
bool IsEmpty(void) const
Check to see if the list of Global Routing Link Records present in the Global Routing Link State Adve...
void CopyLinkRecords(const GlobalRoutingLSA &lsa)
Copy any Global Routing Link Records in a given Global Routing Link State Advertisement to the curren...
Ipv4Address GetLinkStateId(void) const
Get the Link State ID as defined by the OSPF spec.
void SetLinkStateId(Ipv4Address addr)
Set the Link State ID is defined by the OSPF spec.
GlobalRoutingLSA & operator=(const GlobalRoutingLSA &lsa)
Assignment operator for a Global Routing Link State Advertisement.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:41
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:256
A record of an IPv4 routing table entry for Ipv4GlobalRouting and Ipv4StaticRouting.
holds a vector of ns3::NetDevice pointers
A base class which provides memory management and object aggregation.
Definition: object.h:88
a unique identifier for an interface.
Definition: type-id.h:59
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition: angles.cc:139