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

#include <OriginatorBlockAckAgreementHandler.h>

Inheritance diagram for inet::ieee80211::OriginatorBlockAckAgreementHandler:
inet::ieee80211::IOriginatorBlockAckAgreementHandler

Public Member Functions

virtual ~OriginatorBlockAckAgreementHandler ()
 
virtual void processTransmittedAddbaReq (const Ptr< const Ieee80211AddbaRequest > &addbaReq) override
 
virtual void processTransmittedDataFrame (Packet *packet, const Ptr< const Ieee80211DataHeader > &dataHeader, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy, IProcedureCallback *callback) override
 
virtual void processReceivedBlockAck (const Ptr< const Ieee80211BlockAck > &blockAck, IBlockAckAgreementHandlerCallback *callback) override
 
virtual void processReceivedAddbaResp (const Ptr< const Ieee80211AddbaResponse > &addbaResp, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy, IBlockAckAgreementHandlerCallback *callback) override
 
virtual void processReceivedDelba (const Ptr< const Ieee80211Delba > &delba, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy) override
 
virtual void processTransmittedDelba (const Ptr< const Ieee80211Delba > &delba) override
 
virtual void blockAckAgreementExpired (IProcedureCallback *procedureCallback, IBlockAckAgreementHandlerCallback *agreementHandlerCallback) override
 
virtual OriginatorBlockAckAgreementgetAgreement (MacAddress receiverAddr, Tid tid) override
 
- Public Member Functions inherited from inet::ieee80211::IOriginatorBlockAckAgreementHandler
virtual ~IOriginatorBlockAckAgreementHandler ()
 

Protected Member Functions

virtual const Ptr< Ieee80211AddbaRequestbuildAddbaRequest (MacAddress receiverAddr, Tid tid, SequenceNumberCyclic startingSequenceNumber, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy)
 
virtual void createAgreement (const Ptr< const Ieee80211AddbaRequest > &addbaRequest)
 
virtual void updateAgreement (OriginatorBlockAckAgreement *agreement, const Ptr< const Ieee80211AddbaResponse > &addbaResp)
 
virtual void terminateAgreement (MacAddress originatorAddr, Tid tid)
 
virtual const Ptr< Ieee80211DelbabuildDelba (MacAddress receiverAddr, Tid tid, int reasonCode)
 
virtual simtime_t computeEarliestExpirationTime ()
 
virtual void scheduleInactivityTimer (IBlockAckAgreementHandlerCallback *callback)
 

Protected Attributes

std::map< std::pair< MacAddress, Tid >, OriginatorBlockAckAgreement * > blockAckAgreements
 

Constructor & Destructor Documentation

◆ ~OriginatorBlockAckAgreementHandler()

inet::ieee80211::OriginatorBlockAckAgreementHandler::~OriginatorBlockAckAgreementHandler ( )
virtual
176 {
177  for (auto it : blockAckAgreements)
178  delete it.second;
179 }

Member Function Documentation

◆ blockAckAgreementExpired()

void inet::ieee80211::OriginatorBlockAckAgreementHandler::blockAckAgreementExpired ( IProcedureCallback procedureCallback,
IBlockAckAgreementHandlerCallback agreementHandlerCallback 
)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

37 {
38  // When a timeout of BlockAckTimeout is detected, the STA shall send a DELBA frame to the
39  // peer STA with the Reason Code field set to TIMEOUT and shall issue a MLME-DELBA.indication
40  // primitive with the ReasonCode parameter having a value of TIMEOUT.
41  // The procedure is illustrated in Figure 10-14.
42  simtime_t now = simTime();
43  for (auto id : blockAckAgreements) {
44  auto agreement = id.second;
45  if (agreement->getExpirationTime() == now) {
46  MacAddress receiverAddr = id.first.first;
47  Tid tid = id.first.second;
48  const auto& delba = buildDelba(receiverAddr, tid, 39);
49  auto delbaPacket = new Packet("Delba", delba);
50  procedureCallback->processMgmtFrame(delbaPacket, delba); // 39 - TIMEOUT see: Table 8-36—Reason codes
51  }
52  }
53  scheduleInactivityTimer(agreementHandlerCallback);
54 }

◆ buildAddbaRequest()

