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

#include <OriginatorQosAckPolicy.h>

Inheritance diagram for inet::ieee80211::OriginatorQosAckPolicy:
inet::ieee80211::ModeSetListener inet::ieee80211::IOriginatorQoSAckPolicy

Public Member Functions

virtual bool isAckNeeded (const Ptr< const Ieee80211MgmtHeader > &header) const override
 
virtual AckPolicy computeAckPolicy (Packet *packet, const Ptr< const Ieee80211DataHeader > &header, OriginatorBlockAckAgreement *agreement) const override
 
virtual bool isBlockAckPolicyEligibleFrame (Packet *packet, const Ptr< const Ieee80211DataHeader > &header) const override
 
virtual bool isBlockAckReqNeeded (InProgressFrames *inProgressFrames, TxopProcedure *txopProcedure) const override
 
virtual std::tuple< MacAddress, SequenceNumberCyclic, TidcomputeBlockAckReqParameters (InProgressFrames *inProgressFrames, TxopProcedure *txopProcedure) const override
 
virtual simtime_t getAckTimeout (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader) const override
 
virtual simtime_t getBlockAckTimeout (Packet *packet, const Ptr< const Ieee80211BlockAckReq > &blockAckReq) const override
 
- Public Member Functions inherited from inet::ieee80211::IOriginatorQoSAckPolicy
virtual ~IOriginatorQoSAckPolicy ()
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual bool checkAgreementPolicy (const Ptr< const Ieee80211DataHeader > &header, OriginatorBlockAckAgreement *agreement) const
 
virtual std::map< MacAddress, std::vector< Packet * > > getOutstandingFramesPerReceiver (InProgressFrames *inProgressFrames) const
 
virtual SequenceNumberCyclic computeStartingSequenceNumber (const std::vector< Packet * > &outstandingFrames) const
 
virtual bool isCompressedBlockAckReq (const std::vector< Packet * > &outstandingFrames, int startingSequenceNumber) const
 
- Protected Member Functions inherited from inet::ieee80211::ModeSetListener
virtual void receiveSignal (cComponent *source, simsignal_t signalID, cObject *obj, cObject *details) override
 

Protected Attributes

IQosRateSelectionrateSelection = nullptr
 
int maxBlockAckPolicyFrameLength = -1
 
int blockAckReqThreshold = -1
 
simtime_t blockAckTimeout = -1
 
simtime_t ackTimeout = -1
 
- Protected Attributes inherited from inet::ieee80211::ModeSetListener
physicallayer::Ieee80211ModeSetmodeSet = nullptr
 

Member Function Documentation

◆ checkAgreementPolicy()

bool inet::ieee80211::OriginatorQosAckPolicy::checkAgreementPolicy ( const Ptr< const Ieee80211DataHeader > &  header,
OriginatorBlockAckAgreement agreement 
) const
protectedvirtual
117 {
118  bool bufferFull = agreement->getBufferSize() == agreement->getNumSentBaPolicyFrames();
119  bool aMsduOk = agreement->getIsAMsduSupported() || !header->getAMsduPresent();
120  // TODO bool baPolicy = agreement->getIsDelayedBlockAckPolicySupported() || !frame->getAckPolicy();
121  return !bufferFull && aMsduOk && (header->getSequenceNumber() >= agreement->getStartingSequenceNumber()); // TODO && baPolicy
122 }

Referenced by computeAckPolicy().

◆ computeAckPolicy()

AckPolicy inet::ieee80211::OriginatorQosAckPolicy::computeAckPolicy ( Packet packet,
const Ptr< const Ieee80211DataHeader > &  header,
OriginatorBlockAckAgreement agreement 
) const
overridevirtual

Implements inet::ieee80211::IOriginatorQoSAckPolicy.

