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

Implements IEEE 802.11 Hybrid Coordination Function. More...

#include <Hcf.h>

Inheritance diagram for inet::ieee80211::Hcf:
inet::ieee80211::ICoordinationFunction inet::ieee80211::IFrameSequenceHandler::ICallback inet::ieee80211::IChannelAccess::ICallback inet::ieee80211::ITx::ICallback inet::ieee80211::IProcedureCallback inet::ieee80211::IBlockAckAgreementHandlerCallback inet::ieee80211::ModeSetListener

Public Member Functions

virtual ~Hcf ()
 
virtual void processUpperFrame (Ieee80211DataOrMgmtFrame *frame) override
 
virtual void processLowerFrame (Ieee80211Frame *frame) override
 
virtual void corruptedFrameReceived () override
 
- Public Member Functions inherited from inet::ieee80211::ICoordinationFunction
virtual ~ICoordinationFunction ()
 
- Public Member Functions inherited from inet::ieee80211::IFrameSequenceHandler::ICallback
virtual ~ICallback ()
 
- Public Member Functions inherited from inet::ieee80211::IChannelAccess::ICallback
virtual ~ICallback ()
 
- Public Member Functions inherited from inet::ieee80211::ITx::ICallback
virtual ~ICallback ()
 
- Public Member Functions inherited from inet::ieee80211::IProcedureCallback
virtual ~IProcedureCallback ()
 
- Public Member Functions inherited from inet::ieee80211::IBlockAckAgreementHandlerCallback
virtual ~IBlockAckAgreementHandlerCallback ()
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void handleMessage (cMessage *msg) override
 
void startFrameSequence (AccessCategory ac)
 
void handleInternalCollision (std::vector< Edcaf * > internallyCollidedEdcafs)
 
void sendUp (const std::vector< Ieee80211Frame * > &completeFrames)
 
FrameSequenceContextbuildContext (AccessCategory ac)
 
virtual bool hasFrameToTransmit ()
 
virtual bool hasFrameToTransmit (AccessCategory ac)
 
virtual bool isReceptionInProgress ()
 
virtual void recipientProcessReceivedFrame (Ieee80211Frame *frame)
 
virtual void recipientProcessReceivedControlFrame (Ieee80211Frame *frame)
 
virtual void recipientProcessReceivedManagementFrame (Ieee80211ManagementFrame *frame)
 
virtual void recipientProcessTransmittedControlResponseFrame (Ieee80211Frame *frame)
 
virtual void originatorProcessTransmittedManagementFrame (Ieee80211ManagementFrame *mgmtFrame, AccessCategory ac)
 
virtual void originatorProcessTransmittedControlFrame (Ieee80211Frame *controlFrame, AccessCategory ac)
 
virtual void originatorProcessTransmittedDataFrame (Ieee80211DataFrame *dataFrame, AccessCategory ac)
 
virtual void originatorProcessReceivedManagementFrame (Ieee80211ManagementFrame *frame, Ieee80211Frame *lastTransmittedFrame, AccessCategory ac)
 
virtual void originatorProcessReceivedControlFrame (Ieee80211Frame *frame, Ieee80211Frame *lastTransmittedFrame, AccessCategory ac)
 
virtual void originatorProcessReceivedDataFrame (Ieee80211DataFrame *frame, Ieee80211Frame *lastTransmittedFrame, AccessCategory ac)
 
virtual void setFrameMode (Ieee80211Frame *frame, const IIeee80211Mode *mode) const
 
virtual bool isSentByUs (Ieee80211Frame *frame) const
 
virtual bool isForUs (Ieee80211Frame *frame) const
 
virtual void originatorProcessRtsProtectionFailed (Ieee80211DataOrMgmtFrame *protectedFrame) override
 
virtual void originatorProcessTransmittedFrame (Ieee80211Frame *transmittedFrame) override
 
virtual void originatorProcessReceivedFrame (Ieee80211Frame *frame, Ieee80211Frame *lastTransmittedFrame) override
 
virtual void originatorProcessFailedFrame (Ieee80211DataOrMgmtFrame *failedFrame) override
 
virtual void frameSequenceFinished () override
 
virtual void transmitFrame (Ieee80211Frame *frame, simtime_t ifs) override
 
virtual void scheduleStartRxTimer (simtime_t timeout) override
 
virtual void channelGranted (IChannelAccess *channelAccess) override
 
virtual void transmissionComplete (Ieee80211Frame *frame) override
 
virtual void transmitControlResponseFrame (Ieee80211Frame *responseFrame, Ieee80211Frame *receivedFrame) override
 
virtual void processMgmtFrame (Ieee80211ManagementFrame *mgmtFrame) override
 
virtual void scheduleInactivityTimer (simtime_t timeout) override
 
- Protected Member Functions inherited from inet::ieee80211::ModeSetListener
virtual void receiveSignal (cComponent *source, simsignal_t signalID, cObject *obj, cObject *details) override
 

Protected Attributes

Ieee80211Macmac = nullptr
 
IRateControldataAndMgmtRateControl = nullptr
 
int numEdcafs = -1
 
cMessage * startRxTimer = nullptr
 
cMessage * inactivityTimer = nullptr
 
IRxrx = nullptr
 
ITxtx = nullptr
 
IQoSRateSelectionrateSelection = nullptr
 
Edcaedca = nullptr
 
Hccahcca = nullptr
 
IOriginatorMacDataServiceoriginatorDataService = nullptr
 
IRecipientQoSMacDataServicerecipientDataService = nullptr
 
IRecipientAckProcedurerecipientAckProcedure = nullptr
 
IOriginatorQoSAckPolicyoriginatorAckPolicy = nullptr
 
IRecipientQoSAckPolicyrecipientAckPolicy = nullptr
 
IRtsProcedurertsProcedure = nullptr
 
IRtsPolicyrtsPolicy = nullptr
 
ICtsProcedurectsProcedure = nullptr
 
ICtsPolicyctsPolicy = nullptr
 
IOriginatorBlockAckProcedureoriginatorBlockAckProcedure = nullptr
 
IRecipientBlockAckProcedurerecipientBlockAckProcedure = nullptr
 
EdcaTransmitLifetimeHandlerlifetimeHandler = nullptr
 
std::vector< QoSRecoveryProcedure * > edcaDataRecoveryProcedures
 
NonQoSRecoveryProcedureedcaMgmtAndNonQoSRecoveryProcedure = nullptr
 
IOriginatorBlockAckAgreementHandleroriginatorBlockAckAgreementHandler = nullptr
 
IOriginatorBlockAckAgreementPolicyoriginatorBlockAckAgreementPolicy = nullptr
 
IRecipientBlockAckAgreementHandlerrecipientBlockAckAgreementHandler = nullptr
 
IRecipientBlockAckAgreementPolicyrecipientBlockAckAgreementPolicy = nullptr
 
std::vector< QoSAckHandler * > edcaAckHandlers
 
std::vector< TxopProcedure * > edcaTxops
 
TxopProcedurehccaTxop = nullptr
 
std::vector< PendingQueue * > edcaPendingQueues
 
PendingQueuehccaPendingQueue = nullptr
 
std::vector< InProgressFrames * > edcaInProgressFrames
 
InProgressFrameshccaInProgressFrame = nullptr
 
IFrameSequenceHandlerframeSequenceHandler = nullptr
 
std::vector< StationRetryCounters * > stationRetryCounters
 
SingleProtectionMechanismsingleProtectionMechanism = nullptr
 
- Protected Attributes inherited from inet::ieee80211::ModeSetListener
Ieee80211ModeSetmodeSet = nullptr
 

Detailed Description

Implements IEEE 802.11 Hybrid Coordination Function.

Constructor & Destructor Documentation

inet::ieee80211::Hcf::~Hcf ( )
virtual
683 {
684  cancelAndDelete(startRxTimer);
685  cancelAndDelete(inactivityTimer);
686  delete recipientAckProcedure;
687  delete ctsProcedure;
688  delete rtsProcedure;
693  delete frameSequenceHandler;
694  for (auto inProgressFrames : edcaInProgressFrames)
695  delete inProgressFrames;
696  for (auto pendingQueue : edcaPendingQueues)
697  delete pendingQueue;
698  for (auto ackHandler : edcaAckHandlers)
699  delete ackHandler;
700  for (auto retryCounter : stationRetryCounters)
701  delete retryCounter;
702 }
IRecipientAckProcedure * recipientAckProcedure
Definition: Hcf.h:85
IRecipientBlockAckAgreementHandler * recipientBlockAckAgreementHandler
Definition: Hcf.h:101
IRtsProcedure * rtsProcedure
Definition: Hcf.h:88
std::vector< InProgressFrames * > edcaInProgressFrames
Definition: Hcf.h:114
cMessage * inactivityTimer
Definition: Hcf.h:68
IRecipientBlockAckProcedure * recipientBlockAckProcedure
Definition: Hcf.h:93
IOriginatorBlockAckAgreementHandler * originatorBlockAckAgreementHandler
Definition: Hcf.h:99
std::vector< PendingQueue * > edcaPendingQueues
Definition: Hcf.h:112
std::vector< StationRetryCounters * > stationRetryCounters
Definition: Hcf.h:121
ICtsProcedure * ctsProcedure
Definition: Hcf.h:90
cMessage * startRxTimer
Definition: Hcf.h:67
IOriginatorBlockAckProcedure * originatorBlockAckProcedure
Definition: Hcf.h:92
std::vector< QoSAckHandler * > edcaAckHandlers
Definition: Hcf.h:105
IFrameSequenceHandler * frameSequenceHandler
Definition: Hcf.h:118

Member Function Documentation

FrameSequenceContext * inet::ieee80211::Hcf::buildContext ( AccessCategory  ac)
protected

Referenced by startFrameSequence().

