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

#include <QosRecoveryProcedure.h>

Inheritance diagram for inet::ieee80211::QosRecoveryProcedure:
inet::ieee80211::IRecoveryProcedure

Public Member Functions

virtual void multicastFrameTransmitted ()
 
virtual void ctsFrameReceived ()
 
virtual void ackFrameReceived (Packet *packet, const Ptr< const Ieee80211DataHeader > &ackedHeader)
 
virtual void blockAckFrameReceived ()
 
virtual void rtsFrameTransmissionFailed (const Ptr< const Ieee80211DataHeader > &protectedHeader)
 
virtual void dataFrameTransmissionFailed (Packet *packet, const Ptr< const Ieee80211DataHeader > &failedHeader)
 
virtual bool isRetryLimitReached (Packet *packet, const Ptr< const Ieee80211DataHeader > &failedHeader)
 
virtual int getRetryCount (Packet *packet, const Ptr< const Ieee80211DataHeader > &header)
 
virtual bool isRtsFrameRetryLimitReached (Packet *packet, const Ptr< const Ieee80211DataHeader > &protectedHeader)
 
virtual void retryLimitReached (Packet *packet, const Ptr< const Ieee80211DataHeader > &header)
 
virtual int getLongRetryLimit ()
 
virtual int getShortRetryLimit ()
 
- Public Member Functions inherited from inet::ieee80211::IRecoveryProcedure
virtual ~IRecoveryProcedure ()
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
void incrementCounter (const Ptr< const Ieee80211DataHeader > &header, std::map< std::pair< Tid, SequenceControlField >, int > &retryCounter)
 
void incrementStationSrc ()
 
void incrementStationLrc ()
 
void resetStationSrc ()
 
void resetStationLrc ()
 
void incrementContentionWindow ()
 
void resetContentionWindow ()
 
int doubleCw (int cw)
 
int getRc (Packet *packet, const Ptr< const Ieee80211DataHeader > &header, std::map< std::pair< Tid, SequenceControlField >, int > &retryCounter)
 
bool isMulticastFrame (Packet *packet, const Ptr< const Ieee80211MacHeader > &header)
 

Protected Attributes

ICwCalculatorcwCalculator = nullptr
 
std::map< std::pair< Tid, SequenceControlField >, int > shortRetryCounter
 
std::map< std::pair< Tid, SequenceControlField >, int > longRetryCounter
 
int stationLongRetryCounter = 0
 
int stationShortRetryCounter = 0
 
int shortRetryLimit = -1
 
int longRetryLimit = -1
 
int rtsThreshold = -1
 

Additional Inherited Members

- Static Public Attributes inherited from inet::ieee80211::IRecoveryProcedure
static simsignal_t contentionWindowChangedSignal = cComponent::registerSignal("contentionWindowChanged")
 
static simsignal_t retryLimitReachedSignal = cComponent::registerSignal("retryLimitReached")
 

Member Function Documentation

◆ ackFrameReceived()

void inet::ieee80211::QosRecoveryProcedure::ackFrameReceived ( Packet packet,
const Ptr< const Ieee80211DataHeader > &  ackedHeader 
)
virtual
115 {
116  auto id = std::make_pair(ackedHeader->getTid(), SequenceControlField(ackedHeader->getSequenceNumber().get(), ackedHeader->getFragmentNumber()));
117  if (packet->getByteLength() >= rtsThreshold) {
118  resetStationLrc();
119  auto it = longRetryCounter.find(id);
120  if (it != longRetryCounter.end())
121  longRetryCounter.erase(it);
122  }
123  else {
124  auto it = shortRetryCounter.find(id);
125  resetStationSrc();
126  if (it != shortRetryCounter.end())
127  shortRetryCounter.erase(it);
128  }
129  //
130  // The CW shall be reset to aCWmin after every successful attempt to transmit a frame containing
131  // all or part of an MSDU or MMPDU
132  //
134 }

◆ blockAckFrameReceived()

void inet::ieee80211::QosRecoveryProcedure::blockAckFrameReceived ( )
virtual
103 {
104  resetStationSrc();
105 }

◆ ctsFrameReceived()

void inet::ieee80211::QosRecoveryProcedure::ctsFrameReceived ( )
virtual
98 {
100 }

◆ dataFrameTransmissionFailed()