98 {
99  if (agreement == nullptr)
100  return AckPolicy::NORMAL_ACK;
101  if (agreement->getIsAddbaResponseReceived() && isBlockAckPolicyEligibleFrame(packet, header)) {
102  if (checkAgreementPolicy(header, agreement))
103  return AckPolicy::BLOCK_ACK;
104  else
105  return AckPolicy::NORMAL_ACK;
106  }
107  else
108  return AckPolicy::NORMAL_ACK;
109 }

◆ computeBlockAckReqParameters()

std::tuple< MacAddress, SequenceNumberCyclic, Tid > inet::ieee80211::OriginatorQosAckPolicy::computeBlockAckReqParameters ( InProgressFrames inProgressFrames,
TxopProcedure txopProcedure 
) const
overridevirtual

Implements inet::ieee80211::IOriginatorQoSAckPolicy.

79 {
80  auto outstandingFramesPerReceiver = getOutstandingFramesPerReceiver(inProgressFrames);
81  for (auto outstandingFrames : outstandingFramesPerReceiver) {
82  if ((int)outstandingFrames.second.size() >= blockAckReqThreshold) {
83  auto largestOutstandingFrames = outstandingFramesPerReceiver.begin();
84  for (auto it = outstandingFramesPerReceiver.begin(); it != outstandingFramesPerReceiver.end(); it++) {
85  if (it->second.size() > largestOutstandingFrames->second.size())
86  largestOutstandingFrames = it;
87  }
88  MacAddress receiverAddress = largestOutstandingFrames->first;
89  SequenceNumberCyclic startingSequenceNumber = computeStartingSequenceNumber(largestOutstandingFrames->second);
90  Tid tid = largestOutstandingFrames->second.at(0)->peekAtFront<Ieee80211DataHeader>()->getTid();
91  return std::make_tuple(receiverAddress, startingSequenceNumber, tid);
92  }
93  }
94  return std::make_tuple(MacAddress::UNSPECIFIED_ADDRESS, SequenceNumberCyclic(), -1);
95 }

◆ computeStartingSequenceNumber()

SequenceNumberCyclic inet::ieee80211::OriginatorQosAckPolicy::computeStartingSequenceNumber ( const std::vector< Packet * > &  outstandingFrames) const
protectedvirtual
44 {
45  ASSERT(outstandingFrames.size() > 0);
46  auto startingSequenceNumber = outstandingFrames[0]->peekAtFront<Ieee80211DataHeader>()->getSequenceNumber();
47  for (size_t i = 1; i < outstandingFrames.size(); i++) {
48  auto seqNum = outstandingFrames[i]->peekAtFront<Ieee80211DataHeader>()->getSequenceNumber();
49  if (seqNum < startingSequenceNumber)
50  startingSequenceNumber = seqNum;
51  }
52  return startingSequenceNumber;
53 }

Referenced by computeBlockAckReqParameters().

◆ getAckTimeout()

simtime_t inet::ieee80211::OriginatorQosAckPolicy::getAckTimeout ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  dataOrMgmtHeader 
) const
overridevirtual

◆ getBlockAckTimeout()

simtime_t inet::ieee80211::OriginatorQosAckPolicy::getBlockAckTimeout ( Packet packet,
const Ptr< const Ieee80211BlockAckReq > &  blockAckReq 
) const
overridevirtual

◆ getOutstandingFramesPerReceiver()

std::map< MacAddress, std::vector< Packet * > > inet::ieee80211::OriginatorQosAckPolicy::getOutstandingFramesPerReceiver ( InProgressFrames inProgressFrames) const
protectedvirtual
35 {
36  auto outstandingFrames = inProgressFrames->getOutstandingFrames();
37  std::map<MacAddress, std::vector<Packet *>> outstandingFramesPerReceiver;
38  for (auto frame : outstandingFrames)
39  outstandingFramesPerReceiver[frame->peekAtFront<Ieee80211MacHeader>()->getReceiverAddress()].push_back(frame);
40  return outstandingFramesPerReceiver;
41 }

Referenced by computeBlockAckReqParameters(), and isBlockAckReqNeeded().

