INET Framework for OMNeT++/OMNEST
inet::ieee80211::Contention Class Reference

The default implementation of IContention. More...

#include <Contention.h>

Inheritance diagram for inet::ieee80211::Contention:
inet::ieee80211::IContention

Public Types

enum  State { IDLE, DEFER, IFS_AND_BACKOFF }
 
enum  EventType { START, MEDIUM_STATE_CHANGED, CORRUPTED_FRAME_RECEIVED, CHANNEL_ACCESS_GRANTED }
 

Public Member Functions

 Contention ()
 
 ~Contention ()
 
virtual void startContention (int cw, simtime_t ifs, simtime_t eifs, simtime_t slotTime, ICallback *callback) override
 
virtual void mediumStateChanged (bool mediumFree) override
 
virtual void corruptedFrameReceived () override
 
virtual bool isContentionInProgress () override
 
- Public Member Functions inherited from inet::ieee80211::IContention
virtual ~IContention ()
 

Static Public Attributes

static simsignal_t stateChangedSignal = registerSignal("stateChanged")
 
- Static Public Attributes inherited from inet::ieee80211::IContention
static simsignal_t backoffPeriodGeneratedSignal = cComponent::registerSignal("backoffPeriodGenerated")
 
static simsignal_t backoffStartedSignal = cComponent::registerSignal("backoffStarted")
 
static simsignal_t backoffStoppedSignal = cComponent::registerSignal("backoffStopped")
 
static simsignal_t channelAccessGrantedSignal = cComponent::registerSignal("channelAccessGranted")
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void handleMessage (cMessage *msg) override
 
virtual void handleWithFSM (EventType event)
 
virtual void scheduleTransmissionRequest ()
 
virtual void scheduleTransmissionRequestFor (simtime_t txStartTime)
 
virtual void cancelTransmissionRequest ()
 
virtual void switchToEifs ()
 
virtual void computeRemainingBackoffSlots ()
 
virtual void revokeBackoffOptimization ()
 
virtual void updateDisplayString (simtime_t expectedChannelAccess) const
 
const char * getEventName (EventType event)
 

Protected Attributes

Ieee80211Macmac = nullptr
 
ICallbackcallback = nullptr
 
cMessage * startTxEvent = nullptr
 
cMessage * channelGrantedEvent = nullptr
 
simtime_t ifs = SIMTIME_ZERO
 
simtime_t eifs = SIMTIME_ZERO
 
simtime_t slotTime = SIMTIME_ZERO
 
cFSM fsm
 
simtime_t endEifsTime = SIMTIME_ZERO
 
int backoffSlots = 0
 
simtime_t scheduledTransmissionTime = SIMTIME_ZERO
 
simtime_t lastChannelBusyTime = SIMTIME_ZERO
 
simtime_t lastIdleStartTime = SIMTIME_ZERO
 
simtime_t backoffOptimizationDelta = SIMTIME_ZERO
 
bool mediumFree = true
 
bool backoffOptimization = true
 
simtime_t startTime = SIMTIME_ZERO
 

Detailed Description

The default implementation of IContention.

Member Enumeration Documentation

◆ EventType

Enumerator
START 
MEDIUM_STATE_CHANGED 
CORRUPTED_FRAME_RECEIVED 
CHANNEL_ACCESS_GRANTED 

◆ State

Enumerator
IDLE 
DEFER 
IFS_AND_BACKOFF 

Constructor & Destructor Documentation

◆ Contention()

inet::ieee80211::Contention::Contention ( )
inline
66 {}

◆ ~Contention()

inet::ieee80211::Contention::~Contention ( )
65 {
66  cancelAndDelete(channelGrantedEvent);
67  cancelAndDelete(startTxEvent);
68 }

Member Function Documentation

◆ cancelTransmissionRequest()

void inet::ieee80211::Contention::cancelTransmissionRequest ( )
protectedvirtual
196 {
197  cancelEvent(startTxEvent);
199  emit(backoffStoppedSignal, SimTime::ZERO);
200  if (hasGUI())
202 }

Referenced by handleWithFSM(), revokeBackoffOptimization(), and switchToEifs().

◆ computeRemainingBackoffSlots()

void inet::ieee80211::Contention::computeRemainingBackoffSlots ( )
protectedvirtual
234 {
235  simtime_t remainingTime = scheduledTransmissionTime - simTime();
236  int remainingSlots = (remainingTime.raw() + slotTime.raw() - 1) / slotTime.raw();
237  if (remainingSlots < backoffSlots) // don't count IFS
238  backoffSlots = remainingSlots;
239 }