const Ptr< Ieee80211AddbaRequest > inet::ieee80211::OriginatorBlockAckAgreementHandler::buildAddbaRequest ( MacAddress  receiverAddr,
Tid  tid,
SequenceNumberCyclic  startingSequenceNumber,
IOriginatorBlockAckAgreementPolicy blockAckAgreementPolicy 
)
protectedvirtual
57 {
58  auto addbaRequest = makeShared<Ieee80211AddbaRequest>();
59  addbaRequest->setReceiverAddress(receiverAddr);
60  addbaRequest->setTid(tid);
61  addbaRequest->setAMsduSupported(blockAckAgreementPolicy->isMsduSupported());
62  addbaRequest->setBlockAckTimeoutValue(blockAckAgreementPolicy->getBlockAckTimeoutValue());
63  addbaRequest->setBufferSize(blockAckAgreementPolicy->getMaximumAllowedBufferSize());
64  // The Block Ack Policy subfield is set to 1 for immediate Block Ack and 0 for delayed Block Ack.
65  addbaRequest->setBlockAckPolicy(blockAckAgreementPolicy->isDelayedAckPolicySupported() ? 0 : 1);
66  addbaRequest->setStartingSequenceNumber(startingSequenceNumber);
67  return addbaRequest;
68 }

Referenced by processTransmittedDataFrame().

◆ buildDelba()

const Ptr< Ieee80211Delba > inet::ieee80211::OriginatorBlockAckAgreementHandler::buildDelba ( MacAddress  receiverAddr,
Tid  tid,
int  reasonCode 
)
protectedvirtual
103 {
104  auto delba = makeShared<Ieee80211Delba>();
105  delba->setReceiverAddress(receiverAddr);
106  delba->setTid(tid);
107  delba->setReasonCode(reasonCode);
108  // The Initiator subfield indicates if the originator or the recipient of the data is sending this frame.
109  delba->setInitiator(true);
110  return delba;
111 }

Referenced by blockAckAgreementExpired().

◆ computeEarliestExpirationTime()

simtime_t inet::ieee80211::OriginatorBlockAckAgreementHandler::computeEarliestExpirationTime ( )
protectedvirtual
23 {
24  simtime_t earliestTime = SIMTIME_MAX;
25  for (auto id : blockAckAgreements) {
26  auto agreement = id.second;
27  if (agreement->getIsAddbaResponseReceived()) {
28  ASSERT(earliestTime >= 0);
29  ASSERT(agreement->getExpirationTime() >= 0);
30  earliestTime = std::min(earliestTime, agreement->getExpirationTime());
31  }
32  }
33  return earliestTime;
34 }

Referenced by scheduleInactivityTimer().

◆ createAgreement()

void inet::ieee80211::OriginatorBlockAckAgreementHandler::createAgreement ( const Ptr< const Ieee80211AddbaRequest > &  addbaRequest)
protectedvirtual
16 {
17  OriginatorBlockAckAgreement *blockAckAgreement = new OriginatorBlockAckAgreement(addbaRequest->getReceiverAddress(), addbaRequest->getTid(), addbaRequest->getStartingSequenceNumber(), addbaRequest->getBufferSize(), addbaRequest->getAMsduSupported(), addbaRequest->getBlockAckPolicy() == 0);
18  auto agreementId = std::make_pair(addbaRequest->getReceiverAddress(), addbaRequest->getTid());
19  blockAckAgreements[agreementId] = blockAckAgreement;
20 }

Referenced by processTransmittedDataFrame().

◆ getAgreement()

OriginatorBlockAckAgreement * inet::ieee80211::OriginatorBlockAckAgreementHandler::getAgreement ( MacAddress  receiverAddr,
Tid  tid 
)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

96 {
97  auto agreementId = std::make_pair(receiverAddr, tid);
98  auto it = blockAckAgreements.find(agreementId);
99  return it != blockAckAgreements.end() ? it->second : nullptr;
100 }

Referenced by processReceivedAddbaResp(), processReceivedBlockAck(), processTransmittedAddbaReq(), and processTransmittedDataFrame().

◆ processReceivedAddbaResp()

