WSF
WsfCommNetworkManager.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 2017 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 WSFCOMMNETWORKMANAGER_HPP
13#define WSFCOMMNETWORKMANAGER_HPP
14
15#include "wsf_export.h"
16
17#include <map>
18#include <memory>
19#include <set>
20#include <unordered_map>
21#include <unordered_set>
22#include <vector>
23
24#include "UtCallback.hpp"
25#include "UtCallbackHolder.hpp"
26#include "UtMemory.hpp"
27#include "WsfComm.hpp"
28#include "WsfCommAddress.hpp"
29#include "WsfCommGraph.hpp"
30#include "WsfCommNetwork.hpp"
32class WsfPlatform;
33class WsfSimulation;
35#include "WsfSimulation.hpp"
37
38namespace wsf
39{
40namespace comm
41{
42
44{
45public:
46 enum class NetworkTopology
47 {
48 cPOINT_TO_POINT,
49 cMESH,
50 cSTAR,
51 cRING,
52 cDIRECTED_RING
53 };
54
55 struct CommHash
56 {
57 size_t operator()(Comm* aCommPtr) const noexcept { return std::hash<unsigned int>()(aCommPtr->GetUniqueId()); }
58 };
59
61 using CommMap = std::unordered_map<Address, Comm*>; // Address -> Comm
62 using AddressMap = std::unordered_map<Comm*, Address, CommHash>; // Comm.GetUniqueId -> Address
63 using AddressSet = std::unordered_set<Address>;
64 using NetworkSet = std::set<Address>;
65 using AddressNetworkMap = std::unordered_map<Address, std::string>; // Address -> Network Name
66 using NetworkMap = std::unordered_map<std::string, std::unique_ptr<Network>>; // Network name -> Network
67 using AddressVector = std::vector<Address>; // A vector of Addresses
68 using MultiAddressMap = std::unordered_map<Address, AddressVector>; // A mapping of an address to multiple addresses
69 using CommVector = std::vector<Comm*>;
70 using RouterVector = std::vector<router::Router*>;
71
72 static NetworkManager* Find(const WsfSimulation& aSimulation);
73
75
77 ~NetworkManager() override = default;
78 NetworkManager(const NetworkManager& aSrc) = delete;
79 NetworkManager& operator=(const NetworkManager& aSrc) = delete;
83
86
87 bool Initialize() override;
88 bool PlatformsInitialized() override;
89 void PendingStart() override;
91
93
94
96 const Address* GetAddress(Comm* aCommPtr) const;
97
99 Comm* GetComm(const Address& aAddress) const;
100
102 Network* GetNetwork(const std::string& aNetworkName) const;
103
105 bool IsCommManaged(Comm* aCommPtr) const;
106
108 bool IsAddressManaged(const Address& aAddress) const;
109
111 bool IsNetworkManaged(const std::string& aNetworkName) const;
112
114 std::vector<std::string> GetManagedNetworks() const;
115
117 const Address* GetManagingNetworkAddress(const Address& aAddress) const;
118
120 bool IsNetworkAddressManaged(const Address& aAddress) const;
121
123 std::string GetNetworkNameFromAddress(const Address& aAddress) const;
124
126 AddressSet GetAddressesInNetwork(const std::string& aNetworkName) const;
127
129 AddressSet GetComms() const;
130
133
135 bool PathExists(const Address& aSourceAddress, const Address& aDestinationAddress) const;
136
138 bool HasMulticastMember(const Address& aMulticastAddress, const std::string& aNetworkName) const;
139
141 AddressSet GetMulticastMembers(const Address& aMulticastAddress, const std::string& aNetworkName) const;
142
144 AddressSet GetMulticastMembers(const Address& aMulticastAddress) const;
145
147 bool IsMulticastManaged(const Address& aMulticastAddress) const;
149
154 void AddManagedComm(Comm* aCommPtr) { mComms.push_back(aCommPtr); }
155
160 void AddManagedRouter(router::Router* aRouterPtr) { mRouters.push_back(aRouterPtr); }
161
176
177 Address AddComm(double aSimTime, Comm* aCommPtr, std::string& aNetworkName, bool aNotifyObserver = true);
178
179 std::string AddComm(double aSimTime, Comm* aCommPtr, const Address& aAddress, bool aNotifyObserver = true);
181
185
186 void RemoveComm(double aSimTIme, Comm* aCommPtr, bool aNotifyObserver = true);
187 void RemoveComm(double aSimTime, const Address& aAddress, bool aNotifyObserver = true);
189
194
195 bool AddNetwork(double aSimTime, std::unique_ptr<Network> aNetwork, bool aSuppressReservedCheck = false);
197
203 void RemoveNetwork(double aSimTime, const std::string& aNetworkName);
204
207
208 bool EnableComm(double aSimTime, Comm* aCommPtr);
209 bool EnableComm(double aSimTime, const Address& aAddress);
211
214
215 bool DisableComm(double aSimTime, Comm* aCommPtr);
216 bool DisableComm(double aSimTime, const Address& aAddress);
218
221
222 bool AddConnection(double aSimTime, Comm* aSourceCommPtr, Comm* aDestinationCommPtr, bool aNotifyObserver = true);
223 bool AddConnection(double aSimTime,
224 const Address& aSourceAddress,
225 const Address& aDestinationAddress,
226 bool aNotifyObserver = true);
228
231
232 bool RemoveConnection(double aSimTime, Comm* aSourceCommPtr, Comm* aDestinationCommPtr, bool aNotifyObserver = true);
233 bool RemoveConnection(double aSimTime,
234 const Address& aSourceAddress,
235 const Address& aDestinationAddress,
236 bool aNotifyObserver = true);
238
241
242 bool EnableConnection(double aSimTime, Comm* aSourceCommPtr, Comm* aDestinationCommPtr, bool aNotifyObserver = true);
243 bool EnableConnection(double aSimTime,
244 const Address& aSourceAddress,
245 const Address& aDestinationAddress,
246 bool aNotifyObserver = true);
248
251
252 bool DisableConnection(double aSimTime, Comm* aSourceCommPtr, Comm* aDestinaationCommPtr, bool aNotifyObserver = true);
253 bool DisableConnection(double aSimTime,
254 const Address& aSourceAddress,
255 const Address& aDestinationAddress,
256 bool aNotifyObserver = true);
257
258 bool AddMulticastMember(double aSimTime, const Address& aMulticastAddress, const Address& aJoiningMember);
259
260 bool RemoveMulticastMember(double aSimTime, const Address& aMulticastAddress, const Address& aLeavingMember);
262
265 bool RemoveNetworkConnections(double aSimTime, const std::string& aNetworkName, bool aNotifyObserver = true);
266
271 void ManageComm(double aSimTime,
272 Comm* aCommPtr,
273 const std::string& aNetworkName,
274 const Address& aAddress,
275 const Address& aNetworkAddress);
276
282 void InitializeUserLinks(double aSimTime, Comm* aCommPtr);
283
286 void Clear();
287
291 WsfSimulation* GetSimulation() const { return mSimulationPtr; }
292
294
295 void PlatformDeleted(double aSimTime, WsfPlatform* aPlatform);
296 void PlatformInitialized(double aSimTime, WsfPlatform* aPlatform);
298
300 const ReservedAddressing& GetReservedAddresses() const { return mReservedAddresses; }
301
309
310 UtCallbackListN<void(double, Comm*)> CommAdded{};
311 UtCallbackListN<void(double, Comm*)> CommRemoved{};
312 UtCallbackListN<void(double, Network*)> NetworkAdded{};
313 UtCallbackListN<void(double, Network*)> NetworkRemoved{};
314 UtCallbackListN<void(double, Comm*)> CommEnabled{};
315 UtCallbackListN<void(double, Comm*)> CommDisabled{};
316 UtCallbackListN<void(double, const Address&, const Address&)> ConnectionAdded{};
317 UtCallbackListN<void(double, const Address&, const Address&)> ConnectionRemoved{};
318 UtCallbackListN<void(double, const Address&, const Address&)> ConnectionEnabled{};
319 UtCallbackListN<void(double, const Address&, const Address&)> ConnectionDisabled{};
320
322 UtCallbackListN<void()> CommFrameworkPendingStart{};
323
325 UtCallbackListN<void(double, WsfPlatform*)> CommFrameworkPlatformInitialized{};
326
328 UtCallbackListN<void(double, WsfPlatform*)> CommFrameworkPlatformDeleted{};
330
331private:
333 WsfSimulation* mSimulationPtr;
334
336 CommMap mAddressToCommMap;
337 AddressMap mCommToAddressMap;
338
340 AddressNetworkMap mAddressToNetworkMap;
341
343 NetworkMap mNetworkMap;
344
346 NetworkSet mNetworkAddressSet;
347
354 graph::Graph mGraph;
355
359 UtCallbackHolder mCallbacks;
360
364 ReservedAddressing mReservedAddresses;
365
369 MultiAddressMap mMulticastMap;
370
373 CommVector mComms;
374
376 RouterVector mRouters;
377};
378
380{
381public:
382 void SimulationCreated(WsfSimulation& aSimulation) override
383 {
384 aSimulation.RegisterExtension(GetExtensionName(), ut::make_unique<NetworkManager>(&aSimulation));
385 }
386};
387
388} // namespace comm
389} // namespace wsf
390
391#endif
#define WSF_EXPORT
Definition WsfXIO_Export.hpp:35
const std::string & GetExtensionName() const
Definition WsfExtension.hpp:31
Platforms represent a entity within the simulation.
Definition WsfPlatform.hpp:115
WsfScenarioExtension()
Definition WsfScenarioExtension.cpp:21
WsfSimulationExtension()
Definition WsfSimulationExtension.cpp:23
friend class WsfSimulation
Definition WsfSimulationExtension.hpp:43
The main controller for a simulation.
Definition WsfSimulation.hpp:109
void RegisterExtension(const std::string &aName, std::unique_ptr< WsfSimulationExtension > aExtensionPtr)
Definition WsfSimulation.cpp:1554
Definition WsfCommAddress.hpp:57
Definition WsfComm.hpp:43
Definition WsfCommNetworkManager.hpp:380
void SimulationCreated(WsfSimulation &aSimulation) override
Definition WsfCommNetworkManager.hpp:382
std::unordered_map< Address, Comm * > CommMap
Definitions of commonly used container types.
Definition WsfCommNetworkManager.hpp:61
AddressSet GetAddressesInNetwork(const std::string &aNetworkName) const
Get a list of all addresses associated with a network.
Definition WsfCommNetworkManager.cpp:694
bool IsMulticastManaged(const Address &aMulticastAddress) const
True if a multicast address being utilized/managed.
Definition WsfCommNetworkManager.cpp:1616
UtCallbackListN< void(double, const Address &, const Address &)> ConnectionEnabled
Definition WsfCommNetworkManager.hpp:318
UtCallbackListN< void(double, const Address &, const Address &)> ConnectionAdded
Definition WsfCommNetworkManager.hpp:316
UtCallbackListN< void(double, const Address &, const Address &)> ConnectionRemoved
Definition WsfCommNetworkManager.hpp:317
Network * GetNetwork(const std::string &aNetworkName) const
Provides Network object for a network name.
Definition WsfCommNetworkManager.cpp:572
UtCallbackListN< void(double, Network *)> NetworkRemoved
Definition WsfCommNetworkManager.hpp:313
std::vector< std::string > GetManagedNetworks() const
Returns the names of all managed networks.
Definition WsfCommNetworkManager.cpp:615
NetworkManager(const NetworkManager &aSrc)=delete
NetworkManager(NetworkManager &&aSrc)=delete
Comm * GetComm(const Address &aAddress) const
Provides Comm object for an Address.
Definition WsfCommNetworkManager.cpp:561
AddressSet GetComms() const
Returns all registered comms in the simulation.
Definition WsfCommNetworkManager.cpp:1623
~NetworkManager() override=default
void PendingStart() override
Definition WsfCommNetworkManager.cpp:360
UtCallbackListN< void(double, WsfPlatform *)> CommFrameworkPlatformInitialized
Filtered PlatformInitialized event, called after the comm framework has processed this platform.
Definition WsfCommNetworkManager.hpp:325
std::unordered_map< Comm *, Address, CommHash > AddressMap
Definition WsfCommNetworkManager.hpp:62
bool Initialize() override
Definition WsfCommNetworkManager.cpp:57
std::unordered_map< Address, AddressVector > MultiAddressMap
Definition WsfCommNetworkManager.hpp:68
bool IsNetworkManaged(const std::string &aNetworkName) const
True if network with name provided present.
Definition WsfCommNetworkManager.cpp:605
NetworkTopology
Definition WsfCommNetworkManager.hpp:47
UtCallbackListN< void()> CommFrameworkPendingStart
Allows indication that the comm framework is fully set up.
Definition WsfCommNetworkManager.hpp:322
UtCallbackListN< void(double, Network *)> NetworkAdded
Definition WsfCommNetworkManager.hpp:312
graph::Graph & GetGraph()
Get the graph representation of all comm networks in AFSIM (perfect knowledge).
Definition WsfCommNetworkManager.cpp:717
bool IsAddressManaged(const Address &aAddress) const
True if Address object present.
Definition WsfCommNetworkManager.cpp:594
NetworkManager & operator=(const NetworkManager &aSrc)=delete
bool PlatformsInitialized() override
Definition WsfCommNetworkManager.cpp:87
UtCallbackListN< void(double, Comm *)> CommRemoved
Definition WsfCommNetworkManager.hpp:311
std::vector< Comm * > CommVector
Definition WsfCommNetworkManager.hpp:69
void AddManagedRouter(router::Router *aRouterPtr)
Definition WsfCommNetworkManager.hpp:160
std::vector< Address > AddressVector
Definition WsfCommNetworkManager.hpp:67
std::unordered_map< Address, std::string > AddressNetworkMap
Definition WsfCommNetworkManager.hpp:65
void AddManagedComm(Comm *aCommPtr)
Definition WsfCommNetworkManager.hpp:154
UtCallbackListN< void(double, const Address &, const Address &)> ConnectionDisabled
Definition WsfCommNetworkManager.hpp:319
const Address * GetManagingNetworkAddress(const Address &aAddress) const
Returns the address of the network that the provided address belongs to.
Definition WsfCommNetworkManager.cpp:637
std::string GetNetworkNameFromAddress(const Address &aAddress) const
Get name of network associated with an Address.
Definition WsfCommNetworkManager.cpp:683
bool HasMulticastMember(const Address &aMulticastAddress, const std::string &aNetworkName) const
Returns true if the network has a comm subscribed to the provided multicast address.
Definition WsfCommNetworkManager.cpp:1493
UtCallbackListN< void(double, WsfPlatform *)> CommFrameworkPlatformDeleted
Filtered PlatformDeleted event, called prior to the comm framework removing this platform.
Definition WsfCommNetworkManager.hpp:328
std::vector< router::Router * > RouterVector
Definition WsfCommNetworkManager.hpp:70
std::unordered_set< Address > AddressSet
Definition WsfCommNetworkManager.hpp:63
UtCallbackListN< void(double, Comm *)> CommAdded
Definition WsfCommNetworkManager.hpp:310
const ReservedAddressing & GetReservedAddresses() const
Accessor for reserved addressing object.
Definition WsfCommNetworkManager.hpp:300
std::unordered_map< std::string, std::unique_ptr< Network > > NetworkMap
Definition WsfCommNetworkManager.hpp:66
WsfSimulation * GetSimulation() const
Definition WsfCommNetworkManager.hpp:291
AddressSet GetMulticastMembers(const Address &aMulticastAddress, const std::string &aNetworkName) const
Returns the members of a network subscribed to a multicast address.
Definition WsfCommNetworkManager.cpp:1573
const Address * GetAddress(Comm *aCommPtr) const
Accessors.
Definition WsfCommNetworkManager.cpp:550
NetworkManager & operator=(NetworkManager &&aSrc)=delete
bool PathExists(const Address &aSourceAddress, const Address &aDestinationAddress) const
Simple check of pathing from source to destination.
Definition WsfCommNetworkManager.cpp:1635
UtCallbackListN< void(double, Comm *)> CommDisabled
Definition WsfCommNetworkManager.hpp:315
bool IsCommManaged(Comm *aCommPtr) const
True if Comm object present.
Definition WsfCommNetworkManager.cpp:583
UtCallbackListN< void(double, Comm *)> CommEnabled
Definition WsfCommNetworkManager.hpp:314
std::set< Address > NetworkSet
Definition WsfCommNetworkManager.hpp:64
static NetworkManager * Find(const WsfSimulation &aSimulation)
Definition WsfCommNetworkManager.cpp:34
bool IsNetworkAddressManaged(const Address &aAddress) const
True if network address provided overlaps with a currently assigned network address.
Definition WsfCommNetworkManager.cpp:627
NetworkManager(WsfSimulation *aSimPtr)
Constructors and Operator Overloads.
Definition WsfCommNetworkManager.cpp:40
Definition WsfCommNetwork.hpp:51
Definition WsfCommReservedAddressing.hpp:109
Definition WsfCommGraph.hpp:150
Definition WsfCommRouter.hpp:55
Definition WsfComm.cpp:34
Function definitions for those who need run-time access to the version.
Definition WsfComm.cpp:32
Definition WsfCommNetworkManager.hpp:56
size_t operator()(Comm *aCommPtr) const noexcept
Definition WsfCommNetworkManager.hpp:57
Copyrights Multiple, All Rights Reserved