DESERT 4.0.0
sun-ipr-node.h
Go to the documentation of this file.
1//
2// Copyright (c) 2017 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//
29
41#ifndef SUN_NODE_H
42#define SUN_NODE_H
43
44#include "sun-hdr-ack.h"
45#include "sun-hdr-data.h"
48
49#include <uwcbr-module.h>
50#include <uwip-clmsg.h>
51#include <uwip-module.h>
52
53#include "mphy.h"
54#include "packet.h"
55#include <module.h>
56#include <tclcl.h>
57
58#include <cmath>
59#include <ctime>
60#include <fstream>
61#include <iostream>
62#include <limits>
63#include <map>
64#include <rng.h>
65#include <sstream>
66#include <string>
67#include <vector>
68
70
79class SinkProbeTimer : public TimerHandler
80{
81public:
83 : TimerHandler()
84 {
85 module = m;
86 }
87
88protected:
92 virtual void expire(Event *e);
93
95 *module;
96};
97
103class RemoveHopTableTimer : public TimerHandler
104{
105
106public:
108 : TimerHandler()
109 {
110 module = m;
111 }
112
113protected:
115 *module;
120 virtual void expire(Event *e);
121};
122
124// * AckWaiting class is used to handle the timer of acks.
125// * When a node sends a packet it waits for and ack
126// * for a period managed by an AckWaiting object.
127// */
128// class AckWaiting : public TimerHandler {
129//
130// public:
131// AckWaiting(SunIPRoutingNode* m) : TimerHandler() {
132// module = m;
133// }
134//
135// protected:
136// SunIPRoutingNode* module; /**< Pointer to an objet of type
137// SunIPRoutingNode. */
138//
139// /**
140// * Method invoked when the AckWaiting timer expires.
141// */
142// virtual void expire(Event *e);
143//};
144
148class BufferTimer : public TimerHandler
149{
150
151public:
153 : TimerHandler()
154 {
155 module = m;
156 }
157
158protected:
160 *module;
165 virtual void expire(Event *e);
166};
167
171class SearchPathTimer : public TimerHandler
172{
173
174public:
176 : TimerHandler()
177 {
178 module = m;
179 }
180
181protected:
183 *module;
188 virtual void expire(Event *e);
189};
190
194class SunIPRoutingNode : public Module
195{
196
203
209 friend class AckWaiting;
210
216 friend class SinkProbeTimer;
217
223 friend class BufferTimer;
224
230 friend class SearchPathTimer;
231
232public:
237
241 virtual ~SunIPRoutingNode();
242
243 static const int LISTLENGTH = 30;
245 static const int MINUTE =
246 60;
249protected:
250 /*****************************
251 | Internal Functions |
252 *****************************/
263 virtual int command(int, const char *const *);
264
270 virtual void recv(Packet *);
271
279 virtual int recvSyncClMsg(ClMessage *);
280
289 virtual int recvAsyncClMsg(ClMessage *);
290
294 virtual void clearHops();
295
304 virtual void initialize();
305
309 virtual void printHopTable() const;
310
315 virtual void printSelectedRoutes() const;
316
323 inline const long &
325 {
326 return n_paths_established;
327 }
328
336 static string printIP(const nsaddr_t &);
337
345 static string printIP(const ns_addr_t &);
346
354 static nsaddr_t str2addr(const char *);
355
364 inline const double
365 getDelay(const double &period_) const
366 {
367 if (PoissonTraffic_)
368 return (-log(RNG::defaultrng()->uniform_double()) /
369 (1.0 / period_));
370 else
371 return 0;
372 }
373
386 inline const bool
387 isZero(const double &value) const
388 {
389 return std::fabs(value) < std::numeric_limits<double>::epsilon();
390 }
391
399 virtual const int &setNumberOfHopToSink(const int &);
400
411 virtual const int &getNumberOfHopToSink() const;
412
421 virtual void receiveProbe(const Packet *);
422
423 /*****************************
424 | Path Establishment Search |
425 *****************************/
434 virtual void searchPath();
435
442 virtual void initPktPathEstSearch(Packet *) const;
443
456 virtual void replyPathEstSearch(Packet *);
457
469 virtual const bool addMyIpInList(Packet *);
470
480 virtual const bool isMyIpInList(const Packet *) const;
481
488 virtual void updateQuality(Packet *);
489
490 /*****************************
491 | Path Establishment Answer |
492 *****************************/
501 virtual void answerPath(
502 const Packet *); // invoked only by a node with ho count = 1
503
513 virtual void initPktPathEstAnswer(Packet *,
514 const Packet *); // invoked only by a node with ho count = 1
515
525 virtual void sendRouteBack(Packet *);
526
538 virtual const int &evaluatePath(const Packet *);
539
540 /*****************************
541 | Data |
542 *****************************/
549 virtual void initPktDataPacket(Packet *);
550
561 virtual void forwardDataPacket(Packet *);
562
563 /*****************************
564 | Acks |
565 *****************************/
578 virtual void sendBackAck(const Packet *);
579
587 virtual void initPktAck(Packet *);
588
601 virtual void createRouteError(const Packet *, Packet *);
602
609 virtual void sendRouteErrorBack(Packet *);
610
611 /*****************************
612 | Load |
613 *****************************/
618 virtual void updatePacketsCount();
619
624 virtual void updateAcksCount();
625
634 virtual const int getPacketsLastMinute() const;
643 virtual const int getAcksLastMinute() const;
644
653 virtual const double getLoad() const;
654
655 /*****************************
656 | Buffering |
657 *****************************/
661 virtual void bufferManager();
662
663 /*****************************
664 | Statistics |
665 *****************************/
671 static inline const int
673 {
674 return sizeof(hdr_sun_ack);
675 }
676
682 static inline const int
684 {
685 return sizeof(hdr_sun_data);
686 }
687
693 static inline const int
695 {
696 return sizeof(hdr_sun_path_est);
697 }
698
704 inline const long &
706 {
707 return number_of_ackpkt_;
708 }
709
715 inline const long &
717 {
718 return number_of_datapkt_;
719 }
720
726 inline const long &
728 {
730 }
731
738 inline const long &
743
750 inline const long &
752 {
754 }
755
763 inline const long &
768
769 /*****************************
770 | Timers |
771 *****************************/
780 virtual void expTimerHopTable();
781
789 virtual void lostSink();
790
796 virtual void searchPathExpire();
797
798 /*****************************
799 | Trace file |
800 *****************************/
807 virtual void tracePacket(
808 const Packet *const, const string &position = "UNDEF___");
809
814 virtual string createTraceString(const string &, const double &,
815 const int &, const int &, const int &, const int &, const int &,
816 const int &, const int &, const double &, const int &, const int &);
817
824 virtual void writeInTrace(const string &);
825
826 enum {
830 };
832 // Variables
833 nsaddr_t ipAddr_;
848 nsaddr_t *hop_table;
864 // Load
883 double alpha_;
886 // Acks
896 // Buffer
897 vector<buffer_element>
902 long pkt_tx_;
909 // Timers
922 // Trace file
923 bool trace_;
927 ostringstream osstream_;
928 ofstream trace_file_;
933 // Statistics
934 int data_and_hops[MAX_HOP_NUMBER];
941 std::map<uint8_t, uint>
952 static long number_of_datapkt_;
954 static long number_of_ackpkt_;
971private:
980};
981
982#endif // SUN_NODE_H
Definition uwicrp-module-node.h:69
‍**
Definition sun-ipr-node.h:149
BufferTimer(SunIPRoutingNode *m)
Definition sun-ipr-node.h:152
SunIPRoutingNode *virtual void expire(Event *e)
Definition sun-ipr-node-buffermanager.cpp:52
Definition sun-ipr-node.h:104
RemoveHopTableTimer(SunIPRoutingNode *m)
Definition sun-ipr-node.h:107
SunIPRoutingNode *virtual void expire(Event *e)
Definition sun-ipr-node.cpp:71
Definition sun-ipr-node.h:172
SunIPRoutingNode *virtual void expire(Event *e)
Definition sun-ipr-node.cpp:85
SearchPathTimer(SunIPRoutingNode *m)
Definition sun-ipr-node.h:175
Definition sun-ipr-node.h:80
virtual void expire(Event *e)
Definition sun-ipr-node.cpp:78
SinkProbeTimer(SunIPRoutingNode *m)
Definition sun-ipr-node.h:82
Definition sun-ipr-node.h:195
long list_acks_max_time_
Definition sun-ipr-node.h:877
virtual void replyPathEstSearch(Packet *)
Definition sun-ipr-node-pathest-search.cpp:133
static string printIP(const nsaddr_t &)
Definition sun-ipr-node.cpp:279
int pointer_packets_
Definition sun-ipr-node.h:871
double timer_route_validity_
Definition sun-ipr-node.h:910
uint max_retx_
Definition sun-ipr-node.h:967
const long & getPathEstablishmentCount() const
Definition sun-ipr-node.h:764
virtual void writeInTrace(const string &)
Definition sun-ipr-node.cpp:1035
vector< buffer_element > buffer_data
Definition sun-ipr-node.h:898
virtual void printSelectedRoutes() const
Definition sun-ipr-node.cpp:262
double timer_sink_probe_validity_
Definition sun-ipr-node.h:912
ostringstream osstream_
Definition sun-ipr-node.h:927
const long & getNPathsEstablished()
Definition sun-ipr-node.h:324
char trace_separator_
Definition sun-ipr-node.h:930
static const int LISTLENGTH
Definition sun-ipr-node.h:243
bool search_path_enable_
Definition sun-ipr-node.h:856
static long number_of_datapkt_
Definition sun-ipr-node.h:952
virtual int command(int, const char *const *)
Definition sun-ipr-node.cpp:329
const long & getForwardedCount() const
Definition sun-ipr-node.h:727
virtual void initPktDataPacket(Packet *)
Definition sun-ipr-node-data.cpp:49
virtual void createRouteError(const Packet *, Packet *)
Definition sun-ipr-node-ack.cpp:109
virtual void clearHops()
Definition sun-ipr-node.cpp:196
double probe_min_snr_
Definition sun-ipr-node.h:853
static const int getDataPktHeaderSize()
Definition sun-ipr-node.h:683
nsaddr_t * hop_table
Definition sun-ipr-node.h:848
long n_paths_established
Definition sun-ipr-node.h:946
virtual void forwardDataPacket(Packet *)
Definition sun-ipr-node-data.cpp:89
virtual const int getPacketsLastMinute() const
Definition sun-ipr-node-loadmetric.cpp:76
long list_packets_max_time_
Definition sun-ipr-node.h:875
int disable_path_error_
Definition sun-ipr-node.h:858
std::map< uint8_t, uint > paths_selected
Definition sun-ipr-node.h:942
bool trace_
Definition sun-ipr-node.h:923
static long number_of_ackpkt_
Definition sun-ipr-node.h:954
virtual const int & getNumberOfHopToSink() const
Definition sun-ipr-node.cpp:875
static nsaddr_t str2addr(const char *)
Definition sun-ipr-node.cpp:304
virtual void updatePacketsCount()
Definition sun-ipr-node-loadmetric.cpp:46
virtual const int & evaluatePath(const Packet *)
Definition sun-ipr-node-pathest-answer.cpp:318
virtual void bufferManager()
Definition sun-ipr-node-buffermanager.cpp:58
const long & getDataDropsCountBuffer() const
Definition sun-ipr-node.h:739
int hop_table_length
Definition sun-ipr-node.h:849
SinkProbeTimer sinkProbeTimer_
Definition sun-ipr-node.h:918
virtual const bool isMyIpInList(const Packet *) const
Definition sun-ipr-node-pathest-search.cpp:228
virtual void expTimerHopTable()
Definition sun-ipr-node.cpp:951
int data_and_hops[MAX_HOP_NUMBER]
Definition sun-ipr-node.h:934
virtual const int getAcksLastMinute() const
Definition sun-ipr-node-loadmetric.cpp:118
virtual void initPktPathEstSearch(Packet *) const
Definition sun-ipr-node-pathest-search.cpp:94
SunIPRoutingNode(const SunIPRoutingNode &)
virtual void sendRouteBack(Packet *)
Definition sun-ipr-node-pathest-answer.cpp:161
ofstream trace_file_
Definition sun-ipr-node.h:928
char * trace_file_name_
Definition sun-ipr-node.h:925
virtual string createTraceString(const string &, const double &, const int &, const int &, const int &, const int &, const int &, const int &, const int &, const double &, const int &, const int &)
Definition sun-ipr-node.cpp:1011
int reset_buffer_if_error_
Definition sun-ipr-node.h:860
static long number_of_pathestablishment_
Definition sun-ipr-node.h:949
static const int MINUTE
Definition sun-ipr-node.h:245
double snr_to_sink_
Definition sun-ipr-node.h:855
static long number_of_pkt_forwarded_
Definition sun-ipr-node.h:964
virtual void initPktAck(Packet *)
Definition sun-ipr-node-ack.cpp:78
virtual void updateQuality(Packet *)
Definition sun-ipr-node-pathest-search.cpp:245
double period_status_
Definition sun-ipr-node.h:837
BufferTimer bufferTmr_
Definition sun-ipr-node.h:919
nsaddr_t sink_associated
Definition sun-ipr-node.h:850
virtual void updateAcksCount()
Definition sun-ipr-node-loadmetric.cpp:60
static const int getPathEstHeaderSize()
Definition sun-ipr-node.h:694
double timer_buffer_
Definition sun-ipr-node.h:914
virtual void receiveProbe(const Packet *)
Definition sun-ipr-node.cpp:883
virtual const int & setNumberOfHopToSink(const int &)
Definition sun-ipr-node.cpp:856
double period_data_
Definition sun-ipr-node.h:839
virtual void sendBackAck(const Packet *)
Definition sun-ipr-node-ack.cpp:47
double list_acks[LISTLENGTH]
Definition sun-ipr-node.h:868
double alpha_
Definition sun-ipr-node.h:883
SearchPathTimer searchPathTmr_
Definition sun-ipr-node.h:920
SunIPRoutingNode()
Definition sun-ipr-node.cpp:91
bool ack_error_state
Definition sun-ipr-node.h:890
const long & getDataCount() const
Definition sun-ipr-node.h:716
int PoissonTraffic_
Definition sun-ipr-node.h:835
const double getDelay(const double &period_) const
Definition sun-ipr-node.h:365
static const int getAckHeaderSize()
Definition sun-ipr-node.h:672
const long & getAckCount() const
Definition sun-ipr-node.h:705
double quality_link
Definition sun-ipr-node.h:847
virtual void lostSink()
Definition sun-ipr-node.cpp:926
@ SNR
Definition sun-ipr-node.h:828
@ HOPCOUNT
Definition sun-ipr-node.h:827
@ LESSCONGESTED
Definition sun-ipr-node.h:829
virtual void searchPath()
Definition sun-ipr-node-pathest-search.cpp:54
const long & getDataDropsCountMaxRetx() const
Definition sun-ipr-node.h:751
uint32_t buffer_max_size_
Definition sun-ipr-node.h:899
virtual void printHopTable() const
Definition sun-ipr-node.cpp:249
double list_packets[LISTLENGTH]
Definition sun-ipr-node.h:865
virtual int recvSyncClMsg(ClMessage *)
Definition sun-ipr-node.cpp:174
int ack_warnings_counter_
Definition sun-ipr-node.h:889
int max_ack_error_
Definition sun-ipr-node.h:887
virtual void searchPathExpire()
Definition sun-ipr-node.cpp:939
int printDebug_
Definition sun-ipr-node.h:851
virtual void sendRouteErrorBack(Packet *)
Definition sun-ipr-node-ack.cpp:156
virtual ~SunIPRoutingNode()
Definition sun-ipr-node.cpp:160
long pkt_stored_
Definition sun-ipr-node.h:900
virtual void initialize()
Definition sun-ipr-node.cpp:235
static long number_of_drops_buffer_full_
Definition sun-ipr-node.h:956
virtual void tracePacket(const Packet *const, const string &position="UNDEF___")
Definition sun-ipr-node.cpp:964
virtual const double getLoad() const
Definition sun-ipr-node-loadmetric.cpp:156
nsaddr_t ipAddr_
Definition sun-ipr-node.h:833
int pointer_acks_
Definition sun-ipr-node.h:873
virtual const bool addMyIpInList(Packet *)
Definition sun-ipr-node-pathest-search.cpp:205
int metrics_
Definition sun-ipr-node.h:834
virtual int recvAsyncClMsg(ClMessage *)
Definition sun-ipr-node.cpp:182
RemoveHopTableTimer rmhopTableTmr_
Definition sun-ipr-node.h:917
long pkt_tx_
Definition sun-ipr-node.h:902
double timer_search_path_
Definition sun-ipr-node.h:915
virtual void initPktPathEstAnswer(Packet *, const Packet *)
Definition sun-ipr-node-pathest-answer.cpp:91
virtual void recv(Packet *)
Definition sun-ipr-node.cpp:451
static long number_of_drops_maxretx_
Definition sun-ipr-node.h:960
virtual void answerPath(const Packet *)
Definition sun-ipr-node-pathest-answer.cpp:54
const bool isZero(const double &value) const
Definition sun-ipr-node.h:387
int num_hop_to_sink
Definition sun-ipr-node.h:841
int safe_timer_buffer_
Definition sun-ipr-node.h:904
bool acks_array_full
Definition sun-ipr-node.h:881
bool packets_array_full
Definition sun-ipr-node.h:879
Definition sun-hdr-ack.h:52
Definition sun-hdr-data.h:54
Definition sun-hdr-pathestablishment.h:60
Provides the Ack Messages header description.
Provides the Data Messages header description.
Provides the Path Establishment Messages header description.
Common structures and definition used by SUN.
Provides the UWCBR packets header description and the definition of the class UWCBR.
Cross layer messages definition for the UWIP Module.
Provides the UWIP packets header description. Definition of the class that define the network layer.