186 {
188  return new FrameSequenceContext(mac->getAddress(), modeSet, edcaInProgressFrames[ac], rtsProcedure, rtsPolicy, nullptr, qosContext);
189 }
virtual const MACAddress & getAddress() const
Definition: Ieee80211Mac.h:102
IOriginatorQoSAckPolicy * originatorAckPolicy
Definition: Hcf.h:86
IRtsProcedure * rtsProcedure
Definition: Hcf.h:88
std::vector< InProgressFrames * > edcaInProgressFrames
Definition: Hcf.h:114
Ieee80211ModeSet * modeSet
Definition: ModeSetListener.h:31
IOriginatorBlockAckAgreementHandler * originatorBlockAckAgreementHandler
Definition: Hcf.h:99
IRtsPolicy * rtsPolicy
Definition: Hcf.h:89
std::vector< TxopProcedure * > edcaTxops
Definition: Hcf.h:108
Definition: FrameSequenceContext.h:63
Ieee80211Mac * mac
Definition: Hcf.h:63
Definition: FrameSequenceContext.h:37
IOriginatorBlockAckProcedure * originatorBlockAckProcedure
Definition: Hcf.h:92
void inet::ieee80211::Hcf::channelGranted ( IChannelAccess channelAccess)
overrideprotectedvirtual

Implements inet::ieee80211::IChannelAccess::ICallback.

168 {
169  auto edcaf = check_and_cast<Edcaf*>(channelAccess);
170  if (edcaf) {
171  AccessCategory ac = edcaf->getAccessCategory();
172  EV_DETAIL << "Channel access granted to the " << printAccessCategory(ac) << " queue" << std::endl;
173  edcaTxops[ac]->startTxop(ac);
174  auto internallyCollidedEdcafs = edca->getInternallyCollidedEdcafs();
175  if (internallyCollidedEdcafs.size() > 0) {
176  EV_INFO << "Internal collision happened with the following queues:" << std::endl;
177  handleInternalCollision(internallyCollidedEdcafs);
178  }
179  startFrameSequence(ac);
180  }
181  else
182  throw cRuntimeError("Channel access granted but channel owner not found!");
183 }
void startFrameSequence(AccessCategory ac)
Definition: Hcf.cc:191
Implements IEEE 802.11 Enhanced Distributed Channel Access Function.
Definition: Edcaf.h:37
void handleInternalCollision(std::vector< Edcaf * > internallyCollidedEdcafs)
Definition: Hcf.cc:196
std::vector< TxopProcedure * > edcaTxops
Definition: Hcf.h:108
Edca * edca
Definition: Hcf.h:77
virtual std::vector< Edcaf * > getInternallyCollidedEdcafs()
Definition: Edca.cc:61
AccessCategory
IEEE 802.11e QoS (EDCA) access categories.
Definition: AccessCategory.h:29
virtual AccessCategory getAccessCategory(const char *ac)
Definition: Edcaf.cc:93
void inet::ieee80211::Hcf::corruptedFrameReceived ( )
overridevirtual

Implements inet::ieee80211::ICoordinationFunction.

Referenced by inet::ieee80211::Ieee80211Mac::handleLowerPacket().

675 {
677  if (!startRxTimer->isScheduled())
679  }
680 }
cMessage * startRxTimer
Definition: Hcf.h:67
IFrameSequenceHandler * frameSequenceHandler
Definition: Hcf.h:118
void inet::ieee80211::Hcf::frameSequenceFinished ( )
overrideprotectedvirtual

Implements inet::ieee80211::IFrameSequenceHandler::ICallback.

239 {
240  auto edcaf = edca->getChannelOwner();
241  if (edcaf) {
242  bool startContention = hasFrameToTransmit(); // TODO: outstanding frame
243  edcaf->releaseChannel(this);
244  mac->sendDownPendingRadioConfigMsg(); // TODO: review
245  AccessCategory ac = edcaf->getAccessCategory();
246  edcaTxops[ac]->stopTxop();
247  if (startContention)
248  edcaf->requestChannel(this);
249  }
250  else if (hcca->isOwning()) {
251  hcca->releaseChannel(this);
252  mac->sendDownPendingRadioConfigMsg(); // TODO: review
253  throw cRuntimeError("Hcca is unimplemented!");
254  }
255  else
256  throw cRuntimeError("Frame sequence finished but channel owner not found!");
257 }
virtual void sendDownPendingRadioConfigMsg()
Definition: Ieee80211Mac.cc:223
virtual Edcaf * getChannelOwner()
Definition: Edca.cc:53
virtual void releaseChannel(IChannelAccess::ICallback *callback) override
Definition: Hcca.cc:40
Hcca * hcca
Definition: Hcf.h:78
std::vector< TxopProcedure * > edcaTxops
Definition: Hcf.h:108
Edca * edca
Definition: Hcf.h:77
Ieee80211Mac * mac
Definition: Hcf.h:63
virtual bool isOwning()
Definition: Hcca.cc:29
AccessCategory
IEEE 802.11e QoS (EDCA) access categories.
Definition: AccessCategory.h:29
virtual bool hasFrameToTransmit()
Definition: Hcf.cc:561
void inet::ieee80211::Hcf::handleInternalCollision ( std::vector< Edcaf * >  internallyCollidedEdcafs)
protected

Referenced by channelGranted().

197 {
198  for (auto edcaf : internallyCollidedEdcafs) {
199  AccessCategory ac = edcaf->getAccessCategory();
200  Ieee80211DataOrMgmtFrame *internallyCollidedFrame = edcaInProgressFrames[ac]->getFrameToTransmit();
201  EV_INFO << printAccessCategory(ac) << " (" << internallyCollidedFrame->getName() << ")" << endl;
202  bool retryLimitReached = false;
203  if (auto dataFrame = dynamic_cast<Ieee80211DataFrame *>(internallyCollidedFrame)) { // TODO: QoSDataFrame
204  edcaDataRecoveryProcedures[ac]->dataFrameTransmissionFailed(dataFrame);
205  retryLimitReached = edcaDataRecoveryProcedures[ac]->isRetryLimitReached(dataFrame);
206  }
207  else if (auto mgmtFrame = dynamic_cast<Ieee80211ManagementFrame*>(internallyCollidedFrame)) {
208  ASSERT(ac == AccessCategory::AC_BE);
210  retryLimitReached = edcaMgmtAndNonQoSRecoveryProcedure->isRetryLimitReached(mgmtFrame);
211  }
212  else // TODO: + NonQoSDataFrame
213  throw cRuntimeError("Unknown frame");
214  if (retryLimitReached) {
215  EV_DETAIL << "The frame has reached its retry limit. Dropping it" << std::endl;
216  emit(NF_LINK_BREAK, internallyCollidedFrame);
217  emit(NF_PACKET_DROP, internallyCollidedFrame);
218  if (auto dataFrame = dynamic_cast<Ieee80211DataFrame *>(internallyCollidedFrame))
219  edcaDataRecoveryProcedures[ac]->retryLimitReached(dataFrame);
220  else if (auto mgmtFrame = dynamic_cast<Ieee80211ManagementFrame*>(internallyCollidedFrame))
222  else ; // TODO: + NonQoSDataFrame
223  edcaInProgressFrames[ac]->dropFrame(internallyCollidedFrame);
224  if (hasFrameToTransmit(ac))
225  edcaf->requestChannel(this);
226  }
227  else
228  edcaf->requestChannel(this);
229  }
230 }
virtual bool isRetryLimitReached(Ieee80211DataOrMgmtFrame *failedFrame)
Definition: NonQoSRecoveryProcedure.cc:186
simsignal_t NF_LINK_BREAK
Definition: NotifierConsts.cc:43
Class generated from inet/linklayer/ieee80211/mac/Ieee80211Frame.msg:166 by nedtool.
Definition: Ieee80211Frame_m.h:438
virtual void retryLimitReached(Ieee80211DataOrMgmtFrame *frame)
Definition: NonQoSRecoveryProcedure.cc:135
virtual void dataOrMgmtFrameTransmissionFailed(Ieee80211DataOrMgmtFrame *failedFrame, StationRetryCounters *stationCounters)
Definition: NonQoSRecoveryProcedure.cc:159
std::vector< QoSRecoveryProcedure * > edcaDataRecoveryProcedures
Definition: Hcf.h:95
std::vector< InProgressFrames * > edcaInProgressFrames
Definition: Hcf.h:114
simsignal_t NF_PACKET_DROP
Definition: NotifierConsts.cc:33
std::vector< StationRetryCounters * > stationRetryCounters
Definition: Hcf.h:121
AccessCategory
IEEE 802.11e QoS (EDCA) access categories.
Definition: AccessCategory.h:29
NonQoSRecoveryProcedure * edcaMgmtAndNonQoSRecoveryProcedure
Definition: Hcf.h:96
Definition: AccessCategory.h:32
virtual bool hasFrameToTransmit()
Definition: Hcf.cc:561
void inet::ieee80211::Hcf::handleMessage ( cMessage *  msg)
overrideprotectedvirtual
78 {
79  if (msg == startRxTimer) {
80  if (!isReceptionInProgress())
82  }
83  else if (msg == inactivityTimer) {
87  }
88  else
89  throw cRuntimeError("Unknown event");
90  }
91  else
92  throw cRuntimeError("Unknown msg type");
93 }
IRecipientBlockAckAgreementHandler * recipientBlockAckAgreementHandler
Definition: Hcf.h:101
cMessage * inactivityTimer
Definition: Hcf.h:68
IOriginatorBlockAckAgreementHandler * originatorBlockAckAgreementHandler
Definition: Hcf.h:99
virtual bool isReceptionInProgress()
Definition: Hcf.cc:653
cMessage * startRxTimer
Definition: Hcf.h:67
virtual void blockAckAgreementExpired(IProcedureCallback *procedureCallback, IBlockAckAgreementHandlerCallback *agreementHandlerCallback)=0
virtual void blockAckAgreementExpired(IProcedureCallback *procedureCallback, IBlockAckAgreementHandlerCallback *agreementHandlerCallback)=0
IFrameSequenceHandler * frameSequenceHandler
Definition: Hcf.h:118
bool inet::ieee80211::Hcf::hasFrameToTransmit ( )
protectedvirtual

