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

Implements IEEE 802.11 Enhanced Distributed Channel Access Function. More...

#include <Edcaf.h>

Inheritance diagram for inet::ieee80211::Edcaf:
inet::ieee80211::IChannelAccess inet::ieee80211::IContention::ICallback inet::ieee80211::IRecoveryProcedure::ICwCalculator inet::ieee80211::ModeSetListener

Public Member Functions

virtual ~Edcaf ()
 
virtual StationRetryCountersgetStationRetryCounters () const
 
virtual QosAckHandlergetAckHandler () const
 
virtual QosRecoveryProceduregetRecoveryProcedure () const
 
virtual TxopProceduregetTxopProcedure () const
 
virtual queueing::IPacketQueuegetPendingQueue () const
 
virtual InProgressFramesgetInProgressFrames () const
 
virtual void requestChannel (IChannelAccess::ICallback *callback) override
 
virtual void releaseChannel (IChannelAccess::ICallback *callback) override
 
virtual void channelAccessGranted () override
 
virtual void expectedChannelAccess (simtime_t time) override
 
virtual void incrementCw () override
 
virtual void resetCw () override
 
virtual int getCw () override
 
virtual bool isOwning ()
 
virtual bool isInternalCollision ()
 
virtual AccessCategory getAccessCategory ()
 
- Public Member Functions inherited from inet::ieee80211::IChannelAccess
virtual ~IChannelAccess ()
 
- Public Member Functions inherited from inet::ieee80211::IContention::ICallback
 ~ICallback ()
 
- Public Member Functions inherited from inet::ieee80211::IRecoveryProcedure::ICwCalculator
virtual ~ICwCalculator ()
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void refreshDisplay () const override
 
virtual void receiveSignal (cComponent *source, simsignal_t signalID, cObject *obj, cObject *details) override
 
virtual AccessCategory getAccessCategory (const char *ac)
 
virtual int getAifsNumber (AccessCategory ac)
 
virtual int getCwMax (AccessCategory ac, int aCwMax, int aCwMin)
 
virtual int getCwMin (AccessCategory ac, int aCwMin)
 
virtual void calculateTimingParameters ()
 

Protected Attributes

IContentioncontention = nullptr
 
IChannelAccess::ICallbackcallback = nullptr
 
IEdcaCollisionControllercollisionController = nullptr
 
StationRetryCountersstationRetryCounters = nullptr
 
QosAckHandlerackHandler = nullptr
 
QosRecoveryProcedurerecoveryProcedure = nullptr
 
TxopProceduretxopProcedure = nullptr
 
queueing::IPacketQueuependingQueue = nullptr
 
InProgressFramesinProgressFrames = nullptr
 
bool owning = false
 
simtime_t slotTime = -1
 
simtime_t sifs = -1
 
simtime_t ifs = -1
 
simtime_t eifs = -1
 
AccessCategory ac = AccessCategory(-1)
 
int cw = -1
 
int cwMin = -1
 
int cwMax = -1
 
- Protected Attributes inherited from inet::ieee80211::ModeSetListener
physicallayer::Ieee80211ModeSetmodeSet = nullptr
 

Additional Inherited Members

- Static Public Attributes inherited from inet::ieee80211::IChannelAccess
static simsignal_t channelOwnershipChangedSignal = cComponent::registerSignal("channelOwnershipChanged")
 

Detailed Description

Implements IEEE 802.11 Enhanced Distributed Channel Access Function.

Constructor & Destructor Documentation

◆ ~Edcaf()

inet::ieee80211::Edcaf::~Edcaf ( )
virtual
25 {
26  delete stationRetryCounters;
27 }

Member Function Documentation

◆ calculateTimingParameters()

void inet::ieee80211::Edcaf::calculateTimingParameters ( )
protectedvirtual
72 {
75  int aifsn = par("aifsn");
76  simtime_t aifs = sifs + fallback(aifsn, getAifsNumber(ac)) * slotTime;
77  ifs = aifs;
79  EV_DEBUG << "Timing parameters are initialized: slotTime = " << slotTime << ", sifs = " << sifs << ", ifs = " << ifs << ", eifs = " << eifs << std::endl;
80  ASSERT(ifs > sifs);
81  cwMin = par("cwMin");
82  cwMax = par("cwMax");
83  if (cwMin == -1)
85  if (cwMax == -1)
87  cw = cwMin;
88  EV_DEBUG << "Contention window parameters are initialized: cw = " << cw << ", cwMin = " << cwMin << ", cwMax = " << cwMax << std::endl;
89 }

