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

#include <QosRateSelection.h>

Inheritance diagram for inet::ieee80211::QosRateSelection:
inet::ieee80211::IQosRateSelection inet::ieee80211::ModeSetListener

Public Member Functions

virtual const physicallayer::IIeee80211ModecomputeResponseCtsFrameMode (Packet *packet, const Ptr< const Ieee80211RtsFrame > &rtsFrame) override
 
virtual const physicallayer::IIeee80211ModecomputeResponseAckFrameMode (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader) override
 
virtual const physicallayer::IIeee80211ModecomputeResponseBlockAckFrameMode (Packet *packet, const Ptr< const Ieee80211BlockAckReq > &blockAckReq) override
 
virtual const physicallayer::IIeee80211ModecomputeMode (Packet *packet, const Ptr< const Ieee80211MacHeader > &header, TxopProcedure *txopProcedure) override
 
virtual void frameTransmitted (Packet *packet, const Ptr< const Ieee80211MacHeader > &header)
 
- Public Member Functions inherited from inet::ieee80211::IQosRateSelection
virtual ~IQosRateSelection ()
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void receiveSignal (cComponent *source, simsignal_t signalID, cObject *obj, cObject *details) override
 
virtual const physicallayer::IIeee80211ModegetMode (Packet *packet, const Ptr< const Ieee80211MacHeader > &header)
 
virtual const physicallayer::IIeee80211ModecomputeControlFrameMode (const Ptr< const Ieee80211MacHeader > &header, TxopProcedure *txopProcedure)
 
virtual const physicallayer::IIeee80211ModecomputeDataOrMgmtFrameMode (const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)
 
virtual bool isControlResponseFrame (const Ptr< const Ieee80211MacHeader > &header, TxopProcedure *txopProcedure)
 

Protected Attributes

IRateControldataOrMgmtRateControl = nullptr
 
const physicallayer::Ieee80211ModeSetmodeSet = nullptr
 
std::map< MacAddress, const physicallayer::IIeee80211Mode * > lastTransmittedFrameMode
 
const physicallayer::IIeee80211ModemulticastFrameMode = nullptr
 
const physicallayer::IIeee80211ModefastestMandatoryMode = nullptr
 
const physicallayer::IIeee80211ModedataFrameMode = nullptr
 
const physicallayer::IIeee80211ModemgmtFrameMode = nullptr
 
const physicallayer::IIeee80211ModecontrolFrameMode = nullptr
 
const physicallayer::IIeee80211ModeresponseAckFrameMode = nullptr
 
const physicallayer::IIeee80211ModeresponseCtsFrameMode = nullptr
 
const physicallayer::IIeee80211ModeresponseBlockAckFrameMode = nullptr
 
- Protected Attributes inherited from inet::ieee80211::ModeSetListener
physicallayer::Ieee80211ModeSetmodeSet = nullptr
 

Member Function Documentation

◆ computeControlFrameMode()