◆ initialize()

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

Reimplemented from inet::ieee80211::ModeSetListener.

18 {
20  if (stage == INITSTAGE_LOCAL) {
21  rateSelection = check_and_cast<IQosRateSelection *>(getModuleByPath(par("rateSelectionModule")));
22  maxBlockAckPolicyFrameLength = par("maxBlockAckPolicyFrameLength");
23  blockAckReqThreshold = par("blockAckReqThreshold");
24  blockAckTimeout = par("blockAckTimeout");
25  ackTimeout = par("ackTimeout");
26  }
27 }

◆ isAckNeeded()

bool inet::ieee80211::OriginatorQosAckPolicy::isAckNeeded ( const Ptr< const Ieee80211MgmtHeader > &  header) const
overridevirtual

Implements inet::ieee80211::IOriginatorQoSAckPolicy.

30 {
31  return !header->getReceiverAddress().isMulticast();
32 }

◆ isBlockAckPolicyEligibleFrame()

bool inet::ieee80211::OriginatorQosAckPolicy::isBlockAckPolicyEligibleFrame ( Packet packet,
const Ptr< const Ieee80211DataHeader > &  header 
) const
overridevirtual

Implements inet::ieee80211::IOriginatorQoSAckPolicy.

112 {
113  return header->getType() == ST_DATA_WITH_QOS && packet->getByteLength() < maxBlockAckPolicyFrameLength;
114 }

Referenced by computeAckPolicy().

◆ isBlockAckReqNeeded()

bool inet::ieee80211::OriginatorQosAckPolicy::isBlockAckReqNeeded ( InProgressFrames inProgressFrames,
TxopProcedure txopProcedure 
) const
overridevirtual

Implements inet::ieee80211::IOriginatorQoSAckPolicy.

68 {
69  auto outstandingFramesPerReceiver = getOutstandingFramesPerReceiver(inProgressFrames);
70  for (auto outstandingFrames : outstandingFramesPerReceiver) {
71  if ((int)outstandingFrames.second.size() >= blockAckReqThreshold)
72  return true;
73  }
74  return false;
75 }

◆ isCompressedBlockAckReq()

bool inet::ieee80211::OriginatorQosAckPolicy::isCompressedBlockAckReq ( const std::vector< Packet * > &  outstandingFrames,
int  startingSequenceNumber 
) const
protectedvirtual
56 {
57  // The Compressed Bitmap subfield of the BA Control field or BAR Control field shall be set to 1 in all
58  // BlockAck and BlockAckReq frames sent from one HT STA to another HT STA and shall be set to 0 otherwise.
59  return false; // non-HT STA
60 // for (auto frame : outstandingFrames)
61 // if (frame->getSequenceNumber() >= startingSequenceNumber && frame->getFragmentNumber() > 0)
62 // return false;
63 // return true;
64 }

◆ numInitStages()

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

Reimplemented from inet::ieee80211::ModeSetListener.

30 { return NUM_INIT_STAGES; }

Member Data Documentation

◆ ackTimeout

simtime_t inet::ieee80211::OriginatorQosAckPolicy::ackTimeout = -1
protected

Referenced by getAckTimeout(), and initialize().

◆ blockAckReqThreshold

int inet::ieee80211::OriginatorQosAckPolicy::blockAckReqThreshold = -1
protected

◆ blockAckTimeout

simtime_t inet::ieee80211::OriginatorQosAckPolicy::blockAckTimeout = -1
protected

Referenced by getBlockAckTimeout(), and initialize().

◆ maxBlockAckPolicyFrameLength

int inet::ieee80211::OriginatorQosAckPolicy::maxBlockAckPolicyFrameLength = -1
protected

◆ rateSelection

IQosRateSelection* inet::ieee80211::OriginatorQosAckPolicy::rateSelection = nullptr
protected