◆ channelAccessGranted()

void inet::ieee80211::Edcaf::channelAccessGranted ( )
overridevirtual

Implements inet::ieee80211::IContention::ICallback.

134 {
135  Enter_Method("channelAccessGranted");
136  ASSERT(callback != nullptr);
138  owning = true;
140  callback->channelGranted(this);
141  }
142  else
143  EV_WARN << "Ignoring channel access granted due to internal collision.\n";
144 }

◆ expectedChannelAccess()

void inet::ieee80211::Edcaf::expectedChannelAccess ( simtime_t  time)
overridevirtual

◆ getAccessCategory() [1/2]

virtual AccessCategory inet::ieee80211::Edcaf::getAccessCategory ( )
inlinevirtual
103 { return ac; }

◆ getAccessCategory() [2/2]

AccessCategory inet::ieee80211::Edcaf::getAccessCategory ( const char *  ac)
protectedvirtual
121 {
122  if (strcmp("AC_BK", ac) == 0)
123  return AC_BK;
124  if (strcmp("AC_VI", ac) == 0)
125  return AC_VI;
126  if (strcmp("AC_VO", ac) == 0)
127  return AC_VO;
128  if (strcmp("AC_BE", ac) == 0)
129  return AC_BE;
130  throw cRuntimeError("Unknown Access Category = %s", ac);
131 }

Referenced by inet::ieee80211::EdcaCollisionController::expectedChannelAccess(), and inet::ieee80211::EdcaCollisionController::isInternalCollision().

◆ getAckHandler()

virtual QosAckHandler* inet::ieee80211::Edcaf::getAckHandler ( ) const
inlinevirtual
79 { return ackHandler; }

◆ getAifsNumber()

int inet::ieee80211::Edcaf::getAifsNumber ( AccessCategory  ac)
protectedvirtual
110 {
111  switch (ac) {
112  case AC_BK: return 7;
113  case AC_BE: return 3;
114  case AC_VI: return 2;
115  case AC_VO: return 2;
116  default: throw cRuntimeError("Unknown access category = %d", ac);
117  }
118 }

◆ getCw()

virtual int inet::ieee80211::Edcaf::getCw ( )
inlineoverridevirtual

◆ getCwMax()

int inet::ieee80211::Edcaf::getCwMax ( AccessCategory  ac,
int  aCwMax,
int  aCwMin 
)
protectedvirtual
178 {
179  switch (ac) {
180  case AC_BK: return aCwMax;
181  case AC_BE: return aCwMax;
182  case AC_VI: return aCwMin;
183  case AC_VO: return (aCwMin + 1) / 2 - 1;
184  default: throw cRuntimeError("Unknown access category = %d", ac);
185  }
186 }

◆ getCwMin()

int inet::ieee80211::Edcaf::getCwMin ( AccessCategory  ac,
int  aCwMin 
)
protectedvirtual
189 {
190  switch (ac) {
191  case AC_BK: return aCwMin;
192  case AC_BE: return aCwMin;
193  case AC_VI: return (aCwMin + 1) / 2 - 1;
194  case AC_VO: return (aCwMin + 1) / 4 - 1;
195  default: throw cRuntimeError("Unknown access category = %d", ac);
196  }
197 }

◆ getInProgressFrames()

virtual InProgressFrames* inet::ieee80211::Edcaf::getInProgressFrames ( ) const
inlinevirtual
85 { return inProgressFrames; }

◆ getPendingQueue()

virtual queueing::IPacketQueue* inet::ieee80211::Edcaf::getPendingQueue ( ) const
inlinevirtual
84 { return pendingQueue; }

◆ getRecoveryProcedure()

virtual QosRecoveryProcedure* inet::ieee80211::Edcaf::getRecoveryProcedure ( ) const
inlinevirtual
80 { return recoveryProcedure; }

◆ getStationRetryCounters()

virtual StationRetryCounters* inet::ieee80211::Edcaf::getStationRetryCounters ( ) const
inlinevirtual
78 { return stationRetryCounters; }

◆ getTxopProcedure()

