DESERT 4.0.0
uw-csma-aloha.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
39#ifndef CSMA_H
40#define CSMA_H
41
42#include <fstream>
43#include <map>
44#include <queue>
45#include <string>
46
47#include <mmac.h>
48#include <mphy.h>
49
50#define CSMA_DROP_REASON_WRONG_STATE \
51 "WST"
52#define CSMA_DROP_REASON_WRONG_RECEIVER \
53 "WRCV"
54#define CSMA_DROP_REASON_UNKNOWN_TYPE \
55 "UPT"
56#define CSMA_DROP_REASON_BUFFER_FULL \
57 "DBF"
58#define CSMA_DROP_REASON_ERROR "ERR"
60extern packet_t PT_MMAC_ACK;
61
65class CsmaAloha : public MMac
66{
67public:
71 CsmaAloha();
75 virtual ~CsmaAloha() = default;
86 virtual int command(int argc, const char *const *argv) override;
87
88protected:
89 static const double prop_speed;
112
134
137
140
148
152 class AlohaTimer : public TimerHandler
153 {
154 public:
160 : TimerHandler()
161 , start_time(0.0)
162 , left_duration(0.0)
163 , counter(0)
164 , module(m)
166 {
167 assert(m != NULL);
168 }
169
173 virtual ~AlohaTimer() = default;
174
178 virtual void
180 {
181 assert(timer_status == CSMA_RUNNING);
182 left_duration -= (NOW - start_time);
183 if (left_duration <= 0.0)
184 left_duration = module->mac2phy_delay_;
185 force_cancel();
187 }
188
193 virtual void
195 {
196 assert(timer_status == CSMA_FROZEN);
197 start_time = NOW;
198 assert(left_duration > 0);
199 sched(left_duration);
201 }
202
206 virtual void
208 {
210 force_cancel();
211 }
212
217 virtual void
218 schedule(double val)
219 {
220 start_time = NOW;
221 left_duration = val;
223 resched(val);
224 }
225
230 bool
232 {
233 return (timer_status == CSMA_IDLE);
234 }
235
240 bool
242 {
243 return (timer_status == CSMA_RUNNING);
244 }
245
251 bool
253 {
254 return (timer_status == CSMA_EXPIRED);
255 }
256
261 bool
263 {
264 return (timer_status == CSMA_FROZEN);
265 }
266
271 bool
273 {
274 return (timer_status == CSMA_FROZEN ||
276 }
277
281 void
283 {
284 counter = 0;
285 }
286
290 void
292 {
293 ++counter;
294 }
295
300 int
302 {
303 return counter;
304 }
305
310 double
312 {
313 return left_duration;
314 }
315
316 protected:
317 double start_time;
323 CsmaAloha *module;
325 };
326
331 {
332 public:
338 : AlohaTimer(m)
339 {
340 }
341
345 virtual ~BackOffTimer() = default;
346
347 protected:
352 virtual void expire(Event *e);
353 };
354
358 class AckTimer : public AlohaTimer
359 {
360 public:
366 : AlohaTimer(m)
367 {
368 }
369
373 virtual ~AckTimer() = default;
374
375 protected:
380 virtual void expire(Event *e);
381 };
382
388 class ListenTimer : public AlohaTimer
389 {
390 public:
396 : AlohaTimer(m)
397 {
398 }
399
403 virtual ~ListenTimer() = default;
404
405 protected:
410 virtual void expire(Event *e);
411 };
412
418 virtual void recvFromUpperLayers(Packet *p) override;
419
425 virtual void Mac2PhyStartTx(Packet *p);
426
432 virtual void Phy2MacEndTx(const Packet *p) override;
433
439 virtual void Phy2MacStartRx(const Packet *p) override;
440
446 virtual void Phy2MacEndRx(Packet *p) override;
447
453 virtual double computeTxTime(CSMA_PKT_TYPE type);
454
462 virtual void initPkt(Packet *p, CSMA_PKT_TYPE pkt_type, int dest_addr = 0);
463
471 virtual double getBackoffTime();
472
477 virtual void txData();
478
484 virtual void txAck(int dest_addr);
485
489 virtual void stateIdle();
490
494 virtual void stateRxIdle();
495
499 virtual void stateTxData();
500
505 virtual void stateTxAck(int dest_addr);
506
512 virtual void stateBackoff();
513
518 virtual void stateRxBackoff();
519
524 virtual void stateWaitAck();
525
529 virtual void stateRxWaitAck();
530
534 virtual void stateListen();
535
540 virtual void stateRxListen();
541
545 virtual void stateCheckListenExpired();
546
550 virtual void stateCheckAckExpired();
551
555 virtual void stateCheckBackoffExpired();
556
560 virtual void stateRxData(Packet *p);
561
565 virtual void stateRxAck(Packet *p);
566
570 virtual void stateRxPacketNotForMe(Packet *p);
571
578 virtual void printStateInfo(double delay = 0);
579
585 virtual void initInfo();
586
590 virtual void
597
601 virtual void
603 {
604 last_reason = reason;
605 }
609 virtual void exitBackoff();
610
615 virtual void
616 setSessionDistance(double distance)
617 {
618 session_distance = distance;
619 }
620
629 virtual bool keepDataPkt(int serial_number);
630
634 virtual void
636 {
638 }
639
643 virtual void
645 {
646 curr_tx_rounds = 0;
647 }
648
656 virtual void updateRTT(double rtt);
657
662 virtual double
663 getRTT() const
664 {
665 return (rttsamples > 0) ? sumrtt / rttsamples : 0;
666 }
667
674 virtual void updateAckTimeout(double rtt);
675
679 virtual void
681 {
682 last_data_id_rx = id;
683 }
684
688 virtual void
689 queuePop(bool flag = true)
690 {
691 Packet::free(Q.front());
692 Q.pop();
693 waitEndTime(flag);
694 data_sn_queue.pop();
695 }
699 virtual void resetSession();
700
707 virtual int
709 {
710 return (up_data_pkts_rx - Q.size());
711 }
712
716 virtual void
718 {
719 up_data_pkts_rx++;
720 }
721
722 virtual int
724 {
725 return up_data_pkts_rx;
726 }
727
736 double ACK_timeout;
738 double alpha_;
740 double listen_time;
742 std::queue<Packet *> Q;
743 std::queue<int>
746 static bool initialized;
748 static int u_pkt_id;
752 bool TxActive;
753 bool RxActive;
765 double srtt;
766 double sumrtt;
767 double sumrtt2;
791 static map<CSMA_STATUS, string>
793 static map<CSMA_REASON_STATUS, string>
796 static map<CSMA_PKT_TYPE, string>
799 ofstream fout;
801};
802
803#endif /* CSMA_H */
Definition uw-csma-aloha.h:359
virtual ~AckTimer()=default
AckTimer(CsmaAloha *m)
Definition uw-csma-aloha.h:365
virtual void expire(Event *e)
Definition uw-csma-aloha.cpp:77
Definition uw-csma-aloha.h:153
virtual ~AlohaTimer()=default
virtual void unFreeze()
Definition uw-csma-aloha.h:194
virtual void schedule(double val)
Definition uw-csma-aloha.h:218
void incrCounter()
Definition uw-csma-aloha.h:291
virtual void stop()
Definition uw-csma-aloha.h:207
CsmaAloha *CSMA_TIMER_STATUS timer_status
Definition uw-csma-aloha.h:324
double left_duration
Definition uw-csma-aloha.h:319
bool isFrozen()
Definition uw-csma-aloha.h:262
double start_time
Definition uw-csma-aloha.h:317
bool isActive()
Definition uw-csma-aloha.h:272
int counter
Definition uw-csma-aloha.h:321
void resetCounter()
Definition uw-csma-aloha.h:282
virtual void freeze()
Definition uw-csma-aloha.h:179
AlohaTimer(CsmaAloha *m)
Definition uw-csma-aloha.h:159
bool isRunning()
Definition uw-csma-aloha.h:241
int getCounter() const
Definition uw-csma-aloha.h:301
double getDuration() const
Definition uw-csma-aloha.h:311
bool isIdle()
Definition uw-csma-aloha.h:231
bool isExpired()
Definition uw-csma-aloha.h:252
Definition uw-csma-aloha.h:331
virtual ~BackOffTimer()=default
virtual void expire(Event *e)
Definition uw-csma-aloha.cpp:98
BackOffTimer(CsmaAloha *m)
Definition uw-csma-aloha.h:337
Definition uw-csma-aloha.h:389
ListenTimer(CsmaAloha *m)
Definition uw-csma-aloha.h:395
virtual void expire(Event *e)
Definition uw-csma-aloha.cpp:120
virtual ~ListenTimer()=default
Definition uw-csma-aloha.h:66
int rttsamples
Definition uw-csma-aloha.h:768
double ACK_timeout
Definition uw-csma-aloha.h:736
int ACK_size
Definition uw-csma-aloha.h:735
virtual void stateRxWaitAck()
Definition uw-csma-aloha.cpp:941
virtual void stateIdle()
Definition uw-csma-aloha.cpp:798
virtual int getRemainingPkts() override
Definition uw-csma-aloha.h:708
std::queue< int > data_sn_queue
Definition uw-csma-aloha.h:744
virtual void txAck(int dest_addr)
Definition uw-csma-aloha.cpp:656
virtual void stateTxData()
Definition uw-csma-aloha.cpp:886
virtual void setSessionDistance(double distance)
Definition uw-csma-aloha.h:616
virtual void stateCheckAckExpired()
Definition uw-csma-aloha.cpp:743
virtual void refreshState(CSMA_STATUS state)
Definition uw-csma-aloha.h:591
int buffer_pkts
Definition uw-csma-aloha.h:737
virtual void queuePop(bool flag=true)
Definition uw-csma-aloha.h:689
virtual void initInfo()
Definition uw-csma-aloha.cpp:246
CSMA_ACK_MODES
Definition uw-csma-aloha.h:139
@ CSMA_ACK_MODE
Definition uw-csma-aloha.h:139
@ CSMA_NO_ACK_MODE
Definition uw-csma-aloha.h:139
virtual void updateRTT(double rtt)
Definition uw-csma-aloha.cpp:304
virtual void updateAckTimeout(double rtt)
Definition uw-csma-aloha.cpp:314
std::queue< Packet * > Q
Definition uw-csma-aloha.h:742
int last_sent_data_id
Definition uw-csma-aloha.h:750
CSMA_STATUS prev_prev_state
Definition uw-csma-aloha.h:786
virtual void stateRxAck(Packet *p)
Definition uw-csma-aloha.cpp:1037
virtual void resetSession()
Definition uw-csma-aloha.cpp:298
virtual void Phy2MacStartRx(const Packet *p) override
Definition uw-csma-aloha.cpp:550
virtual int getUpLayersDataPktsRx()
Definition uw-csma-aloha.h:723
Packet * curr_data_pkt
Definition uw-csma-aloha.h:774
CSMA_STATUS
Definition uw-csma-aloha.h:93
@ CSMA_STATE_TX_DATA
Definition uw-csma-aloha.h:96
@ CSMA_STATE_BACKOFF
Definition uw-csma-aloha.h:95
@ CSMA_STATE_CHK_ACK_TIMEOUT
Definition uw-csma-aloha.h:103
@ CSMA_STATE_DATA_RX
Definition uw-csma-aloha.h:99
@ CSMA_STATE_RX_WAIT_ACK
Definition uw-csma-aloha.h:109
@ CSMA_STATE_ACK_RX
Definition uw-csma-aloha.h:100
@ CSMA_STATE_RX_BACKOFF
Definition uw-csma-aloha.h:108
@ CSMA_STATE_LISTEN
Definition uw-csma-aloha.h:102
@ CSMA_STATE_CHK_LISTEN_TIMEOUT
Definition uw-csma-aloha.h:104
@ CSMA_STATE_RX_IDLE
Definition uw-csma-aloha.h:106
@ CSMA_STATE_TX_ACK
Definition uw-csma-aloha.h:97
@ CSMA_STATE_WAIT_ACK
Definition uw-csma-aloha.h:98
@ CSMA_STATE_WRONG_PKT_RX
Definition uw-csma-aloha.h:110
@ CSMA_STATE_CHK_BACKOFF_TIMEOUT
Definition uw-csma-aloha.h:105
@ CSMA_STATE_NOT_SET
Definition uw-csma-aloha.h:101
@ CSMA_STATE_IDLE
Definition uw-csma-aloha.h:94
@ CSMA_STATE_RX_LISTEN
Definition uw-csma-aloha.h:107
virtual int command(int argc, const char *const *argv) override
Definition uw-csma-aloha.cpp:201
double alpha_
Definition uw-csma-aloha.h:738
bool RxActive
Definition uw-csma-aloha.h:753
CSMA_REASON_STATUS
Definition uw-csma-aloha.h:114
@ CSMA_REASON_ACK_TX
Definition uw-csma-aloha.h:118
@ CSMA_REASON_WAIT_ACK_PENDING
Definition uw-csma-aloha.h:131
@ CSMA_REASON_DATA_PENDING
Definition uw-csma-aloha.h:115
@ CSMA_REASON_BACKOFF_TIMEOUT
Definition uw-csma-aloha.h:120
@ CSMA_REASON_DATA_RX
Definition uw-csma-aloha.h:116
@ CSMA_REASON_DATA_TX
Definition uw-csma-aloha.h:117
@ CSMA_REASON_NOT_SET
Definition uw-csma-aloha.h:123
@ CSMA_REASON_DATA_EMPTY
Definition uw-csma-aloha.h:122
@ CSMA_REASON_ACK_RX
Definition uw-csma-aloha.h:119
@ CSMA_REASON_LISTEN_TIMEOUT
Definition uw-csma-aloha.h:127
@ CSMA_REASON_PKT_NOT_FOR_ME
Definition uw-csma-aloha.h:130
@ CSMA_REASON_LISTEN
Definition uw-csma-aloha.h:126
@ CSMA_REASON_BACKOFF_PENDING
Definition uw-csma-aloha.h:125
@ CSMA_REASON_MAX_TX_TRIES
Definition uw-csma-aloha.h:124
@ CSMA_REASON_START_RX
Definition uw-csma-aloha.h:129
@ CSMA_REASON_ACK_TIMEOUT
Definition uw-csma-aloha.h:121
@ CSMA_REASON_LISTEN_PENDING
Definition uw-csma-aloha.h:128
@ CSMA_REASON_PKT_ERROR
Definition uw-csma-aloha.h:132
virtual void initPkt(Packet *p, CSMA_PKT_TYPE pkt_type, int dest_addr=0)
Definition uw-csma-aloha.cpp:417
static map< CSMA_PKT_TYPE, string > pkt_type_info
Definition uw-csma-aloha.h:797
virtual void stateWaitAck()
Definition uw-csma-aloha.cpp:926
virtual ~CsmaAloha()=default
static const double prop_speed
Definition uw-csma-aloha.h:89
virtual void stateRxData(Packet *p)
Definition uw-csma-aloha.cpp:965
bool has_buffer_queue
Definition uw-csma-aloha.h:760
virtual void stateCheckListenExpired()
Definition uw-csma-aloha.cpp:710
int last_data_id_rx
Definition uw-csma-aloha.h:772
static int u_pkt_id
Definition uw-csma-aloha.h:748
virtual void stateRxListen()
Definition uw-csma-aloha.cpp:851
virtual void refreshReason(CSMA_REASON_STATUS reason)
Definition uw-csma-aloha.h:602
CSMA_ACK_MODES ack_mode
Definition uw-csma-aloha.h:788
double wait_costant
Definition uw-csma-aloha.h:731
virtual void incrCurrTxRounds()
Definition uw-csma-aloha.h:635
virtual void stateRxPacketNotForMe(Packet *p)
Definition uw-csma-aloha.cpp:666
double session_distance
Definition uw-csma-aloha.h:776
CsmaAloha()
Definition uw-csma-aloha.cpp:150
virtual void txData()
Definition uw-csma-aloha.cpp:643
virtual void Phy2MacEndTx(const Packet *p) override
Definition uw-csma-aloha.cpp:460
static map< CSMA_REASON_STATUS, string > reason_info
Definition uw-csma-aloha.h:794
virtual void Phy2MacEndRx(Packet *p) override
Definition uw-csma-aloha.cpp:587
int max_payload
Definition uw-csma-aloha.h:733
BackOffTimer backoff_timer
Definition uw-csma-aloha.h:780
virtual double getBackoffTime()
Definition uw-csma-aloha.cpp:375
virtual void printStateInfo(double delay=0)
Definition uw-csma-aloha.cpp:1079
virtual void recvFromUpperLayers(Packet *p) override
Definition uw-csma-aloha.cpp:398
int HDR_size
Definition uw-csma-aloha.h:734
double sumrtt
Definition uw-csma-aloha.h:766
bool print_transitions
Definition uw-csma-aloha.h:757
CSMA_TIMER_STATUS
Definition uw-csma-aloha.h:142
@ CSMA_IDLE
Definition uw-csma-aloha.h:143
@ CSMA_FROZEN
Definition uw-csma-aloha.h:145
@ CSMA_EXPIRED
Definition uw-csma-aloha.h:146
@ CSMA_RUNNING
Definition uw-csma-aloha.h:144
virtual double computeTxTime(CSMA_PKT_TYPE type)
Definition uw-csma-aloha.cpp:336
static bool initialized
Definition uw-csma-aloha.h:746
AckTimer ack_timer
Definition uw-csma-aloha.h:779
int max_backoff_counter
Definition uw-csma-aloha.h:739
int u_data_id
Definition uw-csma-aloha.h:749
virtual void updateLastDataIdRx(int id)
Definition uw-csma-aloha.h:680
virtual void stateBackoff()
Definition uw-csma-aloha.cpp:860
bool TxActive
Definition uw-csma-aloha.h:752
virtual void exitBackoff()
Definition uw-csma-aloha.cpp:369
virtual void stateRxBackoff()
Definition uw-csma-aloha.cpp:876
bool session_active
Definition uw-csma-aloha.h:754
ListenTimer listen_timer
Definition uw-csma-aloha.h:781
CSMA_STATUS prev_state
Definition uw-csma-aloha.h:785
virtual void stateListen()
Definition uw-csma-aloha.cpp:830
static map< CSMA_STATUS, string > status_info
Definition uw-csma-aloha.h:792
double srtt
Definition uw-csma-aloha.h:765
int curr_tx_rounds
Definition uw-csma-aloha.h:770
CSMA_REASON_STATUS last_reason
Definition uw-csma-aloha.h:783
double start_tx_time
Definition uw-csma-aloha.h:763
virtual void resetCurrTxRounds()
Definition uw-csma-aloha.h:644
double sumrtt2
Definition uw-csma-aloha.h:767
virtual void Mac2PhyStartTx(Packet *p)
Definition uw-csma-aloha.cpp:450
virtual double getRTT() const
Definition uw-csma-aloha.h:663
virtual bool keepDataPkt(int serial_number)
Definition uw-csma-aloha.cpp:325
double backoff_tuner
Definition uw-csma-aloha.h:729
CSMA_STATUS curr_state
Definition uw-csma-aloha.h:784
int max_tx_tries
Definition uw-csma-aloha.h:728
virtual void incrUpperDataRx() override
Definition uw-csma-aloha.h:717
virtual void stateCheckBackoffExpired()
Definition uw-csma-aloha.cpp:769
ofstream fout
Definition uw-csma-aloha.h:799
virtual void stateRxIdle()
Definition uw-csma-aloha.cpp:821
CSMA_PKT_TYPE
Definition uw-csma-aloha.h:136
@ CSMA_ACK_PKT
Definition uw-csma-aloha.h:136
@ CSMA_DATAMAX_PKT
Definition uw-csma-aloha.h:136
@ CSMA_DATA_PKT
Definition uw-csma-aloha.h:136
double listen_time
Definition uw-csma-aloha.h:740
virtual void stateTxAck(int dest_addr)
Definition uw-csma-aloha.cpp:950
packet_t PT_MMAC_ACK
Definition initlib.cpp:44
std::pair< int, int > counter
Definition uwinterference.h:53