void inet::ieee80211::QosRecoveryProcedure::dataFrameTransmissionFailed ( Packet packet,
const Ptr< const Ieee80211DataHeader > &  failedHeader 
)
virtual
167 {
168  if (packet->getByteLength() >= rtsThreshold) {
170  incrementCounter(failedHeader, longRetryCounter);
171  }
172  else {
174  incrementCounter(failedHeader, shortRetryCounter);
175  }
176 }

◆ doubleCw()

int inet::ieee80211::QosRecoveryProcedure::doubleCw ( int  cw)
protected

◆ getLongRetryLimit()

virtual int inet::ieee80211::QosRecoveryProcedure::getLongRetryLimit ( )
inlinevirtual
77 { return longRetryLimit; }

◆ getRc()

int inet::ieee80211::QosRecoveryProcedure::getRc ( Packet packet,
const Ptr< const Ieee80211DataHeader > &  header,
std::map< std::pair< Tid, SequenceControlField >, int > &  retryCounter 
)
protected
233 {
234  auto id = std::make_pair(header->getTid(), SequenceControlField(header->getSequenceNumber().get(), header->getFragmentNumber()));
235  auto it = retryCounter.find(id);
236  if (it != retryCounter.end())
237  return it->second;
238  else
239  throw cRuntimeError("The retry counter entry doesn't exist for message id: %ld", packet->getId());
240 }

Referenced by getRetryCount(), isRetryLimitReached(), and isRtsFrameRetryLimitReached().

◆ getRetryCount()

int inet::ieee80211::QosRecoveryProcedure::getRetryCount ( Packet packet,
const Ptr< const Ieee80211DataHeader > &  header 
)
virtual
202 {
203  if (packet->getByteLength() >= rtsThreshold)
204  return getRc(packet, header, longRetryCounter);
205  else
206  return getRc(packet, header, shortRetryCounter);
207 }

◆ getShortRetryLimit()

virtual int inet::ieee80211::QosRecoveryProcedure::getShortRetryLimit ( )
inlinevirtual
78 { return shortRetryLimit; }

◆ incrementContentionWindow()

void inet::ieee80211::QosRecoveryProcedure::incrementContentionWindow ( )
protected
210 {
211  auto oldCw = cwCalculator->getCw();
213  auto newCw = cwCalculator->getCw();
214  if (oldCw != newCw)
216 }

Referenced by incrementStationLrc(), and incrementStationSrc().

◆ incrementCounter()

void inet::ieee80211::QosRecoveryProcedure::incrementCounter ( const Ptr< const Ieee80211DataHeader > &  header,
std::map< std::pair< Tid, SequenceControlField >, int > &  retryCounter 
)
protected
68 {
69  auto id = std::make_pair((Tid)header->getTid(), SequenceControlField(header->getSequenceNumber().get(), header->getFragmentNumber()));
70  if (containsKey(retryCounter, id))
71  retryCounter[id]++;
72  else
73  retryCounter[id] = 1;
74 }

Referenced by dataFrameTransmissionFailed(), and rtsFrameTransmissionFailed().

◆ incrementStationLrc()

void inet::ieee80211::QosRecoveryProcedure::incrementStationLrc ( )
protected
58 {
60  EV_INFO << "Incremented station LRC: stationLongRetryCounter = " << stationLongRetryCounter << ".\n";
61  if (stationLongRetryCounter == longRetryLimit) // 9.3.3 Random backoff time
63  else
65 }

Referenced by dataFrameTransmissionFailed().

◆ incrementStationSrc()

void inet::ieee80211::QosRecoveryProcedure::incrementStationSrc ( )
protected
48 {
50  EV_INFO << "Incremented station SRC: stationShortRetryCounter = " << stationShortRetryCounter << ".\n";
51  if (stationShortRetryCounter == shortRetryLimit) // 9.3.3 Random backoff time
53  else
55 }

Referenced by dataFrameTransmissionFailed(), and rtsFrameTransmissionFailed().

◆ initialize()

void inet::ieee80211::QosRecoveryProcedure::initialize ( int  stage)
overrideprotectedvirtual
32 {
33  if (stage == INITSTAGE_LAST) {
34  auto rtsPolicy = check_and_cast<IRtsPolicy *>(getModuleByPath(par("rtsPolicyModule")));
35  cwCalculator = check_and_cast<ICwCalculator *>(getModuleByPath(par("cwCalculatorModule")));
36  rtsThreshold = rtsPolicy->getRtsThreshold();
37  shortRetryLimit = par("shortRetryLimit");
38  longRetryLimit = par("longRetryLimit");
42  WATCH_MAP(shortRetryCounter);
43  WATCH_MAP(longRetryCounter);
44  }
45 }