virtual TxopProcedure* inet::ieee80211::Edcaf::getTxopProcedure ( ) const
inlinevirtual
82 { return txopProcedure; }

◆ incrementCw()

void inet::ieee80211::Edcaf::incrementCw ( )
overridevirtual

Implements inet::ieee80211::IRecoveryProcedure::ICwCalculator.

92 {
93  Enter_Method("incrementCw");
94  int newCw = 2 * cw + 1;
95  if (newCw > cwMax)
96  cw = cwMax;
97  else
98  cw = newCw;
99  EV_DEBUG << "Contention window is incremented: cw = " << cw << std::endl;
100 }

◆ initialize()

void inet::ieee80211::Edcaf::initialize ( int  stage)
overrideprotectedvirtual

Reimplemented from inet::ieee80211::ModeSetListener.

30 {
31  if (stage == INITSTAGE_LOCAL) {
32  getContainingNicModule(this)->subscribe(modesetChangedSignal, this);
33  ac = getAccessCategory(par("accessCategory"));
34  contention = check_and_cast<IContention *>(getSubmodule("contention"));
35  collisionController = check_and_cast<IEdcaCollisionController *>(getModuleByPath(par("collisionControllerModule")));
36  pendingQueue = check_and_cast<queueing::IPacketQueue *>(getSubmodule("pendingQueue"));
37  recoveryProcedure = check_and_cast<QosRecoveryProcedure *>(getSubmodule("recoveryProcedure"));
38  ackHandler = check_and_cast<QosAckHandler *>(getSubmodule("ackHandler"));
39  inProgressFrames = check_and_cast<InProgressFrames *>(getSubmodule("inProgressFrames"));
40  txopProcedure = check_and_cast<TxopProcedure *>(getSubmodule("txopProcedure"));
41  stationRetryCounters = new StationRetryCounters();
42  WATCH(owning);
43  WATCH(slotTime);
44  WATCH(sifs);
45  WATCH(ifs);
46  WATCH(eifs);
47  WATCH(ac);
48  WATCH(cw);
49  WATCH(cwMin);
50  WATCH(cwMax);
51  }
52  else if (stage == INITSTAGE_LINK_LAYER) {
53  auto rx = check_and_cast<IRx *>(getModuleByPath(par("rxModule")));
54  rx->registerContention(contention);
56  }
57 }

◆ isInternalCollision()

bool inet::ieee80211::Edcaf::isInternalCollision ( )
virtual
173 {
175 }

◆ isOwning()

virtual bool inet::ieee80211::Edcaf::isOwning ( )
inlinevirtual
101 { return owning; }

◆ numInitStages()

virtual int inet::ieee80211::Edcaf::numInitStages ( ) const
inlineoverrideprotectedvirtual

Reimplemented from inet::ieee80211::ModeSetListener.

62 { return NUM_INIT_STAGES; }

◆ receiveSignal()

void inet::ieee80211::Edcaf::receiveSignal ( cComponent *  source,
simsignal_t  signalID,
cObject *  obj,
cObject *  details 
)
overrideprotectedvirtual

Reimplemented from inet::ieee80211::ModeSetListener.

200 {
201  Enter_Method("%s", cComponent::getSignalName(signalID));
202 
203  if (signalID == modesetChangedSignal) {
204  modeSet = check_and_cast<Ieee80211ModeSet *>(obj);
206  }
207 }

◆ refreshDisplay()

void inet::ieee80211::Edcaf::refreshDisplay ( ) const
overrideprotectedvirtual
60 {
61  std::string text(printAccessCategory(ac));
62  if (owning)
63  text += "\nOwning";
65  text += "\nContending";
66  else
67  text += "\nIdle";
68  getDisplayString().setTagArg("t", 0, text.c_str());
69 }

◆ releaseChannel()

void inet::ieee80211::Edcaf::releaseChannel ( IChannelAccess::ICallback callback)
overridevirtual

Implements inet::ieee80211::IChannelAccess.

147 {
148  Enter_Method("releaseChannel");
149  ASSERT(owning);
150  owning = false;
152  this->callback = nullptr;
153  EV_INFO << "Channel released.\n";
154 }

Referenced by inet::ieee80211::Edca::releaseChannelAccess().

◆ requestChannel()

void inet::ieee80211::Edcaf::requestChannel ( IChannelAccess::ICallback callback)
overridevirtual

