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

#include <NonQosRecoveryProcedure.h>

Inheritance diagram for inet::ieee80211::NonQosRecoveryProcedure:
inet::ieee80211::IRecoveryProcedure

Public Member Functions

virtual void multicastFrameTransmitted (StationRetryCounters *stationCounters)
 
virtual void ctsFrameReceived (StationRetryCounters *stationCounters)
 
virtual void ackFrameReceived (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &ackedHeader, StationRetryCounters *stationCounters)
 
virtual void rtsFrameTransmissionFailed (const Ptr< const Ieee80211DataOrMgmtHeader > &protectedHeader, StationRetryCounters *stationCounters)
 
virtual void dataOrMgmtFrameTransmissionFailed (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &failedHeader, StationRetryCounters *stationCounters)
 
virtual int getRetryCount (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &header)
 
virtual int getShortRetryCount (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)
 
virtual int getLongRetryCount (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)
 
virtual bool isRetryLimitReached (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &failedHeader)
 
virtual bool isRtsFrameRetryLimitReached (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &protectedHeader)
 
virtual void retryLimitReached (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &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
 
virtual void incrementCounter (const Ptr< const Ieee80211DataOrMgmtHeader > &header, std::map< SequenceControlField, int > &retryCounter)
 
virtual void incrementContentionWindow ()
 
virtual void resetContentionWindow ()
 
virtual int getRc (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &header, std::map< SequenceControlField, int > &retryCounter)
 
virtual bool isMulticastFrame (const Ptr< const Ieee80211MacHeader > &header)
 
virtual void incrementStationSrc (StationRetryCounters *stationCounters)
 
virtual void incrementStationLrc (StationRetryCounters *stationCounters)
 

Protected Attributes

ICwCalculatorcwCalculator = nullptr
 
std::map< SequenceControlField, int > shortRetryCounter
 
std::map< SequenceControlField, int > longRetryCounter
 
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::NonQosRecoveryProcedure::ackFrameReceived ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  ackedHeader,
StationRetryCounters stationCounters 
)
virtual
106 {
107  auto id = SequenceControlField(ackedHeader->getSequenceNumber().get(), ackedHeader->getFragmentNumber());
108  if (packet->getByteLength() >= rtsThreshold) {
109  stationCounters->resetStationLongRetryCount();
110  auto it = longRetryCounter.find(id);
111  if (it != longRetryCounter.end())
112  longRetryCounter.erase(it);
113  }
114  else {
115  stationCounters->resetStationShortRetryCount();
116  auto it = shortRetryCounter.find(id);
117  if (it != shortRetryCounter.end())
118  shortRetryCounter.erase(it);
119  }
120 
121  //
122  // The CW shall be reset to aCWmin after every successful attempt to transmit a frame containing
123  // all or part of an MSDU or MMPDU
124  //
126 }

◆ ctsFrameReceived()

void inet::ieee80211::NonQosRecoveryProcedure::ctsFrameReceived ( StationRetryCounters stationCounters)
virtual
94 {
95  stationCounters->resetStationShortRetryCount();
96 }

◆ dataOrMgmtFrameTransmissionFailed()

void inet::ieee80211::NonQosRecoveryProcedure::dataOrMgmtFrameTransmissionFailed ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  failedHeader,
StationRetryCounters stationCounters 
)
virtual
159 {
160  if (packet->getByteLength() >= rtsThreshold) {
161  incrementStationLrc(stationCounters);
162  incrementCounter(failedHeader, longRetryCounter);
163  }
164  else {
165  incrementStationSrc(stationCounters);
166  incrementCounter(failedHeader, shortRetryCounter);
167  }
168 }

◆ getLongRetryCount()

int inet::ieee80211::NonQosRecoveryProcedure::getLongRetryCount ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  dataOrMgmtHeader 
)
virtual
207 {
208  return getRc(packet, dataOrMgmtHeader, longRetryCounter);
209 }

◆ getLongRetryLimit()

virtual int inet::ieee80211::NonQosRecoveryProcedure::getLongRetryLimit ( )
inlinevirtual
68 { return longRetryLimit; }

◆ getRc()

int inet::ieee80211::NonQosRecoveryProcedure::getRc ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  header,
std::map< SequenceControlField, int > &  retryCounter 
)
protectedvirtual
235 {
236  auto count = retryCounter.find(SequenceControlField(header->getSequenceNumber().get(), header->getFragmentNumber()));
237  return (count != retryCounter.end()) ? count->second : 0;
238 }

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

◆ getRetryCount()

int inet::ieee80211::NonQosRecoveryProcedure::getRetryCount ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  header 
)
virtual
194 {
195  if (packet->getByteLength() >= rtsThreshold)
196  return getRc(packet, header, longRetryCounter);
197  else
198  return getRc(packet, header, shortRetryCounter);
199 }

◆ getShortRetryCount()

int inet::ieee80211::NonQosRecoveryProcedure::getShortRetryCount ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  dataOrMgmtHeader 
)
virtual
202 {
203  return getRc(packet, dataOrMgmtHeader, shortRetryCounter);
204 }