Referenced by frameSequenceFinished(), and handleInternalCollision().

562 {
563  auto edcaf = edca->getChannelOwner();
564  if (edcaf) {
565  AccessCategory ac = edcaf->getAccessCategory();
566  return !edcaPendingQueues[ac]->isEmpty() || edcaInProgressFrames[ac]->hasInProgressFrames();
567  }
568  else
569  throw cRuntimeError("Hcca is unimplemented");
570 }
virtual Edcaf * getChannelOwner()
Definition: Edca.cc:53
std::vector< InProgressFrames * > edcaInProgressFrames
Definition: Hcf.h:114
Edca * edca
Definition: Hcf.h:77
std::vector< PendingQueue * > edcaPendingQueues
Definition: Hcf.h:112
AccessCategory
IEEE 802.11e QoS (EDCA) access categories.
Definition: AccessCategory.h:29
virtual AccessCategory getAccessCategory(const char *ac)
Definition: Edcaf.cc:93
bool inet::ieee80211::Hcf::hasFrameToTransmit ( AccessCategory  ac)
protectedvirtual
551 {
552  auto edcaf = edca->getChannelOwner();
553  if (edcaf) {
554  AccessCategory ac = edcaf->getAccessCategory();
555  return !edcaPendingQueues[ac]->isEmpty() || edcaInProgressFrames[ac]->hasInProgressFrames();
556  }
557  else
558  throw cRuntimeError("Hcca is unimplemented");
559 }
virtual Edcaf * getChannelOwner()
Definition: Edca.cc:53
std::vector< InProgressFrames * > edcaInProgressFrames
Definition: Hcf.h:114
Edca * edca
Definition: Hcf.h:77
std::vector< PendingQueue * > edcaPendingQueues
Definition: Hcf.h:112
AccessCategory
IEEE 802.11e QoS (EDCA) access categories.
Definition: AccessCategory.h:29
virtual AccessCategory getAccessCategory(const char *ac)
Definition: Edcaf.cc:93
void inet::ieee80211::Hcf::initialize ( int  stage)
overrideprotectedvirtual

Reimplemented from inet::ieee80211::ModeSetListener.

33 {
35  if (stage == INITSTAGE_LOCAL) {
36  mac = check_and_cast<Ieee80211Mac *>(getContainingNicModule(this)->getSubmodule("mac"));
37  startRxTimer = new cMessage("startRxTimeout");
38  inactivityTimer = new cMessage("blockAckInactivityTimer");
39  numEdcafs = par("numEdcafs");
40  edca = check_and_cast<Edca *>(getSubmodule("edca"));
41  hcca = check_and_cast<Hcca *>(getSubmodule("hcca"));
42  tx = check_and_cast<ITx *>(getModuleByPath(par("txModule")));
43  rx = check_and_cast<IRx *>(getModuleByPath(par("rxModule")));
44  dataAndMgmtRateControl = dynamic_cast<IRateControl*>(getSubmodule("rateControl"));
45  originatorBlockAckAgreementPolicy = dynamic_cast<IOriginatorBlockAckAgreementPolicy*>(getSubmodule("originatorBlockAckAgreementPolicy"));
46  recipientBlockAckAgreementPolicy = dynamic_cast<IRecipientBlockAckAgreementPolicy*>(getSubmodule("recipientBlockAckAgreementPolicy"));
47  rateSelection = check_and_cast<IQoSRateSelection *>(getSubmodule("rateSelection"));
49  originatorDataService = check_and_cast<IOriginatorMacDataService *>(getSubmodule(("originatorMacDataService")));
50  recipientDataService = check_and_cast<IRecipientQoSMacDataService*>(getSubmodule("recipientMacDataService"));
51  originatorAckPolicy = check_and_cast<IOriginatorQoSAckPolicy*>(getSubmodule("originatorAckPolicy"));
52  recipientAckPolicy = check_and_cast<IRecipientQoSAckPolicy*>(getSubmodule("recipientAckPolicy"));
53  edcaMgmtAndNonQoSRecoveryProcedure = check_and_cast<NonQoSRecoveryProcedure *>(getSubmodule("edcaMgmtAndNonQoSRecoveryProcedure"));
54  singleProtectionMechanism = check_and_cast<SingleProtectionMechanism*>(getSubmodule("singleProtectionMechanism"));
55  rtsProcedure = new RtsProcedure();
56  rtsPolicy = check_and_cast<IRtsPolicy*>(getSubmodule("rtsPolicy"));
58  ctsProcedure = new CtsProcedure();
59  ctsPolicy = check_and_cast<ICtsPolicy*>(getSubmodule("ctsPolicy"));
65  }
66  for (int ac = 0; ac < numEdcafs; ac++) {
68  edcaDataRecoveryProcedures.push_back(check_and_cast<QoSRecoveryProcedure *>(getSubmodule("edcaDataRecoveryProcedures", ac)));
69  edcaAckHandlers.push_back(new QoSAckHandler());
71  edcaTxops.push_back(check_and_cast<TxopProcedure *>(getSubmodule("edcaTxopProcedures", ac)));
73  }
74  }
75 }
IRecipientQoSAckPolicy * recipientAckPolicy
Definition: Hcf.h:87
Definition: IRtsPolicy.h:26
Definition: QoSAckHandler.h:31
Definition: InProgressFrames.h:30
IRecipientAckProcedure * recipientAckProcedure
Definition: Hcf.h:85
Definition: RecipientBlockAckProcedure.h:29
Definition: OriginatorBlockAckAgreementHandler.h:30
Abstract interface for unconditionally transmitting a frame immediately or after waiting for a specif...
Definition: ITx.h:33
Implements IEEE 802.11 Hybrid coordination function (HCF) Controlled Channel Access.
Definition: Hcca.h:29
Definition: IOriginatorMacDataService.h:26
IRecipientBlockAckAgreementPolicy * recipientBlockAckAgreementPolicy
Definition: Hcf.h:102
Hcca * hcca
Definition: Hcf.h:78
IOriginatorBlockAckAgreementPolicy * originatorBlockAckAgreementPolicy
Definition: Hcf.h:100
Abstract interface for rate selection.
Definition: IQoSRateSelection.h:36
Implements IEEE 802.11 Enhanced Distributed Channel Access.
Definition: Edca.h:30
IRecipientBlockAckAgreementHandler * recipientBlockAckAgreementHandler
Definition: Hcf.h:101
Abstract interface for Rx processes.
Definition: IRx.h:45
IOriginatorQoSAckPolicy * originatorAckPolicy
Definition: Hcf.h:86
Definition: IOriginatorQoSAckPolicy.h:29
IRecipientQoSMacDataService * recipientDataService
Definition: Hcf.h:82
Definition: Ieee80211Queue.h:53
IRtsProcedure * rtsProcedure
Definition: Hcf.h:88
std::vector< QoSRecoveryProcedure * > edcaDataRecoveryProcedures
Definition: Hcf.h:95
std::vector< InProgressFrames * > edcaInProgressFrames
Definition: Hcf.h:114
Definition: SingleProtectionMechanism.h:37
int numEdcafs
Definition: Hcf.h:65
Implements the IEEE 802.11 MAC.
Definition: Ieee80211Mac.h:47
cMessage * inactivityTimer
Definition: Hcf.h:68
IRecipientBlockAckProcedure * recipientBlockAckProcedure
Definition: Hcf.h:93
IOriginatorBlockAckAgreementHandler * originatorBlockAckAgreementHandler
Definition: Hcf.h:99
IRtsPolicy * rtsPolicy
Definition: Hcf.h:89
IQoSRateSelection * rateSelection
Definition: Hcf.h:74
IOriginatorMacDataService * originatorDataService
Definition: Hcf.h:81
Definition: IRecipientQoSAckPolicy.h:28
std::vector< TxopProcedure * > edcaTxops
Definition: Hcf.h:108
IRateControl * dataAndMgmtRateControl
Definition: Hcf.h:64
Edca * edca
Definition: Hcf.h:77
Local initializations.
Definition: InitStages.h:35
Definition: IOriginatorBlockAckAgreementPolicy.h:28
Definition: NonQoSRecoveryProcedure.h:35
Definition: ICtsPolicy.h:26
std::vector< PendingQueue * > edcaPendingQueues
Definition: Hcf.h:112
Definition: OriginatorBlockAckProcedure.h:26
Ieee80211Mac * mac
Definition: Hcf.h:63
cModule * getContainingNicModule(cModule *from)
Find the nic module (inside the networkNode) containing the given module.
Definition: ModuleAccess.cc:96
std::vector< StationRetryCounters * > stationRetryCounters
Definition: Hcf.h:121
ICtsProcedure * ctsProcedure
Definition: Hcf.h:90
virtual void initialize(int stage) override
Definition: ModeSetListener.cc:25
Definition: RecipientBlockAckAgreementHandler.h:35
cMessage * startRxTimer
Definition: Hcf.h:67
Abstract interface for auto rate control algorithms.
Definition: IRateControl.h:35
Definition: RecipientAckProcedure.h:29
NonQoSRecoveryProcedure * edcaMgmtAndNonQoSRecoveryProcedure
Definition: Hcf.h:96
IOriginatorBlockAckProcedure * originatorBlockAckProcedure
Definition: Hcf.h:92
ICtsPolicy * ctsPolicy
Definition: Hcf.h:91
Definition: RtsProcedure.h:26
Definition: CtsProcedure.h:29
Definition: FrameSequenceHandler.h:28
Definition: StationRetryCounters.h:26
IRx * rx
Definition: Hcf.h:71
std::vector< QoSAckHandler * > edcaAckHandlers
Definition: Hcf.h:105
Definition: IRecipientQoSMacDataService.h:27
IFrameSequenceHandler * frameSequenceHandler
Definition: Hcf.h:118
ITx * tx
Definition: Hcf.h:72
Definition: IRecipientBlockAckAgreementPolicy.h:26
SingleProtectionMechanism * singleProtectionMechanism
Definition: Hcf.h:124
bool inet::ieee80211::Hcf::isForUs ( Ieee80211Frame frame) const
protectedvirtual