Implements inet::ieee80211::IChannelAccess.

157 {
158  Enter_Method("requestChannel");
159  this->callback = callback;
160  ASSERT(!owning);
162  EV_DEBUG << "Contention has been already started.\n";
163  else
165 }

Referenced by inet::ieee80211::Edca::requestChannelAccess().

◆ resetCw()

void inet::ieee80211::Edcaf::resetCw ( )
overridevirtual

Implements inet::ieee80211::IRecoveryProcedure::ICwCalculator.

103 {
104  Enter_Method("resetCw");
105  cw = cwMin;
106  EV_DEBUG << "Contention window is reset: cw = " << cw << std::endl;
107 }

Member Data Documentation

◆ ac

AccessCategory inet::ieee80211::Edcaf::ac = AccessCategory(-1)
protected

◆ ackHandler

QosAckHandler* inet::ieee80211::Edcaf::ackHandler = nullptr
protected

◆ callback

IChannelAccess::ICallback* inet::ieee80211::Edcaf::callback = nullptr
protected

◆ collisionController

IEdcaCollisionController* inet::ieee80211::Edcaf::collisionController = nullptr
protected

◆ contention

IContention* inet::ieee80211::Edcaf::contention = nullptr
protected

◆ cw

int inet::ieee80211::Edcaf::cw = -1
protected

◆ cwMax

int inet::ieee80211::Edcaf::cwMax = -1
protected

◆ cwMin

int inet::ieee80211::Edcaf::cwMin = -1
protected

◆ eifs

simtime_t inet::ieee80211::Edcaf::eifs = -1
protected

◆ ifs

simtime_t inet::ieee80211::Edcaf::ifs = -1
protected

◆ inProgressFrames

InProgressFrames* inet::ieee80211::Edcaf::inProgressFrames = nullptr
protected

◆ owning

bool inet::ieee80211::Edcaf::owning = false
protected

◆ pendingQueue

queueing::IPacketQueue* inet::ieee80211::Edcaf::pendingQueue = nullptr
protected

◆ recoveryProcedure

QosRecoveryProcedure* inet::ieee80211::Edcaf::recoveryProcedure = nullptr
protected

◆ sifs

simtime_t inet::ieee80211::Edcaf::sifs = -1
protected

◆ slotTime

simtime_t inet::ieee80211::Edcaf::slotTime = -1
protected

◆ stationRetryCounters

StationRetryCounters* inet::ieee80211::Edcaf::stationRetryCounters = nullptr
protected

◆ txopProcedure

TxopProcedure* inet::ieee80211::Edcaf::txopProcedure = nullptr
protected