void inet::ieee80211::OriginatorBlockAckAgreementHandler::processReceivedAddbaResp ( const Ptr< const Ieee80211AddbaResponse > &  addbaResp,
IOriginatorBlockAckAgreementPolicy blockAckAgreementPolicy,
IBlockAckAgreementHandlerCallback callback 
)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

136 {
137  auto agreement = getAgreement(addbaResp->getTransmitterAddress(), addbaResp->getTid());
138  if (blockAckAgreementPolicy->isAddbaReqAccepted(addbaResp, agreement)) {
139  updateAgreement(agreement, addbaResp);
140  scheduleInactivityTimer(callback);
141  }
142  else {
143  // TODO send a new one?
144  }
145 }

◆ processReceivedBlockAck()

void inet::ieee80211::OriginatorBlockAckAgreementHandler::processReceivedBlockAck ( const Ptr< const Ieee80211BlockAck > &  blockAck,
IBlockAckAgreementHandlerCallback callback 
)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

75 {
76  if (auto basicBlockAck = dynamicPtrCast<const Ieee80211BasicBlockAck>(blockAck)) {
77  auto agreement = getAgreement(basicBlockAck->getTransmitterAddress(), basicBlockAck->getTidInfo());
78  if (agreement) {
79  agreement->setStartingSequenceNumber(basicBlockAck->getStartingSequenceNumber());
80  agreement->calculateExpirationTime();
81  scheduleInactivityTimer(callback);
82  }
83  }
84  else
85  throw cRuntimeError("Unsupported BlockAck");
86 }

◆ processReceivedDelba()

void inet::ieee80211::OriginatorBlockAckAgreementHandler::processReceivedDelba ( const Ptr< const Ieee80211Delba > &  delba,
IOriginatorBlockAckAgreementPolicy blockAckAgreementPolicy 
)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

170 {
171  if (blockAckAgreementPolicy->isDelbaAccepted(delba))
172  terminateAgreement(delba->getTransmitterAddress(), delba->getTid());
173 }

◆ processTransmittedAddbaReq()

void inet::ieee80211::OriginatorBlockAckAgreementHandler::processTransmittedAddbaReq ( const Ptr< const Ieee80211AddbaRequest > &  addbaReq)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

156 {
157  auto agreement = getAgreement(addbaReq->getReceiverAddress(), addbaReq->getTid());
158  if (agreement)
159  agreement->setIsAddbaRequestSent(true);
160  else
161  throw cRuntimeError("Block Ack Agreement should have already been added");
162 }

◆ processTransmittedDataFrame()

void inet::ieee80211::OriginatorBlockAckAgreementHandler::processTransmittedDataFrame ( Packet packet,
const Ptr< const Ieee80211DataHeader > &  dataHeader,
IOriginatorBlockAckAgreementPolicy blockAckAgreementPolicy,
IProcedureCallback callback 
)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

125 {
126  auto agreement = getAgreement(dataHeader->getReceiverAddress(), dataHeader->getTid());
127  if (blockAckAgreementPolicy->isAddbaReqNeeded(packet, dataHeader) && agreement == nullptr) {
128  auto addbaReq = buildAddbaRequest(dataHeader->getReceiverAddress(), dataHeader->getTid(), dataHeader->getSequenceNumber() + 1, blockAckAgreementPolicy);
129  createAgreement(addbaReq);
130  auto addbaPacket = new Packet("AddbaReq", addbaReq);
131  callback->processMgmtFrame(addbaPacket, addbaReq);
132  }
133 }

◆ processTransmittedDelba()

void inet::ieee80211::OriginatorBlockAckAgreementHandler::processTransmittedDelba ( const Ptr< const Ieee80211Delba > &  delba)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

165 {
166  terminateAgreement(delba->getReceiverAddress(), delba->getTid());
167 }

◆ scheduleInactivityTimer()

void inet::ieee80211::OriginatorBlockAckAgreementHandler::scheduleInactivityTimer ( IBlockAckAgreementHandlerCallback callback)
protectedvirtual
89 {
90  simtime_t earliestExpirationTime = computeEarliestExpirationTime();
91  if (earliestExpirationTime != SIMTIME_MAX)
92  callback->scheduleInactivityTimer(earliestExpirationTime);
93 }