Referenced by processLowerFrame().

659 {
660  return frame->getReceiverAddress() == mac->getAddress() || (frame->getReceiverAddress().isMulticast() && !isSentByUs(frame));
661 }
virtual MACAddress & getReceiverAddress()
virtual const MACAddress & getAddress() const
Definition: Ieee80211Mac.h:102
bool isMulticast() const
Returns true if this is a multicast logical address (first byte&#39;s lsb is 1).
Definition: MACAddress.h:146
Ieee80211Mac * mac
Definition: Hcf.h:63
virtual bool isSentByUs(Ieee80211Frame *frame) const
Definition: Hcf.cc:663
bool inet::ieee80211::Hcf::isReceptionInProgress ( )
protectedvirtual

Referenced by handleMessage().

654 {
655  return rx->isReceptionInProgress();
656 }
virtual bool isReceptionInProgress() const =0
IRx * rx
Definition: Hcf.h:71
bool inet::ieee80211::Hcf::isSentByUs ( Ieee80211Frame frame) const
protectedvirtual

Referenced by isForUs().

664 {
665  // FIXME:
666  // Check the roles of the Addr3 field when aggregation is applied
667  // Table 8-19—Address field contents
668  if (auto dataOrMgmtFrame = dynamic_cast<Ieee80211DataOrMgmtFrame *>(frame))
669  return dataOrMgmtFrame->getAddress3() == mac->getAddress();
670  else
671  return false;
672 }
virtual const MACAddress & getAddress() const
Definition: Ieee80211Mac.h:102
Ieee80211Mac * mac
Definition: Hcf.h:63
virtual int inet::ieee80211::Hcf::numInitStages ( ) const
inlineoverrideprotectedvirtual

Reimplemented from inet::ieee80211::ModeSetListener.

127 { return NUM_INIT_STAGES; }
The number of initialization stages.
Definition: InitStages.h:116
void inet::ieee80211::Hcf::originatorProcessFailedFrame ( Ieee80211DataOrMgmtFrame failedFrame)
overrideprotectedvirtual

Implements inet::ieee80211::IFrameSequenceHandler::ICallback.

421 {
422  auto edcaf = edca->getChannelOwner();
423  if (edcaf) {
424  AccessCategory ac = edcaf->getAccessCategory();
425  bool retryLimitReached = false;
426  if (auto dataFrame = dynamic_cast<Ieee80211DataFrame *>(failedFrame)) {
427  EV_INFO << "Data frame transmission failed\n";
428  if (dataFrame->getAckPolicy() == NORMAL_ACK) {
429  edcaDataRecoveryProcedures[ac]->dataFrameTransmissionFailed(dataFrame);
430  retryLimitReached = edcaDataRecoveryProcedures[ac]->isRetryLimitReached(dataFrame);
432  int retryCount = edcaDataRecoveryProcedures[ac]->getRetryCount(dataFrame);
433  dataAndMgmtRateControl->frameTransmitted(dataFrame, retryCount, false, retryLimitReached);
434  }
435  }
436  else if (dataFrame->getAckPolicy() == BLOCK_ACK) {
437  // TODO:
438  // bool lifetimeExpired = lifetimeHandler->isLifetimeExpired(failedFrame);
439  // if (lifetimeExpired) {
440  // inProgressFrames->dropFrame(failedFrame);
441  // }
442  }
443  else
444  throw cRuntimeError("Unimplemented!");
445  }
446  else if (auto mgmtFrame = dynamic_cast<Ieee80211ManagementFrame*>(failedFrame)) { // TODO: + NonQoS frames
447  EV_INFO << "Management frame transmission failed\n";
449  retryLimitReached = edcaMgmtAndNonQoSRecoveryProcedure->isRetryLimitReached(mgmtFrame);
451  int retryCount = edcaMgmtAndNonQoSRecoveryProcedure->getRetryCount(mgmtFrame);
452  dataAndMgmtRateControl->frameTransmitted(mgmtFrame, retryCount, false, retryLimitReached);
453  }
454  }
455  else
456  throw cRuntimeError("Unknown frame"); // TODO: qos, nonqos
457  edcaAckHandlers[ac]->processFailedFrame(failedFrame);
458  if (retryLimitReached) {
459  if (auto dataFrame = dynamic_cast<Ieee80211DataFrame *>(failedFrame))
460  edcaDataRecoveryProcedures[ac]->retryLimitReached(dataFrame);
461  else if (auto mgmtFrame = dynamic_cast<Ieee80211ManagementFrame*>(failedFrame))
463  edcaInProgressFrames[ac]->dropFrame(failedFrame);
464  emit(NF_LINK_BREAK, failedFrame);
465  emit(NF_PACKET_DROP, failedFrame);
466  }
467  else
468  failedFrame->setRetry(true);
469  }
470  else
471  throw cRuntimeError("Hcca is unimplemented!");
472 }
virtual bool isRetryLimitReached(Ieee80211DataOrMgmtFrame *failedFrame)
Definition: NonQoSRecoveryProcedure.cc:186
simsignal_t NF_LINK_BREAK
Definition: NotifierConsts.cc:43
virtual Edcaf * getChannelOwner()
Definition: Edca.cc:53
virtual int getRetryCount(Ieee80211DataOrMgmtFrame *frame)
Definition: NonQoSRecoveryProcedure.cc:195
virtual void retryLimitReached(Ieee80211DataOrMgmtFrame *frame)
Definition: NonQoSRecoveryProcedure.cc:135
Definition: Ieee80211Frame_m.h:142
virtual void dataOrMgmtFrameTransmissionFailed(Ieee80211DataOrMgmtFrame *failedFrame, StationRetryCounters *stationCounters)
Definition: NonQoSRecoveryProcedure.cc:159
Definition: Ieee80211Frame_m.h:139
std::vector< QoSRecoveryProcedure * > edcaDataRecoveryProcedures
Definition: Hcf.h:95
virtual void frameTransmitted(const Ieee80211Frame *frame, int retryCount, bool isSuccessful, bool isGivenUp)=0
std::vector< InProgressFrames * > edcaInProgressFrames
Definition: Hcf.h:114
IRateControl * dataAndMgmtRateControl
Definition: Hcf.h:64
Edca * edca
Definition: Hcf.h:77
simsignal_t NF_PACKET_DROP
Definition: NotifierConsts.cc:33
std::vector< StationRetryCounters * > stationRetryCounters
Definition: Hcf.h:121
AccessCategory
IEEE 802.11e QoS (EDCA) access categories.
Definition: AccessCategory.h:29
NonQoSRecoveryProcedure * edcaMgmtAndNonQoSRecoveryProcedure
Definition: Hcf.h:96
virtual AccessCategory getAccessCategory(const char *ac)
Definition: Edcaf.cc:93
std::vector< QoSAckHandler * > edcaAckHandlers
Definition: Hcf.h:105
virtual void setRetry(bool retry)
void inet::ieee80211::Hcf::originatorProcessReceivedControlFrame ( Ieee80211Frame frame,
Ieee80211Frame lastTransmittedFrame,
AccessCategory  ac 
)
protectedvirtual

Referenced by originatorProcessReceivedFrame().