The documentation for this class was generated from the following files:
inet::ieee80211::Edcaf::calculateTimingParameters
virtual void calculateTimingParameters()
Definition: Edcaf.cc:71
inet::ieee80211::Edcaf::recoveryProcedure
QosRecoveryProcedure * recoveryProcedure
Definition: Edcaf.h:40
inet::ieee80211::IEdcaCollisionController::isInternalCollision
virtual bool isInternalCollision(Edcaf *channelAccess)=0
inet::ieee80211::Edcaf::inProgressFrames
InProgressFrames * inProgressFrames
Definition: Edcaf.h:47
inet::ieee80211::Edcaf::ac
AccessCategory ac
Definition: Edcaf.h:56
inet::ieee80211::IContention::startContention
virtual void startContention(int cw, simtime_t ifs, simtime_t eifs, simtime_t slotTime, ICallback *callback)=0
inet::ieee80211::Edcaf::stationRetryCounters
StationRetryCounters * stationRetryCounters
Definition: Edcaf.h:38
inet::ieee80211::IContention::isContentionInProgress
virtual bool isContentionInProgress()=0
inet::getContainingNicModule
NetworkInterface * getContainingNicModule(const cModule *from)
Find the nic module (inside the networkNode) containing the given module.
Definition: NetworkInterface.cc:691
inet::ieee80211::Edcaf::getCwMin
virtual int getCwMin(AccessCategory ac, int aCwMin)
Definition: Edcaf.cc:188
inet::modesetChangedSignal
simsignal_t modesetChangedSignal
Definition: Simsignals.cc:24
inet::physicallayer::IIeee80211Mode::getDuration
virtual const simtime_t getDuration(b dataLength) const =0
inet::ieee80211::AC_BK
@ AC_BK
Definition: AccessCategory.h:20
inet::ieee80211::IChannelAccess::channelOwnershipChangedSignal
static simsignal_t channelOwnershipChangedSignal
Definition: IChannelAccess.h:19
inet::physicallayer::Ieee80211ModeSet::getSlowestMandatoryMode
const IIeee80211Mode * getSlowestMandatoryMode() const
Definition: Ieee80211ModeSet.cc:565
inet::ieee80211::LENGTH_ACK
const b LENGTH_ACK
Definition: Ieee80211Frame_m.h:94
inet::ieee80211::printAccessCategory
std::string printAccessCategory(AccessCategory ac)
Definition: AccessCategory.h:27
inet::ieee80211::AC_BE
@ AC_BE
Definition: AccessCategory.h:21
inet::ieee80211::Edcaf::cwMin
int cwMin
Definition: Edcaf.h:58
inet::ieee80211::Edcaf::getAifsNumber
virtual int getAifsNumber(AccessCategory ac)
Definition: Edcaf.cc:109
inet::ieee80211::Edcaf::ackHandler
QosAckHandler * ackHandler
Definition: Edcaf.h:39
inet::ieee80211::IChannelAccess::ICallback::channelGranted
virtual void channelGranted(IChannelAccess *channelAccess)=0
inet::ieee80211::fallback
double fallback(double a, double b)
Definition: Edcaf.cc:21
inet::ieee80211::Edcaf::owning
bool owning
Definition: Edcaf.h:49
inet::ieee80211::Edcaf::ifs
simtime_t ifs
Definition: Edcaf.h:53
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::physicallayer::Ieee80211ModeSet::getCwMin
int getCwMin() const
Definition: Ieee80211ModeSet.h:70
inet::ieee80211::Edcaf::getAccessCategory
virtual AccessCategory getAccessCategory()
Definition: Edcaf.h:103
inet::ieee80211::Edcaf::cwMax
int cwMax
Definition: Edcaf.h:59
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::ieee80211::Edcaf::cw
int cw
Definition: Edcaf.h:57
inet::ieee80211::AC_VI
@ AC_VI
Definition: AccessCategory.h:22
inet::physicallayer::Ieee80211ModeSet::getSlotTime
simtime_t getSlotTime() const
Definition: Ieee80211ModeSet.h:68
inet::physicallayer::Ieee80211ModeSet::getSifsTime
simtime_t getSifsTime() const
Definition: Ieee80211ModeSet.h:67
inet::ieee80211::ModeSetListener::modeSet
physicallayer::Ieee80211ModeSet * modeSet
Definition: ModeSetListener.h:19
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::ieee80211::AC_VO
@ AC_VO
Definition: AccessCategory.h:23
inet::ieee80211::Edcaf::callback
IChannelAccess::ICallback * callback
Definition: Edcaf.h:35
inet::ieee80211::Edcaf::pendingQueue
queueing::IPacketQueue * pendingQueue
Definition: Edcaf.h:46
inet::ieee80211::Edcaf::slotTime
simtime_t slotTime
Definition: Edcaf.h:51
inet::ieee80211::Edcaf::eifs
simtime_t eifs
Definition: Edcaf.h:54
inet::ieee80211::IEdcaCollisionController::expectedChannelAccess
virtual void expectedChannelAccess(Edcaf *channelAccess, simtime_t time)=0
inet::ieee80211::Edcaf::sifs
simtime_t sifs
Definition: Edcaf.h:52
inet::ieee80211::Edcaf::txopProcedure
TxopProcedure * txopProcedure
Definition: Edcaf.h:43
inet::physicallayer::Ieee80211ModeSet::getCwMax
int getCwMax() const
Definition: Ieee80211ModeSet.h:71
inet::ieee80211::Edcaf::getCwMax
virtual int getCwMax(AccessCategory ac, int aCwMax, int aCwMin)
Definition: Edcaf.cc:177
inet::INITSTAGE_LINK_LAYER
INET_API InitStage INITSTAGE_LINK_LAYER
Initialization of link-layer protocols.
inet::ieee80211::Edcaf::collisionController
IEdcaCollisionController * collisionController
Definition: Edcaf.h:36
inet::ieee80211::Edcaf::contention
IContention * contention
Definition: Edcaf.h:34