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

#include <RecipientBlockAckAgreementHandler.h>

Inheritance diagram for inet::ieee80211::RecipientBlockAckAgreementHandler:
inet::ieee80211::IRecipientBlockAckAgreementHandler

Public Member Functions

virtual ~RecipientBlockAckAgreementHandler ()
 
virtual void processTransmittedAddbaResp (const Ptr< const Ieee80211AddbaResponse > &addbaResp, IBlockAckAgreementHandlerCallback *callback) override
 
virtual void processReceivedAddbaRequest (const Ptr< const Ieee80211AddbaRequest > &addbaRequest, IRecipientBlockAckAgreementPolicy *blockAckAgreementPolicy, IProcedureCallback *callback) override
 
virtual void processReceivedDelba (const Ptr< const Ieee80211Delba > &delba, IRecipientBlockAckAgreementPolicy *blockAckAgreementPolicy) override
 
virtual void qosFrameReceived (const Ptr< const Ieee80211DataHeader > &qosHeader, IBlockAckAgreementHandlerCallback *callback) override
 
virtual void processTransmittedDelba (const Ptr< const Ieee80211Delba > &delba) override
 
virtual void blockAckAgreementExpired (IProcedureCallback *procedureCallback, IBlockAckAgreementHandlerCallback *agreementHandlerCallback) override
 
virtual RecipientBlockAckAgreementgetAgreement (Tid tid, MacAddress originatorAddr) override
 
- Public Member Functions inherited from inet::ieee80211::IRecipientBlockAckAgreementHandler
virtual ~IRecipientBlockAckAgreementHandler ()
 

Protected Member Functions

virtual void terminateAgreement (MacAddress originatorAddr, Tid tid)
 
virtual RecipientBlockAckAgreementaddAgreement (const Ptr< const Ieee80211AddbaRequest > &addbaReq)
 
virtual void updateAgreement (const Ptr< const Ieee80211AddbaResponse > &addbaResponse)
 
virtual const Ptr< Ieee80211AddbaResponsebuildAddbaResponse (const Ptr< const Ieee80211AddbaRequest > &addbaRequest, IRecipientBlockAckAgreementPolicy *blockAckAgreementPolicy)
 
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 >, RecipientBlockAckAgreement * > blockAckAgreements
 

Constructor & Destructor Documentation

◆ ~RecipientBlockAckAgreementHandler()

inet::ieee80211::RecipientBlockAckAgreementHandler::~RecipientBlockAckAgreementHandler ( )
virtual
181 {
182  for (auto it : blockAckAgreements)
183  delete it.second;
184 }

Member Function Documentation

◆ addAgreement()

RecipientBlockAckAgreement * inet::ieee80211::RecipientBlockAckAgreementHandler::addAgreement ( const Ptr< const Ieee80211AddbaRequest > &  addbaReq)
protectedvirtual
75 {
76  MacAddress originatorAddr = addbaReq->getTransmitterAddress();
77  auto id = std::make_pair(originatorAddr, addbaReq->getTid());
78  auto it = blockAckAgreements.find(id);
79  if (it == blockAckAgreements.end()) {
80  RecipientBlockAckAgreement *agreement = new RecipientBlockAckAgreement(originatorAddr, addbaReq->getTid(), addbaReq->getStartingSequenceNumber(), addbaReq->getBufferSize(), addbaReq->getBlockAckTimeoutValue());
81  blockAckAgreements[id] = agreement;
82  EV_DETAIL << "Block Ack Agreement is added with the following parameters: " << *agreement << endl;
83  return agreement;
84  }
85  else
86  // TODO update?
87  return it->second;
88 }

Referenced by processReceivedAddbaRequest().

◆ blockAckAgreementExpired()

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

Implements inet::ieee80211::IRecipientBlockAckAgreementHandler.

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

◆ buildAddbaResponse()

const Ptr< Ieee80211AddbaResponse > inet::ieee80211::RecipientBlockAckAgreementHandler::buildAddbaResponse ( const Ptr< const Ieee80211AddbaRequest > &  addbaRequest,
IRecipientBlockAckAgreementPolicy blockAckAgreementPolicy 
)
protectedvirtual
106 {
107  auto addbaResponse = makeShared<Ieee80211AddbaResponse>();
108  addbaResponse->setReceiverAddress(addbaRequest->getTransmitterAddress());
109  // The Block Ack Policy subfield is set to 1 for immediate Block Ack and 0 for delayed Block Ack.
110  Tid tid = addbaRequest->getTid();
111  addbaResponse->setTid(tid);
112  addbaResponse->setBlockAckPolicy(!addbaRequest->getBlockAckPolicy() && blockAckAgreementPolicy->delayedBlockAckPolicySupported() ? false : true);
113  addbaResponse->setBufferSize(addbaRequest->getBufferSize() <= blockAckAgreementPolicy->getMaximumAllowedBufferSize() ? addbaRequest->getBufferSize() : blockAckAgreementPolicy->getMaximumAllowedBufferSize());
114  addbaResponse->setBlockAckTimeoutValue(blockAckAgreementPolicy->getBlockAckTimeoutValue() == 0 ? blockAckAgreementPolicy->getBlockAckTimeoutValue() : addbaRequest->getBlockAckTimeoutValue());
115  addbaResponse->setAMsduSupported(blockAckAgreementPolicy->aMsduSupported());
116  return addbaResponse;
117 }