496 {
497  if (auto ackFrame = dynamic_cast<Ieee80211ACKFrame *>(frame)) {
498  if (auto dataFrame = dynamic_cast<Ieee80211DataFrame *>(lastTransmittedFrame)) {
500  int retryCount;
501  if (dataFrame->getRetry())
502  retryCount = edcaDataRecoveryProcedures[ac]->getRetryCount(dataFrame);
503  else
504  retryCount = 0;
505  edcaDataRecoveryProcedures[ac]->ackFrameReceived(dataFrame);
506  dataAndMgmtRateControl->frameTransmitted(dataFrame, retryCount, true, false);
507  }
508  }
509  else if (auto mgmtFrame = dynamic_cast<Ieee80211ManagementFrame *>(lastTransmittedFrame)) {
511  int retryCount = edcaMgmtAndNonQoSRecoveryProcedure->getRetryCount(dataFrame);
512  dataAndMgmtRateControl->frameTransmitted(mgmtFrame, retryCount, true, false);
513  }
515  }
516  else
517  throw cRuntimeError("Unknown frame"); // TODO: qos, nonqos frame
518  edcaAckHandlers[ac]->processReceivedAck(ackFrame, check_and_cast<Ieee80211DataOrMgmtFrame*>(lastTransmittedFrame));
519  edcaInProgressFrames[ac]->dropFrame(check_and_cast<Ieee80211DataOrMgmtFrame*>(lastTransmittedFrame));
520  }
521  else if (auto blockAck = dynamic_cast<Ieee80211BasicBlockAck *>(frame)) {
522  EV_INFO << "BasicBlockAck has arrived" << std::endl;
523  edcaDataRecoveryProcedures[ac]->blockAckFrameReceived();
524  auto ackedSeqAndFragNums = edcaAckHandlers[ac]->processReceivedBlockAck(blockAck);
527  EV_INFO << "It has acknowledged the following frames:" << std::endl;
528  // FIXME
529 // for (auto seqCtrlField : ackedSeqAndFragNums)
530 // EV_INFO << "Fragment number = " << seqCtrlField.getSequenceNumber() << " Sequence number = " << (int)seqCtrlField.getFragmentNumber() << std::endl;
531  edcaInProgressFrames[ac]->dropFrames(ackedSeqAndFragNums);
532  }
533  else if (dynamic_cast<Ieee80211RTSFrame*>(frame))
534  ; // void
535  else if (dynamic_cast<Ieee80211CTSFrame*>(frame))
536  edcaDataRecoveryProcedures[ac]->ctsFrameReceived();
537  else if (frame->getType() == ST_DATA_WITH_QOS)
538  ; // void
539  else if (dynamic_cast<Ieee80211BasicBlockAckReq*>(frame))
540  ; // void
541  else
542  throw cRuntimeError("Unknown control frame");
543 }
virtual int getRetryCount(Ieee80211DataOrMgmtFrame *frame)
Definition: NonQoSRecoveryProcedure.cc:195
virtual short getType() const
virtual void ackFrameReceived(Ieee80211DataOrMgmtFrame *ackedFrame, StationRetryCounters *stationCounters)
Definition: NonQoSRecoveryProcedure.cc:108
Definition: Ieee80211Frame_m.h:117
std::vector< QoSRecoveryProcedure * > edcaDataRecoveryProcedures
Definition: Hcf.h:95
virtual void frameTransmitted(const Ieee80211Frame *frame, int retryCount, bool isSuccessful, bool isGivenUp)=0
std::vector< InProgressFrames * > edcaInProgressFrames
Definition: Hcf.h:114
IOriginatorBlockAckAgreementHandler * originatorBlockAckAgreementHandler
Definition: Hcf.h:99
IRateControl * dataAndMgmtRateControl
Definition: Hcf.h:64
virtual void processReceivedBlockAck(Ieee80211BlockAck *blockAck, IBlockAckAgreementHandlerCallback *callback)=0
std::vector< StationRetryCounters * > stationRetryCounters
Definition: Hcf.h:121
NonQoSRecoveryProcedure * edcaMgmtAndNonQoSRecoveryProcedure
Definition: Hcf.h:96
std::vector< QoSAckHandler * > edcaAckHandlers
Definition: Hcf.h:105
void inet::ieee80211::Hcf::originatorProcessReceivedDataFrame ( Ieee80211DataFrame frame,
Ieee80211Frame lastTransmittedFrame,
AccessCategory  ac 
)
protectedvirtual

Referenced by originatorProcessReceivedFrame().

546 {
547  throw cRuntimeError("Unknown data frame");
548 }
void inet::ieee80211::Hcf::originatorProcessReceivedFrame ( Ieee80211Frame frame,
Ieee80211Frame lastTransmittedFrame 
)
overrideprotectedvirtual

Implements inet::ieee80211::IFrameSequenceHandler::ICallback.

475 {
476  auto edcaf = edca->getChannelOwner();
477  if (edcaf) {
478  AccessCategory ac = edcaf->getAccessCategory();
479  if (auto dataFrame = dynamic_cast<Ieee80211DataFrame*>(frame))
480  originatorProcessReceivedDataFrame(dataFrame, lastTransmittedFrame, ac);
481  else if (auto mgmtFrame = dynamic_cast<Ieee80211ManagementFrame *>(frame))
482  originatorProcessReceivedManagementFrame(mgmtFrame, lastTransmittedFrame, ac);
483  else
484  originatorProcessReceivedControlFrame(frame, lastTransmittedFrame, ac);
485  }
486  else
487  throw cRuntimeError("Hcca is unimplemented!");
488 }
virtual Edcaf * getChannelOwner()
Definition: Edca.cc:53
virtual void originatorProcessReceivedDataFrame(Ieee80211DataFrame *frame, Ieee80211Frame *lastTransmittedFrame, AccessCategory ac)
Definition: Hcf.cc:545
Edca * edca
Definition: Hcf.h:77
AccessCategory
IEEE 802.11e QoS (EDCA) access categories.
Definition: AccessCategory.h:29
virtual void originatorProcessReceivedManagementFrame(Ieee80211ManagementFrame *frame, Ieee80211Frame *lastTransmittedFrame, AccessCategory ac)
Definition: Hcf.cc:490
virtual AccessCategory getAccessCategory(const char *ac)
Definition: Edcaf.cc:93
virtual void originatorProcessReceivedControlFrame(Ieee80211Frame *frame, Ieee80211Frame *lastTransmittedFrame, AccessCategory ac)
Definition: Hcf.cc:495
void inet::ieee80211::Hcf::originatorProcessReceivedManagementFrame ( Ieee80211ManagementFrame frame,
Ieee80211Frame lastTransmittedFrame,
AccessCategory  ac 
)
protectedvirtual

Referenced by originatorProcessReceivedFrame().

491 {
492  throw cRuntimeError("Unknown management frame");
493 }
void inet::ieee80211::Hcf::originatorProcessRtsProtectionFailed ( Ieee80211DataOrMgmtFrame protectedFrame)
overrideprotectedvirtual

Implements inet::ieee80211::IFrameSequenceHandler::ICallback.

328 {
329  auto edcaf = edca->getChannelOwner();
330  if (edcaf) {
331  EV_INFO << "RTS frame transmission failed\n";
332  AccessCategory ac = edcaf->getAccessCategory();
333  bool retryLimitReached = false;
334  if (auto dataFrame = dynamic_cast<Ieee80211DataFrame *>(protectedFrame)) {
335  edcaDataRecoveryProcedures[ac]->rtsFrameTransmissionFailed(dataFrame);
336  retryLimitReached = edcaDataRecoveryProcedures[ac]->isRtsFrameRetryLimitReached(dataFrame);
337  }
338  else if (auto mgmtFrame = dynamic_cast<Ieee80211ManagementFrame *>(protectedFrame)) {
340  retryLimitReached = edcaMgmtAndNonQoSRecoveryProcedure->isRtsFrameRetryLimitReached(dataFrame);
341  }
342  else
343  throw cRuntimeError("Unknown frame"); // TODO: QoSDataFrame, NonQoSDataFrame
344  if (retryLimitReached) {
345  if (auto dataFrame = dynamic_cast<Ieee80211DataFrame *>(protectedFrame))
346  edcaDataRecoveryProcedures[ac]->retryLimitReached(dataFrame);
347  else if (auto mgmtFrame = dynamic_cast<Ieee80211ManagementFrame*>(protectedFrame))
349  else ; // TODO: nonqos data
350  edcaInProgressFrames[ac]->dropFrame(protectedFrame);
351  emit(NF_LINK_BREAK, protectedFrame);
352  emit(NF_PACKET_DROP, protectedFrame);
353  }
354  }
355  else
356  throw cRuntimeError("Hcca is unimplemented!");
357 }
virtual void rtsFrameTransmissionFailed(Ieee80211DataOrMgmtFrame *protectedFrame, StationRetryCounters *stationCounters)
Definition: NonQoSRecoveryProcedure.cc:174
simsignal_t NF_LINK_BREAK
Definition: NotifierConsts.cc:43
virtual Edcaf * getChannelOwner()
Definition: Edca.cc:53
virtual void retryLimitReached(Ieee80211DataOrMgmtFrame *frame)
Definition: NonQoSRecoveryProcedure.cc:135
virtual bool isRtsFrameRetryLimitReached(Ieee80211DataOrMgmtFrame *protectedFrame)
Definition: NonQoSRecoveryProcedure.cc:219
std::vector< QoSRecoveryProcedure * > edcaDataRecoveryProcedures
Definition: Hcf.h:95
std::vector< InProgressFrames * > edcaInProgressFrames
Definition: Hcf.h:114
Edca * edca
Definition: Hcf.h:77
simsignal_t NF_PACKET_DROP
Definition: NotifierConsts.cc:33
std::vector< StationRetryCounters * > stationRetryCounters
Definition: Hcf.h:121
AccessCategory
IEEE 802.11e QoS (EDCA) access categories.
Definition: AccessCategory.h:29
NonQoSRecoveryProcedure * edcaMgmtAndNonQoSRecoveryProcedure
Definition: Hcf.h:96
virtual AccessCategory getAccessCategory(const char *ac)
Definition: Edcaf.cc:93
void inet::ieee80211::Hcf::originatorProcessTransmittedControlFrame ( Ieee80211Frame controlFrame,
AccessCategory  ac 
)
protectedvirtual

Referenced by originatorProcessTransmittedFrame().

411 {
412  if (auto blockAckReq = dynamic_cast<Ieee80211BlockAckReq*>(controlFrame))
413  edcaAckHandlers[ac]->processTransmittedBlockAckReq(blockAckReq);
414  else if (auto rtsFrame = dynamic_cast<Ieee80211RTSFrame*>(controlFrame))
416  else
417  throw cRuntimeError("Unknown control frame");
418 }
IRtsProcedure * rtsProcedure
Definition: Hcf.h:88
std::vector< QoSAckHandler * > edcaAckHandlers
Definition: Hcf.h:105
virtual void processTransmittedRts(Ieee80211RTSFrame *rtsFrame)=0
void inet::ieee80211::Hcf::originatorProcessTransmittedDataFrame ( Ieee80211DataFrame dataFrame,
AccessCategory  ac 
)
protectedvirtual

Referenced by originatorProcessTransmittedFrame().