Referenced by handleWithFSM(), and revokeBackoffOptimization().

◆ corruptedFrameReceived()

void inet::ieee80211::Contention::corruptedFrameReceived ( )
overridevirtual

Implements inet::ieee80211::IContention.

181 {
182  Enter_Method("corruptedFrameReceived");
184 }

◆ getEventName()

const char * inet::ieee80211::Contention::getEventName ( EventType  event)
protected
253 {
254 #define CASE(x) case x: return #x;
255  switch (event) {
256  CASE(START);
260  default: ASSERT(false); return "";
261  }
262 #undef CASE
263 }

Referenced by handleWithFSM().

◆ handleMessage()

void inet::ieee80211::Contention::handleMessage ( cMessage *  msg)
overrideprotectedvirtual
165 {
166  if (msg == startTxEvent) {
167  emit(backoffStoppedSignal, SimTime::ZERO);
169  }
170  else if (msg == channelGrantedEvent) {
171  EV_INFO << "Channel granted: startTime = " << startTime << std::endl;
172  emit(channelAccessGrantedSignal, this);
174  callback = nullptr;
175  }
176  else
177  throw cRuntimeError("Unknown msg");
178 }

◆ handleWithFSM()

void inet::ieee80211::Contention::handleWithFSM ( EventType  event)
protectedvirtual
88 {
89  emit(stateChangedSignal, fsm.getState());
90  EV_TRACE << "handleWithFSM: processing event " << getEventName(event) << "\n";
91  bool finallyReportChannelAccessGranted = false;
92  FSMA_Switch(fsm) {
93  FSMA_State(IDLE) {
95  FSMA_Event_Transition(Starting-IFS-and-Backoff,
96  event == START && mediumFree,
99  );
101  event == START && !mediumFree,
102  DEFER,
103  ;
104  );
108  }
109  FSMA_State(DEFER) {
111  FSMA_Event_Transition(Restarting-IFS-and-Backoff,
112  event == MEDIUM_STATE_CHANGED && mediumFree,
115  );
116  FSMA_Event_Transition(Use-EIFS,
117  event == CORRUPTED_FRAME_RECEIVED,
118  DEFER,
119  endEifsTime = simTime() + eifs;
120  );
122  }
124  FSMA_Enter();
125  FSMA_Event_Transition(Backoff-expired,
126  event == CHANNEL_ACCESS_GRANTED,
127  IDLE,
128  lastIdleStartTime = simTime();
129  finallyReportChannelAccessGranted = true;
130  );
131  FSMA_Event_Transition(Defer-on-channel-busy,
132  event == MEDIUM_STATE_CHANGED && !mediumFree,
133  DEFER,
136  );
137  FSMA_Event_Transition(Use-EIFS,
138  event == CORRUPTED_FRAME_RECEIVED,
140  switchToEifs();
141  );
143  }
144  }
145  emit(stateChangedSignal, fsm.getState());
146  if (finallyReportChannelAccessGranted)
147  scheduleAfter(SIMTIME_ZERO, channelGrantedEvent);
148  if (hasGUI()) {
149  if (startTxEvent->isScheduled())
150  updateDisplayString(startTxEvent->getArrivalTime());
151  else
153  }
154 }

Referenced by corruptedFrameReceived(), handleMessage(), mediumStateChanged(), and startContention().

◆ initialize()

void inet::ieee80211::Contention::initialize ( int  stage)
overrideprotectedvirtual
28 {
29  if (stage == INITSTAGE_LOCAL) {
30  backoffOptimization = par("backoffOptimization");
31  lastIdleStartTime = simTime() - SimTime::getMaxTime() / 2;
32  mac = check_and_cast<Ieee80211Mac *>(getContainingNicModule(this)->getSubmodule("mac"));
33  startTxEvent = new cMessage("startTx");
34  startTxEvent->setSchedulingPriority(1000); // low priority, i.e. processed later than most events for the same time
35  // KLUDGE
36  // The callback->channelAccessGranted() call should be the last
37  // event at a simulation time in order to handle internal collisions
38  // properly.
39  channelGrantedEvent = new cMessage("channelGranted");
40  channelGrantedEvent->setSchedulingPriority(1000);
41  fsm.setName("Backoff procedure");
42  fsm.setState(IDLE, "IDLE");
43 
44  WATCH(ifs);
45  WATCH(eifs);
46  WATCH(slotTime);
47  WATCH(endEifsTime);
48  WATCH(backoffSlots);
50  WATCH(lastChannelBusyTime);
51  WATCH(lastIdleStartTime);
53  WATCH(mediumFree);
54  WATCH(backoffOptimization);
55  WATCH(startTime);
57  }
58  else if (stage == INITSTAGE_LAST) {
59  if (!par("initialChannelBusy") && simTime() == 0)
60  lastChannelBusyTime = simTime() - SimTime().getMaxTime() / 2;
61  }
62 }

