WSF
WsfCommProtocolRIPv2.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 WSFCOMMPROTOCOLRIPV2_HPP
13#define WSFCOMMPROTOCOLRIPV2_HPP
14
15#include <cstdint>
16#include <sstream>
17#include <vector>
18
19#include "UtInput.hpp"
20#include "WsfCommAddress.hpp"
21#include "WsfCommMessage.hpp"
23#include "WsfEvent.hpp"
24
25namespace wsf
26{
27namespace comm
28{
29namespace router
30{
31namespace rip
32{
33
34class IPv4
35{
36public:
37 constexpr IPv4() noexcept = default;
38
39 constexpr IPv4(std::uint8_t a, std::uint8_t b, std::uint8_t c, std::uint8_t d) noexcept
40 : mData{{a, b, c, d}}
41 {
42 }
43
44 explicit constexpr IPv4(std::uint32_t aVal) noexcept
45 : mData{{static_cast<std::uint8_t>((aVal >> 24) & 0xFF),
46 static_cast<std::uint8_t>((aVal >> 16) & 0xFF),
47 static_cast<std::uint8_t>((aVal >> 8) & 0xFF),
48 static_cast<std::uint8_t>(aVal & 0xFF)}}
49 {
50 }
51
52 std::string to_string() const
53 {
54 std::stringstream str;
55 str << std::to_string(mData[0]) << '.' << std::to_string(mData[1]) << '.' << std::to_string(mData[2]) << '.'
56 << std::to_string(mData[3]);
57 return str.str();
58 }
59
60 constexpr std::uint32_t to_uint32() const noexcept
61 {
62 return static_cast<std::uint32_t>(mData[0] << 24) | static_cast<std::uint32_t>(mData[1] << 16) |
63 static_cast<std::uint32_t>(mData[2] << 8) | static_cast<std::uint32_t>(mData[3]);
64 }
65
66 bool operator==(const IPv4& rhs) const noexcept { return mData == rhs.mData; }
67
68 bool operator!=(const IPv4& rhs) const noexcept { return !(*this == rhs); }
69
70 constexpr bool operator<(const IPv4& rhs) const noexcept { return to_uint32() < rhs.to_uint32(); }
71
72 constexpr bool operator>(const IPv4& rhs) const noexcept { return to_uint32() > rhs.to_uint32(); }
73
74private:
75 std::array<std::uint8_t, 4> mData{{0, 0, 0, 0}};
76};
77
78constexpr IPv4 operator|(const IPv4& lhs, const IPv4& rhs) noexcept
79{
80 return IPv4{lhs.to_uint32() | rhs.to_uint32()};
81}
82
83constexpr IPv4 operator&(const IPv4& lhs, const IPv4& rhs) noexcept
84{
85 return IPv4{lhs.to_uint32() & rhs.to_uint32()};
86}
87
88WSF_EXPORT std::ostream& operator<<(std::ostream& out, const IPv4& ip);
89
90WSF_EXPORT std::istream& operator>>(std::istream& in, IPv4& ip);
91
92constexpr size_t cINFINITY = 16;
93constexpr IPv4 cRIP_MULTICAST_ADDR = IPv4{224, 0, 0, 9};
94
96{
97 std::uint16_t addressFamilyIdentifier{2};
98 std::uint16_t routeTag{0};
99 std::uint32_t address{0};
100 std::uint32_t subnetMask{0};
101 std::uint32_t nextHop{0};
102 std::uint64_t metric{1};
103};
104
105enum class Command : std::int8_t
106{
107 Request = 0x01,
108 Response = 0x02
109};
110
112{
114 std::uint8_t version{2};
115 std::uint16_t mustBeZero{0};
116 std::vector<Entry> entries{};
117};
118
120bool WSF_EXPORT isFullTableRequest(const Message& aMsg);
121
123{
124public:
125 static constexpr const char* cRIP_DATAGRAM = "RIP_datagram";
126 static constexpr const char* cRIP_MESSAGE = "RIP_MESSAGE";
127
128 RIPv2() = default;
129 RIPv2(const RIPv2& aSrc);
130 RIPv2(RIPv2&&) = default;
131 RIPv2& operator=(RIPv2&&) = default;
132 ~RIPv2() override = default;
133
134 WsfComponent* CloneComponent() const override { return Clone(); }
135 const int* GetComponentRoles() const override;
136 void* QueryInterface(int aRole) override;
137
138 bool ProcessInput(UtInput& aInput) override;
139 bool Initialize(double aSimTime) override;
140
141 RIPv2* Clone() const override { return new RIPv2(*this); }
142
143 void TurnOn(double aSimTime, Router* aRouterPtr);
144
145 bool ShouldPropagateTruth() const override { return false; }
146 graph::Graph* GetGraph() const override { return nullptr; }
147 int GetPriority() const override;
148
149 std::vector<Address> Routing(double aSimTime,
150 const Address& aSendingInterface,
151 size_t& aHopNumber,
152 double& aCost,
153 const wsf::comm::Message& aMessage) override;
154
155 bool Send(double aSimTime, Router::SendData& aData) override;
156
157 bool Receive(double aSimTime, const Address& aReceivingInterface, wsf::comm::Message& aMessage, bool& aOverrideForward) override;
158
159
160private:
161 void MessageReceived(double aSimTime,
162 const Address& aSrcAddr,
163 const Address& aReceivingInterface,
164 const router::rip::Message& aRIPMsg);
165 void RequestReceived(double aSimTime,
166 const Address& aSrcAddr,
167 const Address& aReceivingInterface,
168 const router::rip::Message& aRIPMsg);
169 void ResponseReceived(double aSimTime,
170 const Address& aSrcAddr,
171 const Address& aReceivingInterface,
172 const router::rip::Message& aRIPMsg);
173
174 Message GenerateResponse(double aSimTime, const Address& aSrcAddr, bool aFullTable) const;
175 Message GenerateFullTableResponse(double aSimTime, const Address& aSrcAddr) const;
176 Message GenerateSpecificEntryResponse(double aSimTime, const Address& aSrcAddr, const router::rip::Message& aRIPMsg) const;
177
178 void SendUpdate(double aSimTime, bool aTriggered);
179 void SendExpiredNotification(double aSimTime, const IPv4& route) const;
180 void SendRIPMessage(double aSimTime, const Address& aSource, const Address& aDest, const Message& aResponse) const;
181 std::uint64_t GetCost(const IPv4& aAddress) const;
182 bool HasUpdates() const;
183 void ScheduleEvent(std::unique_ptr<WsfEvent> aEvent) const;
184 double GetRandomValue(double min, double max) const;
185
186 // These items are for the type definition:
187 double mUpdateTimeOut{30.0};
188 double mInvalidationTimeout{180.0};
189 double mGarbageCollectionTimeOut{120.0};
190 bool mPoisonedReverse{true};
191
192 struct IPEntry
193 {
194 IPv4 subnetMask{255, 255, 255, 0};
195 IPv4 gateway{0};
196 std::uint64_t metric{router::rip::cINFINITY};
197 double lastSeen{0.0};
198 bool staticRoute{false};
199 bool valid{true};
200 bool changed{false};
201 };
202
203 // These items are for the instances of the protocol
204 std::map<IPv4, IPEntry> mTable{};
205 double mLastTimeOut{std::numeric_limits<double>::max()};
206 bool mTriggeredUpdatedPending{false};
207 std::shared_ptr<int> mContext{nullptr};
208
209 // Callback for router activation
210 UtCallbackHolder mCallbacks{};
211};
212
213} // namespace rip
214} // namespace router
215} // namespace comm
216} // namespace wsf
217
218#endif
#define WSF_EXPORT
Definition WsfXIO_Export.hpp:35
Definition WsfComponent.hpp:39
Definition WsfCommAddress.hpp:57
Definition WsfCommMessage.hpp:51
Definition WsfCommGraph.hpp:150
Definition WsfCommRouter.hpp:60
Definition WsfCommRouter.hpp:55
Definition WsfCommProtocolRIPv2.hpp:35
constexpr IPv4(std::uint32_t aVal) noexcept
Definition WsfCommProtocolRIPv2.hpp:44
constexpr IPv4() noexcept=default
std::string to_string() const
Definition WsfCommProtocolRIPv2.hpp:52
constexpr bool operator>(const IPv4 &rhs) const noexcept
Definition WsfCommProtocolRIPv2.hpp:72
bool operator==(const IPv4 &rhs) const noexcept
Definition WsfCommProtocolRIPv2.hpp:66
constexpr std::uint32_t to_uint32() const noexcept
Definition WsfCommProtocolRIPv2.hpp:60
constexpr bool operator<(const IPv4 &rhs) const noexcept
Definition WsfCommProtocolRIPv2.hpp:70
bool operator!=(const IPv4 &rhs) const noexcept
Definition WsfCommProtocolRIPv2.hpp:68
RIPv2 & operator=(RIPv2 &&)=default
static constexpr const char * cRIP_MESSAGE
Definition WsfCommProtocolRIPv2.hpp:126
~RIPv2() override=default
RIPv2 * Clone() const override
Definition WsfCommProtocolRIPv2.hpp:141
graph::Graph * GetGraph() const override
Definition WsfCommProtocolRIPv2.hpp:146
static constexpr const char * cRIP_DATAGRAM
Definition WsfCommProtocolRIPv2.hpp:125
bool ShouldPropagateTruth() const override
Definition WsfCommProtocolRIPv2.hpp:145
WsfComponent * CloneComponent() const override
Definition WsfCommProtocolRIPv2.hpp:134
Template specialization for wsf::comm::Address. Allows usage of Address in std::unordered_map/set.
Definition WsfCommAddress.hpp:185
Definition WsfCommProtocolRIPv2.cpp:34
constexpr IPv4 operator&(const IPv4 &lhs, const IPv4 &rhs) noexcept
Definition WsfCommProtocolRIPv2.hpp:83
Message CreateFullTableRequest()
Definition WsfCommProtocolRIPv2.cpp:62
std::ostream & operator<<(std::ostream &out, const IPv4 &ip)
Definition WsfCommProtocolRIPv2.cpp:39
bool isFullTableRequest(const Message &aMsg)
Definition WsfCommProtocolRIPv2.cpp:72
std::istream & operator>>(std::istream &in, IPv4 &ip)
Definition WsfCommProtocolRIPv2.cpp:45
Command
Definition WsfCommProtocolRIPv2.hpp:106
@ Request
Definition WsfCommProtocolRIPv2.hpp:107
@ Response
Definition WsfCommProtocolRIPv2.hpp:108
constexpr IPv4 cRIP_MULTICAST_ADDR
Definition WsfCommProtocolRIPv2.hpp:93
constexpr IPv4 operator|(const IPv4 &lhs, const IPv4 &rhs) noexcept
Definition WsfCommProtocolRIPv2.hpp:78
constexpr size_t cINFINITY
Definition WsfCommProtocolRIPv2.hpp:92
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 WsfCommAddress.hpp:35
Definition WsfCommProtocolRIPv2.hpp:96
std::uint16_t routeTag
Definition WsfCommProtocolRIPv2.hpp:98
std::uint32_t subnetMask
Definition WsfCommProtocolRIPv2.hpp:100
std::uint16_t addressFamilyIdentifier
Definition WsfCommProtocolRIPv2.hpp:97
std::uint64_t metric
Definition WsfCommProtocolRIPv2.hpp:102
std::uint32_t address
Definition WsfCommProtocolRIPv2.hpp:99
std::uint32_t nextHop
Definition WsfCommProtocolRIPv2.hpp:101
Definition WsfCommProtocolRIPv2.hpp:112
Command command
Definition WsfCommProtocolRIPv2.hpp:113
std::vector< Entry > entries
Definition WsfCommProtocolRIPv2.hpp:116
std::uint16_t mustBeZero
Definition WsfCommProtocolRIPv2.hpp:115
std::uint8_t version
Definition WsfCommProtocolRIPv2.hpp:114
Copyrights Multiple, All Rights Reserved