Referenced by processReceivedAddbaRequest().

◆ buildDelba()

const Ptr< Ieee80211Delba > inet::ieee80211::RecipientBlockAckAgreementHandler::buildDelba ( MacAddress  receiverAddr,
Tid  tid,
int  reasonCode 
)
protectedvirtual
96 {
97  auto delba = makeShared<Ieee80211Delba>();
98  delba->setReceiverAddress(receiverAddr);
99  delba->setInitiator(false);
100  delba->setTid(tid);
101  delba->setReasonCode(reasonCode);
102  return delba;
103 }

Referenced by blockAckAgreementExpired().

◆ computeEarliestExpirationTime()

simtime_t inet::ieee80211::RecipientBlockAckAgreementHandler::computeEarliestExpirationTime ( )
protectedvirtual
16 {
17  simtime_t earliestTime = SIMTIME_MAX;
18  for (auto id : blockAckAgreements) {
19  auto agreement = id.second;
20  earliestTime = std::min(earliestTime, agreement->getExpirationTime());
21  }
22  return earliestTime;
23 }

Referenced by scheduleInactivityTimer().

◆ getAgreement()

RecipientBlockAckAgreement * inet::ieee80211::RecipientBlockAckAgreementHandler::getAgreement ( Tid  tid,
MacAddress  originatorAddr 
)
overridevirtual

Implements inet::ieee80211::IRecipientBlockAckAgreementHandler.

143 {
144  auto agreementId = std::make_pair(originatorAddr, tid);
145  auto it = blockAckAgreements.find(agreementId);
146  return it != blockAckAgreements.end() ? it->second : nullptr;
147 }

Referenced by qosFrameReceived().

◆ processReceivedAddbaRequest()

void inet::ieee80211::RecipientBlockAckAgreementHandler::processReceivedAddbaRequest ( const Ptr< const Ieee80211AddbaRequest > &  addbaRequest,
IRecipientBlockAckAgreementPolicy blockAckAgreementPolicy,
IProcedureCallback callback 
)
overridevirtual

Implements inet::ieee80211::IRecipientBlockAckAgreementHandler.

156 {
157  EV_INFO << "Processing Addba Request from " << addbaRequest->getTransmitterAddress() << endl;
158  if (blockAckAgreementPolicy->isAddbaReqAccepted(addbaRequest)) {
159  EV_DETAIL << "Addba Request has been accepted. Creating a new Block Ack Agreement." << endl;
160  auto agreement = addAgreement(addbaRequest);
161  EV_DETAIL << "Agreement is added with the following parameters: " << *agreement << endl;
162  EV_DETAIL << "Building Addba Response" << endl;
163  auto addbaResponse = buildAddbaResponse(addbaRequest, blockAckAgreementPolicy);
164  auto addbaResponsePacket = new Packet("AddbaResponse", addbaResponse);
165  callback->processMgmtFrame(addbaResponsePacket, addbaResponse);
166  }
167 }

◆ processReceivedDelba()

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

Implements inet::ieee80211::IRecipientBlockAckAgreementHandler.

175 {
176  if (blockAckAgreementPolicy->isDelbaAccepted(delba))
177  terminateAgreement(delba->getReceiverAddress(), delba->getTid());
178 }

◆ processTransmittedAddbaResp()

void inet::ieee80211::RecipientBlockAckAgreementHandler::processTransmittedAddbaResp ( const Ptr< const Ieee80211AddbaResponse > &  addbaResp,
IBlockAckAgreementHandlerCallback callback 
)
overridevirtual

Implements inet::ieee80211::IRecipientBlockAckAgreementHandler.

150 {
151  updateAgreement(addbaResp);
152  scheduleInactivityTimer(callback);
153 }

◆ processTransmittedDelba()

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

Implements inet::ieee80211::IRecipientBlockAckAgreementHandler.

170 {
171  terminateAgreement(delba->getReceiverAddress(), delba->getTid());
172 }

◆ qosFrameReceived()

void inet::ieee80211::RecipientBlockAckAgreementHandler::qosFrameReceived ( const Ptr< const Ieee80211DataHeader > &  qosHeader,
IBlockAckAgreementHandlerCallback callback 
)
overridevirtual

Implements inet::ieee80211::IRecipientBlockAckAgreementHandler.

37 {
38  if (qosHeader->getAckPolicy() == AckPolicy::BLOCK_ACK) { // TODO + Implicit Block Ack
39  Tid tid = qosHeader->getTid();
40  MacAddress originatorAddr = qosHeader->getTransmitterAddress();
41  auto agreement = getAgreement(tid, originatorAddr);
42  if (agreement)
43  scheduleInactivityTimer(callback);
44  }
45 }

◆ scheduleInactivityTimer()

void inet::ieee80211::RecipientBlockAckAgreementHandler::scheduleInactivityTimer ( IBlockAckAgreementHandlerCallback callback)
protectedvirtual
26 {
27  simtime_t earliestExpirationTime = computeEarliestExpirationTime();
28  if (earliestExpirationTime != SIMTIME_MAX)
29  callback->scheduleInactivityTimer(earliestExpirationTime);
30 }

Referenced by blockAckAgreementExpired(), processTransmittedAddbaResp(), and qosFrameReceived().

◆ terminateAgreement()

void inet::ieee80211::RecipientBlockAckAgreementHandler::terminateAgreement ( MacAddress  originatorAddr,
Tid  tid 
)
protectedvirtual
132 {
133  auto agreementId = std::make_pair(originatorAddr, tid);
134  auto it = blockAckAgreements.find(agreementId);
135  if (it != blockAckAgreements.end()) {
136  RecipientBlockAckAgreement *agreement = it->second;
137  blockAckAgreements.erase(it);
138  delete agreement;
139  }
140 }

Referenced by processReceivedDelba(), and processTransmittedDelba().

◆ updateAgreement()

void inet::ieee80211::RecipientBlockAckAgreementHandler::updateAgreement ( const Ptr< const Ieee80211AddbaResponse > &  addbaResponse)
protectedvirtual
120 {
121  auto id = std::make_pair(addbaResponse->getReceiverAddress(), addbaResponse->getTid());
122  auto it = blockAckAgreements.find(id);
123  if (it != blockAckAgreements.end()) {
124  RecipientBlockAckAgreement *agreement = it->second;
125  agreement->addbaResposneSent();
126  }
127  else
128  throw cRuntimeError("Agreement is not found");
129 }

Referenced by processTransmittedAddbaResp().

Member Data Documentation

◆ blockAckAgreements

std::map<std::pair<MacAddress, Tid>, RecipientBlockAckAgreement *> inet::ieee80211::RecipientBlockAckAgreementHandler::blockAckAgreements
protected

The documentation for this class was generated from the following files:
inet::ieee80211::RecipientBlockAckAgreementHandler::addAgreement
virtual RecipientBlockAckAgreement * addAgreement(const Ptr< const Ieee80211AddbaRequest > &addbaReq)
Definition: RecipientBlockAckAgreementHandler.cc:74
inet::ieee80211::BLOCK_ACK
@ BLOCK_ACK
Definition: Ieee80211Frame_m.h:196
inet::sctp::min
double min(const double a, const double b)
Returns the minimum of a and b.
Definition: SctpAssociation.h:261
inet::ieee80211::RecipientBlockAckAgreementHandler::scheduleInactivityTimer
virtual void scheduleInactivityTimer(IBlockAckAgreementHandlerCallback *callback)
Definition: RecipientBlockAckAgreementHandler.cc:25
inet::ieee80211::RecipientBlockAckAgreementHandler::computeEarliestExpirationTime
virtual simtime_t computeEarliestExpirationTime()
Definition: RecipientBlockAckAgreementHandler.cc:15
inet::ieee80211::RecipientBlockAckAgreementHandler::buildDelba
virtual const Ptr< Ieee80211Delba > buildDelba(MacAddress receiverAddr, Tid tid, int reasonCode)
Definition: RecipientBlockAckAgreementHandler.cc:95
inet::ieee80211::RecipientBlockAckAgreementHandler::getAgreement
virtual RecipientBlockAckAgreement * getAgreement(Tid tid, MacAddress originatorAddr) override
Definition: RecipientBlockAckAgreementHandler.cc:142
inet::ieee80211::Tid
int8_t Tid
Definition: Ieee80211Defs.h:17
inet::ieee80211::RecipientBlockAckAgreementHandler::blockAckAgreements
std::map< std::pair< MacAddress, Tid >, RecipientBlockAckAgreement * > blockAckAgreements
Definition: RecipientBlockAckAgreementHandler.h:28
inet::ieee80211::RecipientBlockAckAgreementHandler::updateAgreement
virtual void updateAgreement(const Ptr< const Ieee80211AddbaResponse > &addbaResponse)
Definition: RecipientBlockAckAgreementHandler.cc:119
inet::ieee80211::RecipientBlockAckAgreementHandler::terminateAgreement
virtual void terminateAgreement(MacAddress originatorAddr, Tid tid)
Definition: RecipientBlockAckAgreementHandler.cc:131
inet::ieee80211::RecipientBlockAckAgreementHandler::buildAddbaResponse
virtual const Ptr< Ieee80211AddbaResponse > buildAddbaResponse(const Ptr< const Ieee80211AddbaRequest > &addbaRequest, IRecipientBlockAckAgreementPolicy *blockAckAgreementPolicy)
Definition: RecipientBlockAckAgreementHandler.cc:105