DESERT 4.0.0
uwaloha.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
40#ifndef UWALOHA_H_
41#define UWALOHA_H_
42
43#include <fstream>
44#include <iostream>
45#include <map>
46#include <mmac.h>
47#include <queue>
48#include <set>
49#include <string>
50
51#include <mphy.h>
52
53#define UWALOHA_DROP_REASON_WRONG_STATE "WST"
54#define UWALOHA_DROP_REASON_WRONG_RECEIVER "WRCV"
55#define UWALOHA_DROP_REASON_UNKNOWN_TYPE "UPT"
56#define UWALOHA_DROP_REASON_BUFFER_FULL "DBF"
57#define UWALOHA_DROP_REASON_ERROR "ERR"
58
59extern packet_t PT_MMAC_ACK;
60
61typedef int pktSeqNum;
62
68class UWAloha : public MMac
69{
70
71public:
75 UWAloha();
76
80 virtual ~UWAloha();
81
90 virtual int command(int argc, const char *const *argv);
91
92protected:
112
134
144
152
163
168 class UWAlohaTimer : public TimerHandler
169 {
170
171 public:
176 : TimerHandler()
177 , start_time(0.0)
178 , left_duration(0.0)
179 , counter(0)
180 , module(m)
182 {
183 assert(m != NULL);
184 }
185
190 {
191 }
192
200 virtual void
202 {
203 assert(timer_status == UWALOHA_RUNNING);
204 left_duration -= (NOW - start_time);
205 if (left_duration <= 0.0)
206 left_duration = module->mac2phy_delay_;
207 force_cancel();
209 }
214 virtual void
216 {
217 assert(timer_status == UWALOHA_FROZEN);
218 start_time = NOW;
219 assert(left_duration > 0);
220 sched(left_duration);
222 }
223
227 virtual void
229 {
231 force_cancel();
232 }
233
238 virtual void
239 schedule(double val)
240 {
241 start_time = NOW;
242 left_duration = val;
244 resched(val);
245 }
246
251 bool
253 {
254 return (timer_status == UWALOHA_IDLE);
255 }
256
261 bool
263 {
264 return (timer_status == UWALOHA_RUNNING);
265 }
266
271 bool
273 {
274 return (timer_status == UWALOHA_EXPIRED);
275 }
276
281 bool
283 {
284 return (timer_status == UWALOHA_FROZEN);
285 }
286
291 bool
293 {
294 return (timer_status == UWALOHA_FROZEN ||
296 }
297
301 void
303 {
304 counter = 0;
305 }
306
311 void
313 {
314 ++counter;
315 }
316
321 int
323 {
324 return counter;
325 }
326
331 double
333 {
334 return left_duration;
335 }
336
337 protected:
338 double start_time;
344 UWAloha *module;
347 };
348
352 class AckTimer : public UWAlohaTimer
353 {
354
355 public:
360 : UWAlohaTimer(m)
361 {
362 }
363
367 virtual ~AckTimer()
368 {
369 }
370
371 protected:
376 virtual void expire(Event *e);
377 };
378
383 {
384
385 public:
390 : UWAlohaTimer(m)
391 {
392 }
393
398 {
399 }
400
401 protected:
406 virtual void expire(Event *e);
407 };
408
414 virtual void recvFromUpperLayers(Packet *p);
415
420 virtual void Mac2PhyStartTx(Packet *p);
421
426 virtual void Phy2MacEndTx(const Packet *p);
427
432 virtual void Phy2MacStartRx(const Packet *p);
433
438 virtual void Phy2MacEndRx(Packet *p);
439
446 virtual double computeTxTime(UWALOHA_PKT_TYPE type);
447
458 virtual void initPkt(
459 Packet *p, UWALOHA_PKT_TYPE pkt_type, int dest_addr = 0);
460
466 virtual double getBackoffTime();
467
471 virtual void txData();
472
477 virtual void txAck(int dest_addr);
478
483 virtual void stateIdle();
484
488 virtual void stateRxIdle();
489
494 virtual void stateTxData();
495
500 virtual void stateTxAck(int dest_addr);
501
506 virtual void stateWaitAck();
507
514 virtual void stateRxWaitAck();
515
520 virtual void stateBackoff();
521
527 virtual void stateRxBackoff();
528
533 virtual void stateCheckAckExpired();
534
539 virtual void stateCheckBackoffExpired();
540
546 virtual void stateRxData(Packet *p);
547
553 virtual void stateRxAck(Packet *p);
554
558 virtual void exitBackoff();
559
564 virtual void printStateInfo(double delay = 0);
565
569 virtual void initInfo();
570
577 virtual void
584
589 virtual void
591 {
592 last_reason = reason;
593 }
594
599 virtual void
601 {
603 }
604
608 virtual void
610 {
611 curr_tx_rounds = 0;
612 }
613
619 virtual void updateRTT(double rtt);
620
625 virtual double
627 {
628 return (rttsamples > 0) ? sumrtt / rttsamples : 0;
629 }
630
634 virtual void updateAckTimeout(double rtt);
635
640 virtual void
642 {
643 last_data_id_rx = id;
644 }
645 virtual void waitForUser();
646
652 inline int
653 getPktSeqNum(Packet *p)
654 {
655 int seq_num;
656 hdr_cmn *ch = hdr_cmn::access(p);
657 seq_num = ch->uid();
658 return seq_num;
659 }
660
666 inline void
667 putPktInQueue(Packet *p)
668 {
669 mapPacket.insert(pair<pktSeqNum, Packet *>(getPktSeqNum(p), p));
670 }
671
676 inline void
678 {
679 map<pktSeqNum, Packet *>::iterator it_p;
680 it_p = mapPacket.find(seq_num);
681 if (it_p != mapPacket.end()) {
682 Packet::free((*it_p).second);
683 mapPacket.erase((*it_p).first);
684 }
685 }
686
691 inline void
692 putAckTimerInMap(int seq_num)
693 {
694 mapAckTimer.insert(pair<pktSeqNum, AckTimer>(seq_num, ack_timer));
695 }
696
701 inline void
703 {
704 map<pktSeqNum, AckTimer>::iterator it_a;
705 it_a = mapAckTimer.find(seq_num);
706 if (it_a != mapAckTimer.end()) {
707 mapAckTimer.erase((*it_a).first);
708 }
709 }
710
716 virtual int
718 {
719 return (up_data_pkts_rx - mapPacket.size());
720 }
721
725 virtual void
727 {
728 up_data_pkts_rx++;
729 }
730
731 inline int
733 {
734 return up_data_pkts_rx;
735 }
736
745 double ACK_timeout;
747 double alpha_;
753
754 static bool initialized;
766 double srtt;
767 double sumrtt;
768 double sumrtt2;
778 int txsn;
780 static const double prop_speed;
799 static map<UWALOHA_STATUS, string> status_info;
802 static map<UWALOHA_REASON_STATUS, string>
805 static map<UWALOHA_PKT_TYPE, string>
809 map<pktSeqNum, Packet *>
811 map<pktSeqNum, AckTimer> mapAckTimer;
814 ofstream fout;
815};
816
817#endif /* UWUWALOHA_H_ */
Definition uwaloha.h:353
virtual void expire(Event *e)
Definition uwaloha.cpp:68
virtual ~AckTimer()
Definition uwaloha.h:367
AckTimer(UWAloha *m)
Definition uwaloha.h:359
Definition uwaloha.h:383
virtual void expire(Event *e)
Definition uwaloha.cpp:90
BackOffTimer(UWAloha *m)
Definition uwaloha.h:389
virtual ~BackOffTimer()
Definition uwaloha.h:397
Definition uwaloha.h:169
int counter
Definition uwaloha.h:342
virtual void unFreeze()
Definition uwaloha.h:215
double getDuration()
Definition uwaloha.h:332
virtual void stop()
Definition uwaloha.h:228
int getCounter()
Definition uwaloha.h:322
double start_time
Definition uwaloha.h:338
virtual void freeze()
Definition uwaloha.h:201
bool isIdle()
Definition uwaloha.h:252
bool isRunning()
Definition uwaloha.h:262
void resetCounter()
Definition uwaloha.h:302
virtual ~UWAlohaTimer()
Definition uwaloha.h:189
double left_duration
Definition uwaloha.h:340
UWAloha *UWALOHA_TIMER_STATUS timer_status
Definition uwaloha.h:346
virtual void schedule(double val)
Definition uwaloha.h:239
UWAlohaTimer(UWAloha *m)
Definition uwaloha.h:175
void incrCounter()
Definition uwaloha.h:312
bool isActive()
Definition uwaloha.h:292
bool isExpired()
Definition uwaloha.h:272
bool isFrozen()
Definition uwaloha.h:282
This is the base class of UWAloha protocol, which is a derived class of MMac.
Definition uwaloha.h:69
void putAckTimerInMap(int seq_num)
Definition uwaloha.h:692
int rttsamples
Definition uwaloha.h:769
int txsn
Definition uwaloha.h:778
static map< UWALOHA_STATUS, string > status_info
Definition uwaloha.h:799
double start_tx_time
Definition uwaloha.h:765
virtual void waitForUser()
Definition uwaloha.cpp:840
static map< UWALOHA_REASON_STATUS, string > reason_info
Definition uwaloha.h:803
UWALOHA_STATUS prev_prev_state
Definition uwaloha.h:793
BackOffTimer backoff_timer
Definition uwaloha.h:783
void eraseItemFromPktQueue(int seq_num)
Definition uwaloha.h:677
virtual ~UWAloha()
Definition uwaloha.cpp:162
UWAloha()
Definition uwaloha.cpp:119
static bool initialized
Definition uwaloha.h:754
virtual void stateTxData()
Definition uwaloha.cpp:661
int max_payload
Definition uwaloha.h:742
UWALOHA_TIMER_STATUS
Definition uwaloha.h:157
@ UWALOHA_IDLE
Definition uwaloha.h:158
@ UWALOHA_FROZEN
Definition uwaloha.h:160
@ UWALOHA_RUNNING
Definition uwaloha.h:159
@ UWALOHA_EXPIRED
Definition uwaloha.h:161
UWALOHA_ACK_MODES
Definition uwaloha.h:151
@ UWALOHA_NO_ACK_MODE
Definition uwaloha.h:151
@ UWALOHA_ACK_MODE
Definition uwaloha.h:151
int last_sent_data_id
Definition uwaloha.h:759
virtual void txData()
Definition uwaloha.cpp:524
virtual void Phy2MacStartRx(const Packet *p)
Definition uwaloha.cpp:457
virtual void stateRxData(Packet *p)
Definition uwaloha.cpp:764
virtual void stateRxAck(Packet *p)
Definition uwaloha.cpp:789
UWALOHA_PKT_TYPE
Definition uwaloha.h:139
@ UWALOHA_ACK_PKT
Definition uwaloha.h:140
@ UWALOHA_DATAMAX_PKT
Definition uwaloha.h:142
@ UWALOHA_DATA_PKT
Definition uwaloha.h:141
bool print_transitions
Definition uwaloha.h:761
int buffer_pkts
Definition uwaloha.h:746
double srtt
Definition uwaloha.h:766
virtual void stateWaitAck()
Definition uwaloha.cpp:722
UWALOHA_STATUS prev_state
Definition uwaloha.h:791
virtual void updateLastDataIdRx(int id)
Definition uwaloha.h:641
virtual void stateCheckAckExpired()
Definition uwaloha.cpp:548
double ACK_timeout
Definition uwaloha.h:745
double backoff_tuner
Definition uwaloha.h:741
virtual void stateIdle()
Definition uwaloha.cpp:605
int getUpLayersDataPktsRx()
Definition uwaloha.h:732
virtual void resetCurrTxRounds()
Definition uwaloha.h:609
virtual void updateRTT(double rtt)
Definition uwaloha.cpp:255
UWALOHA_REASON_STATUS
Definition uwaloha.h:117
@ UWALOHA_REASON_BACKOFF_PENDING
Definition uwaloha.h:132
@ UWALOHA_REASON_DATA_PENDING
Definition uwaloha.h:118
@ UWALOHA_REASON_DATA_EMPTY
Definition uwaloha.h:124
@ UWALOHA_REASON_WAIT_ACK_PENDING
Definition uwaloha.h:129
@ UWALOHA_REASON_DATA_TX
Definition uwaloha.h:120
@ UWALOHA_REASON_START_RX
Definition uwaloha.h:127
@ UWALOHA_REASON_BACKOFF_TIMEOUT
Definition uwaloha.h:131
@ UWALOHA_REASON_MAX_TX_TRIES
Definition uwaloha.h:126
@ UWALOHA_REASON_ACK_TX
Definition uwaloha.h:121
@ UWALOHA_REASON_NOT_SET
Definition uwaloha.h:125
@ UWALOHA_REASON_ACK_TIMEOUT
Definition uwaloha.h:123
@ UWALOHA_REASON_ACK_RX
Definition uwaloha.h:122
@ UWALOHA_REASON_PKT_ERROR
Definition uwaloha.h:130
@ UWALOHA_REASON_PKT_NOT_FOR_ME
Definition uwaloha.h:128
@ UWALOHA_REASON_DATA_RX
Definition uwaloha.h:119
virtual void initInfo()
Definition uwaloha.cpp:208
virtual double computeTxTime(UWALOHA_PKT_TYPE type)
Definition uwaloha.cpp:310
int curr_tx_rounds
Definition uwaloha.h:771
virtual void stateCheckBackoffExpired()
Definition uwaloha.cpp:578
virtual void stateRxIdle()
Definition uwaloha.cpp:625
UWALOHA_STATUS curr_state
Definition uwaloha.h:788
UWALOHA_STATUS
Definition uwaloha.h:96
@ UWALOHA_STATE_TX_ACK
Definition uwaloha.h:100
@ UWALOHA_STATE_CHK_ACK_TIMEOUT
Definition uwaloha.h:105
@ UWALOHA_STATE_RX_BACKOFF
Definition uwaloha.h:109
@ UWALOHA_STATE_ACK_RX
Definition uwaloha.h:103
@ UWALOHA_STATE_RX_WAIT_ACK
Definition uwaloha.h:107
@ UWALOHA_STATE_TX_DATA
Definition uwaloha.h:99
@ UWALOHA_STATE_NOT_SET
Definition uwaloha.h:104
@ UWALOHA_STATE_IDLE
Definition uwaloha.h:97
@ UWALOHA_STATE_BACKOFF
Definition uwaloha.h:98
@ UWALOHA_STATE_DATA_RX
Definition uwaloha.h:102
@ UWALOHA_STATE_WAIT_ACK
Definition uwaloha.h:101
@ UWALOHA_STATE_CHK_BACKOFF_TIMEOUT
Definition uwaloha.h:108
@ UWALOHA_STATE_WRONG_PKT_RX
Definition uwaloha.h:110
@ UWALOHA_STATE_RX_IDLE
Definition uwaloha.h:106
double sumrtt
Definition uwaloha.h:767
virtual void Phy2MacEndTx(const Packet *p)
Definition uwaloha.cpp:403
virtual double getRTT()
Definition uwaloha.h:626
int getPktSeqNum(Packet *p)
Definition uwaloha.h:653
virtual void stateRxBackoff()
Definition uwaloha.cpp:651
virtual void exitBackoff()
Definition uwaloha.cpp:280
virtual int getRemainingPkts()
Definition uwaloha.h:717
int last_data_id_rx
Definition uwaloha.h:772
int max_backoff_counter
Definition uwaloha.h:748
virtual void Phy2MacEndRx(Packet *p)
Definition uwaloha.cpp:465
static const double prop_speed
Definition uwaloha.h:780
bool has_buffer_queue
Definition uwaloha.h:762
virtual double getBackoffTime()
Definition uwaloha.cpp:286
virtual void incrCurrTxRounds()
Definition uwaloha.h:600
void putPktInQueue(Packet *p)
Definition uwaloha.h:667
AckTimer ack_timer
Definition uwaloha.h:782
virtual void Mac2PhyStartTx(Packet *p)
Definition uwaloha.cpp:393
map< pktSeqNum, AckTimer > mapAckTimer
Definition uwaloha.h:811
UWALOHA_ACK_MODES ack_mode
Definition uwaloha.h:797
virtual int command(int argc, const char *const *argv)
Definition uwaloha.cpp:169
int max_tx_tries
Definition uwaloha.h:738
static map< UWALOHA_PKT_TYPE, string > pkt_type_info
Definition uwaloha.h:806
UWALOHA_REASON_STATUS last_reason
Definition uwaloha.h:786
virtual void stateBackoff()
Definition uwaloha.cpp:634
virtual void initPkt(Packet *p, UWALOHA_PKT_TYPE pkt_type, int dest_addr=0)
Definition uwaloha.cpp:369
void eraseItemFrommapAckTimer(int seq_num)
Definition uwaloha.h:702
int ACK_size
Definition uwaloha.h:744
double sumrtt2
Definition uwaloha.h:768
virtual void stateRxWaitAck()
Definition uwaloha.cpp:741
int recv_data_id
Definition uwaloha.h:773
double wait_constant
Definition uwaloha.h:739
map< pktSeqNum, Packet * > mapPacket
Definition uwaloha.h:810
virtual void incrUpperDataRx()
Definition uwaloha.h:726
virtual void refreshState(UWALOHA_STATUS state)
Definition uwaloha.h:578
int uwaloha_debug
Definition uwaloha.h:751
virtual void recvFromUpperLayers(Packet *p)
Definition uwaloha.cpp:339
ofstream fout
Definition uwaloha.h:814
virtual void stateTxAck(int dest_addr)
Definition uwaloha.cpp:750
virtual void updateAckTimeout(double rtt)
Definition uwaloha.cpp:265
virtual void printStateInfo(double delay=0)
Definition uwaloha.cpp:815
virtual void refreshReason(UWALOHA_REASON_STATUS reason)
Definition uwaloha.h:590
double alpha_
Definition uwaloha.h:747
Packet * curr_data_pkt
Definition uwaloha.h:776
int HDR_size
Definition uwaloha.h:743
virtual void txAck(int dest_addr)
Definition uwaloha.cpp:538
int pktSeqNum
Definition uwaloha.h:61
packet_t PT_MMAC_ACK
Definition initlib.cpp:44
std::pair< int, int > counter
Definition uwinterference.h:53