◆ isMulticastFrame()

bool inet::ieee80211::QosRecoveryProcedure::isMulticastFrame ( Packet packet,
const Ptr< const Ieee80211MacHeader > &  header 
)
protected
243 {
244  if (auto oneAddressHeader = dynamicPtrCast<const Ieee80211OneAddressHeader>(header))
245  return oneAddressHeader->getReceiverAddress().isMulticast();
246  return false;
247 }

◆ isRetryLimitReached()

bool inet::ieee80211::QosRecoveryProcedure::isRetryLimitReached ( Packet packet,
const Ptr< const Ieee80211DataHeader > &  failedHeader 
)
virtual
194 {
195  if (packet->getByteLength() >= rtsThreshold)
196  return getRc(packet, failedHeader, longRetryCounter) >= longRetryLimit;
197  else
198  return getRc(packet, failedHeader, shortRetryCounter) >= shortRetryLimit;
199 }

◆ isRtsFrameRetryLimitReached()

bool inet::ieee80211::QosRecoveryProcedure::isRtsFrameRetryLimitReached ( Packet packet,
const Ptr< const Ieee80211DataHeader > &  protectedHeader 
)
virtual
228 {
229  return getRc(packet, protectedHeader, shortRetryCounter) >= shortRetryLimit;
230 }

◆ multicastFrameTransmitted()

void inet::ieee80211::QosRecoveryProcedure::multicastFrameTransmitted ( )
virtual
82 {
85 }

◆ numInitStages()

virtual int inet::ieee80211::QosRecoveryProcedure::numInitStages ( ) const
inlineoverrideprotectedvirtual
47 { return NUM_INIT_STAGES; }

◆ resetContentionWindow()

void inet::ieee80211::QosRecoveryProcedure::resetContentionWindow ( )
protected
219 {
220  auto oldCw = cwCalculator->getCw();
222  auto newCw = cwCalculator->getCw();
223  if (oldCw != newCw)
224  emit(contentionWindowChangedSignal, newCw);
225 }

Referenced by ackFrameReceived(), incrementStationLrc(), and incrementStationSrc().

◆ resetStationLrc()

void inet::ieee80211::QosRecoveryProcedure::resetStationLrc ( )
inlineprotected

◆ resetStationSrc()

void inet::ieee80211::QosRecoveryProcedure::resetStationSrc ( )
inlineprotected

◆ retryLimitReached()

void inet::ieee80211::QosRecoveryProcedure::retryLimitReached ( Packet packet,
const Ptr< const Ieee80211DataHeader > &  header 
)
virtual
141 {
142  EV_WARN << "Retry limit reached for " << *packet << ".\n";
143  auto id = std::make_pair(header->getTid(), SequenceControlField(header->getSequenceNumber().get(), header->getFragmentNumber()));
144  if (packet->getByteLength() >= rtsThreshold) {
145  auto it = longRetryCounter.find(id);
146  if (it != longRetryCounter.end())
147  longRetryCounter.erase(it);
148  }
149  else {
150  auto it = shortRetryCounter.find(id);
151  if (it != shortRetryCounter.end())
152  shortRetryCounter.erase(it);
153  }
154  emit(retryLimitReachedSignal, packet);
155 }

◆ rtsFrameTransmissionFailed()

void inet::ieee80211::QosRecoveryProcedure::rtsFrameTransmissionFailed ( const Ptr< const Ieee80211DataHeader > &  protectedHeader)
virtual
182 {
184  incrementCounter(protectedHeader, shortRetryCounter);
185 }

Member Data Documentation

◆ cwCalculator

ICwCalculator* inet::ieee80211::QosRecoveryProcedure::cwCalculator = nullptr
protected

◆ longRetryCounter

std::map<std::pair<Tid, SequenceControlField>, int> inet::ieee80211::QosRecoveryProcedure::longRetryCounter
protected

◆ longRetryLimit

int inet::ieee80211::QosRecoveryProcedure::longRetryLimit = -1
protected

◆ rtsThreshold

int inet::ieee80211::QosRecoveryProcedure::rtsThreshold = -1
protected

◆ shortRetryCounter

std::map<std::pair<Tid, SequenceControlField>, int> inet::ieee80211::QosRecoveryProcedure::shortRetryCounter
protected