const IIeee80211Mode * inet::ieee80211::QosRateSelection::computeControlFrameMode ( const Ptr< const Ieee80211MacHeader > &  header,
TxopProcedure txopProcedure 
)
protectedvirtual
169 {
170  ASSERT(!isControlResponseFrame(header, txopProcedure));
171  if (controlFrameMode)
172  return controlFrameMode;
173  // This subclause describes the rate selection rules for control frames that initiate a TXOP and that are not carried
174  // in an A-MPDU.
175  if (txopProcedure->isTxopInitiator(header)) {
176  // If a control frame other than a Basic BlockAckReq or Basic BlockAck is carried in a non-HT PPDU, the
177  // transmitting STA shall transmit the frame using one of the rates in the BSSBasicRateSet parameter or a rate
178  // from the mandatory rate set of the attached PHY if the BSSBasicRateSet is empty.
179  if (!dynamicPtrCast<const Ieee80211BasicBlockAck>(header) && !dynamicPtrCast<const Ieee80211BasicBlockAckReq>(header)) {
180  // TODO BSSBasicRateSet
181  return fastestMandatoryMode;
182  }
183  // If a Basic BlockAckReq or Basic BlockAck frame is carried in a non-HT PPDU, the transmitting STA shall
184  // transmit the frame using a rate supported by the receiver STA, if known (as reported in the Supported Rates
185  // element and/or Extended Supported Rates element in frames transmitted by that STA). If the supported rate set
186  // of the receiving STA or STAs is not known, the transmitting STA shall transmit using a rate from the
187  // BSSBasicRateSet parameter or using a rate from the mandatory rate set of the attached PHY if the
188  // BSSBasicRateSet is empty.
189  else {
190  // TODO supported rate set of the receiving STA
191  return fastestMandatoryMode;
192  }
193  }
194  // This subclause describes the rate selection rules for control frames that are not control response frames, are not
195  // the frame that initiates a TXOP, are not the frame that terminates a TXOP, and are not carried in an A-MPDU.
196  else if (!txopProcedure->isTxopTerminator(header)) {
197  // A frame other than a BlockAckReq or BlockAck that is carried in a non-HT PPDU shall be transmitted by the
198  // STA using a rate no higher than the highest rate in the BSSBasicRateSet parameter that is less than or equal to
199  // the rate or non-HT reference rate (see 9.7.9) of the previously transmitted frame that was directed to the same
200  // receiving STA. If no rate in the BSSBasicRateSet parameter meets these conditions, the control frame shall be
201  // transmitted at a rate no higher than the highest mandatory rate of the attached PHY that is less than or equal to
202  // the rate or non-HT reference rate (see 9.7.9) of the previously transmitted frame that was directed to the same
203  // receiving STA.
204  // TODO BSSBasicRateSet
205  if (!dynamicPtrCast<const Ieee80211BasicBlockAck>(header) && !dynamicPtrCast<const Ieee80211BasicBlockAckReq>(header)) {
206  // TODO frame sequence context
207  auto it = lastTransmittedFrameMode.find(header->getReceiverAddress());
208  return (it != lastTransmittedFrameMode.end()) ? it->second : fastestMandatoryMode;
209  }
210  // A BlockAckReq or BlockAck that is carried in a non-HT PPDU shall be transmitted by the STA using a rate
211  // supported by the receiver STA, as reported in the Supported Rates element and/or Extended Supported Rates
212  // element in frames transmitted by that STA. When the supported rate set of the receiving STA or STAs is not
213  // known, the transmitting STA shall transmit using a rate from the BSSBasicRateSet parameter or from the
214  // mandatory rate set of the attached PHY if the BSSBasicRateSet is empty.
215  else {
216  // TODO BSSBasicRateSet
217  // TODO Supported Rates element and/or Extended Supported Rates
218  return fastestMandatoryMode;
219  }
220  }
221  else
222  throw cRuntimeError("Control frames cannot terminate TXOPs");
223 }

◆ computeDataOrMgmtFrameMode()

const IIeee80211Mode * inet::ieee80211::QosRateSelection::computeDataOrMgmtFrameMode ( const Ptr< const Ieee80211DataOrMgmtHeader > &  dataOrMgmtHeader)
protectedvirtual
121 {
122  if (dynamicPtrCast<const Ieee80211DataHeader>(dataOrMgmtHeader) && dataFrameMode)
123  return dataFrameMode;
124  if (dynamicPtrCast<const Ieee80211MgmtHeader>(dataOrMgmtHeader) && mgmtFrameMode)
125  return mgmtFrameMode;
126  // This subclause describes the rate selection rules for group addressed data and management frames, excluding
127  // the following:
128  // — Non-STBC Beacon and non-STBC PSMP frames
129  // — STBC group addressed data and management frames
130  // — Data frames located in an FMS stream (see 10.23.7)
131  if (dataOrMgmtHeader->getReceiverAddress().isMulticast()) {
132  // If the BSSBasicRateSet parameter is not empty, a data or management frame (excluding the frames listed
133  // above) with a group address in the Address 1 field shall be transmitted in a non-HT PPDU using one of the
134  // rates included in the BSSBasicRateSet parameter or the rate chosen by the AP, described in 10.23.7, if the data
135  // frames are part of an FMS stream.
136  // TODO BSSBasicRateSet
137  // If the BSSBasicRateSet parameter is empty and the BSSBasicMCSSet parameter is not empty, the frame shall
138  // be transmitted in an HT PPDU using one of the MCSs included in the BSSBasicMCSSet parameter.
139 
140  // If both the BSSBasicRateSet parameter and the BSSBasicMCSSet parameter are empty (e.g., a scanning STA
141  // that is not yet associated with a BSS), the frame shall be transmitted in a non-HT PPDU using one of the
142  // mandatory PHY rates.
144  return dataOrMgmtRateControl->getRate();
145  else
146  return fastestMandatoryMode;
147  }
148  // A data or management frame not identified in 9.7.5.1 through 9.7.5.5 shall be sent using any data rate or MCS
149  // subject to the following constraints:
150  // — A STA shall not transmit a frame using a rate or MCS that is not supported by the receiver STA or
151  // STAs, as reported in any Supported Rates element, Extended Supported Rates element, or
152  // Supported MCS field in management frames transmitted by the receiver STA.
153  // — A STA shall not transmit a frame using a value for the CH_BANDWIDTH parameter of the
154  // TXVECTOR that is not supported by the receiver STA.
155  // — A STA shall not initiate transmission of a frame at a data rate higher than the greatest rate in the
156  // OperationalRateSet or the HTOperationalMCSset, which are parameters of the MLME-
157  // JOIN.request primitive.
158  else {
159  // TODO Supported Rates element, Extended Supported Rates element
160  // TODO OperationalRateSet or the HTOperationalMCSset
162  return dataOrMgmtRateControl->getRate();
163  else
164  return fastestMandatoryMode;
165  }
166 }

◆ computeMode()

const IIeee80211Mode * inet::ieee80211::QosRateSelection::computeMode ( Packet packet,
const Ptr< const Ieee80211MacHeader > &  header,
TxopProcedure txopProcedure 
)
overridevirtual

Implements inet::ieee80211::IQosRateSelection.

226 {
227  if (auto dataOrMgmtHeader = dynamicPtrCast<const Ieee80211DataOrMgmtHeader>(header))
228  return computeDataOrMgmtFrameMode(dataOrMgmtHeader);
229  else
230  return computeControlFrameMode(header, txopProcedure);
231 }

◆ computeResponseAckFrameMode()

const IIeee80211Mode * inet::ieee80211::QosRateSelection::computeResponseAckFrameMode ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  dataOrMgmtHeader 
)
overridevirtual

Implements inet::ieee80211::IQosRateSelection.

73 {
74  // TODO BSSBasicRateSet, alternate rate
75  auto mode = getMode(packet, dataOrMgmtHeader);
76  ASSERT(modeSet->containsMode(mode));
77  if (!responseAckFrameMode) {
78  if (modeSet->getIsMandatory(mode))
79  return mode;
80  else if (auto slowerMode = modeSet->getSlowerMandatoryMode(mode))
81  return slowerMode;
82  else
83  throw cRuntimeError("Mandatory mode not found");
84  }
85  else
86  return responseAckFrameMode;
87 }

◆ computeResponseBlockAckFrameMode()

const IIeee80211Mode * inet::ieee80211::QosRateSelection::computeResponseBlockAckFrameMode ( Packet packet,
const Ptr< const Ieee80211BlockAckReq > &  blockAckReq 
)
overridevirtual

Implements inet::ieee80211::IQosRateSelection.

