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 (Ieee80211AddbaRequest *addbaReq) override
 
virtual void processTransmittedDataFrame (Ieee80211DataFrame *dataFrame, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy, IProcedureCallback *callback) override
 
virtual void processReceivedBlockAck (Ieee80211BlockAck *blockAck, IBlockAckAgreementHandlerCallback *callback) override
 
virtual void processReceivedAddbaResp (Ieee80211AddbaResponse *addbaResp, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy, IBlockAckAgreementHandlerCallback *callback) override
 
virtual void processReceivedDelba (Ieee80211Delba *delba, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy) override
 
virtual void processTransmittedDelba (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 Ieee80211AddbaRequestbuildAddbaRequest (MACAddress receiverAddr, Tid tid, int startingSequenceNumber, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy)
 
virtual void createAgreement (Ieee80211AddbaRequest *addbaRequest)
 
virtual void updateAgreement (OriginatorBlockAckAgreement *agreement, Ieee80211AddbaResponse *addbaResp)
 
virtual void terminateAgreement (MACAddress originatorAddr, Tid tid)
 
virtual 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

inet::ieee80211::OriginatorBlockAckAgreementHandler::~OriginatorBlockAckAgreementHandler ( )
virtual
181 {
182  for (auto it : blockAckAgreements)
183  delete it.second;
184 }
std::map< std::pair< MACAddress, Tid >, OriginatorBlockAckAgreement * > blockAckAgreements
Definition: OriginatorBlockAckAgreementHandler.h:33

Member Function Documentation

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

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

46 {
47  // When a timeout of BlockAckTimeout is detected, the STA shall send a DELBA frame to the
48  // peer STA with the Reason Code field set to TIMEOUT and shall issue a MLME-DELBA.indication
49  // primitive with the ReasonCode parameter having a value of TIMEOUT.
50  // The procedure is illustrated in Figure 10-14.
51  simtime_t now = simTime();
52  for (auto id : blockAckAgreements) {
53  auto agreement = id.second;
54  if (agreement->getExpirationTime() == now) {
55  MACAddress receiverAddr = id.first.first;
56  Tid tid = id.first.second;
57  procedureCallback->processMgmtFrame(buildDelba(receiverAddr, tid, 39)); // 39 - TIMEOUT see: Table 8-36—Reason codes
58  }
59  }
60  scheduleInactivityTimer(agreementHandlerCallback);
61 }
int8_t Tid
Definition: Ieee80211Defs.h:28
virtual void scheduleInactivityTimer(IBlockAckAgreementHandlerCallback *callback)
Definition: OriginatorBlockAckAgreementHandler.cc:94
std::map< std::pair< MACAddress, Tid >, OriginatorBlockAckAgreement * > blockAckAgreements
Definition: OriginatorBlockAckAgreementHandler.h:33
virtual Ieee80211Delba * buildDelba(MACAddress receiverAddr, Tid tid, int reasonCode)
Definition: OriginatorBlockAckAgreementHandler.cc:108
Ieee80211AddbaRequest * inet::ieee80211::OriginatorBlockAckAgreementHandler::buildAddbaRequest ( MACAddress  receiverAddr,
Tid  tid,
int  startingSequenceNumber,
IOriginatorBlockAckAgreementPolicy blockAckAgreementPolicy 
)
protectedvirtual

Referenced by processTransmittedDataFrame().

64 {
65  Ieee80211AddbaRequest *addbaRequest = new Ieee80211AddbaRequest("AddbaReq");
66  addbaRequest->setReceiverAddress(receiverAddr);
67  addbaRequest->setTid(tid);
68  addbaRequest->setAMsduSupported(blockAckAgreementPolicy->isMsduSupported());
69  addbaRequest->setBlockAckTimeoutValue(blockAckAgreementPolicy->getBlockAckTimeoutValue());
70  addbaRequest->setBufferSize(blockAckAgreementPolicy->getMaximumAllowedBufferSize());
71  // The Block Ack Policy subfield is set to 1 for immediate Block Ack and 0 for delayed Block Ack.
72  addbaRequest->setBlockAckPolicy(blockAckAgreementPolicy->isDelayedAckPolicySupported() ? 0 : 1);
73  addbaRequest->setStartingSequenceNumber(startingSequenceNumber);
74  return addbaRequest;
75 }
Ieee80211Delba * inet::ieee80211::OriginatorBlockAckAgreementHandler::buildDelba ( MACAddress  receiverAddr,
Tid  tid,
int  reasonCode 
)
protectedvirtual

Referenced by blockAckAgreementExpired().

109 {
110  Ieee80211Delba *delba = new Ieee80211Delba();
111  delba->setReceiverAddress(receiverAddr);
112  delba->setTid(tid);
113  delba->setReasonCode(reasonCode);
114  // The Initiator subfield indicates if the originator or the recipient of the data is sending this frame.
115  delba->setInitiator(true);
116  return delba;
117 }
simtime_t inet::ieee80211::OriginatorBlockAckAgreementHandler::computeEarliestExpirationTime ( )
protectedvirtual

Referenced by scheduleInactivityTimer().

32 {
33  simtime_t earliestTime = SIMTIME_MAX;
34  for (auto id : blockAckAgreements) {
35  auto agreement = id.second;
36  if (agreement->getIsAddbaResponseReceived()) {
37  ASSERT(earliestTime >= 0);
38  ASSERT(agreement->getExpirationTime() >= 0);
39  earliestTime = std::min(earliestTime, agreement->getExpirationTime());
40  }
41  }
42  return earliestTime;
43 }
double min(const double a, const double b)
Returns the minimum of a and b.
Definition: SCTPAssociation.h:270
std::map< std::pair< MACAddress, Tid >, OriginatorBlockAckAgreement * > blockAckAgreements
Definition: OriginatorBlockAckAgreementHandler.h:33
void inet::ieee80211::OriginatorBlockAckAgreementHandler::createAgreement ( Ieee80211AddbaRequest addbaRequest)
protectedvirtual

Referenced by processTransmittedDataFrame().

25 {
26  OriginatorBlockAckAgreement *blockAckAgreement = new OriginatorBlockAckAgreement(addbaRequest->getReceiverAddress(), addbaRequest->getTid(), addbaRequest->getStartingSequenceNumber(), addbaRequest->getBufferSize(), addbaRequest->getAMsduSupported(), addbaRequest->getBlockAckPolicy() == 0);
27  auto agreementId = std::make_pair(addbaRequest->getReceiverAddress(), addbaRequest->getTid());
28  blockAckAgreements[agreementId] = blockAckAgreement;
29 }
std::map< std::pair< MACAddress, Tid >, OriginatorBlockAckAgreement * > blockAckAgreements
Definition: OriginatorBlockAckAgreementHandler.h:33
OriginatorBlockAckAgreement * inet::ieee80211::OriginatorBlockAckAgreementHandler::getAgreement ( MACAddress  receiverAddr,
Tid  tid 
)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

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

102 {
103  auto agreementId = std::make_pair(receiverAddr, tid);
104  auto it = blockAckAgreements.find(agreementId);
105  return it != blockAckAgreements.end() ? it->second : nullptr;
106 }
std::map< std::pair< MACAddress, Tid >, OriginatorBlockAckAgreement * > blockAckAgreements
Definition: OriginatorBlockAckAgreementHandler.h:33
void inet::ieee80211::OriginatorBlockAckAgreementHandler::processReceivedAddbaResp ( Ieee80211AddbaResponse addbaResp,
IOriginatorBlockAckAgreementPolicy blockAckAgreementPolicy,
IBlockAckAgreementHandlerCallback callback 
)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

141 {
142  auto agreement = getAgreement(addbaResp->getTransmitterAddress(), addbaResp->getTid());
143  if (blockAckAgreementPolicy->isAddbaReqAccepted(addbaResp, agreement)) {
144  updateAgreement(agreement, addbaResp);
145  scheduleInactivityTimer(callback);
146  }
147  else {
148  // TODO: send a new one?
149  }
150 }
virtual void scheduleInactivityTimer(IBlockAckAgreementHandlerCallback *callback)
Definition: OriginatorBlockAckAgreementHandler.cc:94
virtual void updateAgreement(OriginatorBlockAckAgreement *agreement, Ieee80211AddbaResponse *addbaResp)
Definition: OriginatorBlockAckAgreementHandler.cc:152
virtual OriginatorBlockAckAgreement * getAgreement(MACAddress receiverAddr, Tid tid) override
Definition: OriginatorBlockAckAgreementHandler.cc:101
void inet::ieee80211::OriginatorBlockAckAgreementHandler::processReceivedBlockAck ( Ieee80211BlockAck blockAck,
IBlockAckAgreementHandlerCallback callback 
)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

82 {
83  if (auto basicBlockAck = dynamic_cast<Ieee80211BasicBlockAck*>(blockAck)) {
84  auto agreement = getAgreement(basicBlockAck->getTransmitterAddress(), basicBlockAck->getTidInfo());
85  if (agreement) {
86  agreement->calculateExpirationTime();
87  scheduleInactivityTimer(callback);
88  }
89  }
90  else
91  throw cRuntimeError("Unsupported BlockAck");
92 }
virtual void scheduleInactivityTimer(IBlockAckAgreementHandlerCallback *callback)
Definition: OriginatorBlockAckAgreementHandler.cc:94
virtual OriginatorBlockAckAgreement * getAgreement(MACAddress receiverAddr, Tid tid) override
Definition: OriginatorBlockAckAgreementHandler.cc:101
virtual void calculateExpirationTime()
Definition: OriginatorBlockAckAgreement.h:75
void inet::ieee80211::OriginatorBlockAckAgreementHandler::processReceivedDelba ( Ieee80211Delba delba,
IOriginatorBlockAckAgreementPolicy blockAckAgreementPolicy 
)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

175 {
176  if (blockAckAgreementPolicy->isDelbaAccepted(delba))
177  terminateAgreement(delba->getTransmitterAddress(), delba->getTid());
178 }
virtual void terminateAgreement(MACAddress originatorAddr, Tid tid)
Definition: OriginatorBlockAckAgreementHandler.cc:119
void inet::ieee80211::OriginatorBlockAckAgreementHandler::processTransmittedAddbaReq ( Ieee80211AddbaRequest addbaReq)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

161 {
162  auto agreement = getAgreement(addbaReq->getReceiverAddress(), addbaReq->getTid());
163  if (agreement)
164  agreement->setIsAddbaRequestSent(true);
165  else
166  throw cRuntimeError("Block Ack Agreement should have already been added");
167 }
virtual OriginatorBlockAckAgreement * getAgreement(MACAddress receiverAddr, Tid tid) override
Definition: OriginatorBlockAckAgreementHandler.cc:101
virtual void setIsAddbaRequestSent(bool isAddbaRequestSent)
Definition: OriginatorBlockAckAgreement.h:69
void inet::ieee80211::OriginatorBlockAckAgreementHandler::processTransmittedDataFrame ( Ieee80211DataFrame dataFrame,
IOriginatorBlockAckAgreementPolicy blockAckAgreementPolicy,
IProcedureCallback callback 
)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

131 {
132  auto agreement = getAgreement(dataFrame->getReceiverAddress(), dataFrame->getTid());
133  if (blockAckAgreementPolicy->isAddbaReqNeeded(dataFrame) && agreement == nullptr) {
134  auto addbaReq = buildAddbaRequest(dataFrame->getReceiverAddress(), dataFrame->getTid(), dataFrame->getSequenceNumber() + 1, blockAckAgreementPolicy);
135  createAgreement(addbaReq);
136  callback->processMgmtFrame(addbaReq);
137  }
138 }
virtual void createAgreement(Ieee80211AddbaRequest *addbaRequest)
Definition: OriginatorBlockAckAgreementHandler.cc:24
virtual Ieee80211AddbaRequest * buildAddbaRequest(MACAddress receiverAddr, Tid tid, int startingSequenceNumber, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy)
Definition: OriginatorBlockAckAgreementHandler.cc:63
virtual OriginatorBlockAckAgreement * getAgreement(MACAddress receiverAddr, Tid tid) override
Definition: OriginatorBlockAckAgreementHandler.cc:101
void inet::ieee80211::OriginatorBlockAckAgreementHandler::processTransmittedDelba ( Ieee80211Delba delba)
overridevirtual

Implements inet::ieee80211::IOriginatorBlockAckAgreementHandler.

170 {
171  terminateAgreement(delba->getReceiverAddress(), delba->getTid());
172 }
virtual void terminateAgreement(MACAddress originatorAddr, Tid tid)
Definition: OriginatorBlockAckAgreementHandler.cc:119
void inet::ieee80211::OriginatorBlockAckAgreementHandler::scheduleInactivityTimer ( IBlockAckAgreementHandlerCallback callback)
protectedvirtual

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

95 {
96  simtime_t earliestExpirationTime = computeEarliestExpirationTime();
97  if (earliestExpirationTime != SIMTIME_MAX)
98  callback->scheduleInactivityTimer(earliestExpirationTime);
99 }
virtual simtime_t computeEarliestExpirationTime()
Definition: OriginatorBlockAckAgreementHandler.cc:31
void inet::ieee80211::OriginatorBlockAckAgreementHandler::terminateAgreement ( MACAddress  originatorAddr,
Tid  tid 
)
protectedvirtual

Referenced by processReceivedDelba(), and processTransmittedDelba().

120 {
121  auto agreementId = std::make_pair(originatorAddr, tid);
122  auto it = blockAckAgreements.find(agreementId);
123  if (it != blockAckAgreements.end()) {
124  OriginatorBlockAckAgreement *agreement = it->second;
125  blockAckAgreements.erase(it);
126  delete agreement;
127  }
128 }
std::map< std::pair< MACAddress, Tid >, OriginatorBlockAckAgreement * > blockAckAgreements
Definition: OriginatorBlockAckAgreementHandler.h:33
void inet::ieee80211::OriginatorBlockAckAgreementHandler::updateAgreement ( OriginatorBlockAckAgreement agreement,
Ieee80211AddbaResponse addbaResp 
)
protectedvirtual

Referenced by processReceivedAddbaResp().

153 {
154  agreement->setIsAddbaResponseReceived(true);
155  agreement->setBufferSize(addbaResp->getBufferSize());
156  agreement->setBlockAckTimeoutValue(addbaResp->getBlockAckTimeoutValue());
157  agreement->calculateExpirationTime();
158 }

Member Data Documentation

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

The documentation for this class was generated from the following files: