WSF
WsfCommProtocolOSPF.hpp
Go to the documentation of this file.
1// ****************************************************************************
2// CUI
3//
4// The Advanced Framework for Simulation, Integration, and Modeling (AFSIM)
5//
6// Copyright 2018 Infoscitex, a DCS Company. All rights reserved.
7//
8// The use, dissemination or disclosure of data in this file is subject to
9// limitation or restriction. See accompanying README and LICENSE for details.
10// ****************************************************************************
11
12#ifndef WSFCOMMPROTOCOLOSPF_HPP
13#define WSFCOMMPROTOCOLOSPF_HPP
14
15#include "wsf_export.h"
16
17#include <memory>
18
19#include "UtCallbackHolder.hpp"
21#include "WsfEvent.hpp"
22#include "WsfRandomVariable.hpp"
23
24namespace wsf
25{
26namespace comm
27{
28namespace router
29{
30
32class OSPF_Area;
33
74{
75public:
77 using ProtocolVector = std::vector<ProtocolOSPF*>;
78
83 using AreaVector = std::vector<std::shared_ptr<OSPF_Area>>;
84
86 using AreaGraphMap = std::map<Address, std::unique_ptr<graph::Graph>>;
87
89
90 static constexpr const char* cOSPF_ALL_HELLO = "OSPF_ALL_HELLO";
91 static constexpr const char* cOSPF_ALL_DROP = "OSPF_ALL_DROP";
92 static constexpr const char* cOSPF_ALL_DR_DROP = "OSPF_ALL_DR_DROP";
93 static constexpr const char* cOSPF_ALL_DR_ADD = "OSPF_ALL_DR_ADD";
95
96 enum class RouterAreaType : size_t
97 {
98 cNONE,
99 cNORMAL,
100 cABR,
101 cASBR
103 };
104
105 static ProtocolOSPF* Find(const Router& aParent);
106 static ProtocolOSPF* FindOrCreate(Router& aParent);
107
108 ProtocolOSPF() = default;
109 ~ProtocolOSPF() override = default;
110 ProtocolOSPF(const ProtocolOSPF& aSrc);
111
113
114 WsfComponent* CloneComponent() const override;
115 const int* GetComponentRoles() const override;
116 void* QueryInterface(int aRole) override;
117 int GetPriority() const override;
118 ProtocolOSPF* Clone() const override;
119 const char* GetScriptClassName() const override { return "WsfCommProtocolOSPF"; }
121
123
124 void Setup() override;
125 bool ProcessInput(UtInput& aInput) override;
126 bool Initialize(double aSimTime) override;
128
134
135 bool Send(double aSimTime, Router::SendData& aData) override;
136
137 bool Receive(double aSimTime, const Address& aReceivingInterface, Message& aMessage, bool& aOverrideForward) override;
138
139 std::vector<Address> Routing(double aSimTime,
140 const Address& aSendingInterface,
141 size_t& aHopNumber,
142 double& aCost,
143 const Message& aMessage) override;
145
147
148
150 graph::Graph* GetGraph() const override;
151 graph::Graph* GetGraph(const Address& aArea);
152 bool ShouldPropagateTruth() const override { return false; }
153 void SetGraph(const Address& aArea, std::unique_ptr<graph::Graph> aGraph);
155
156 AreaVector& GetAreas() { return mAreas; }
157 OSPF_Area* GetArea(const Address& aAreaAddress);
158 const std::vector<Address>& GetInputAreas() const { return mInputAreas; }
159 const Address& GetInputBackbone() const { return mInputBackbone; }
160 bool IsSetup() const { return mSetup; }
161 void SetSetup(bool aSetup) { mSetup = aSetup; }
162 RouterAreaType GetAreaType() const { return mAreaType; }
163 void SetAreaType(RouterAreaType aType) { mAreaType = aType; }
164 size_t GetPriorityDR() const { return mPriorityDR; }
165
169 Comm* GetPriorityInterface(const std::string aNetwork) const;
170
172 void PlatformInitialized(double aSimTime, WsfPlatform* aPlatformPtr);
173
189
192 using LinkStateMap = std::map<Address, std::vector<LinkStateData>>;
193 using LinkStateIt = LinkStateMap::iterator;
194
195protected:
199
201 std::set<std::shared_ptr<OSPF_Area>> GetAllAreas();
202
204 void SetRouterRoleType(ProtocolOSPF& aProtocol);
205
209 void VerifyBackboneConnections(const AreaVector& aAreas);
210
216 void InitializeLinkState(const AreaVector& aAreas, graph::Graph& aGraph);
217
222 Address InterfaceInContiguousOSPF(const Address& aDestinationInterface,
223 ProtocolOSPF& aProtocol,
224 std::set<Address>& aCheckedAreas);
225
227 std::set<ProtocolOSPF*> GetAllASBR(ProtocolOSPF& aProtocol, std::set<Address>& aCheckedAreas);
228
235
236
240 std::vector<Address> RouteToBackbone(ProtocolOSPF& aProtocol, const Address& aSendingAddress, double& aCost, size_t& aHops);
241
246 std::vector<Address> RouteFromBackbone(ProtocolOSPF& aProtocol,
247 const Address& aSendingAddress,
248 const Address& aDestinationAddress,
249 double& aCost,
250 size_t& aHops);
251
258 std::pair<std::vector<Address>, Comm*> RouteExternallyASBR(const Message& aMessage);
260
264 std::vector<Address> MyMessage(Message& aMessage) const;
265
266
269 void ScheduleEvent(std::unique_ptr<WsfEvent> aEvent) const;
270
274
275 void SendHello(double aSimTime);
276 void ReceiveHello(double aSimTime,
277 const Address& aReceiverAddress,
278 const std::vector<Address>& aValidAreas,
279 Message& aMessage);
280
281 void SendDR_GraphAdd(double aSimTime, const Address& aReceivingInterface, const std::vector<Address>& aTraceRoute);
282 void ReceiveDR_GraphAdd(double aSimTime,
283 const Address& aReceivingInterface,
284 const std::vector<Address>& aValidAreas,
285 Message& aMessage);
286 void SendDR_GraphDrop(double aSimTime,
287 const Address& aReceivingInterface,
288 const Address& aDroppedInterface,
289 const std::string& aDroppedInterfaceNetwork);
290 void ReceiveDR_GraphDrop(double aSimTime,
291 const Address& aReceivingInterface,
292 const std::vector<Address>& aValidAreas,
293 Message& aMessage);
295
296
300 void DR_GraphAdd(graph::Graph& aGraph, const Address& aReceivingInterface, const std::vector<Address>& aTraceRoute);
301
305 void DR_GraphDrop(graph::Graph& aGraph,
306 const Address& aArea,
307 const Address& aDroppedInterface,
308 const std::string& aDroppedNetwork);
309
310
312 void TimeoutUpdate(double aSimTime, bool aCalledFromEvent);
313
314
315 void AddLinkState(const Address& aAreaAddress, const LinkStateData& aData);
316 LinkStateData* FindLinkState(const Address& aAreaAddress, const Address& aLocalAddress, const Address& aRemoteAddress);
317
320 std::vector<LinkStateData> FindLinkState(const Address& aAreaAddress, const Address& aRemoteAddress);
321 bool RemoveLinkState(const Address& aAreaAddress, const Address& aLocalAddress, const Address& aRemoteAddress);
322
323 const LinkStateMap& GetLinkStates() const { return mLinkStates; }
324 LinkStateMap& GetLinkStates() { return mLinkStates; }
325
326
327private:
328 Address mInputBackbone{};
329 std::vector<Address> mInputAreas{};
330 AreaVector mAreas{};
331 size_t mPriorityDR{std::numeric_limits<size_t>::max()};
332 RouterAreaType mAreaType{RouterAreaType::cNORMAL};
333
335 WsfRandomVariable mHelloInterval{10.0, WsfRandomVariable::cNON_NEGATIVE};
336
338 WsfRandomVariable mHoldTimer{40.0, WsfRandomVariable::cNON_NEGATIVE};
339
345 WsfRandomVariable mRandomInterval{0.0, 0.1, WsfRandomVariable::cNON_NEGATIVE};
346
349 bool mSetup{false};
350
355 AreaGraphMap mGraph{};
356
359 LinkStateMap mLinkStates{};
360
362 std::shared_ptr<int> mContext{nullptr};
363
365 UtCallbackHolder mCallbacks{};
366};
367
392{
393public:
395 using ProtocolVector = std::vector<ProtocolOSPF*>;
396
398 using ProtocolMapDR = std::map<std::string, ProtocolOSPF*>;
399
404 using RemovedNetworkInterfaces = std::map<std::string, std::vector<Address>>;
405
406 OSPF_Area() = default;
407 virtual ~OSPF_Area() = default;
408
409 void SetAddress(const Address& aAddress) { mArea = aAddress; }
410 void SetBackbone(bool aIsBackbone) { mIsBackbone = aIsBackbone; }
411 const Address& GetAddress() const { return mArea; }
412 bool IsBackbone() const { return mIsBackbone; }
413 RemovedNetworkInterfaces& GetRemovedInterfacesDR() { return mRemovedInterfacesDR; }
414 void AddRemovedInterfaceDR(Comm* aInterfacePtr);
415 RemovedNetworkInterfaces& GetRemovedInterfacesBDR() { return mRemovedInterfacesBDR; }
416 void AddRemovedInterfaceBDR(Comm* aInterfacePtr);
417
418 const ProtocolMapDR& GetDRs() const { return mMapDR; }
419 const ProtocolMapDR& GetBDRs() const { return mMapBDR; }
420
421 ProtocolVector& GetProtocols() { return mProtocols; }
422
425 ProtocolVector GetProtocols(const std::string& aNetwork);
426
427 std::set<std::string>& GetNetworks() { return mNetworks; }
428
430 void SetDRs();
431
435 void PlatformDeleted(double aSimTime, WsfPlatform* aPlatformPtr);
436
444 void InitializeGraphData(graph::Graph& aGraph);
445
448 std::vector<std::pair<Comm*, ProtocolOSPF*>> GetInterfaces();
449
461 void ElectionDR(double aSimTime, const std::string aNetwork, const Address& aArea, bool aElectionDR);
462
463 void InitializeCallbacks(WsfSimulation& aSim);
464
468 void SetNetworks();
469
470private:
471 ProtocolMapDR mMapDR{};
472 ProtocolMapDR mMapBDR{};
473 Address mArea{};
474 bool mIsBackbone{false};
475 ProtocolVector mProtocols{};
476 std::set<std::string> mNetworks{};
477 RemovedNetworkInterfaces mRemovedInterfacesDR{};
478 RemovedNetworkInterfaces mRemovedInterfacesBDR{};
479
481 UtCallbackHolder mCallbacks{};
482};
483
484} // namespace router
485} // namespace comm
486} // namespace wsf
487
489
490#endif
#define WSF_DECLARE_COMPONENT_ROLE_TYPE(TYPE, ROLE)
Definition WsfComponentRoles.hpp:44
@ cWSF_COMPONENT_COMM_ROUTER_PROTOCOL_OSPF
Definition WsfComponentRoles.hpp:126
wsf::comm::Address Address
Definition WsfScriptCommRouterClass.cpp:29
#define WSF_EXPORT
Definition WsfXIO_Export.hpp:35
Definition WsfComponent.hpp:39
Platforms represent a entity within the simulation.
Definition WsfPlatform.hpp:115
@ cNON_NEGATIVE
Value must be greater than or equal to zero.
Definition WsfRandomVariable.hpp:50
The main controller for a simulation.
Definition WsfSimulation.hpp:109
Definition WsfCommAddress.hpp:57
Definition WsfComm.hpp:43
Definition WsfCommMessage.hpp:51
Definition WsfCommGraph.hpp:150
Definition WsfCommProtocolOSPF.hpp:392
std::set< std::string > & GetNetworks()
Definition WsfCommProtocolOSPF.hpp:427
std::map< std::string, ProtocolOSPF * > ProtocolMapDR
ProtocolMapDR provides a mapping of networks to their DR/BDR.
Definition WsfCommProtocolOSPF.hpp:398
std::map< std::string, std::vector< Address > > RemovedNetworkInterfaces
Definition WsfCommProtocolOSPF.hpp:404
void SetAddress(const Address &aAddress)
Definition WsfCommProtocolOSPF.hpp:409
void SetBackbone(bool aIsBackbone)
Definition WsfCommProtocolOSPF.hpp:410
std::vector< ProtocolOSPF * > ProtocolVector
ProtocolVector provides a vector of OSPF protocols.
Definition WsfCommProtocolOSPF.hpp:395
RemovedNetworkInterfaces & GetRemovedInterfacesBDR()
Definition WsfCommProtocolOSPF.hpp:415
RemovedNetworkInterfaces & GetRemovedInterfacesDR()
Definition WsfCommProtocolOSPF.hpp:413
const ProtocolMapDR & GetBDRs() const
Definition WsfCommProtocolOSPF.hpp:419
bool IsBackbone() const
Definition WsfCommProtocolOSPF.hpp:412
const Address & GetAddress() const
Definition WsfCommProtocolOSPF.hpp:411
ProtocolVector & GetProtocols()
Definition WsfCommProtocolOSPF.hpp:421
const ProtocolMapDR & GetDRs() const
Definition WsfCommProtocolOSPF.hpp:418
virtual ~OSPF_Area()=default
Definition WsfCommProtocolOSPF.hpp:74
AreaVector & GetAreas()
Definition WsfCommProtocolOSPF.hpp:156
std::vector< std::shared_ptr< OSPF_Area > > AreaVector
Definition WsfCommProtocolOSPF.hpp:83
void VerifyBackboneConnections(const AreaVector &aAreas)
Definition WsfCommProtocolOSPF.cpp:920
WsfComponent * CloneComponent() const override
Definition WsfCommProtocolOSPF.cpp:86
void ReceiveHello(double aSimTime, const Address &aReceiverAddress, const std::vector< Address > &aValidAreas, Message &aMessage)
Definition WsfCommProtocolOSPF.cpp:1009
void ReceiveDR_GraphDrop(double aSimTime, const Address &aReceivingInterface, const std::vector< Address > &aValidAreas, Message &aMessage)
Definition WsfCommProtocolOSPF.cpp:1262
void ReceiveDR_GraphAdd(double aSimTime, const Address &aReceivingInterface, const std::vector< Address > &aValidAreas, Message &aMessage)
Definition WsfCommProtocolOSPF.cpp:1202
void AddLinkState(const Address &aAreaAddress, const LinkStateData &aData)
Definition WsfCommProtocolOSPF.cpp:1392
void SendDR_GraphDrop(double aSimTime, const Address &aReceivingInterface, const Address &aDroppedInterface, const std::string &aDroppedInterfaceNetwork)
Definition WsfCommProtocolOSPF.cpp:1232
LinkStateData * FindLinkState(const Address &aAreaAddress, const Address &aLocalAddress, const Address &aRemoteAddress)
Definition WsfCommProtocolOSPF.cpp:1417
const LinkStateMap & GetLinkStates() const
Definition WsfCommProtocolOSPF.hpp:323
LinkStateMap::iterator LinkStateIt
Definition WsfCommProtocolOSPF.hpp:193
std::set< ProtocolOSPF * > GetAllASBR(ProtocolOSPF &aProtocol, std::set< Address > &aCheckedAreas)
Provides all of the ASBRs in contiguous OSPF areas.
Definition WsfCommProtocolOSPF.cpp:1362
RouterAreaType GetAreaType() const
Definition WsfCommProtocolOSPF.hpp:162
void SendDR_GraphAdd(double aSimTime, const Address &aReceivingInterface, const std::vector< Address > &aTraceRoute)
Definition WsfCommProtocolOSPF.cpp:1169
std::map< Address, std::vector< LinkStateData > > LinkStateMap
Definition WsfCommProtocolOSPF.hpp:192
void * QueryInterface(int aRole) override
Definition WsfCommProtocolOSPF.cpp:108
size_t GetPriorityDR() const
Definition WsfCommProtocolOSPF.hpp:164
const int * GetComponentRoles() const override
Definition WsfCommProtocolOSPF.cpp:92
void SetSetup(bool aSetup)
Definition WsfCommProtocolOSPF.hpp:161
std::set< std::shared_ptr< OSPF_Area > > GetAllAreas()
Convenience method for runtime acquisition of all existing areas.
Definition WsfCommProtocolOSPF.cpp:811
bool IsSetup() const
Definition WsfCommProtocolOSPF.hpp:160
std::map< Address, std::unique_ptr< graph::Graph > > AreaGraphMap
A mapping of an area with the corresponding graph/routing table.
Definition WsfCommProtocolOSPF.hpp:86
static constexpr const char * cOSPF_ALL_HELLO
Definition WsfCommProtocolOSPF.hpp:90
std::vector< Address > MyMessage(Message &aMessage) const
Definition WsfCommProtocolOSPF.cpp:375
static constexpr const char * cOSPF_ALL_DR_DROP
Definition WsfCommProtocolOSPF.hpp:92
Address InterfaceInContiguousOSPF(const Address &aDestinationInterface, ProtocolOSPF &aProtocol, std::set< Address > &aCheckedAreas)
Definition WsfCommProtocolOSPF.cpp:1329
void SetRouterRoleType(ProtocolOSPF &aProtocol)
A method that determines and sets the OSPF router type.
Definition WsfCommProtocolOSPF.cpp:828
const char * GetScriptClassName() const override
Definition WsfCommProtocolOSPF.hpp:119
void SendHello(double aSimTime)
Definition WsfCommProtocolOSPF.cpp:979
const std::vector< Address > & GetInputAreas() const
Definition WsfCommProtocolOSPF.hpp:158
bool ShouldPropagateTruth() const override
Definition WsfCommProtocolOSPF.hpp:152
std::vector< Address > RouteToBackbone(ProtocolOSPF &aProtocol, const Address &aSendingAddress, double &aCost, size_t &aHops)
Definition WsfCommProtocolOSPF.cpp:660
bool RemoveLinkState(const Address &aAreaAddress, const Address &aLocalAddress, const Address &aRemoteAddress)
Definition WsfCommProtocolOSPF.cpp:1464
void InitializeLinkState(const AreaVector &aAreas, graph::Graph &aGraph)
Definition WsfCommProtocolOSPF.cpp:1292
RouterAreaType
Definition WsfCommProtocolOSPF.hpp:97
void DR_GraphDrop(graph::Graph &aGraph, const Address &aArea, const Address &aDroppedInterface, const std::string &aDroppedNetwork)
Definition WsfCommProtocolOSPF.cpp:1108
int GetPriority() const override
Definition WsfCommProtocolOSPF.cpp:123
LinkStateMap & GetLinkStates()
Definition WsfCommProtocolOSPF.hpp:324
static constexpr const char * cOSPF_ALL_DR_ADD
Definition WsfCommProtocolOSPF.hpp:93
void TimeoutUpdate(double aSimTime, bool aCalledFromEvent)
Handles the update of the link state list for checks on dropped interfaces via timeout.
Definition WsfCommProtocolOSPF.cpp:1505
ProtocolVector GetAllOSPF()
Definition WsfCommProtocolOSPF.cpp:788
ProtocolOSPF * Clone() const override
Definition WsfCommProtocolOSPF.cpp:102
const Address & GetInputBackbone() const
Definition WsfCommProtocolOSPF.hpp:159
void SetAreaType(RouterAreaType aType)
Definition WsfCommProtocolOSPF.hpp:163
void DR_GraphAdd(graph::Graph &aGraph, const Address &aReceivingInterface, const std::vector< Address > &aTraceRoute)
Definition WsfCommProtocolOSPF.cpp:1071
std::vector< ProtocolOSPF * > ProtocolVector
ProtocolVector provides a vector of OSPF protocols.
Definition WsfCommProtocolOSPF.hpp:77
static constexpr const char * cOSPF_ALL_DROP
Definition WsfCommProtocolOSPF.hpp:91
std::vector< Address > RouteFromBackbone(ProtocolOSPF &aProtocol, const Address &aSendingAddress, const Address &aDestinationAddress, double &aCost, size_t &aHops)
Definition WsfCommProtocolOSPF.cpp:582
void ScheduleEvent(std::unique_ptr< WsfEvent > aEvent) const
Definition WsfCommProtocolOSPF.cpp:1492
~ProtocolOSPF() override=default
std::pair< std::vector< Address >, Comm * > RouteExternallyASBR(const Message &aMessage)
Definition WsfCommProtocolOSPF.cpp:734
Definition WsfCommRouter.hpp:60
Definition WsfCommRouter.hpp:55
Definition WsfComm.hpp:36
Definition WsfComm.cpp:34
Function definitions for those who need run-time access to the version.
Definition WsfComm.cpp:32
Definition WsfCommProtocolOSPF.hpp:182
std::string mRemoteNetwork
Definition WsfCommProtocolOSPF.hpp:186
Address mLocalInterface
Definition WsfCommProtocolOSPF.hpp:183
Address mRemoteInterface
Definition WsfCommProtocolOSPF.hpp:184
std::string mLocalNetwork
Definition WsfCommProtocolOSPF.hpp:185
double mLastUpdateTime
Definition WsfCommProtocolOSPF.hpp:187
Copyrights Multiple, All Rights Reserved