113 {
114  if (dynamicPtrCast<const Ieee80211BasicBlockAckReq>(blockAckReq))
115  return responseBlockAckFrameMode ? responseBlockAckFrameMode : getMode(packet, blockAckReq);
116  else
117  throw cRuntimeError("Unknown BlockAckReq frame type");
118 }

◆ computeResponseCtsFrameMode()

const IIeee80211Mode * inet::ieee80211::QosRateSelection::computeResponseCtsFrameMode ( Packet packet,
const Ptr< const Ieee80211RtsFrame > &  rtsFrame 
)
overridevirtual

Implements inet::ieee80211::IQosRateSelection.

90 {
91  // TODO BSSBasicRateSet, alternate rate
92  auto mode = getMode(packet, rtsFrame);
93  ASSERT(modeSet->containsMode(mode));
94  if (!responseCtsFrameMode) {
95  if (modeSet->getIsMandatory(mode))
96  return mode;
97  else if (auto slowerMode = modeSet->getSlowerMandatoryMode(mode))
98  return slowerMode;
99  else
100  throw cRuntimeError("Mandatory mode not found");
101  }
102  else
103  return responseCtsFrameMode;
104 }

◆ frameTransmitted()

void inet::ieee80211::QosRateSelection::frameTransmitted ( Packet packet,
const Ptr< const Ieee80211MacHeader > &  header 
)
virtual
244 {
245  auto receiverAddr = header->getReceiverAddress();
246  lastTransmittedFrameMode[receiverAddr] = getMode(packet, header);
247 }

◆ getMode()

const IIeee80211Mode * inet::ieee80211::QosRateSelection::getMode ( Packet packet,
const Ptr< const Ieee80211MacHeader > &  header 
)
protectedvirtual
44 {
45  const auto& modeReqTag = packet->findTag<Ieee80211ModeReq>();
46  if (modeReqTag)
47  return modeReqTag->getMode();
48  const auto& modeIndTag = packet->findTag<Ieee80211ModeInd>();
49  if (modeIndTag)
50  return modeIndTag->getMode();
51  throw cRuntimeError("Missing mode");
52 }

◆ initialize()

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

Reimplemented from inet::ieee80211::ModeSetListener.

22 {
24  if (stage == INITSTAGE_LINK_LAYER) {
25  dataOrMgmtRateControl = dynamic_cast<IRateControl *>(findModuleByPath(par("rateControlModule")));
26  double multicastFrameBitrate = par("multicastFrameBitrate");
27  multicastFrameMode = (multicastFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(multicastFrameBitrate));
28  double dataFrameBitrate = par("dataFrameBitrate");
29  dataFrameMode = (dataFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(dataFrameBitrate), Hz(par("dataFrameBandwidth")), par("dataFrameNumSpatialStreams"));
30  double mgmtFrameBitrate = par("mgmtFrameBitrate");
31  mgmtFrameMode = (mgmtFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(mgmtFrameBitrate));
32  double controlFrameBitrate = par("controlFrameBitrate");
33  controlFrameMode = (controlFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(controlFrameBitrate));
34  double responseAckFrameBitrate = par("responseAckFrameBitrate");
35  responseAckFrameMode = (responseAckFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(responseAckFrameBitrate));
36  double responseBlockAckFrameBitrate = par("responseBlockAckFrameBitrate");
37  responseBlockAckFrameMode = (responseBlockAckFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(responseBlockAckFrameBitrate));
38  double responseCtsFrameBitrate = par("responseCtsFrameBitrate");
39  responseCtsFrameMode = (responseCtsFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(responseCtsFrameBitrate));
40  }
41 }

◆ isControlResponseFrame()

bool inet::ieee80211::QosRateSelection::isControlResponseFrame ( const Ptr< const Ieee80211MacHeader > &  header,
TxopProcedure txopProcedure 
)
protectedvirtual
55 {
56  bool nonSelfCts = dynamicPtrCast<const Ieee80211CtsFrame>(header) && !txopProcedure->isTxopInitiator(header);
57  bool blockAck = dynamicPtrCast<const Ieee80211BlockAck>(header) != nullptr;
58  bool ack = dynamicPtrCast<const Ieee80211AckFrame>(header) != nullptr;
59  return ack || blockAck || nonSelfCts;
60 }