383 {
384  edcaAckHandlers[ac]->processTransmittedDataOrMgmtFrame(dataFrame);
387  if (dataFrame->getAckPolicy() == NO_ACK)
388  edcaInProgressFrames[ac]->dropFrame(dataFrame);
389 }
Definition: Ieee80211Frame_m.h:140
IOriginatorBlockAckAgreementPolicy * originatorBlockAckAgreementPolicy
Definition: Hcf.h:100
std::vector< InProgressFrames * > edcaInProgressFrames
Definition: Hcf.h:114
virtual void processTransmittedDataFrame(Ieee80211DataFrame *dataFrame, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy, IProcedureCallback *callback)=0
IOriginatorBlockAckAgreementHandler * originatorBlockAckAgreementHandler
Definition: Hcf.h:99
std::vector< QoSAckHandler * > edcaAckHandlers
Definition: Hcf.h:105
virtual int getAckPolicy() const
void inet::ieee80211::Hcf::originatorProcessTransmittedFrame ( Ieee80211Frame transmittedFrame)
overrideprotectedvirtual

Implements inet::ieee80211::IFrameSequenceHandler::ICallback.

360 {
361  auto edcaf = edca->getChannelOwner();
362  if (edcaf) {
363  AccessCategory ac = edcaf->getAccessCategory();
364  if (transmittedFrame->getReceiverAddress().isMulticast()) {
365  edcaDataRecoveryProcedures[ac]->multicastFrameTransmitted();
366  if (auto transmittedDataOrMgmtFrame = dynamic_cast<Ieee80211DataOrMgmtFrame*>(transmittedFrame))
367  edcaInProgressFrames[ac]->dropFrame(transmittedDataOrMgmtFrame);
368  }
369  else if (auto dataFrame = dynamic_cast<Ieee80211DataFrame*>(transmittedFrame))
371  else if (auto mgmtFrame = dynamic_cast<Ieee80211ManagementFrame*>(transmittedFrame))
373  else // TODO: Ieee80211ControlFrame
374  originatorProcessTransmittedControlFrame(transmittedFrame, ac);
375  }
376  else if (hcca->isOwning())
377  throw cRuntimeError("Hcca is unimplemented");
378  else
379  throw cRuntimeError("Frame transmitted but channel owner not found");
380 }
virtual MACAddress & getReceiverAddress()
virtual Edcaf * getChannelOwner()
Definition: Edca.cc:53
Hcca * hcca
Definition: Hcf.h:78
virtual void originatorProcessTransmittedManagementFrame(Ieee80211ManagementFrame *mgmtFrame, AccessCategory ac)
Definition: Hcf.cc:391
virtual void originatorProcessTransmittedControlFrame(Ieee80211Frame *controlFrame, AccessCategory ac)
Definition: Hcf.cc:410
std::vector< QoSRecoveryProcedure * > edcaDataRecoveryProcedures
Definition: Hcf.h:95
std::vector< InProgressFrames * > edcaInProgressFrames
Definition: Hcf.h:114
Edca * edca
Definition: Hcf.h:77
bool isMulticast() const
Returns true if this is a multicast logical address (first byte&#39;s lsb is 1).
Definition: MACAddress.h:146
virtual bool isOwning()
Definition: Hcca.cc:29
AccessCategory
IEEE 802.11e QoS (EDCA) access categories.
Definition: AccessCategory.h:29
virtual AccessCategory getAccessCategory(const char *ac)
Definition: Edcaf.cc:93
virtual void originatorProcessTransmittedDataFrame(Ieee80211DataFrame *dataFrame, AccessCategory ac)
Definition: Hcf.cc:382
void inet::ieee80211::Hcf::originatorProcessTransmittedManagementFrame ( Ieee80211ManagementFrame mgmtFrame,
AccessCategory  ac 
)
protectedvirtual

Referenced by originatorProcessTransmittedFrame().

392 {
393  if (originatorAckPolicy->isAckNeeded(mgmtFrame))
394  edcaAckHandlers[ac]->processTransmittedDataOrMgmtFrame(mgmtFrame);
395  if (auto addbaReq = dynamic_cast<Ieee80211AddbaRequest*>(mgmtFrame)) {
398  }
399  else if (auto addbaResp = dynamic_cast<Ieee80211AddbaResponse*>(mgmtFrame))
401  else if (auto delba = dynamic_cast<Ieee80211Delba *>(mgmtFrame)) {
402  if (delba->getInitiator())
404  else
406  }
407  else ; // TODO: other mgmt frames if needed
408 }
virtual bool isAckNeeded(Ieee80211ManagementFrame *frame) const =0
IRecipientBlockAckAgreementHandler * recipientBlockAckAgreementHandler
Definition: Hcf.h:101
IOriginatorQoSAckPolicy * originatorAckPolicy
Definition: Hcf.h:86
virtual void processTransmittedDelba(Ieee80211Delba *delba)=0
virtual void processTransmittedDelba(Ieee80211Delba *delba)=0
IOriginatorBlockAckAgreementHandler * originatorBlockAckAgreementHandler
Definition: Hcf.h:99
virtual void processTransmittedAddbaReq(Ieee80211AddbaRequest *addbaReq)=0
std::vector< QoSAckHandler * > edcaAckHandlers
Definition: Hcf.h:105
virtual void processTransmittedAddbaResp(Ieee80211AddbaResponse *addbaResp, IBlockAckAgreementHandlerCallback *callback)=0
void inet::ieee80211::Hcf::processLowerFrame ( Ieee80211Frame frame)
overridevirtual

Implements inet::ieee80211::ICoordinationFunction.

Referenced by inet::ieee80211::Ieee80211Mac::processLowerFrame().

144 {
145  Enter_Method_Silent();
146  auto edcaf = edca->getChannelOwner();
147  if (edcaf && frameSequenceHandler->isSequenceRunning()) {
148  // TODO: always call processResponse?
149  if ((!isForUs(frame) && !startRxTimer->isScheduled()) || isForUs(frame))
151  else {
152  EV_INFO << "This frame is not for us" << std::endl;
153  delete frame;
154  }
155  cancelEvent(startRxTimer);
156  }
157  else if (hcca->isOwning())
158  throw cRuntimeError("Hcca is unimplemented!");
159  else if (isForUs(frame))
161  else {
162  EV_INFO << "This frame is not for us" << std::endl;
163  delete frame;
164  }
165 }
virtual Edcaf * getChannelOwner()
Definition: Edca.cc:53
Hcca * hcca
Definition: Hcf.h:78
Edca * edca
Definition: Hcf.h:77
virtual bool isOwning()
Definition: Hcca.cc:29
cMessage * startRxTimer
Definition: Hcf.h:67
virtual bool isForUs(Ieee80211Frame *frame) const
Definition: Hcf.cc:658
virtual void recipientProcessReceivedFrame(Ieee80211Frame *frame)
Definition: Hcf.cc:259
virtual void processResponse(Ieee80211Frame *frame)=0
IFrameSequenceHandler * frameSequenceHandler
Definition: Hcf.h:118
void inet::ieee80211::Hcf::processMgmtFrame ( Ieee80211ManagementFrame mgmtFrame)
overrideprotectedvirtual

Implements inet::ieee80211::IProcedureCallback.

639 {
640  processUpperFrame(mgmtFrame);
641 }
virtual void processUpperFrame(Ieee80211DataOrMgmtFrame *frame) override
Definition: Hcf.cc:95
void inet::ieee80211::Hcf::processUpperFrame ( Ieee80211DataOrMgmtFrame frame)
overridevirtual

Implements inet::ieee80211::ICoordinationFunction.

Referenced by processMgmtFrame(), and inet::ieee80211::Ieee80211Mac::processUpperFrame().

96 {
97  Enter_Method("processUpperFrame(%s)", frame->getName());
98  EV_INFO << "Processing upper frame: " << frame->getName() << endl;
99  // TODO:
100  // A QoS STA should send individually addressed Management frames that are addressed to a non-QoS STA
101  // using the access category AC_BE and shall send all other management frames using the access category
102  // AC_VO. A QoS STA that does not send individually addressed Management frames that are addressed to a
103  // non-QoS STA using the access category AC_BE shall send them using the access category AC_VO.
104  // Management frames are exempted from any and all restrictions on transmissions arising from admission
105  // control procedures.
107  if (dynamic_cast<Ieee80211ManagementFrame *>(frame)) // TODO: + non-QoS frames
109  else if (auto dataFrame = dynamic_cast<Ieee80211DataFrame *>(frame))
110  ac = edca->classifyFrame(dataFrame);
111  else
112  throw cRuntimeError("Unknown message type");
113  EV_INFO << "The upper frame has been classified as a " << printAccessCategory(ac) << " frame." << endl;
114  if (edcaPendingQueues[ac]->insert(frame)) {
115  EV_INFO << "Frame " << frame->getName() << " has been inserted into the PendingQueue." << endl;
116  auto edcaf = edca->getChannelOwner();
117  if (edcaf == nullptr || edcaf->getAccessCategory() != ac) {
118  EV_DETAIL << "Requesting channel for access category " << printAccessCategory(ac) << endl;
119  edca->requestChannelAccess(ac, this);
120  }
121  }
122  else {
123  EV_INFO << "Frame " << frame->getName() << " has been dropped because the PendingQueue is full." << endl;
124  emit(NF_PACKET_DROP, frame);
125  delete frame;
126  }
127 }
void insert(std::vector< T > &v, int pos, const T &a)
Definition: stlutils.h:79
virtual Edcaf * getChannelOwner()
Definition: Edca.cc:53
virtual AccessCategory classifyFrame(Ieee80211DataFrame *frame)
Definition: Edca.cc:36
Edca * edca
Definition: Hcf.h:77
std::vector< PendingQueue * > edcaPendingQueues
Definition: Hcf.h:112
simsignal_t NF_PACKET_DROP
Definition: NotifierConsts.cc:33
virtual void requestChannelAccess(AccessCategory ac, IChannelAccess::ICallback *callback)
Definition: Edca.cc:70
AccessCategory
IEEE 802.11e QoS (EDCA) access categories.
Definition: AccessCategory.h:29
Definition: AccessCategory.h:34
void inet::ieee80211::Hcf::recipientProcessReceivedControlFrame ( Ieee80211Frame frame)
protectedvirtual

Referenced by recipientProcessReceivedFrame().

282 {
283  if (auto rtsFrame = dynamic_cast<Ieee80211RTSFrame *>(frame))
284  ctsProcedure->processReceivedRts(rtsFrame, ctsPolicy, this);
285  else if (auto blockAckRequest = dynamic_cast<Ieee80211BasicBlockAckReq*>(frame)) {
288  }
289  else if (dynamic_cast<Ieee80211ACKFrame*>(frame))
290  EV_WARN << "ACK frame received after timeout, ignoring it.\n"; // drop it, it is an ACK frame that is received after the ACKTimeout
291  else
292  throw cRuntimeError("Unknown control frame");
293 }
IRecipientQoSAckPolicy * recipientAckPolicy
Definition: Hcf.h:87
IRecipientBlockAckAgreementHandler * recipientBlockAckAgreementHandler
Definition: Hcf.h:101
IRecipientBlockAckProcedure * recipientBlockAckProcedure
Definition: Hcf.h:93
virtual void processReceivedBlockAckReq(Ieee80211BlockAckReq *blockAckReq, IRecipientQoSAckPolicy *ackPolicy, IRecipientBlockAckAgreementHandler *blockAckAgreementHandler, IProcedureCallback *callback)=0
virtual void processReceivedRts(Ieee80211RTSFrame *rtsFrame, ICtsPolicy *ctsPolicy, IProcedureCallback *callback)=0
ICtsProcedure * ctsProcedure
Definition: Hcf.h:90
ICtsPolicy * ctsPolicy
Definition: Hcf.h:91
void inet::ieee80211::Hcf::recipientProcessReceivedFrame ( Ieee80211Frame frame)
protectedvirtual

Referenced by processLowerFrame().

260 {
261  if (auto dataOrMgmtFrame = dynamic_cast<Ieee80211DataOrMgmtFrame *>(frame))
262  recipientAckProcedure->processReceivedFrame(dataOrMgmtFrame, check_and_cast<IRecipientAckPolicy*>(recipientAckPolicy), this);
263  if (auto dataFrame = dynamic_cast<Ieee80211DataFrame*>(frame)) {
264  if (dataFrame->getType() == ST_DATA_WITH_QOS && recipientBlockAckAgreementHandler)
267  }
268  else if (auto mgmtFrame = dynamic_cast<Ieee80211ManagementFrame*>(frame)) {
271  if (dynamic_cast<Ieee80211ActionFrame *>(mgmtFrame))
272  delete mgmtFrame;
273  }
274  else { // TODO: else if (auto ctrlFrame = dynamic_cast<Ieee80211ControlFrame*>(frame))
277  delete frame;
278  }
279 }
IRecipientQoSAckPolicy * recipientAckPolicy
Definition: Hcf.h:87
IRecipientAckProcedure * recipientAckProcedure
Definition: Hcf.h:85
virtual std::vector< Ieee80211Frame * > controlFrameReceived(Ieee80211Frame *controlFrame, IRecipientBlockAckAgreementHandler *blockAckAgreementHandler)=0
virtual void recipientProcessReceivedManagementFrame(Ieee80211ManagementFrame *frame)
Definition: Hcf.cc:295
IRecipientBlockAckAgreementHandler * recipientBlockAckAgreementHandler
Definition: Hcf.h:101
Definition: Ieee80211Frame_m.h:117
IRecipientQoSMacDataService * recipientDataService
Definition: Hcf.h:82
virtual void recipientProcessReceivedControlFrame(Ieee80211Frame *frame)
Definition: Hcf.cc:281
virtual std::vector< Ieee80211Frame * > managementFrameReceived(Ieee80211ManagementFrame *mgmtFrame)=0
void sendUp(const std::vector< Ieee80211Frame * > &completeFrames)
Definition: Hcf.cc:572
virtual std::vector< Ieee80211Frame * > dataFrameReceived(Ieee80211DataFrame *dataFrame, IRecipientBlockAckAgreementHandler *blockAckAgreementHandler)=0
virtual void processReceivedFrame(Ieee80211DataOrMgmtFrame *dataOrMgmtFrame, IRecipientAckPolicy *ackPolicy, IProcedureCallback *callback)=0
virtual void qosFrameReceived(Ieee80211DataFrame *qosFrame, IBlockAckAgreementHandlerCallback *callback)=0
void inet::ieee80211::Hcf::recipientProcessReceivedManagementFrame ( Ieee80211ManagementFrame frame)
protectedvirtual

Referenced by recipientProcessReceivedFrame().

296 {
298  if (auto addbaRequest = dynamic_cast<Ieee80211AddbaRequest *>(frame))
300  else if (auto addbaResp = dynamic_cast<Ieee80211AddbaResponse *>(frame))
302  else if (auto delba = dynamic_cast<Ieee80211Delba*>(frame)) {
303  if (delba->getInitiator())
305  else
307  }
308  else
309  ; // Beacon, etc
310  }
311  else
312  ; // Optional modules
313 }
virtual void processReceivedDelba(Ieee80211Delba *delba, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy)=0
virtual void processReceivedAddbaRequest(Ieee80211AddbaRequest *addbaRequest, IRecipientBlockAckAgreementPolicy *blockAckAgreementPolicy, IProcedureCallback *callback)=0
virtual void processReceivedDelba(Ieee80211Delba *delba, IRecipientBlockAckAgreementPolicy *blockAckAgreementPolicy)=0
IRecipientBlockAckAgreementPolicy * recipientBlockAckAgreementPolicy
Definition: Hcf.h:102
IOriginatorBlockAckAgreementPolicy * originatorBlockAckAgreementPolicy
Definition: Hcf.h:100
IRecipientBlockAckAgreementHandler * recipientBlockAckAgreementHandler
Definition: Hcf.h:101
virtual void processReceivedAddbaResp(Ieee80211AddbaResponse *addbaResp, IOriginatorBlockAckAgreementPolicy *blockAckAgreementPolicy, IBlockAckAgreementHandlerCallback *callback)=0
IOriginatorBlockAckAgreementHandler * originatorBlockAckAgreementHandler
Definition: Hcf.h:99
void inet::ieee80211::Hcf::recipientProcessTransmittedControlResponseFrame ( Ieee80211Frame frame)
protectedvirtual