◆ isContentionInProgress()

virtual bool inet::ieee80211::Contention::isContentionInProgress ( )
inlineoverridevirtual

Implements inet::ieee80211::IContention.

74 { return fsm.getState() != IDLE; }

◆ mediumStateChanged()

void inet::ieee80211::Contention::mediumStateChanged ( bool  mediumFree)
overridevirtual

Implements inet::ieee80211::IContention.

157 {
158  Enter_Method(mediumFree ? "medium FREE" : "medium BUSY");
159  this->mediumFree = mediumFree;
160  lastChannelBusyTime = simTime();
162 }

◆ numInitStages()

virtual int inet::ieee80211::Contention::numInitStages ( ) const
inlineoverrideprotectedvirtual
51 { return NUM_INIT_STAGES; }

◆ revokeBackoffOptimization()

void inet::ieee80211::Contention::revokeBackoffOptimization ( )
protectedvirtual
243 {
244  EV_DEBUG << "Revoking backoff optimization: backoffOptimizationDelta = " << backoffOptimizationDelta << std::endl;
246  backoffOptimizationDelta = SIMTIME_ZERO;
250 }

◆ scheduleTransmissionRequest()

void inet::ieee80211::Contention::scheduleTransmissionRequest ( )
protectedvirtual
205 {
206  ASSERT(mediumFree);
207  simtime_t now = simTime();
208  bool useEifs = endEifsTime > now + ifs;
209  simtime_t waitInterval = (useEifs ? eifs : ifs) + backoffSlots * slotTime;
210  EV_INFO << "Scheduling contention end: backoffslots = " << backoffSlots << ", slotTime = " << slotTime;
211  if (backoffOptimization && fsm.getState() == IDLE) {
212  // we can pretend the frame has arrived into the queue a little bit earlier, and may be able to start transmitting immediately
213  simtime_t elapsedFreeChannelTime = now - lastChannelBusyTime;
214  simtime_t elapsedIdleTime = now - lastIdleStartTime;
215  EV_INFO << ", lastBusyTime = " << lastChannelBusyTime << ", lastIdle = " << lastIdleStartTime;
216  backoffOptimizationDelta = std::min(waitInterval, std::min(elapsedFreeChannelTime, elapsedIdleTime));
217  if (backoffOptimizationDelta > SIMTIME_ZERO)
218  waitInterval -= backoffOptimizationDelta;
219  }
220  scheduledTransmissionTime = now + waitInterval;
221  EV_INFO << ", waitInterval = " << waitInterval << ".\n";
223 }

Referenced by handleWithFSM(), revokeBackoffOptimization(), and switchToEifs().

◆ scheduleTransmissionRequestFor()

void inet::ieee80211::Contention::scheduleTransmissionRequestFor ( simtime_t  txStartTime)
protectedvirtual
187 {
188  scheduleAt(txStartTime, startTxEvent);
189  callback->expectedChannelAccess(txStartTime);
190  emit(backoffStartedSignal, txStartTime);
191  if (hasGUI())
192  updateDisplayString(txStartTime);
193 }

Referenced by scheduleTransmissionRequest().

◆ startContention()

void inet::ieee80211::Contention::startContention ( int  cw,
simtime_t  ifs,
simtime_t  eifs,
simtime_t  slotTime,
ICallback callback 
)
overridevirtual

Implements inet::ieee80211::IContention.

71 {
72  startTime = simTime();
73  ASSERT(ifs >= 0 && eifs >= 0 && slotTime >= 0 && cw >= 0);
74  Enter_Method("startContention");
75  cancelEvent(channelGrantedEvent);
76  ASSERT(fsm.getState() == IDLE);
77  this->ifs = ifs;
78  this->eifs = eifs;
79  this->slotTime = slotTime;
80  this->callback = callback;
81  backoffSlots = intrand(cw + 1);
83  EV_DETAIL << "Starting contention: cw = " << cw << ", slots = " << backoffSlots << ", slotTime = " << slotTime << ", ifs = " << ifs << ", eifs = " << eifs << endl;
85 }