◆ numInitStages()

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

Reimplemented from inet::ieee80211::ModeSetListener.

52 { return NUM_INIT_STAGES; }

◆ receiveSignal()

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

Reimplemented from inet::ieee80211::ModeSetListener.

234 {
235  Enter_Method("%s", cComponent::getSignalName(signalID));
236 
237  if (signalID == modesetChangedSignal) {
238  modeSet = check_and_cast<Ieee80211ModeSet *>(obj);
240  }
241 }

Member Data Documentation

◆ controlFrameMode

const physicallayer::IIeee80211Mode* inet::ieee80211::QosRateSelection::controlFrameMode = nullptr
protected

◆ dataFrameMode

const physicallayer::IIeee80211Mode* inet::ieee80211::QosRateSelection::dataFrameMode = nullptr
protected

◆ dataOrMgmtRateControl

IRateControl* inet::ieee80211::QosRateSelection::dataOrMgmtRateControl = nullptr
protected

◆ fastestMandatoryMode

const physicallayer::IIeee80211Mode* inet::ieee80211::QosRateSelection::fastestMandatoryMode = nullptr
protected

◆ lastTransmittedFrameMode

std::map<MacAddress, const physicallayer::IIeee80211Mode *> inet::ieee80211::QosRateSelection::lastTransmittedFrameMode
protected

◆ mgmtFrameMode

const physicallayer::IIeee80211Mode* inet::ieee80211::QosRateSelection::mgmtFrameMode = nullptr
protected

◆ modeSet

const physicallayer::Ieee80211ModeSet* inet::ieee80211::QosRateSelection::modeSet = nullptr
protected

◆ multicastFrameMode

const physicallayer::IIeee80211Mode* inet::ieee80211::QosRateSelection::multicastFrameMode = nullptr
protected

◆ responseAckFrameMode

const physicallayer::IIeee80211Mode* inet::ieee80211::QosRateSelection::responseAckFrameMode = nullptr
protected

◆ responseBlockAckFrameMode

const physicallayer::IIeee80211Mode* inet::ieee80211::QosRateSelection::responseBlockAckFrameMode = nullptr
protected

◆ responseCtsFrameMode

const physicallayer::IIeee80211Mode* inet::ieee80211::QosRateSelection::responseCtsFrameMode = nullptr
protected