Referenced by transmissionComplete().

624 {
625  if (auto ctsFrame = dynamic_cast<Ieee80211CTSFrame*>(frame))
627  else if (auto blockAck = dynamic_cast<Ieee80211BlockAck*>(frame)) {
630  }
631  else if (auto ackFrame = dynamic_cast<Ieee80211ACKFrame*>(frame))
633  else
634  throw cRuntimeError("Unknown control response frame");
635 }
IRecipientAckProcedure * recipientAckProcedure
Definition: Hcf.h:85
IRecipientBlockAckProcedure * recipientBlockAckProcedure
Definition: Hcf.h:93
ICtsProcedure * ctsProcedure
Definition: Hcf.h:90
virtual void processTransmittedCts(Ieee80211CTSFrame *ctsFrame)=0
virtual void processTransmittedBlockAck(Ieee80211BlockAck *blockAck)=0
virtual void processTransmittedAck(Ieee80211ACKFrame *ack)=0
void inet::ieee80211::Hcf::scheduleInactivityTimer ( simtime_t  timeout)
overrideprotectedvirtual

Implements inet::ieee80211::IBlockAckAgreementHandlerCallback.

136 {
137  Enter_Method_Silent();
138  if (inactivityTimer->isScheduled())
139  cancelEvent(inactivityTimer);
140  scheduleAt(simTime() + timeout, inactivityTimer);
141 }
cMessage * inactivityTimer
Definition: Hcf.h:68
void inet::ieee80211::Hcf::scheduleStartRxTimer ( simtime_t  timeout)
overrideprotectedvirtual

Implements inet::ieee80211::IFrameSequenceHandler::ICallback.

130 {
131  Enter_Method_Silent();
132  scheduleAt(simTime() + timeout, startRxTimer);
133 }
cMessage * startRxTimer
Definition: Hcf.h:67
void inet::ieee80211::Hcf::sendUp ( const std::vector< Ieee80211Frame * > &  completeFrames)
protected

Referenced by recipientProcessReceivedFrame().

573 {
574  for (auto frame : completeFrames) {
575  // FIXME: mgmt module does not handle addba req ..
576  if (!dynamic_cast<Ieee80211ActionFrame *>(frame))
577  mac->sendUp(frame);
578  }
579 }
virtual void sendUp(cMessage *message) override
Definition: Ieee80211Mac.cc:208
Ieee80211Mac * mac
Definition: Hcf.h:63
void inet::ieee80211::Hcf::setFrameMode ( Ieee80211Frame frame,
const IIeee80211Mode mode 
) const
protectedvirtual

Referenced by transmitControlResponseFrame(), and transmitFrame().

644  {
645  ASSERT(mode != nullptr);
646  delete frame->removeControlInfo();
648  ctrl->setMode(mode);
649  frame->setControlInfo(ctrl);
650 }
Class generated from inet/physicallayer/ieee80211/packetlevel/Ieee80211ControlInfo.msg:146 by nedtool.
Definition: Ieee80211ControlInfo_m.h:135
virtual void setMode(const IIeee80211ModePtr &mode)
void inet::ieee80211::Hcf::startFrameSequence ( AccessCategory  ac)
protected

Referenced by channelGranted().

192 {
194 }
virtual void startFrameSequence(IFrameSequence *frameSequence, FrameSequenceContext *context, ICallback *callback)=0
Definition: HcfFs.h:26
FrameSequenceContext * buildContext(AccessCategory ac)
Definition: Hcf.cc:185
IFrameSequenceHandler * frameSequenceHandler
Definition: Hcf.h:118
void inet::ieee80211::Hcf::transmissionComplete ( Ieee80211Frame frame)
overrideprotectedvirtual