◆ switchToEifs()

void inet::ieee80211::Contention::switchToEifs ( )
protectedvirtual
226 {
227  EV_DEBUG << "Switching to EIFS from DISF.\n";
228  endEifsTime = simTime() + eifs;
231 }

Referenced by handleWithFSM().

◆ updateDisplayString()

void inet::ieee80211::Contention::updateDisplayString ( simtime_t  expectedChannelAccess) const
protectedvirtual
266 {
267  getDisplayString().setTagArg("t", 0, fsm.getStateName());
268 }

Referenced by cancelTransmissionRequest(), handleWithFSM(), initialize(), and scheduleTransmissionRequestFor().

Member Data Documentation

◆ backoffOptimization

bool inet::ieee80211::Contention::backoffOptimization = true
protected

◆ backoffOptimizationDelta

simtime_t inet::ieee80211::Contention::backoffOptimizationDelta = SIMTIME_ZERO
protected

◆ backoffSlots

int inet::ieee80211::Contention::backoffSlots = 0
protected

◆ callback

ICallback* inet::ieee80211::Contention::callback = nullptr
protected

◆ channelGrantedEvent

cMessage* inet::ieee80211::Contention::channelGrantedEvent = nullptr
protected

◆ eifs

simtime_t inet::ieee80211::Contention::eifs = SIMTIME_ZERO
protected

◆ endEifsTime

simtime_t inet::ieee80211::Contention::endEifsTime = SIMTIME_ZERO
protected

◆ fsm

cFSM inet::ieee80211::Contention::fsm
protected

◆ ifs

simtime_t inet::ieee80211::Contention::ifs = SIMTIME_ZERO
protected

◆ lastChannelBusyTime

simtime_t inet::ieee80211::Contention::lastChannelBusyTime = SIMTIME_ZERO
protected

◆ lastIdleStartTime

simtime_t inet::ieee80211::Contention::lastIdleStartTime = SIMTIME_ZERO
protected

◆ mac

Ieee80211Mac* inet::ieee80211::Contention::mac = nullptr
protected

Referenced by handleWithFSM(), and initialize().

◆ mediumFree

bool inet::ieee80211::Contention::mediumFree = true
protected

◆ scheduledTransmissionTime

simtime_t inet::ieee80211::Contention::scheduledTransmissionTime = SIMTIME_ZERO
protected

◆ slotTime

simtime_t inet::ieee80211::Contention::slotTime = SIMTIME_ZERO
protected

◆ startTime

simtime_t inet::ieee80211::Contention::startTime = SIMTIME_ZERO
protected

◆ startTxEvent

cMessage* inet::ieee80211::Contention::startTxEvent = nullptr
protected

◆ stateChangedSignal

simsignal_t inet::ieee80211::Contention::stateChangedSignal = registerSignal("stateChanged")
static

Referenced by handleWithFSM().