The documentation for this class was generated from the following files:
inet::ieee80211::QosRateSelection::multicastFrameMode
const physicallayer::IIeee80211Mode * multicastFrameMode
Definition: QosRateSelection.h:40
inet::ieee80211::QosRateSelection::mgmtFrameMode
const physicallayer::IIeee80211Mode * mgmtFrameMode
Definition: QosRateSelection.h:44
inet::ieee80211::QosRateSelection::dataFrameMode
const physicallayer::IIeee80211Mode * dataFrameMode
Definition: QosRateSelection.h:43
inet::units::units::Hz
pow< s, -1 > Hz
Definition: Units.h:935
inet::physicallayer::Ieee80211ModeSet::getIsMandatory
bool getIsMandatory(const IIeee80211Mode *mode) const
Definition: Ieee80211ModeSet.cc:493
inet::physicallayer::Ieee80211ModeTagBase::getMode
virtual const IIeee80211Mode * getMode() const
inet::ieee80211::QosRateSelection::modeSet
const physicallayer::Ieee80211ModeSet * modeSet
Definition: QosRateSelection.h:36
inet::units::units::bps
compose< b, pow< s, -1 > > bps
Definition: Units.h:1169
inet::physicallayer::Ieee80211ModeSet::containsMode
bool containsMode(const IIeee80211Mode *mode) const
Definition: Ieee80211ModeSet.h:48
inet::ieee80211::ModeSetListener::initialize
virtual void initialize(int stage) override
Definition: ModeSetListener.cc:17
inet::modesetChangedSignal
simsignal_t modesetChangedSignal
Definition: Simsignals.cc:24
inet::ieee80211::QosRateSelection::controlFrameMode
const physicallayer::IIeee80211Mode * controlFrameMode
Definition: QosRateSelection.h:45
inet::ieee80211::QosRateSelection::computeControlFrameMode
virtual const physicallayer::IIeee80211Mode * computeControlFrameMode(const Ptr< const Ieee80211MacHeader > &header, TxopProcedure *txopProcedure)
Definition: QosRateSelection.cc:168
inet::physicallayer::Ieee80211ModeSet::getSlowerMandatoryMode
const IIeee80211Mode * getSlowerMandatoryMode(const IIeee80211Mode *mode) const
Definition: Ieee80211ModeSet.cc:581
inet::ieee80211::QosRateSelection::responseBlockAckFrameMode
const physicallayer::IIeee80211Mode * responseBlockAckFrameMode
Definition: QosRateSelection.h:49
inet::ieee80211::QosRateSelection::getMode
virtual const physicallayer::IIeee80211Mode * getMode(Packet *packet, const Ptr< const Ieee80211MacHeader > &header)
Definition: QosRateSelection.cc:43
inet::physicallayer::Ieee80211ModeReq
Class generated from inet/physicallayer/wireless/ieee80211/packetlevel/Ieee80211Tag....
Definition: Ieee80211Tag_m.h:107
inet::ieee80211::IRateControl::getRate
virtual const physicallayer::IIeee80211Mode * getRate()=0
inet::physicallayer::Ieee80211ModeSet::getFastestMandatoryMode
const IIeee80211Mode * getFastestMandatoryMode() const
Definition: Ieee80211ModeSet.cc:573
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::ieee80211::QosRateSelection::isControlResponseFrame
virtual bool isControlResponseFrame(const Ptr< const Ieee80211MacHeader > &header, TxopProcedure *txopProcedure)
Definition: QosRateSelection.cc:54
inet::ieee80211::QosRateSelection::lastTransmittedFrameMode
std::map< MacAddress, const physicallayer::IIeee80211Mode * > lastTransmittedFrameMode
Definition: QosRateSelection.h:37
inet::ieee80211::QosRateSelection::fastestMandatoryMode
const physicallayer::IIeee80211Mode * fastestMandatoryMode
Definition: QosRateSelection.h:41
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::physicallayer::Ieee80211ModeInd
Class generated from inet/physicallayer/wireless/ieee80211/packetlevel/Ieee80211Tag....
Definition: Ieee80211Tag_m.h:142
inet::physicallayer::Ieee80211ModeSet::getMode
const IIeee80211Mode * getMode(bps bitrate, Hz bandwidth=Hz(NaN), int numSpatialStreams=-1) const
Definition: Ieee80211ModeSet.cc:519
inet::ieee80211::QosRateSelection::responseAckFrameMode
const physicallayer::IIeee80211Mode * responseAckFrameMode
Definition: QosRateSelection.h:47
inet::ieee80211::QosRateSelection::responseCtsFrameMode
const physicallayer::IIeee80211Mode * responseCtsFrameMode
Definition: QosRateSelection.h:48
inet::ieee80211::QosRateSelection::dataOrMgmtRateControl
IRateControl * dataOrMgmtRateControl
Definition: QosRateSelection.h:34
inet::INITSTAGE_LINK_LAYER
INET_API InitStage INITSTAGE_LINK_LAYER
Initialization of link-layer protocols.
inet::ieee80211::QosRateSelection::computeDataOrMgmtFrameMode
virtual const physicallayer::IIeee80211Mode * computeDataOrMgmtFrameMode(const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)
Definition: QosRateSelection.cc:120