DESERT 4.0.0
uwmulti-multiphy-controller.h
Go to the documentation of this file.
1//
2// Copyright (c) 2014 Regents of the SIGNET lab, University of Padova.
3// All rights reserved.
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions
7// are met:
8// 1. Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10// 2. Redistributions in binary form must reproduce the above copyright
11// notice, this list of conditions and the following disclaimer in the
12// documentation and/or other materials provided with the distribution.
13// 3. Neither the name of the University of Padova (SIGNET lab) nor the
14// names of its contributors may be used to endorse or promote products
15// derived from this software without specific prior written permission.
16//
17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
21// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
24// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
27// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
38#ifndef UWMULTI_MULTIPHY_CONTROLLER_H
39#define UWMULTI_MULTIPHY_CONTROLLER_H
40
41#include <map>
42#include <module.h>
43#include <packet.h>
44#include <queue>
45#include <rng.h>
46#include <tclcl.h>
47#include <uwcbr-module.h>
48#include <uwip-module.h>
49#include <uwmulti-cmn-hdr.h>
50#include <vector>
51
52#include <climits>
53#include <cmath>
54#include <iostream>
55#include <limits>
56#include <string.h>
57
58std::string
59printType(packet_t ptype)
60{
61 if (ptype == PT_UWMULTIPHY_DATA) {
62 return "PT_UWMULTIPHY_DATA";
63 }
64 if (ptype == PT_UWMULTIPHY_PING) {
65 return "PT_UWMULTIPHY_PING";
66 }
67 if (ptype == PT_UWMULTIPHY_PONG) {
68 return "PT_UWMULTIPHY_PONG";
69 }
70 return "Unknown packet";
71}
72
74
75std::ostream &
76operator<<(std::ostream &o, LinkStatus s)
77{
78 switch (s) {
79 case LINK_UNKNOWN:
80 return o << "LINK_UNKNOWN";
81 case LINK_OK:
82 return o << "LINK_OK";
83 case LINK_PROBING:
84 return o << "LINK_PROBING";
85 default:
86 return o << "(invalid value)";
87 }
88}
89
90// connection between local application and local MAC layer
94
95 bool
97 {
98 return trafficType == o.trafficType && localMacID == o.localMacID;
99 }
100
101 bool
102 operator<(const LocalConnection &o) const
103 {
104 // this total order relationship has no actual meaning, only needed
105 // to use struct as key in a map
107 }
108
109 friend std::ostream &
110 operator<<(std::ostream &os, const LocalConnection &c)
111 {
112 os << "<LocalConnection(trafficType=" << c.trafficType << ","
113 << "localMacID=" << c.localMacID << ")>";
114 return os;
115 }
116};
117
118// connection between local MAC layer and remote destination IP
122
123 bool
125 {
126 return remoteIP == o.remoteIP && localMacID == o.localMacID;
127 }
128
129 bool
130 operator<(const RemoteConnection &o) const
131 {
132 // this total order relationship has no actual meaning, only needed
133 // to use struct as key in a map
134 return remoteIP < o.remoteIP || localMacID < o.localMacID;
135 }
136
137 friend std::ostream &
138 operator<<(std::ostream &os, const RemoteConnection &c)
139 {
140 os << "<RemoteConnection(localMacID=" << c.localMacID << ","
141 << "remoteIP=" << c.remoteIP << ")>";
142 return os;
143 }
144};
145
147{
148private:
150
151 //* default priority for each MAC
152 std::map<int, int> defaultPriorities;
153
154 //* custom priority for a given (local) traffic on each available MAC module
155 std::map<LocalConnection, int> customPriorities;
156
157public:
158 PriorityMap();
159
160 PriorityMap(int debug_);
161
168 void addCustomPriority(LocalConnection c, int priority);
169
176 void setDefaultPriority(int macID, int priority);
177
186
187 friend std::ostream &operator<<(std::ostream &, const PriorityMap &);
188};
189
193class UwMultiPhyControl : public Module
194{
195private:
197
198 // characterize current node
200 std::vector<int> macIDs;
201
202 std::queue<Packet *> packet_queue;
203
204 //* each MAC state gets LINK_UNKNOWN after a timeout
205 class ResilienceTimer;
206 std::map<int, double> resilienceTimeouts;
207 std::map<RemoteConnection, ResilienceTimer> resilienceTimers;
208
209 //* each MAC state gets probed again after a timeout
210 class ProbeTimer;
211
212 std::map<int, double> probeTimeouts;
213 std::map<RemoteConnection, ProbeTimer> probeTimers;
214
215 // encode here how to choose the MAC for an application that
216 // wants to communicate to a remote destination
218
219 std::map<RemoteConnection, int> linkStatuses;
220
224 std::map<int, int> macResilience;
225
226 std::map<int, int> macTclIdLayerId;
227
228 void initialize();
229
230 int getBestMacID(int trafficType, int remoteIP);
231
233
235 void recvFromUpperLayers(Packet *p);
236
237 void recvFromLowerLayers(Packet *p, int macID);
238
239public:
244
249 {
250 }
251
252 virtual int command(int, const char *const *);
253
254 void recv(Packet *p);
255
256 void recv(Packet *p, int idSrc);
257
258 // timer classes
259private:
260 class ResilienceTimer : public TimerHandler
261 {
262 private:
263 UwMultiPhyControl *module;
266
271 virtual void expire(Event *e);
272
273 public:
274 // default constructor is needed to be value of a map
275 // set meaningless values then
277 : TimerHandler()
278 {
279 this->module = NULL;
280
282 c.localMacID = 0;
283 c.remoteIP = 0;
284
285 this->conn = c;
286 };
287
289 : TimerHandler()
290 {
291 this->module = m;
292 this->conn = c;
293 if (this->module != NULL && this->module->debug_ >= 3) {
294 std::cout << NOW
295 << "::UwMultiPhyControl::ResilienceTimer::constructor"
296 << "::localIP(" << this->module->localIP << ")"
297 << "::localMAC(" << this->conn.localMacID << ")"
298 << "::remoteIP(" << this->conn.remoteIP << ")"
299 << std::endl;
300 }
301 }
303 {
304 if (this->module != NULL && this->module->debug_ >= 3) {
305 std::cout << NOW
306 << "::UwMultiPhyControl::ResilienceTimer::destructor"
307 << "::localMacID(" << this->conn.localMacID << ")"
308 << "::remoteIP(" << this->conn.remoteIP << ")"
309 << "::module(" << this->module << ")"
310 << "::this(" << this << ")" << std::endl;
311 }
312 }
313 };
314
315 class ProbeTimer : public TimerHandler
316 {
317 private:
318 UwMultiPhyControl *module;
320
325 virtual void expire(Event *e);
326
327 public:
328 // default constructor is needed to be value of a map
329 // set meaningless values then
331 : TimerHandler()
332 {
333 this->module = NULL;
334
336 c.localMacID = 0;
337 c.remoteIP = 0;
338
339 this->conn = c;
340 };
341
343 : TimerHandler()
344 {
345 this->module = m;
346 this->conn = c;
347 };
348
350 {
351 if (this->module != NULL && this->module->debug_ >= 3) {
352 std::cout << NOW
353 << "::UwMultiPhyControl::ProbeTimer::destructor"
354 << "::localMacID(" << this->conn.localMacID << ")"
355 << "::remoteIP(" << this->conn.remoteIP << ")"
356 << "::module(" << this->module << ")"
357 << "::this(" << this << ")" << std::endl;
358 }
359 }
360 };
361};
362
363#endif
packet_t PT_UWMULTIPHY_PONG
Definition initlib.cc:54
packet_t PT_UWMULTIPHY_PING
Definition initlib.cc:53
packet_t PT_UWMULTIPHY_DATA
Definition initlib.cc:52
Definition uwmulti-multiphy-controller.h:147
PriorityMap()
Definition uwmulti-multiphy-controller.cpp:50
friend std::ostream & operator<<(std::ostream &, const PriorityMap &)
std::map< int, int > defaultPriorities
Definition uwmulti-multiphy-controller.h:152
int debug_
Definition uwmulti-multiphy-controller.h:149
void addCustomPriority(LocalConnection c, int priority)
Definition uwmulti-multiphy-controller.cpp:61
int getPriority(LocalConnection c)
Definition uwmulti-multiphy-controller.cpp:73
std::map< LocalConnection, int > customPriorities
Definition uwmulti-multiphy-controller.h:155
void setDefaultPriority(int macID, int priority)
Definition uwmulti-multiphy-controller.cpp:67
Definition uwmulti-multiphy-controller.h:316
ProbeTimer()
Definition uwmulti-multiphy-controller.h:330
~ProbeTimer()
Definition uwmulti-multiphy-controller.h:349
ProbeTimer(UwMultiPhyControl *m, RemoteConnection c)
Definition uwmulti-multiphy-controller.h:342
UwMultiPhyControl *RemoteConnection conn
Definition uwmulti-multiphy-controller.h:319
virtual void expire(Event *e)
Definition uwmulti-multiphy-controller.cpp:586
Definition uwmulti-multiphy-controller.h:261
UwMultiPhyControl *RemoteConnection conn
Definition uwmulti-multiphy-controller.h:265
ResilienceTimer()
Definition uwmulti-multiphy-controller.h:276
virtual void expire(Event *e)
Definition uwmulti-multiphy-controller.cpp:570
ResilienceTimer(UwMultiPhyControl *m, RemoteConnection c)
Definition uwmulti-multiphy-controller.h:288
~ResilienceTimer()
Definition uwmulti-multiphy-controller.h:302
Definition uwmulti-multiphy-controller.h:194
int localIP
Definition uwmulti-multiphy-controller.h:199
std::map< RemoteConnection, ResilienceTimer > resilienceTimers
Definition uwmulti-multiphy-controller.h:207
UwMultiPhyControl()
Definition uwmulti-multiphy-controller.cpp:137
std::vector< int > macIDs
Definition uwmulti-multiphy-controller.h:200
std::map< RemoteConnection, int > linkStatuses
Definition uwmulti-multiphy-controller.h:219
std::queue< Packet * > packet_queue
Definition uwmulti-multiphy-controller.h:202
std::map< int, double > resilienceTimeouts
Definition uwmulti-multiphy-controller.h:206
std::map< int, int > macTclIdLayerId
Definition uwmulti-multiphy-controller.h:226
void initialize()
Definition uwmulti-multiphy-controller.cpp:233
int getBestMacID(int trafficType, int remoteIP)
Definition uwmulti-multiphy-controller.cpp:539
void updateAvailability(RemoteConnection c, LinkStatus status)
Definition uwmulti-multiphy-controller.cpp:498
void recvFromUpperLayers(Packet *p)
Definition uwmulti-multiphy-controller.cpp:394
void recv(Packet *p)
Definition uwmulti-multiphy-controller.cpp:281
std::map< RemoteConnection, ProbeTimer > probeTimers
Definition uwmulti-multiphy-controller.h:213
void sendPing(RemoteConnection c)
Definition uwmulti-multiphy-controller.cpp:449
virtual int command(int, const char *const *)
Definition uwmulti-multiphy-controller.cpp:146
void recvFromLowerLayers(Packet *p, int macID)
Definition uwmulti-multiphy-controller.cpp:303
std::map< int, double > probeTimeouts
Definition uwmulti-multiphy-controller.h:212
PriorityMap priorityMap
Definition uwmulti-multiphy-controller.h:217
int debug_
Definition uwmulti-multiphy-controller.h:196
std::map< int, int > macResilience
Definition uwmulti-multiphy-controller.h:224
virtual ~UwMultiPhyControl()
Definition uwmulti-multiphy-controller.h:248
Definition uwmulti-multiphy-controller.h:91
int localMacID
Definition uwmulti-multiphy-controller.h:93
int trafficType
Definition uwmulti-multiphy-controller.h:92
bool operator<(const LocalConnection &o) const
Definition uwmulti-multiphy-controller.h:102
friend std::ostream & operator<<(std::ostream &os, const LocalConnection &c)
Definition uwmulti-multiphy-controller.h:110
bool operator==(const LocalConnection &o) const
Definition uwmulti-multiphy-controller.h:96
Definition uwmulti-multiphy-controller.h:119
friend std::ostream & operator<<(std::ostream &os, const RemoteConnection &c)
Definition uwmulti-multiphy-controller.h:138
bool operator<(const RemoteConnection &o) const
Definition uwmulti-multiphy-controller.h:130
int localMacID
Definition uwmulti-multiphy-controller.h:120
bool operator==(const RemoteConnection &o) const
Definition uwmulti-multiphy-controller.h:124
int remoteIP
Definition uwmulti-multiphy-controller.h:121
Provides the UWCBR packets header description and the definition of the class UWCBR.
Provides the UWIP packets header description. Definition of the class that define the network layer.
std::ostream & operator<<(std::ostream &o, LinkStatus s)
Definition uwmulti-multiphy-controller.h:76
LinkStatus
Definition uwmulti-multiphy-controller.h:73
@ LINK_PROBING
Definition uwmulti-multiphy-controller.h:73
@ LINK_OK
Definition uwmulti-multiphy-controller.h:73
@ LINK_UNKNOWN
Definition uwmulti-multiphy-controller.h:73
std::string printType(packet_t ptype)
Definition uwmulti-multiphy-controller.h:59