DESERT 4.0.0
uwApplication_module.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 UWAPPLICATION_MODULE_H
42#define UWAPPLICATION_MODULE_H
43
44#include <module.h>
46
47#include <arpa/inet.h>
48#include <netdb.h>
49#include <netinet/in.h>
50#include <sys/socket.h>
51#include <sys/types.h>
52
53#include <atomic>
54#include <chrono>
55#include <mutex>
56#include <queue>
57#include <thread>
58
59#define UWAPPLICATION_DROP_REASON_UNKNOWN_TYPE \
60 "DPUT"
61#define UWAPPLICATION_DROP_REASON_DUPLICATED_PACKET \
62 "DPD"
63#define UWAPPLICATION_DROP_REASON_OUT_OF_SEQUENCE \
64 "DOOS"
67
72class uwSendTimerAppl : public TimerHandler
73{
74public:
76 : TimerHandler()
77 {
78 module = m;
79 }
80
81protected:
82 virtual void expire(Event *e);
83 uwApplicationModule *module;
84};
85
86class uwApplicationModule : public Module
87{
88 friend class uwSendTimerAppl;
89
90public:
95
99 virtual ~uwApplicationModule();
100
111 virtual int command(int argc, const char *const *argv) override;
112
118 virtual void recv(Packet *) override;
119
120 virtual double GetFTT() const;
127 virtual double GetFTTstd() const;
134 virtual double GetPER() const;
135
141 virtual double GetTHR() const;
142
148 virtual double GetRTT() const;
149
155 virtual double GetRTTstd() const;
156
162 virtual int
164 {
165 return txsn - 1;
166 }
167
173 virtual int
175 {
176 return pkts_lost;
177 }
178
184 virtual int
186 {
187 return pkts_recv;
188 }
189
195 virtual int
197 {
198 return pkts_ooseq;
199 }
200
206 virtual int
208 {
209 return pkts_invalid;
210 }
211
217 virtual int
219 {
220 return pkts_push_queue;
221 }
222
228 virtual double
229 getPeriod() const
230 {
231 return period;
232 }
233
238 std::string
239 getEpoch() const
240 {
241 unsigned long int timestamp =
242 (unsigned long int) (std::chrono::duration_cast<
243 std::chrono::milliseconds>(
244 std::chrono::system_clock::now().time_since_epoch())
245 .count());
246
247 return to_string(timestamp);
248 }
249
260 virtual void
261 printOnLog(LogLev log_level, const std::string &module,
262 const std::string &message) const override
263 {
264 if (enable_log) {
265 if (sea_trial)
266 logger.printOnLog(log_level,
267 "[" + getEpoch() + "]::" + module + "(" +
268 to_string(node_id) + ")::" + message);
269 else
270 PlugIn::printOnLog(log_level, module, message);
271 }
272 }
273
274protected:
282 virtual void transmit();
283
288 virtual bool listenTCP();
289
294 virtual void acceptTCP();
295
302 virtual void readFromTCP(int clnSock);
303
311 virtual bool openConnectionUDP();
312
318 virtual void readFromUDP();
319
326 virtual void stop();
327
334 virtual bool
336 {
337 return !socket_active;
338 }
339
345 virtual bool
347 {
348 return socket_tcp;
349 }
350
358 virtual bool
360 {
361 return (poisson_traffic == 1) ? true : false;
362 }
363
371 virtual bool
373 {
374 return (drop_out_of_order == 1) ? true : false;
375 }
376
381 virtual void
383 {
384 txsn++;
385 }
386
390 virtual void
391 incrPktLost(int npkts)
392 {
393 pkts_lost += npkts;
394 }
395
399 virtual void
401 {
402 pkts_recv++;
403 }
407 virtual void
409 {
410 pkts_ooseq++;
411 }
415 virtual void
417 {
418 pkts_invalid++;
419 }
420
425 virtual void
427 {
429 }
430
438 virtual double getTimeBeforeNextPkt();
439
445 virtual void updateRTT(double rtt);
446
452 virtual void updateFTT(double ftt);
453
460 virtual void updateThroughput(int bytes, double dt);
461
466 bool *sn_check;
467 uint8_t dst_addr;
474 int uidcnt;
476 int hrsn;
477 int txsn;
478 int rftt;
497 uint32_t esn;
500 double period;
501 double lrtime;
502 double sumrtt;
503 double sumrtt2;
504 double sumftt;
505 double sumftt2;
506 double sumbytes;
507 double sumdt;
509 struct sockaddr_in servAddr;
510 struct sockaddr_in clnAddr;
511 std::thread socket_thread;
512 std::mutex socket_mutex;
513 std::atomic<bool> receiving;
515 std::queue<Packet *> queuePckReadTCP;
518 std::queue<Packet *> queuePckReadUDP;
524 static uint MAX_READ_LEN;
526};
527#endif /* UWAPPLICATION_MODULE_H */
Definition uwApplication_module.h:87
virtual void updateThroughput(int bytes, double dt)
Definition uwApplication_module.cpp:554
virtual int getPktsInvalidRx() const
Definition uwApplication_module.h:207
virtual bool withoutSocket()
Definition uwApplication_module.h:335
int pkts_push_queue
Definition uwApplication_module.h:486
virtual void stop()
Definition uwApplication_module.cpp:443
virtual void readFromTCP(int clnSock)
Definition uwApplication_TCP_socket.cpp:130
int rttsamples
Definition uwApplication_module.h:498
std::atomic< bool > receiving
Definition uwApplication_module.h:513
virtual int getPktsPushQueue() const
Definition uwApplication_module.h:218
double sumftt2
Definition uwApplication_module.h:505
int hrsn
Definition uwApplication_module.h:476
std::thread socket_thread
Definition uwApplication_module.h:511
virtual void incrPktOoseq()
Definition uwApplication_module.h:408
virtual double getTimeBeforeNextPkt()
Definition uwApplication_module.cpp:469
int node_id
Definition uwApplication_module.h:493
int pkts_last_reset
Definition uwApplication_module.h:489
virtual int getPktLost() const
Definition uwApplication_module.h:174
double sumftt
Definition uwApplication_module.h:504
virtual int getPktRecv() const
Definition uwApplication_module.h:185
uint32_t esn
Definition uwApplication_module.h:497
virtual double getPeriod() const
Definition uwApplication_module.h:229
int pkts_ooseq
Definition uwApplication_module.h:482
int pkts_recv
Definition uwApplication_module.h:480
bool socket_active
Definition uwApplication_module.h:462
virtual void readFromUDP()
Definition uwApplication_UDP_socket.cpp:89
int drop_out_of_order
Definition uwApplication_module.h:472
virtual bool openConnectionUDP()
Definition uwApplication_UDP_socket.cpp:43
int servSockDescr
Definition uwApplication_module.h:494
double sumrtt
Definition uwApplication_module.h:502
int rftt
Definition uwApplication_module.h:478
virtual void incrPktLost(int npkts)
Definition uwApplication_module.h:391
bool socket_tcp
Definition uwApplication_module.h:464
std::queue< Packet * > queuePckReadUDP
Definition uwApplication_module.h:518
virtual void incrPktSent()
Definition uwApplication_module.h:382
virtual ~uwApplicationModule()
Definition uwApplication_module.cpp:139
virtual double GetRTT() const
Definition uwApplication_module.cpp:482
double sumdt
Definition uwApplication_module.h:507
virtual int getPktSent() const
Definition uwApplication_module.h:163
virtual double GetPER() const
Definition uwApplication_module.cpp:527
virtual void printOnLog(LogLev log_level, const std::string &module, const std::string &message) const override
Definition uwApplication_module.h:261
int fttsamples
Definition uwApplication_module.h:499
virtual bool useDropOutOfOrder()
Definition uwApplication_module.h:372
virtual void recv(Packet *) override
Definition uwApplication_module.cpp:248
virtual double GetFTT() const
Definition uwApplication_module.cpp:508
int servPort
Definition uwApplication_module.h:496
virtual double GetTHR() const
Definition uwApplication_module.cpp:540
virtual void incrPktsPushQueue()
Definition uwApplication_module.h:426
virtual void updateFTT(double ftt)
Definition uwApplication_module.cpp:546
virtual void transmit()
Definition uwApplication_module.cpp:355
virtual int command(int argc, const char *const *argv) override
Definition uwApplication_module.cpp:145
int uidcnt
Definition uwApplication_module.h:474
double sumbytes
Definition uwApplication_module.h:506
int sea_trial
Definition uwApplication_module.h:492
std::mutex socket_mutex
Definition uwApplication_module.h:512
double sumrtt2
Definition uwApplication_module.h:503
virtual bool usePoissonTraffic()
Definition uwApplication_module.h:359
virtual bool listenTCP()
Definition uwApplication_TCP_socket.cpp:43
int pkts_lost
Definition uwApplication_module.h:479
virtual void acceptTCP()
Definition uwApplication_TCP_socket.cpp:103
int clnSockDescr
Definition uwApplication_module.h:495
int pkts_invalid
Definition uwApplication_module.h:484
uwSendTimerAppl * chkTimerPeriod
Definition uwApplication_module.h:521
bool * sn_check
Definition uwApplication_module.h:466
int payloadsize
Definition uwApplication_module.h:470
struct sockaddr_in servAddr
Definition uwApplication_module.h:509
virtual void incrPktInvalid()
Definition uwApplication_module.h:416
virtual double GetRTTstd() const
Definition uwApplication_module.cpp:488
uwApplicationModule()
Definition uwApplication_module.cpp:73
std::string getEpoch() const
Definition uwApplication_module.h:239
static uint MAX_READ_LEN
Definition uwApplication_module.h:524
int poisson_traffic
Definition uwApplication_module.h:468
virtual int getPktsOOSequence() const
Definition uwApplication_module.h:196
int port_num
Definition uwApplication_module.h:471
struct sockaddr_in clnAddr
Definition uwApplication_module.h:510
uint8_t dst_addr
Definition uwApplication_module.h:467
double period
Definition uwApplication_module.h:500
virtual bool useTCP()
Definition uwApplication_module.h:346
std::queue< Packet * > queuePckReadTCP
Definition uwApplication_module.h:515
int txsn
Definition uwApplication_module.h:477
virtual void incrPktRecv()
Definition uwApplication_module.h:400
virtual double GetFTTstd() const
Definition uwApplication_module.cpp:514
double lrtime
Definition uwApplication_module.h:501
virtual void updateRTT(double rtt)
Definition uwApplication_module.cpp:500
Definition uwApplication_module.h:73
virtual void expire(Event *e)
Definition uwApplication_module.cpp:561
uwSendTimerAppl(uwApplicationModule *m)
Definition uwApplication_module.h:75
log_level
Definition uw-csma-ca.h:86
Provides the headers of the DATA packet.