◆ shortRetryLimit

int inet::ieee80211::QosRecoveryProcedure::shortRetryLimit = -1
protected

◆ stationLongRetryCounter

int inet::ieee80211::QosRecoveryProcedure::stationLongRetryCounter = 0
protected

Referenced by incrementStationLrc(), and initialize().

◆ stationShortRetryCounter

int inet::ieee80211::QosRecoveryProcedure::stationShortRetryCounter = 0
protected

Referenced by incrementStationSrc(), and initialize().


The documentation for this class was generated from the following files:
inet::ieee80211::QosRecoveryProcedure::incrementContentionWindow
void incrementContentionWindow()
Definition: QosRecoveryProcedure.cc:209
inet::INITSTAGE_LAST
INET_API InitStage INITSTAGE_LAST
Operations that no other initializations can depend on, e.g.
inet::ieee80211::QosRecoveryProcedure::resetStationSrc
void resetStationSrc()
Definition: QosRecoveryProcedure.h:53
inet::ieee80211::IRecoveryProcedure::ICwCalculator::incrementCw
virtual void incrementCw()=0
inet::ieee80211::QosRecoveryProcedure::resetStationLrc
void resetStationLrc()
Definition: QosRecoveryProcedure.h:54
inet::ieee80211::QosRecoveryProcedure::incrementStationLrc
void incrementStationLrc()
Definition: QosRecoveryProcedure.cc:57
inet::ieee80211::IRecoveryProcedure::contentionWindowChangedSignal
static simsignal_t contentionWindowChangedSignal
Definition: IRecoveryProcedure.h:19
inet::ieee80211::QosRecoveryProcedure::longRetryLimit
int longRetryLimit
Definition: QosRecoveryProcedure.h:43
inet::ieee80211::IRecoveryProcedure::retryLimitReachedSignal
static simsignal_t retryLimitReachedSignal
Definition: IRecoveryProcedure.h:20
inet::ieee80211::QosRecoveryProcedure::incrementCounter
void incrementCounter(const Ptr< const Ieee80211DataHeader > &header, std::map< std::pair< Tid, SequenceControlField >, int > &retryCounter)
Definition: QosRecoveryProcedure.cc:67
inet::ieee80211::QosRecoveryProcedure::resetContentionWindow
void resetContentionWindow()
Definition: QosRecoveryProcedure.cc:218
inet::ieee80211::Tid
int8_t Tid
Definition: Ieee80211Defs.h:17
inet::ieee80211::QosRecoveryProcedure::shortRetryLimit
int shortRetryLimit
Definition: QosRecoveryProcedure.h:42
inet::ieee80211::QosRecoveryProcedure::getRc
int getRc(Packet *packet, const Ptr< const Ieee80211DataHeader > &header, std::map< std::pair< Tid, SequenceControlField >, int > &retryCounter)
Definition: QosRecoveryProcedure.cc:232
inet::ieee80211::QosRecoveryProcedure::stationShortRetryCounter
int stationShortRetryCounter
Definition: QosRecoveryProcedure.h:40
inet::ieee80211::QosRecoveryProcedure::longRetryCounter
std::map< std::pair< Tid, SequenceControlField >, int > longRetryCounter
Definition: QosRecoveryProcedure.h:36
inet::ieee80211::QosRecoveryProcedure::rtsThreshold
int rtsThreshold
Definition: QosRecoveryProcedure.h:44
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::ieee80211::QosRecoveryProcedure::shortRetryCounter
std::map< std::pair< Tid, SequenceControlField >, int > shortRetryCounter
Definition: QosRecoveryProcedure.h:35
inet::ieee80211::QosRecoveryProcedure::stationLongRetryCounter
int stationLongRetryCounter
Definition: QosRecoveryProcedure.h:39
inet::ieee80211::QosRecoveryProcedure::incrementStationSrc
void incrementStationSrc()
Definition: QosRecoveryProcedure.cc:47
inet::ieee80211::QosRecoveryProcedure::cwCalculator
ICwCalculator * cwCalculator
Definition: QosRecoveryProcedure.h:32
inet::ieee80211::IRecoveryProcedure::ICwCalculator::getCw
virtual int getCw()=0
inet::containsKey
bool containsKey(const std::map< K, V, _C > &m, const Tk &a)
Definition: stlutils.h:80
inet::ieee80211::IRecoveryProcedure::ICwCalculator::resetCw
virtual void resetCw()=0