◆ getShortRetryLimit()

virtual int inet::ieee80211::NonQosRecoveryProcedure::getShortRetryLimit ( )
inlinevirtual
69 { return shortRetryLimit; }

◆ incrementContentionWindow()

void inet::ieee80211::NonQosRecoveryProcedure::incrementContentionWindow ( )
protectedvirtual
212 {
213  auto oldCw = cwCalculator->getCw();
215  auto newCw = cwCalculator->getCw();
216  if (oldCw != newCw)
217  emit(contentionWindowChangedSignal, newCw);
218 }

Referenced by incrementStationLrc(), and incrementStationSrc().

◆ incrementCounter()

void inet::ieee80211::NonQosRecoveryProcedure::incrementCounter ( const Ptr< const Ieee80211DataOrMgmtHeader > &  header,
std::map< SequenceControlField, int > &  retryCounter 
)
protectedvirtual
64 {
65  auto id = SequenceControlField(header->getSequenceNumber().get(), header->getFragmentNumber());
66  if (containsKey(retryCounter, id))
67  retryCounter[id]++;
68  else
69  retryCounter.insert(std::make_pair(id, 1));
70 }

Referenced by dataOrMgmtFrameTransmissionFailed(), and rtsFrameTransmissionFailed().

◆ incrementStationLrc()

void inet::ieee80211::NonQosRecoveryProcedure::incrementStationLrc ( StationRetryCounters stationCounters)
protectedvirtual
54 {
55  stationCounters->incrementStationLongRetryCount();
56  EV_INFO << "Incremented station LRC: stationLongRetryCounter = " << stationCounters->getStationLongRetryCount() << ".\n";
57  if (stationCounters->getStationLongRetryCount() == longRetryLimit) // 9.3.3 Random backoff time
59  else
61 }

Referenced by dataOrMgmtFrameTransmissionFailed().

◆ incrementStationSrc()

void inet::ieee80211::NonQosRecoveryProcedure::incrementStationSrc ( StationRetryCounters stationCounters)
protectedvirtual
44 {
45  stationCounters->incrementStationShortRetryCount();
46  EV_INFO << "Incremented station SRC: stationShortRetryCounter = " << stationCounters->getStationShortRetryCount() << ".\n";
47  if (stationCounters->getStationShortRetryCount() == shortRetryLimit) // 9.3.3 Random backoff time
49  else
51 }

Referenced by dataOrMgmtFrameTransmissionFailed(), and rtsFrameTransmissionFailed().

◆ initialize()

void inet::ieee80211::NonQosRecoveryProcedure::initialize ( int  stage)
overrideprotectedvirtual
30 {
31  if (stage == INITSTAGE_LAST) {
32  auto rtsPolicy = check_and_cast<IRtsPolicy *>(getModuleByPath(par("rtsPolicyModule")));
33  cwCalculator = check_and_cast<ICwCalculator *>(getModuleByPath(par("cwCalculatorModule")));
34  rtsThreshold = rtsPolicy->getRtsThreshold();
35  shortRetryLimit = par("shortRetryLimit");
36  longRetryLimit = par("longRetryLimit");
38  WATCH_MAP(shortRetryCounter);
39  WATCH_MAP(longRetryCounter);
40  }
41 }

◆ isMulticastFrame()

bool inet::ieee80211::NonQosRecoveryProcedure::isMulticastFrame ( const Ptr< const Ieee80211MacHeader > &  header)
protectedvirtual
241 {
242  if (auto oneAddressHeader = dynamicPtrCast<const Ieee80211OneAddressHeader>(header))
243  return oneAddressHeader->getReceiverAddress().isMulticast();
244  return false;
245 }

◆ isRetryLimitReached()

bool inet::ieee80211::NonQosRecoveryProcedure::isRetryLimitReached ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  failedHeader 
)
virtual
186 {
187  if (packet->getByteLength() >= rtsThreshold)
188  return getRc(packet, failedHeader, longRetryCounter) >= longRetryLimit;
189  else
190  return getRc(packet, failedHeader, shortRetryCounter) >= shortRetryLimit;
191 }

◆ isRtsFrameRetryLimitReached()

bool inet::ieee80211::NonQosRecoveryProcedure::isRtsFrameRetryLimitReached ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  protectedHeader 
)
virtual
230 {
231  return getRc(packet, protectedHeader, shortRetryCounter) >= shortRetryLimit;
232 }

◆ multicastFrameTransmitted()

void inet::ieee80211::NonQosRecoveryProcedure::multicastFrameTransmitted ( StationRetryCounters stationCounters)
virtual
78 {
79  stationCounters->resetStationShortRetryCount();
80  stationCounters->resetStationLongRetryCount();
81 }

◆ numInitStages()

virtual int inet::ieee80211::NonQosRecoveryProcedure::numInitStages ( ) const
inlineoverrideprotectedvirtual
40 { return NUM_INIT_STAGES; }

◆ resetContentionWindow()