Implements inet::ieee80211::ITx::ICallback.

316 {
317  auto edcaf = edca->getChannelOwner();
318  if (edcaf)
320  else if (hcca->isOwning())
321  throw cRuntimeError("Hcca is unimplemented!");
322  else
324  delete frame;
325 }
virtual Edcaf * getChannelOwner()
Definition: Edca.cc:53
Hcca * hcca
Definition: Hcf.h:78
Edca * edca
Definition: Hcf.h:77
virtual bool isOwning()
Definition: Hcca.cc:29
IFrameSequenceHandler * frameSequenceHandler
Definition: Hcf.h:118
virtual void recipientProcessTransmittedControlResponseFrame(Ieee80211Frame *frame)
Definition: Hcf.cc:623
void inet::ieee80211::Hcf::transmitControlResponseFrame ( Ieee80211Frame responseFrame,
Ieee80211Frame receivedFrame 
)
overrideprotectedvirtual

Implements inet::ieee80211::IProcedureCallback.

608 {
609  const IIeee80211Mode *responseMode = nullptr;
610  if (auto rtsFrame = dynamic_cast<Ieee80211RTSFrame*>(receivedFrame))
611  responseMode = rateSelection->computeResponseCtsFrameMode(rtsFrame);
612  else if (auto blockAckReq = dynamic_cast<Ieee80211BasicBlockAckReq*>(receivedFrame))
613  responseMode = rateSelection->computeResponseBlockAckFrameMode(blockAckReq);
614  else if (auto dataOrMgmtFrame = dynamic_cast<Ieee80211DataOrMgmtFrame*>(receivedFrame))
615  responseMode = rateSelection->computeResponseAckFrameMode(dataOrMgmtFrame);
616  else
617  throw cRuntimeError("Unknown received frame type");
618  setFrameMode(responseFrame, responseMode);
619  tx->transmitFrame(responseFrame, modeSet->getSifsTime(), this);
620  delete responseFrame;
621 }
virtual void setFrameMode(Ieee80211Frame *frame, const IIeee80211Mode *mode) const
Definition: Hcf.cc:643
virtual void transmitFrame(Ieee80211Frame *frame, ITx::ICallback *txCallback)=0
Ieee80211ModeSet * modeSet
Definition: ModeSetListener.h:31
virtual const IIeee80211Mode * computeResponseAckFrameMode(Ieee80211DataOrMgmtFrame *dataOrMgmtFrame)=0
IQoSRateSelection * rateSelection
Definition: Hcf.h:74
simtime_t getSifsTime() const
Definition: Ieee80211ModeSet.h:77
virtual const IIeee80211Mode * computeResponseCtsFrameMode(Ieee80211RTSFrame *rtsFrame)=0
Definition: IIeee80211Mode.h:54
ITx * tx
Definition: Hcf.h:72
virtual const IIeee80211Mode * computeResponseBlockAckFrameMode(Ieee80211BlockAckReq *blockAckReq)=0
void inet::ieee80211::Hcf::transmitFrame ( Ieee80211Frame frame,
simtime_t  ifs 
)
overrideprotectedvirtual

Implements inet::ieee80211::IFrameSequenceHandler::ICallback.

582 {
583  auto channelOwner = edca->getChannelOwner();
584  if (channelOwner) {
585  AccessCategory ac = channelOwner->getAccessCategory();
586  auto txop = edcaTxops[ac];
587  if (auto dataFrame = dynamic_cast<Ieee80211DataFrame*>(frame)) {
588  OriginatorBlockAckAgreement *agreement = nullptr;
590  agreement = originatorBlockAckAgreementHandler->getAgreement(dataFrame->getReceiverAddress(), dataFrame->getTid());
591  auto ackPolicy = originatorAckPolicy->computeAckPolicy(dataFrame, agreement);
592  dataFrame->setAckPolicy(ackPolicy);
593  }
594  setFrameMode(frame, rateSelection->computeMode(frame, txop));
595  if (txop->getProtectionMechanism() == TxopProcedure::ProtectionMechanism::SINGLE_PROTECTION)
597  else if (txop->getProtectionMechanism() == TxopProcedure::ProtectionMechanism::MULTIPLE_PROTECTION)
598  throw cRuntimeError("Multiple protection is unsupported");
599  else
600  throw cRuntimeError("Undefined protection mechanism");
601  tx->transmitFrame(frame, ifs, this);
602  }
603  else
604  throw cRuntimeError("Hcca is unimplemented");
605 }
IRecipientQoSAckPolicy * recipientAckPolicy
Definition: Hcf.h:87
virtual Edcaf * getChannelOwner()
Definition: Edca.cc:53
virtual simtime_t computeDurationField(Ieee80211Frame *frame, Ieee80211DataOrMgmtFrame *pendingFrame, TxopProcedure *txop, IRecipientQoSAckPolicy *ackPolicy)
Definition: SingleProtectionMechanism.cc:178
Definition: OriginatorBlockAckAgreement.h:28
virtual const IIeee80211Mode * computeMode(Ieee80211Frame *frame, TxopProcedure *txopProcedure)=0
virtual void setFrameMode(Ieee80211Frame *frame, const IIeee80211Mode *mode) const
Definition: Hcf.cc:643
IOriginatorQoSAckPolicy * originatorAckPolicy
Definition: Hcf.h:86
virtual void transmitFrame(Ieee80211Frame *frame, ITx::ICallback *txCallback)=0
std::vector< InProgressFrames * > edcaInProgressFrames
Definition: Hcf.h:114
IOriginatorBlockAckAgreementHandler * originatorBlockAckAgreementHandler
Definition: Hcf.h:99
IQoSRateSelection * rateSelection
Definition: Hcf.h:74
std::vector< TxopProcedure * > edcaTxops
Definition: Hcf.h:108
Edca * edca
Definition: Hcf.h:77
AccessCategory
IEEE 802.11e QoS (EDCA) access categories.
Definition: AccessCategory.h:29
virtual AckPolicy computeAckPolicy(Ieee80211DataFrame *frame, OriginatorBlockAckAgreement *agreement) const =0
virtual AccessCategory getAccessCategory(const char *ac)
Definition: Edcaf.cc:93
virtual OriginatorBlockAckAgreement * getAgreement(MACAddress receiverAddr, Tid tid)=0
virtual void setDuration(::omnetpp::simtime_t duration)
ITx * tx
Definition: Hcf.h:72
SingleProtectionMechanism * singleProtectionMechanism
Definition: Hcf.h:124

Member Data Documentation

ICtsPolicy* inet::ieee80211::Hcf::ctsPolicy = nullptr
protected
ICtsProcedure* inet::ieee80211::Hcf::ctsProcedure = nullptr
protected
IRateControl* inet::ieee80211::Hcf::dataAndMgmtRateControl = nullptr
protected
std::vector<PendingQueue *> inet::ieee80211::Hcf::edcaPendingQueues
protected
std::vector<TxopProcedure*> inet::ieee80211::Hcf::edcaTxops
protected
IFrameSequenceHandler* inet::ieee80211::Hcf::frameSequenceHandler = nullptr
protected
Hcca* inet::ieee80211::Hcf::hcca = nullptr
protected
InProgressFrames* inet::ieee80211::Hcf::hccaInProgressFrame = nullptr
protected
PendingQueue* inet::ieee80211::Hcf::hccaPendingQueue = nullptr
protected
TxopProcedure* inet::ieee80211::Hcf::hccaTxop = nullptr
protected
cMessage* inet::ieee80211::Hcf::inactivityTimer = nullptr
protected
EdcaTransmitLifetimeHandler* inet::ieee80211::Hcf::lifetimeHandler = nullptr
protected
Ieee80211Mac* inet::ieee80211::Hcf::mac = nullptr
protected
int inet::ieee80211::Hcf::numEdcafs = -1
protected

Referenced by initialize().

IOriginatorQoSAckPolicy* inet::ieee80211::Hcf::originatorAckPolicy = nullptr
protected
IOriginatorBlockAckAgreementPolicy* inet::ieee80211::Hcf::originatorBlockAckAgreementPolicy = nullptr
protected
IOriginatorBlockAckProcedure* inet::ieee80211::Hcf::originatorBlockAckProcedure = nullptr
protected

Referenced by buildContext(), initialize(), and ~Hcf().

IOriginatorMacDataService* inet::ieee80211::Hcf::originatorDataService = nullptr
protected

Referenced by initialize().

IQoSRateSelection* inet::ieee80211::Hcf::rateSelection = nullptr
protected
IRecipientQoSAckPolicy* inet::ieee80211::Hcf::recipientAckPolicy = nullptr
protected
IRecipientAckProcedure* inet::ieee80211::Hcf::recipientAckProcedure = nullptr
protected
IRecipientBlockAckAgreementPolicy* inet::ieee80211::Hcf::recipientBlockAckAgreementPolicy = nullptr
protected
IRecipientBlockAckProcedure* inet::ieee80211::Hcf::recipientBlockAckProcedure = nullptr
protected
IRecipientQoSMacDataService* inet::ieee80211::Hcf::recipientDataService = nullptr
protected
IRtsPolicy* inet::ieee80211::Hcf::rtsPolicy = nullptr
protected

Referenced by buildContext(), and initialize().

IRtsProcedure* inet::ieee80211::Hcf::rtsProcedure = nullptr
protected
IRx* inet::ieee80211::Hcf::rx = nullptr
protected
SingleProtectionMechanism* inet::ieee80211::Hcf::singleProtectionMechanism = nullptr
protected

Referenced by initialize(), and transmitFrame().

cMessage* inet::ieee80211::Hcf::startRxTimer = nullptr
protected
ITx* inet::ieee80211::Hcf::tx = nullptr
protected

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