The documentation for this class was generated from the following files:
inet::ieee80211::Ieee80211Mac::sendDownPendingRadioConfigMsg
virtual void sendDownPendingRadioConfigMsg()
Definition: Ieee80211Mac.cc:366
FSMA_State
#define FSMA_State(s)
Definition: FSMA.h:107
inet::INITSTAGE_LAST
INET_API InitStage INITSTAGE_LAST
Operations that no other initializations can depend on, e.g.
inet::ieee80211::Contention::IDLE
@ IDLE
Definition: Contention.h:24
FSMA_Fail_On_Unhandled_Event
#define FSMA_Fail_On_Unhandled_Event()
Definition: FSMA.h:146
FSMA_Event_Transition
#define FSMA_Event_Transition(transition, condition, target, action)
Definition: FSMA.h:117
inet::ieee80211::Contention::ifs
simtime_t ifs
Definition: Contention.h:35
inet::ieee80211::Contention::channelGrantedEvent
cMessage * channelGrantedEvent
Definition: Contention.h:32
inet::ieee80211::IContention::ICallback::channelAccessGranted
virtual void channelAccessGranted()=0
inet::ieee80211::Contention::mediumFree
bool mediumFree
Definition: Contention.h:46
inet::ieee80211::Contention::MEDIUM_STATE_CHANGED
@ MEDIUM_STATE_CHANGED
Definition: Contention.h:25
inet::ieee80211::Contention::START
@ START
Definition: Contention.h:25
inet::sctp::min
double min(const double a, const double b)
Returns the minimum of a and b.
Definition: SctpAssociation.h:261
inet::ieee80211::Contention::eifs
simtime_t eifs
Definition: Contention.h:36
inet::getContainingNicModule
NetworkInterface * getContainingNicModule(const cModule *from)
Find the nic module (inside the networkNode) containing the given module.
Definition: NetworkInterface.cc:691
FSMA_Enter
#define FSMA_Enter(action)
Definition: FSMA.h:109
inet::ieee80211::Contention::startTxEvent
cMessage * startTxEvent
Definition: Contention.h:31
inet::ieee80211::IContention::backoffStartedSignal
static simsignal_t backoffStartedSignal
Definition: IContention.h:33
inet::ieee80211::IContention::channelAccessGrantedSignal
static simsignal_t channelAccessGrantedSignal
Definition: IContention.h:35
inet::ieee80211::Contention::startTime
simtime_t startTime
Definition: Contention.h:48
FSMA_Switch
#define FSMA_Switch(fsm)
Definition: FSMA.h:91
inet::ieee80211::Contention::scheduledTransmissionTime
simtime_t scheduledTransmissionTime
Definition: Contention.h:42
inet::ieee80211::Contention::lastIdleStartTime
simtime_t lastIdleStartTime
Definition: Contention.h:44
inet::ieee80211::Contention::switchToEifs
virtual void switchToEifs()
Definition: Contention.cc:225
inet::ieee80211::Contention::slotTime
simtime_t slotTime
Definition: Contention.h:37
inet::ieee80211::Contention::endEifsTime
simtime_t endEifsTime
Definition: Contention.h:40
inet::ieee80211::Contention::backoffOptimizationDelta
simtime_t backoffOptimizationDelta
Definition: Contention.h:45
inet::ieee80211::Contention::getEventName
const char * getEventName(EventType event)
Definition: Contention.cc:252
inet::ieee80211::IContention::ICallback::expectedChannelAccess
virtual void expectedChannelAccess(simtime_t time)=0
inet::ieee80211::Contention::backoffOptimization
bool backoffOptimization
Definition: Contention.h:47
inet::ieee80211::Contention::cancelTransmissionRequest
virtual void cancelTransmissionRequest()
Definition: Contention.cc:195
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::ieee80211::Contention::DEFER
@ DEFER
Definition: Contention.h:24
inet::ieee80211::Contention::computeRemainingBackoffSlots
virtual void computeRemainingBackoffSlots()
Definition: Contention.cc:233
inet::ieee80211::Contention::IFS_AND_BACKOFF
@ IFS_AND_BACKOFF
Definition: Contention.h:24
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::ieee80211::Contention::fsm
cFSM fsm
Definition: Contention.h:39
inet::ieee80211::Contention::lastChannelBusyTime
simtime_t lastChannelBusyTime
Definition: Contention.h:43
inet::ieee80211::IContention::backoffStoppedSignal
static simsignal_t backoffStoppedSignal
Definition: IContention.h:34
inet::ieee80211::IContention::backoffPeriodGeneratedSignal
static simsignal_t backoffPeriodGeneratedSignal
Definition: IContention.h:32
CASE
#define CASE(x)
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::ieee80211::Contention::handleWithFSM
virtual void handleWithFSM(EventType event)
Definition: Contention.cc:87
inet::ieee80211::Contention::scheduleTransmissionRequestFor
virtual void scheduleTransmissionRequestFor(simtime_t txStartTime)
Definition: Contention.cc:186
inet::ieee80211::Contention::updateDisplayString
virtual void updateDisplayString(simtime_t expectedChannelAccess) const
Definition: Contention.cc:265
inet::ieee80211::Contention::mac
Ieee80211Mac * mac
Definition: Contention.h:29
inet::ieee80211::Contention::CHANNEL_ACCESS_GRANTED
@ CHANNEL_ACCESS_GRANTED
Definition: Contention.h:25
inet::ieee80211::Contention::stateChangedSignal
static simsignal_t stateChangedSignal
Definition: Contention.h:26
inet::ieee80211::Contention::callback
ICallback * callback
Definition: Contention.h:30
inet::ieee80211::Contention::scheduleTransmissionRequest
virtual void scheduleTransmissionRequest()
Definition: Contention.cc:204
inet::ieee80211::Contention::CORRUPTED_FRAME_RECEIVED
@ CORRUPTED_FRAME_RECEIVED
Definition: Contention.h:25
inet::ieee80211::Contention::backoffSlots
int backoffSlots
Definition: Contention.h:41
FSMA_Ignore_Event
#define FSMA_Ignore_Event(condition)
Definition: FSMA.h:139