Referenced by blockAckAgreementExpired(), processReceivedAddbaResp(), and processReceivedBlockAck().

◆ terminateAgreement()

void inet::ieee80211::OriginatorBlockAckAgreementHandler::terminateAgreement ( MacAddress  originatorAddr,
Tid  tid 
)
protectedvirtual
114 {
115  auto agreementId = std::make_pair(originatorAddr, tid);
116  auto it = blockAckAgreements.find(agreementId);
117  if (it != blockAckAgreements.end()) {
118  OriginatorBlockAckAgreement *agreement = it->second;
119  blockAckAgreements.erase(it);
120  delete agreement;
121  }
122 }

Referenced by processReceivedDelba(), and processTransmittedDelba().

◆ updateAgreement()

void inet::ieee80211::OriginatorBlockAckAgreementHandler::updateAgreement ( OriginatorBlockAckAgreement agreement,
const Ptr< const Ieee80211AddbaResponse > &  addbaResp 
)
protectedvirtual
148 {
149  agreement->setIsAddbaResponseReceived(true);
150  agreement->setBufferSize(addbaResp->getBufferSize());
151  agreement->setBlockAckTimeoutValue(addbaResp->getBlockAckTimeoutValue());
152  agreement->calculateExpirationTime();
153 }

Referenced by processReceivedAddbaResp().

Member Data Documentation

◆ blockAckAgreements

std::map<std::pair<MacAddress, Tid>, OriginatorBlockAckAgreement *> inet::ieee80211::OriginatorBlockAckAgreementHandler::blockAckAgreements
protected

The documentation for this class was generated from the following files:
inet::ieee80211::OriginatorBlockAckAgreementHandler::updateAgreement
virtual void updateAgreement(OriginatorBlockAckAgreement *agreement, const Ptr< const Ieee80211AddbaResponse > &addbaResp)
Definition: OriginatorBlockAckAgreementHandler.cc:147
inet::ieee80211::OriginatorBlockAckAgreementHandler::blockAckAgreements
std::map< std::pair< MacAddress, Tid >, OriginatorBlockAckAgreement * > blockAckAgreements
Definition: OriginatorBlockAckAgreementHandler.h:23
inet::ieee80211::OriginatorBlockAckAgreementHandler::buildAddbaRequest
virtual const Ptr< Ieee80211AddbaRequest > buildAddbaRequest(MacAddress receiverAddr, Tid tid, SequenceNumberCyclic startingSequenceNumber, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy)
Definition: OriginatorBlockAckAgreementHandler.cc:56
inet::ieee80211::OriginatorBlockAckAgreementHandler::terminateAgreement
virtual void terminateAgreement(MacAddress originatorAddr, Tid tid)
Definition: OriginatorBlockAckAgreementHandler.cc:113
inet::sctp::min
double min(const double a, const double b)
Returns the minimum of a and b.
Definition: SctpAssociation.h:261
inet::ieee80211::Tid
int8_t Tid
Definition: Ieee80211Defs.h:17
inet::ieee80211::OriginatorBlockAckAgreementHandler::getAgreement
virtual OriginatorBlockAckAgreement * getAgreement(MacAddress receiverAddr, Tid tid) override
Definition: OriginatorBlockAckAgreementHandler.cc:95
inet::ieee80211::OriginatorBlockAckAgreementHandler::createAgreement
virtual void createAgreement(const Ptr< const Ieee80211AddbaRequest > &addbaRequest)
Definition: OriginatorBlockAckAgreementHandler.cc:15
inet::ieee80211::OriginatorBlockAckAgreementHandler::buildDelba
virtual const Ptr< Ieee80211Delba > buildDelba(MacAddress receiverAddr, Tid tid, int reasonCode)
Definition: OriginatorBlockAckAgreementHandler.cc:102
inet::ieee80211::OriginatorBlockAckAgreementHandler::computeEarliestExpirationTime
virtual simtime_t computeEarliestExpirationTime()
Definition: OriginatorBlockAckAgreementHandler.cc:22
inet::ieee80211::OriginatorBlockAckAgreementHandler::scheduleInactivityTimer
virtual void scheduleInactivityTimer(IBlockAckAgreementHandlerCallback *callback)
Definition: OriginatorBlockAckAgreementHandler.cc:88