The documentation for this class was generated from the following files:
inet::ieee80211::OriginatorQosAckPolicy::maxBlockAckPolicyFrameLength
int maxBlockAckPolicyFrameLength
Definition: OriginatorQosAckPolicy.h:23
inet::ieee80211::OriginatorQosAckPolicy::isBlockAckPolicyEligibleFrame
virtual bool isBlockAckPolicyEligibleFrame(Packet *packet, const Ptr< const Ieee80211DataHeader > &header) const override
Definition: OriginatorQosAckPolicy.cc:111
inet::ieee80211::BLOCK_ACK
@ BLOCK_ACK
Definition: Ieee80211Frame_m.h:196
inet::ieee80211::OriginatorQosAckPolicy::getOutstandingFramesPerReceiver
virtual std::map< MacAddress, std::vector< Packet * > > getOutstandingFramesPerReceiver(InProgressFrames *inProgressFrames) const
Definition: OriginatorQosAckPolicy.cc:34
inet::ieee80211::ModeSetListener::initialize
virtual void initialize(int stage) override
Definition: ModeSetListener.cc:17
inet::ieee80211::OriginatorQosAckPolicy::ackTimeout
simtime_t ackTimeout
Definition: OriginatorQosAckPolicy.h:27
inet::ieee80211::IQosRateSelection::computeResponseAckFrameMode
virtual const physicallayer::IIeee80211Mode * computeResponseAckFrameMode(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)=0
inet::ieee80211::Tid
int8_t Tid
Definition: Ieee80211Defs.h:17
inet::ieee80211::OriginatorQosAckPolicy::rateSelection
IQosRateSelection * rateSelection
Definition: OriginatorQosAckPolicy.h:22
inet::physicallayer::IIeee80211Mode::getPhyRxStartDelay
virtual const simtime_t getPhyRxStartDelay() const =0
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::ieee80211::OriginatorQosAckPolicy::blockAckTimeout
simtime_t blockAckTimeout
Definition: OriginatorQosAckPolicy.h:26
inet::ieee80211::OriginatorQosAckPolicy::computeStartingSequenceNumber
virtual SequenceNumberCyclic computeStartingSequenceNumber(const std::vector< Packet * > &outstandingFrames) const
Definition: OriginatorQosAckPolicy.cc:43
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::physicallayer::Ieee80211ModeSet::getSlotTime
simtime_t getSlotTime() const
Definition: Ieee80211ModeSet.h:68
inet::ieee80211::ST_DATA_WITH_QOS
@ ST_DATA_WITH_QOS
Definition: Ieee80211Frame_m.h:169
inet::ieee80211::IQosRateSelection::computeResponseBlockAckFrameMode
virtual const physicallayer::IIeee80211Mode * computeResponseBlockAckFrameMode(Packet *packet, const Ptr< const Ieee80211BlockAckReq > &blockAckReq)=0
inet::physicallayer::Ieee80211ModeSet::getSifsTime
simtime_t getSifsTime() const
Definition: Ieee80211ModeSet.h:67
inet::ieee80211::ModeSetListener::modeSet
physicallayer::Ieee80211ModeSet * modeSet
Definition: ModeSetListener.h:19
inet::ieee80211::OriginatorQosAckPolicy::checkAgreementPolicy
virtual bool checkAgreementPolicy(const Ptr< const Ieee80211DataHeader > &header, OriginatorBlockAckAgreement *agreement) const
Definition: OriginatorQosAckPolicy.cc:116
inet::MacAddress::UNSPECIFIED_ADDRESS
static const MacAddress UNSPECIFIED_ADDRESS
The unspecified MAC address, 00:00:00:00:00:00.
Definition: MacAddress.h:31
inet::ieee80211::OriginatorQosAckPolicy::blockAckReqThreshold
int blockAckReqThreshold
Definition: OriginatorQosAckPolicy.h:24
inet::ieee80211::NORMAL_ACK
@ NORMAL_ACK
Definition: Ieee80211Frame_m.h:193