void inet::ieee80211::NonQosRecoveryProcedure::resetContentionWindow ( )
protectedvirtual
221 {
222  auto oldCw = cwCalculator->getCw();
224  auto newCw = cwCalculator->getCw();
225  if (oldCw != newCw)
226  emit(contentionWindowChangedSignal, newCw);
227 }

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

◆ retryLimitReached()

void inet::ieee80211::NonQosRecoveryProcedure::retryLimitReached ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  header 
)
virtual
133 {
134  EV_WARN << "Retry limit reached for " << *packet << ".\n";
135  auto id = SequenceControlField(header->getSequenceNumber().get(), header->getFragmentNumber());
136  if (packet->getByteLength() >= rtsThreshold) {
137  auto it = longRetryCounter.find(id);
138  if (it != longRetryCounter.end())
139  longRetryCounter.erase(it);
140  }
141  else {
142  auto it = shortRetryCounter.find(id);
143  if (it != shortRetryCounter.end())
144  shortRetryCounter.erase(it);
145  }
146  emit(retryLimitReachedSignal, packet);
147 }

◆ rtsFrameTransmissionFailed()

void inet::ieee80211::NonQosRecoveryProcedure::rtsFrameTransmissionFailed ( const Ptr< const Ieee80211DataOrMgmtHeader > &  protectedHeader,
StationRetryCounters stationCounters 
)
virtual
174 {
175  incrementStationSrc(stationCounters);
176  incrementCounter(protectedHeader, shortRetryCounter);
177 }

Member Data Documentation

◆ cwCalculator

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

◆ longRetryCounter

std::map<SequenceControlField, int> inet::ieee80211::NonQosRecoveryProcedure::longRetryCounter
protected

◆ longRetryLimit

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

◆ rtsThreshold

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

◆ shortRetryCounter

◆ shortRetryLimit

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

The documentation for this class was generated from the following files:
inet::ieee80211::NonQosRecoveryProcedure::longRetryLimit
int longRetryLimit
Definition: NonQosRecoveryProcedure.h:36
inet::INITSTAGE_LAST
INET_API InitStage INITSTAGE_LAST
Operations that no other initializations can depend on, e.g.
inet::ieee80211::IRecoveryProcedure::ICwCalculator::incrementCw
virtual void incrementCw()=0
inet::ieee80211::NonQosRecoveryProcedure::longRetryCounter
std::map< SequenceControlField, int > longRetryCounter
Definition: NonQosRecoveryProcedure.h:33
inet::count
int count(const std::vector< T > &v, const Tk &a)
Definition: stlutils.h:54
inet::ieee80211::NonQosRecoveryProcedure::getRc
virtual int getRc(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &header, std::map< SequenceControlField, int > &retryCounter)
Definition: NonQosRecoveryProcedure.cc:234
inet::ieee80211::IRecoveryProcedure::contentionWindowChangedSignal
static simsignal_t contentionWindowChangedSignal
Definition: IRecoveryProcedure.h:19
inet::ieee80211::IRecoveryProcedure::retryLimitReachedSignal
static simsignal_t retryLimitReachedSignal
Definition: IRecoveryProcedure.h:20
inet::ieee80211::NonQosRecoveryProcedure::incrementContentionWindow
virtual void incrementContentionWindow()
Definition: NonQosRecoveryProcedure.cc:211
inet::ieee80211::NonQosRecoveryProcedure::incrementCounter
virtual void incrementCounter(const Ptr< const Ieee80211DataOrMgmtHeader > &header, std::map< SequenceControlField, int > &retryCounter)
Definition: NonQosRecoveryProcedure.cc:63
inet::ieee80211::NonQosRecoveryProcedure::incrementStationLrc
virtual void incrementStationLrc(StationRetryCounters *stationCounters)
Definition: NonQosRecoveryProcedure.cc:53
inet::ieee80211::NonQosRecoveryProcedure::shortRetryCounter
std::map< SequenceControlField, int > shortRetryCounter
Definition: NonQosRecoveryProcedure.h:32
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::ieee80211::NonQosRecoveryProcedure::shortRetryLimit
int shortRetryLimit
Definition: NonQosRecoveryProcedure.h:35
inet::ieee80211::NonQosRecoveryProcedure::incrementStationSrc
virtual void incrementStationSrc(StationRetryCounters *stationCounters)
Definition: NonQosRecoveryProcedure.cc:43
inet::ieee80211::NonQosRecoveryProcedure::rtsThreshold
int rtsThreshold
Definition: NonQosRecoveryProcedure.h:37
inet::ieee80211::NonQosRecoveryProcedure::resetContentionWindow
virtual void resetContentionWindow()
Definition: NonQosRecoveryProcedure.cc:220
inet::ieee80211::IRecoveryProcedure::ICwCalculator::getCw
virtual int getCw()=0
inet::ieee80211::NonQosRecoveryProcedure::cwCalculator
ICwCalculator * cwCalculator
Definition: NonQosRecoveryProcedure.h:30
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