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

Implements IEEE 802.11 Distributed Coordination Function. More...

#include <Dcf.h>

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

Public Member Functions

virtual ~Dcf ()
 
virtual void processUpperFrame (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &header) override
 
virtual void processLowerFrame (Packet *packet, const Ptr< const Ieee80211MacHeader > &header) 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 ()
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void forEachChild (cVisitor *v) override
 
virtual void handleMessage (cMessage *msg) override
 
virtual void updateDisplayString () const
 
virtual void sendUp (const std::vector< Packet * > &completeFrames)
 
virtual bool hasFrameToTransmit ()
 
virtual bool isReceptionInProgress ()
 
virtual FrameSequenceContextbuildContext ()
 
virtual void recipientProcessReceivedFrame (Packet *packet, const Ptr< const Ieee80211MacHeader > &header)
 
virtual void recipientProcessReceivedControlFrame (Packet *packet, const Ptr< const Ieee80211MacHeader > &header)
 
virtual void recipientProcessTransmittedControlResponseFrame (Packet *packet, const Ptr< const Ieee80211MacHeader > &header)
 
virtual void channelGranted (IChannelAccess *channelAccess) override
 
virtual void transmitFrame (Packet *packet, simtime_t ifs) override
 
virtual void originatorProcessRtsProtectionFailed (Packet *packet) override
 
virtual void originatorProcessTransmittedFrame (Packet *packet) override
 
virtual void originatorProcessReceivedFrame (Packet *packet, Packet *lastTransmittedPacket) override
 
virtual void originatorProcessFailedFrame (Packet *packet) override
 
virtual void frameSequenceFinished () override
 
virtual void scheduleStartRxTimer (simtime_t timeout) override
 
virtual void transmissionComplete (Packet *packet, const Ptr< const Ieee80211MacHeader > &header) override
 
virtual void transmitControlResponseFrame (Packet *responsePacket, const Ptr< const Ieee80211MacHeader > &responseHeader, Packet *receivedPacket, const Ptr< const Ieee80211MacHeader > &receivedHeader) override
 
virtual void processMgmtFrame (Packet *mgmtPacket, const Ptr< const Ieee80211MgmtHeader > &mgmtHeader) override
 
virtual bool isSentByUs (const Ptr< const Ieee80211MacHeader > &header) const
 
virtual bool isForUs (const Ptr< const Ieee80211MacHeader > &header) const
 
- 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
 
cMessage * startRxTimer = nullptr
 
IRxrx = nullptr
 
ITxtx = nullptr
 
IRateSelectionrateSelection = nullptr
 
DcafchannelAccess = nullptr
 
IOriginatorMacDataServiceoriginatorDataService = nullptr
 
IRecipientMacDataServicerecipientDataService = nullptr
 
AckHandlerackHandler = nullptr
 
IOriginatorAckPolicyoriginatorAckPolicy = nullptr
 
IRecipientAckProcedurerecipientAckProcedure = nullptr
 
IRecipientAckPolicyrecipientAckPolicy = nullptr
 
IRtsProcedurertsProcedure = nullptr
 
IRtsPolicyrtsPolicy = nullptr
 
ICtsProcedurectsProcedure = nullptr
 
ICtsPolicyctsPolicy = nullptr
 
NonQosRecoveryProcedurerecoveryProcedure = nullptr
 
ITransmitLifetimeHandlertransmitLifetimeHandler = nullptr
 
DcfReceiveLifetimeHandlerreceiveLifetimeHandler = nullptr
 
OriginatorProtectionMechanismoriginatorProtectionMechanism = nullptr
 
IFrameSequenceHandlerframeSequenceHandler = nullptr
 
StationRetryCountersstationRetryCounters = nullptr
 
- Protected Attributes inherited from inet::ieee80211::ModeSetListener
physicallayer::Ieee80211ModeSetmodeSet = nullptr
 

Detailed Description

Implements IEEE 802.11 Distributed Coordination Function.

Constructor & Destructor Documentation

◆ ~Dcf()

inet::ieee80211::Dcf::~Dcf ( )
virtual
397 {
398  cancelAndDelete(startRxTimer);
399  delete rtsProcedure;
400  delete recipientAckProcedure;
401  delete stationRetryCounters;
402  delete ctsProcedure;
403  delete frameSequenceHandler;
404 }

Member Function Documentation

◆ buildContext()

FrameSequenceContext * inet::ieee80211::Dcf::buildContext ( )
protectedvirtual
245 {
246  auto nonQoSContext = new NonQoSContext(originatorAckPolicy);
247  return new FrameSequenceContext(mac->getAddress(), modeSet, channelAccess->getInProgressFrames(), rtsProcedure, rtsPolicy, nonQoSContext, nullptr);
248 }

◆ channelGranted()

void inet::ieee80211::Dcf::channelGranted ( IChannelAccess channelAccess)
overrideprotectedvirtual

◆ corruptedFrameReceived()

void inet::ieee80211::Dcf::corruptedFrameReceived ( )
overridevirtual

Implements inet::ieee80211::ICoordinationFunction.

386 {
387  Enter_Method("corruptedFrameReceived");
388  if (frameSequenceHandler->isSequenceRunning() && !startRxTimer->isScheduled()) {
391  }
392  else
393  EV_DEBUG << "Ignoring received corrupt frame.\n";
394 }

◆ forEachChild()

void inet::ieee80211::Dcf::forEachChild ( cVisitor *  v)
overrideprotectedvirtual
52 {
53  cSimpleModule::forEachChild(v);
54  if (frameSequenceHandler != nullptr && frameSequenceHandler->getContext() != nullptr)
55  v->visit(const_cast<FrameSequenceContext *>(frameSequenceHandler->getContext()));
56 }

◆ frameSequenceFinished()

void inet::ieee80211::Dcf::frameSequenceFinished ( )
overrideprotectedvirtual

◆ handleMessage()

void inet::ieee80211::Dcf::handleMessage ( cMessage *  msg)
overrideprotectedvirtual
59 {
60  if (msg == startRxTimer) {
61  if (!isReceptionInProgress()) {
64  }
65  }
66  else
67  throw cRuntimeError("Unknown msg type");
68 }

◆ hasFrameToTransmit()

bool inet::ieee80211::Dcf::hasFrameToTransmit ( )
protectedvirtual

◆ initialize()

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

Reimplemented from inet::ieee80211::ModeSetListener.

24 {
26  if (stage == INITSTAGE_LINK_LAYER) {
27  startRxTimer = new cMessage("startRxTimeout");
28  mac = check_and_cast<Ieee80211Mac *>(getContainingNicModule(this)->getSubmodule("mac"));
29  dataAndMgmtRateControl = dynamic_cast<IRateControl *>(getSubmodule(("rateControl")));
30  tx = check_and_cast<ITx *>(getModuleByPath(par("txModule")));
31  rx = check_and_cast<IRx *>(getModuleByPath(par("rxModule")));
32  channelAccess = check_and_cast<Dcaf *>(getSubmodule("channelAccess"));
33  originatorDataService = check_and_cast<IOriginatorMacDataService *>(getSubmodule(("originatorMacDataService")));
34  recipientDataService = check_and_cast<IRecipientMacDataService *>(getSubmodule("recipientMacDataService"));
35  recoveryProcedure = check_and_cast<NonQosRecoveryProcedure *>(getSubmodule("recoveryProcedure"));
36  rateSelection = check_and_cast<IRateSelection *>(getSubmodule("rateSelection"));
37  rtsProcedure = new RtsProcedure();
38  rtsPolicy = check_and_cast<IRtsPolicy *>(getSubmodule("rtsPolicy"));
39  recipientAckProcedure = new RecipientAckProcedure();
40  recipientAckPolicy = check_and_cast<IRecipientAckPolicy *>(getSubmodule("recipientAckPolicy"));
41  originatorAckPolicy = check_and_cast<IOriginatorAckPolicy *>(getSubmodule("originatorAckPolicy"));
42  frameSequenceHandler = new FrameSequenceHandler();
43  ackHandler = check_and_cast<AckHandler *>(getSubmodule("ackHandler"));
44  ctsProcedure = new CtsProcedure();
45  ctsPolicy = check_and_cast<ICtsPolicy *>(getSubmodule("ctsPolicy"));
46  stationRetryCounters = new StationRetryCounters();
47  originatorProtectionMechanism = check_and_cast<OriginatorProtectionMechanism *>(getSubmodule("originatorProtectionMechanism"));
48  }
49 }

◆ isForUs()

bool inet::ieee80211::Dcf::isForUs ( const Ptr< const Ieee80211MacHeader > &  header) const
protectedvirtual
370 {
371  return header->getReceiverAddress() == mac->getAddress() || (header->getReceiverAddress().isMulticast() && !isSentByUs(header));
372 }

◆ isReceptionInProgress()

bool inet::ieee80211::Dcf::isReceptionInProgress ( )
protectedvirtual
209 {
210  return rx->isReceptionInProgress();
211 }

◆ isSentByUs()

bool inet::ieee80211::Dcf::isSentByUs ( const Ptr< const Ieee80211MacHeader > &  header) const
protectedvirtual
375 {
376  // FIXME
377  // Check the roles of the Addr3 field when aggregation is applied
378  // Table 8-19—Address field contents
379  if (auto dataOrMgmtHeader = dynamicPtrCast<const Ieee80211DataOrMgmtHeader>(header))
380  return dataOrMgmtHeader->getAddress3() == mac->getAddress();
381  else
382  return false;
383 }

◆ numInitStages()

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

Reimplemented from inet::ieee80211::ModeSetListener.

86 { return NUM_INIT_STAGES; }

◆ originatorProcessFailedFrame()

void inet::ieee80211::Dcf::originatorProcessFailedFrame ( Packet packet)
overrideprotectedvirtual

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

337 {
338  Enter_Method("originatorProcessFailedFrame");
339  EV_INFO << "Data/Mgmt frame transmission failed\n";
340  const auto& failedHeader = failedPacket->peekAtFront<Ieee80211DataOrMgmtHeader>();
341  ASSERT(failedHeader->getType() != ST_DATA_WITH_QOS);
344  bool retryLimitReached = recoveryProcedure->isRetryLimitReached(failedPacket, failedHeader);
346  int retryCount = recoveryProcedure->getRetryCount(failedPacket, failedHeader);
347  dataAndMgmtRateControl->frameTransmitted(failedPacket, retryCount, false, retryLimitReached);
348  }
349  ackHandler->processFailedFrame(failedHeader);
350  if (retryLimitReached) {
351  recoveryProcedure->retryLimitReached(failedPacket, failedHeader);
352  channelAccess->getInProgressFrames()->dropFrame(failedPacket);
353  ackHandler->dropFrame(failedHeader);
354  EV_INFO << "Dropping frame " << failedPacket->getName() << ", because retry limit is reached.\n";
355  PacketDropDetails details;
356  details.setReason(RETRY_LIMIT_REACHED);
357  details.setLimit(-1); // TODO
358  emit(packetDroppedSignal, failedPacket, &details);
359  emit(linkBrokenSignal, failedPacket);
360  }
361  else {
362  EV_INFO << "Retrying frame " << failedPacket->getName() << ".\n";
363  auto h = failedPacket->removeAtFront<Ieee80211DataOrMgmtHeader>();
364  h->setRetry(true);
365  failedPacket->insertAtFront(h);
366  }
367 }

◆ originatorProcessReceivedFrame()

void inet::ieee80211::Dcf::originatorProcessReceivedFrame ( Packet packet,
Packet lastTransmittedPacket 
)
overrideprotectedvirtual

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

311 {
312  Enter_Method("originatorProcessReceivedFrame");
313  EV_INFO << "Processing received frame " << receivedPacket->getName() << " as originator in frame sequence.\n";
314  emit(packetReceivedFromPeerSignal, receivedPacket);
315  auto receivedHeader = receivedPacket->peekAtFront<Ieee80211MacHeader>();
316  auto lastTransmittedHeader = lastTransmittedPacket->peekAtFront<Ieee80211MacHeader>();
317  if (receivedHeader->getType() == ST_ACK) {
318  auto lastTransmittedDataOrMgmtHeader = dynamicPtrCast<const Ieee80211DataOrMgmtHeader>(lastTransmittedHeader);
320  int retryCount = lastTransmittedHeader->getRetry() ? recoveryProcedure->getRetryCount(lastTransmittedPacket, lastTransmittedDataOrMgmtHeader) : 0;
321  dataAndMgmtRateControl->frameTransmitted(lastTransmittedPacket, retryCount, true, false);
322  }
323  recoveryProcedure->ackFrameReceived(lastTransmittedPacket, lastTransmittedDataOrMgmtHeader, stationRetryCounters);
324  ackHandler->processReceivedAck(dynamicPtrCast<const Ieee80211AckFrame>(receivedHeader), lastTransmittedDataOrMgmtHeader);
325  channelAccess->getInProgressFrames()->dropFrame(lastTransmittedPacket);
326  ackHandler->dropFrame(lastTransmittedDataOrMgmtHeader);
327  }
328  else if (receivedHeader->getType() == ST_RTS)
329  ; // void
330  else if (receivedHeader->getType() == ST_CTS)
332  else
333  throw cRuntimeError("Unknown frame type");
334 }

◆ originatorProcessRtsProtectionFailed()

void inet::ieee80211::Dcf::originatorProcessRtsProtectionFailed ( Packet packet)
overrideprotectedvirtual

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

267 {
268  Enter_Method("originatorProcessRtsProtectionFailed");
269  EV_INFO << "RTS frame transmission failed\n";
270  auto protectedHeader = packet->peekAtFront<Ieee80211DataOrMgmtHeader>();
272  EV_INFO << "For the current frame exchange, we have CW = " << channelAccess->getCw() << " SRC = " << recoveryProcedure->getShortRetryCount(packet, protectedHeader) << " LRC = " << recoveryProcedure->getLongRetryCount(packet, protectedHeader) << " SSRC = " << stationRetryCounters->getStationShortRetryCount() << " and SLRC = " << stationRetryCounters->getStationLongRetryCount() << std::endl;
273  if (recoveryProcedure->isRtsFrameRetryLimitReached(packet, protectedHeader)) {
274  recoveryProcedure->retryLimitReached(packet, protectedHeader);
276  ackHandler->dropFrame(protectedHeader);
277  EV_INFO << "Dropping RTS/CTS protected frame " << packet->getName() << ", because retry limit is reached.\n";
278  PacketDropDetails details;
279  details.setReason(RETRY_LIMIT_REACHED);
280  details.setLimit(recoveryProcedure->getShortRetryLimit());
281  emit(packetDroppedSignal, packet, &details);
282  emit(linkBrokenSignal, packet);
283  }
284 }

◆ originatorProcessTransmittedFrame()

void inet::ieee80211::Dcf::originatorProcessTransmittedFrame ( Packet packet)
overrideprotectedvirtual

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

287 {
288  Enter_Method("originatorProcessTransmittedFrame");
289  EV_INFO << "Processing transmitted frame " << packet->getName() << " as originator in frame sequence.\n";
290  emit(packetSentToPeerSignal, packet);
291  auto transmittedHeader = packet->peekAtFront<Ieee80211MacHeader>();
292  if (auto dataOrMgmtHeader = dynamicPtrCast<const Ieee80211DataOrMgmtHeader>(transmittedHeader)) {
293  EV_INFO << "For the current frame exchange, we have CW = " << channelAccess->getCw() << " SRC = " << recoveryProcedure->getShortRetryCount(packet, dataOrMgmtHeader) << " LRC = " << recoveryProcedure->getLongRetryCount(packet, dataOrMgmtHeader) << " SSRC = " << stationRetryCounters->getStationShortRetryCount() << " and SLRC = " << stationRetryCounters->getStationLongRetryCount() << std::endl;
294  if (originatorAckPolicy->isAckNeeded(dataOrMgmtHeader)) {
296  }
297  else if (dataOrMgmtHeader->getReceiverAddress().isMulticast()) {
300  }
301  }
302  else if (auto rtsFrame = dynamicPtrCast<const Ieee80211RtsFrame>(transmittedHeader)) {
303  auto protectedFrame = channelAccess->getInProgressFrames()->getFrameToTransmit(); // KLUDGE
304  auto protectedHeader = protectedFrame->peekAtFront<Ieee80211DataOrMgmtHeader>();
305  EV_INFO << "For the current frame exchange, we have CW = " << channelAccess->getCw() << " SRC = " << recoveryProcedure->getShortRetryCount(protectedFrame, protectedHeader) << " LRC = " << recoveryProcedure->getLongRetryCount(protectedFrame, protectedHeader) << " SSRC = " << stationRetryCounters->getStationShortRetryCount() << " and SLRC = " << stationRetryCounters->getStationLongRetryCount() << std::endl;
307  }
308 }

◆ processLowerFrame()

void inet::ieee80211::Dcf::processLowerFrame ( Packet packet,
const Ptr< const Ieee80211MacHeader > &  header 
)
overridevirtual

Implements inet::ieee80211::ICoordinationFunction.

145 {
146  Enter_Method("processLowerFrame(%s)", packet->getName());
147  take(packet);
148  EV_INFO << "Processing lower frame: " << packet->getName() << endl;
150  // TODO always call processResponses
151  if ((!isForUs(header) && !startRxTimer->isScheduled()) || isForUs(header)) {
154  }
155  else {
156  EV_INFO << "This frame is not for us" << std::endl;
157  PacketDropDetails details;
158  details.setReason(NOT_ADDRESSED_TO_US);
159  emit(packetDroppedSignal, packet, &details);
160  delete packet;
161  }
162  cancelEvent(startRxTimer);
163  }
164  else if (isForUs(header))
165  recipientProcessReceivedFrame(packet, header);
166  else {
167  EV_INFO << "This frame is not for us" << std::endl;
168  PacketDropDetails details;
169  details.setReason(NOT_ADDRESSED_TO_US);
170  emit(packetDroppedSignal, packet, &details);
171  delete packet;
172  }
173 }

◆ processMgmtFrame()

void inet::ieee80211::Dcf::processMgmtFrame ( Packet mgmtPacket,
const Ptr< const Ieee80211MgmtHeader > &  mgmtHeader 
)
overrideprotectedvirtual

Implements inet::ieee80211::IProcedureCallback.

123 {
124  throw cRuntimeError("Unknown management frame");
125 }

◆ processUpperFrame()

void inet::ieee80211::Dcf::processUpperFrame ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  header 
)
overridevirtual

Implements inet::ieee80211::ICoordinationFunction.

92 {
93  Enter_Method("processUpperFrame(%s)", packet->getName());
94  take(packet);
95  EV_INFO << "Processing upper frame: " << packet->getName() << endl;
96  auto pendingQueue = channelAccess->getPendingQueue();
97  pendingQueue->enqueuePacket(packet);
98  if (!pendingQueue->isEmpty()) {
99  EV_DETAIL << "Requesting channel" << endl;
101  }
102 }

◆ recipientProcessReceivedControlFrame()

void inet::ieee80211::Dcf::recipientProcessReceivedControlFrame ( Packet packet,
const Ptr< const Ieee80211MacHeader > &  header 
)
protectedvirtual
237 {
238  if (auto rtsFrame = dynamicPtrCast<const Ieee80211RtsFrame>(header))
239  ctsProcedure->processReceivedRts(packet, rtsFrame, ctsPolicy, this);
240  else
241  throw cRuntimeError("Unknown control frame");
242 }

◆ recipientProcessReceivedFrame()

void inet::ieee80211::Dcf::recipientProcessReceivedFrame ( Packet packet,
const Ptr< const Ieee80211MacHeader > &  header 
)
protectedvirtual
214 {
215  EV_INFO << "Processing received frame " << packet->getName() << " as recipient.\n";
216  emit(packetReceivedFromPeerSignal, packet);
217  if (auto dataOrMgmtHeader = dynamicPtrCast<const Ieee80211DataOrMgmtHeader>(header))
218  recipientAckProcedure->processReceivedFrame(packet, dataOrMgmtHeader, recipientAckPolicy, this);
219  if (auto dataHeader = dynamicPtrCast<const Ieee80211DataHeader>(header))
220  sendUp(recipientDataService->dataFrameReceived(packet, dataHeader));
221  else if (auto mgmtHeader = dynamicPtrCast<const Ieee80211MgmtHeader>(header))
223  else { // TODO else if (auto ctrlFrame = dynamic_cast<Ieee80211ControlFrame*>(frame))
225  recipientProcessReceivedControlFrame(packet, header);
226  delete packet;
227  }
228 }

◆ recipientProcessTransmittedControlResponseFrame()

void inet::ieee80211::Dcf::recipientProcessTransmittedControlResponseFrame ( Packet packet,
const Ptr< const Ieee80211MacHeader > &  header 
)
protectedvirtual
128 {
129  emit(packetSentToPeerSignal, packet);
130  if (auto ctsFrame = dynamicPtrCast<const Ieee80211CtsFrame>(header))
132  else if (auto ackFrame = dynamicPtrCast<const Ieee80211AckFrame>(header))
134  else
135  throw cRuntimeError("Unknown control response frame");
136 }

◆ scheduleStartRxTimer()

void inet::ieee80211::Dcf::scheduleStartRxTimer ( simtime_t  timeout)
overrideprotectedvirtual

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

139 {
140  Enter_Method("scheduleStartRxTimer");
141  scheduleAfter(timeout, startRxTimer);
142 }

◆ sendUp()

void inet::ieee80211::Dcf::sendUp ( const std::vector< Packet * > &  completeFrames)
protectedvirtual
231 {
232  for (auto frame : completeFrames)
233  mac->sendUpFrame(frame);
234 }

◆ transmissionComplete()

void inet::ieee80211::Dcf::transmissionComplete ( Packet packet,
const Ptr< const Ieee80211MacHeader > &  header 
)
overrideprotectedvirtual

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

251 {
252  Enter_Method("transmissionComplete");
256  }
257  else
259 }

◆ transmitControlResponseFrame()

void inet::ieee80211::Dcf::transmitControlResponseFrame ( Packet responsePacket,
const Ptr< const Ieee80211MacHeader > &  responseHeader,
Packet receivedPacket,
const Ptr< const Ieee80211MacHeader > &  receivedHeader 
)
overrideprotectedvirtual

Implements inet::ieee80211::IProcedureCallback.

105 {
106  Enter_Method("transmitControlResponseFrame");
107  responsePacket->insertAtBack(makeShared<Ieee80211MacTrailer>());
108  const IIeee80211Mode *responseMode = nullptr;
109  if (auto rtsFrame = dynamicPtrCast<const Ieee80211RtsFrame>(receivedHeader))
110  responseMode = rateSelection->computeResponseCtsFrameMode(receivedPacket, rtsFrame);
111  else if (auto dataOrMgmtHeader = dynamicPtrCast<const Ieee80211DataOrMgmtHeader>(receivedHeader))
112  responseMode = rateSelection->computeResponseAckFrameMode(receivedPacket, dataOrMgmtHeader);
113  else
114  throw cRuntimeError("Unknown received frame type");
115  RateSelection::setFrameMode(responsePacket, responseHeader, responseMode);
116  emit(IRateSelection::datarateSelectedSignal, responseMode->getDataMode()->getNetBitrate().get(), responsePacket);
117  EV_DEBUG << "Datarate for " << responsePacket->getName() << " is set to " << responseMode->getDataMode()->getNetBitrate() << ".\n";
118  tx->transmitFrame(responsePacket, responseHeader, modeSet->getSifsTime(), this);
119  delete responsePacket;
120 }

◆ transmitFrame()

void inet::ieee80211::Dcf::transmitFrame ( Packet packet,
simtime_t  ifs 
)
overrideprotectedvirtual

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

176 {
177  Enter_Method("transmitFrame");
178  const auto& header = packet->peekAtFront<Ieee80211MacHeader>();
179  auto mode = rateSelection->computeMode(packet, header);
180  RateSelection::setFrameMode(packet, header, mode);
181  emit(IRateSelection::datarateSelectedSignal, mode->getDataMode()->getNetBitrate().get(), packet);
182  EV_DEBUG << "Datarate for " << packet->getName() << " is set to " << mode->getDataMode()->getNetBitrate() << ".\n";
183  auto pendingPacket = channelAccess->getInProgressFrames()->getPendingFrameFor(packet);
184  auto duration = originatorProtectionMechanism->computeDurationField(packet, header, pendingPacket, pendingPacket == nullptr ? nullptr : pendingPacket->peekAtFront<Ieee80211DataOrMgmtHeader>());
185  const auto& updatedHeader = packet->removeAtFront<Ieee80211MacHeader>();
186  updatedHeader->setDurationField(duration);
187  EV_DEBUG << "Duration for " << packet->getName() << " is set to " << duration << " s.\n";
188  packet->insertAtFront(updatedHeader);
189  tx->transmitFrame(packet, packet->peekAtFront<Ieee80211MacHeader>(), ifs, this);
190 }

◆ updateDisplayString()

void inet::ieee80211::Dcf::updateDisplayString ( ) const
protectedvirtual
71 {
74  getDisplayString().setTagArg("t", 0, ("Fs: " + history).c_str());
75  }
76  else
77  getDisplayString().removeTag("t");
78 }

Member Data Documentation

◆ ackHandler

AckHandler* inet::ieee80211::Dcf::ackHandler = nullptr
protected

◆ channelAccess

Dcaf* inet::ieee80211::Dcf::channelAccess = nullptr
protected

◆ ctsPolicy

ICtsPolicy* inet::ieee80211::Dcf::ctsPolicy = nullptr
protected

◆ ctsProcedure

ICtsProcedure* inet::ieee80211::Dcf::ctsProcedure = nullptr
protected

◆ dataAndMgmtRateControl

IRateControl* inet::ieee80211::Dcf::dataAndMgmtRateControl = nullptr
protected

◆ frameSequenceHandler

IFrameSequenceHandler* inet::ieee80211::Dcf::frameSequenceHandler = nullptr
protected

◆ mac

Ieee80211Mac* inet::ieee80211::Dcf::mac = nullptr
protected

◆ originatorAckPolicy

IOriginatorAckPolicy* inet::ieee80211::Dcf::originatorAckPolicy = nullptr
protected

◆ originatorDataService

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

◆ originatorProtectionMechanism

OriginatorProtectionMechanism* inet::ieee80211::Dcf::originatorProtectionMechanism = nullptr
protected

◆ rateSelection

IRateSelection* inet::ieee80211::Dcf::rateSelection = nullptr
protected

◆ receiveLifetimeHandler

DcfReceiveLifetimeHandler* inet::ieee80211::Dcf::receiveLifetimeHandler = nullptr
protected

◆ recipientAckPolicy

IRecipientAckPolicy* inet::ieee80211::Dcf::recipientAckPolicy = nullptr
protected

◆ recipientAckProcedure

IRecipientAckProcedure* inet::ieee80211::Dcf::recipientAckProcedure = nullptr
protected

◆ recipientDataService

IRecipientMacDataService* inet::ieee80211::Dcf::recipientDataService = nullptr
protected

◆ recoveryProcedure

NonQosRecoveryProcedure* inet::ieee80211::Dcf::recoveryProcedure = nullptr
protected

◆ rtsPolicy

IRtsPolicy* inet::ieee80211::Dcf::rtsPolicy = nullptr
protected

◆ rtsProcedure

IRtsProcedure* inet::ieee80211::Dcf::rtsProcedure = nullptr
protected

◆ rx

IRx* inet::ieee80211::Dcf::rx = nullptr
protected

◆ startRxTimer

cMessage* inet::ieee80211::Dcf::startRxTimer = nullptr
protected

◆ stationRetryCounters

StationRetryCounters* inet::ieee80211::Dcf::stationRetryCounters = nullptr
protected

◆ transmitLifetimeHandler

ITransmitLifetimeHandler* inet::ieee80211::Dcf::transmitLifetimeHandler = nullptr
protected

◆ tx

ITx* inet::ieee80211::Dcf::tx = nullptr
protected

The documentation for this class was generated from the following files:
inet::ieee80211::Ieee80211Mac::sendDownPendingRadioConfigMsg
virtual void sendDownPendingRadioConfigMsg()
Definition: Ieee80211Mac.cc:366
inet::queueing::IPacketQueue::enqueuePacket
virtual void enqueuePacket(Packet *packet)=0
Enqueues the packet into the packet queue.
inet::ieee80211::Dcf::rtsPolicy
IRtsPolicy * rtsPolicy
Definition: Dcf.h:67
inet::ieee80211::AckHandler::getAckStatus
virtual Status getAckStatus(SequenceControlField id)
Definition: AckHandler.cc:24
inet::ieee80211::Dcf::isSentByUs
virtual bool isSentByUs(const Ptr< const Ieee80211MacHeader > &header) const
Definition: Dcf.cc:374
inet::ieee80211::IRateSelection::computeMode
virtual const physicallayer::IIeee80211Mode * computeMode(Packet *packet, const Ptr< const Ieee80211MacHeader > &header)=0
inet::ieee80211::NonQosRecoveryProcedure::ackFrameReceived
virtual void ackFrameReceived(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &ackedHeader, StationRetryCounters *stationCounters)
Definition: NonQosRecoveryProcedure.cc:105
inet::ieee80211::NonQosRecoveryProcedure::isRetryLimitReached
virtual bool isRetryLimitReached(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &failedHeader)
Definition: NonQosRecoveryProcedure.cc:185
inet::ieee80211::NonQosRecoveryProcedure::multicastFrameTransmitted
virtual void multicastFrameTransmitted(StationRetryCounters *stationCounters)
Definition: NonQosRecoveryProcedure.cc:77
inet::ieee80211::Dcf::ctsPolicy
ICtsPolicy * ctsPolicy
Definition: Dcf.h:69
inet::ieee80211::Dcf::recipientProcessReceivedFrame
virtual void recipientProcessReceivedFrame(Packet *packet, const Ptr< const Ieee80211MacHeader > &header)
Definition: Dcf.cc:213
inet::packetReceivedFromPeerSignal
simsignal_t packetReceivedFromPeerSignal
Definition: Simsignals.cc:94
inet::ieee80211::AckHandler::processFailedFrame
virtual void processFailedFrame(const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)
Definition: AckHandler.cc:79
inet::ieee80211::Dcaf::releaseChannel
virtual void releaseChannel(IChannelAccess::ICallback *callback) override
Definition: Dcaf.cc:110
inet::ieee80211::Dcf::isReceptionInProgress
virtual bool isReceptionInProgress()
Definition: Dcf.cc:208
inet::ieee80211::IRecipientMacDataService::managementFrameReceived
virtual std::vector< Packet * > managementFrameReceived(Packet *mgmtPacket, const Ptr< const Ieee80211MgmtHeader > &mgmtHeader)=0
inet::ieee80211::Dcf::channelAccess
Dcaf * channelAccess
Definition: Dcf.h:55
inet::ieee80211::Dcaf::requestChannel
virtual void requestChannel(IChannelAccess::ICallback *callback) override
Definition: Dcaf.cc:119
inet::ieee80211::AckHandler::processReceivedAck
virtual void processReceivedAck(const Ptr< const Ieee80211AckFrame > &ack, const Ptr< const Ieee80211DataOrMgmtHeader > &ackedHeader)
Definition: AckHandler.cc:36
inet::ieee80211::ST_ACK
@ ST_ACK
Definition: Ieee80211Frame_m.h:165
inet::ieee80211::InProgressFrames::getPendingFrameFor
virtual Packet * getPendingFrameFor(Packet *frame)
Definition: InProgressFrames.cc:95
inet::ieee80211::IRecipientMacDataService::controlFrameReceived
virtual std::vector< Packet * > controlFrameReceived(Packet *controlPacket, const Ptr< const Ieee80211MacHeader > &controlHeader)=0
inet::linkBrokenSignal
simsignal_t linkBrokenSignal
Definition: Simsignals.cc:22
inet::ieee80211::ICtsProcedure::processTransmittedCts
virtual void processTransmittedCts(const Ptr< const Ieee80211CtsFrame > &ctsFrame)=0
inet::ieee80211::Dcf::ctsProcedure
ICtsProcedure * ctsProcedure
Definition: Dcf.h:68
inet::ieee80211::IRtsProcedure::processTransmittedRts
virtual void processTransmittedRts(const Ptr< const Ieee80211RtsFrame > &rtsFrame)=0
inet::packetSentToPeerSignal
simsignal_t packetSentToPeerSignal
Definition: Simsignals.cc:93
inet::Packet::peekAtFront
const Ptr< const Chunk > peekAtFront(b length=b(-1), int flags=0) const
Returns the designated part from the beginning of the data part of the packet as an immutable chunk i...
Definition: Packet.h:245
inet::RETRY_LIMIT_REACHED
@ RETRY_LIMIT_REACHED
Definition: Simsignals_m.h:78
inet::ieee80211::Dcf::mac
Ieee80211Mac * mac
Definition: Dcf.h:43
inet::ieee80211::RateSelection::setFrameMode
static void setFrameMode(Packet *packet, const Ptr< const Ieee80211MacHeader > &header, const physicallayer::IIeee80211Mode *mode)
Definition: RateSelection.cc:165
inet::physicallayer::IIeee80211Mode::getDataMode
virtual const IIeee80211DataMode * getDataMode() const =0
inet::ieee80211::Dcf::rtsProcedure
IRtsProcedure * rtsProcedure
Definition: Dcf.h:66
inet::ieee80211::Dcf::startRxTimer
cMessage * startRxTimer
Definition: Dcf.h:46
inet::ieee80211::NonQosRecoveryProcedure::ctsFrameReceived
virtual void ctsFrameReceived(StationRetryCounters *stationCounters)
Definition: NonQosRecoveryProcedure.cc:93
inet::queueing::IPacketCollection::isEmpty
virtual bool isEmpty() const =0
Returns true if there are no packets available in the collection.
inet::ieee80211::IRecipientAckProcedure::processTransmittedAck
virtual void processTransmittedAck(const Ptr< const Ieee80211AckFrame > &ack)=0
inet::ieee80211::Dcf::recipientAckProcedure
IRecipientAckProcedure * recipientAckProcedure
Definition: Dcf.h:64
inet::ieee80211::NonQosRecoveryProcedure::getShortRetryLimit
virtual int getShortRetryLimit()
Definition: NonQosRecoveryProcedure.h:69
inet::getContainingNicModule
NetworkInterface * getContainingNicModule(const cModule *from)
Find the nic module (inside the networkNode) containing the given module.
Definition: NetworkInterface.cc:691
inet::ieee80211::ModeSetListener::initialize
virtual void initialize(int stage) override
Definition: ModeSetListener.cc:17
inet::physicallayer::IIeee80211DataMode::getNetBitrate
virtual bps getNetBitrate() const =0
inet::ieee80211::OriginatorProtectionMechanism::computeDurationField
virtual simtime_t computeDurationField(Packet *packet, const Ptr< const Ieee80211MacHeader > &header, Packet *pendingPacket, const Ptr< const Ieee80211DataOrMgmtHeader > &pendingHeader)
Definition: OriginatorProtectionMechanism.cc:93
inet::ieee80211::Dcf::tx
ITx * tx
Definition: Dcf.h:50
inet::ieee80211::InProgressFrames::hasInProgressFrames
virtual bool hasInProgressFrames()
Definition: InProgressFrames.h:52
inet::ieee80211::Dcf::originatorDataService
IOriginatorMacDataService * originatorDataService
Definition: Dcf.h:58
inet::ieee80211::Dcf::recipientDataService
IRecipientMacDataService * recipientDataService
Definition: Dcf.h:59
inet::ieee80211::Dcaf::getCw
virtual int getCw() override
Definition: Dcaf.h:64
inet::packetDroppedSignal
simsignal_t packetDroppedSignal
Definition: Simsignals.cc:85
inet::ieee80211::ICtsProcedure::processReceivedRts
virtual void processReceivedRts(Packet *rtsPacket, const Ptr< const Ieee80211RtsFrame > &rtsFrame, ICtsPolicy *ctsPolicy, IProcedureCallback *callback)=0
inet::ieee80211::IFrameSequenceHandler::getFrameSequence
virtual const IFrameSequence * getFrameSequence() const =0
inet::ieee80211::IFrameSequenceHandler::processResponse
virtual void processResponse(Packet *frame)=0
inet::ieee80211::Ieee80211Mac::getAddress
virtual const MacAddress & getAddress() const
Definition: Ieee80211Mac.h:101
inet::ieee80211::ITx::transmitFrame
virtual void transmitFrame(Packet *packet, const Ptr< const Ieee80211MacHeader > &header, ICallback *callback)=0
inet::ieee80211::NonQosRecoveryProcedure::isRtsFrameRetryLimitReached
virtual bool isRtsFrameRetryLimitReached(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &protectedHeader)
Definition: NonQosRecoveryProcedure.cc:229
inet::ieee80211::Dcf::isForUs
virtual bool isForUs(const Ptr< const Ieee80211MacHeader > &header) const
Definition: Dcf.cc:369
inet::ieee80211::IRateSelection::computeResponseCtsFrameMode
virtual const physicallayer::IIeee80211Mode * computeResponseCtsFrameMode(Packet *packet, const Ptr< const Ieee80211RtsFrame > &rtsFrame)=0
inet::ieee80211::StationRetryCounters::getStationLongRetryCount
int getStationLongRetryCount() const
Definition: StationRetryCounters.h:23
inet::ieee80211::NonQosRecoveryProcedure::getRetryCount
virtual int getRetryCount(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &header)
Definition: NonQosRecoveryProcedure.cc:193
inet::ieee80211::Dcf::recipientAckPolicy
IRecipientAckPolicy * recipientAckPolicy
Definition: Dcf.h:65
inet::ieee80211::NonQosRecoveryProcedure::getLongRetryCount
virtual int getLongRetryCount(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)
Definition: NonQosRecoveryProcedure.cc:206
inet::ieee80211::Dcf::buildContext
virtual FrameSequenceContext * buildContext()
Definition: Dcf.cc:244
inet::ieee80211::AckHandler::Status::NO_ACK_REQUIRED
@ NO_ACK_REQUIRED
inet::ieee80211::NonQosRecoveryProcedure::getShortRetryCount
virtual int getShortRetryCount(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)
Definition: NonQosRecoveryProcedure.cc:201
inet::physicallayer::IIeee80211Mode
Definition: IIeee80211Mode.h:49
inet::ieee80211::IFrameSequenceHandler::frameSequenceStartedSignal
static simsignal_t frameSequenceStartedSignal
Definition: IFrameSequenceHandler.h:21
inet::ieee80211::InProgressFrames::dropFrame
virtual void dropFrame(Packet *packet)
Definition: InProgressFrames.cc:126
inet::ieee80211::Dcf::rateSelection
IRateSelection * rateSelection
Definition: Dcf.h:52
inet::ieee80211::IFrameSequenceHandler::transmissionComplete
virtual void transmissionComplete()=0
inet::ieee80211::AckHandler::Status::WAITING_FOR_ACK
@ WAITING_FOR_ACK
inet::ieee80211::Dcf::stationRetryCounters
StationRetryCounters * stationRetryCounters
Definition: Dcf.h:83
inet::ieee80211::IRecipientAckProcedure::processReceivedFrame
virtual void processReceivedFrame(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader, IRecipientAckPolicy *ackPolicy, IProcedureCallback *callback)=0
inet::ieee80211::AckHandler::processTransmittedDataOrMgmtFrame
virtual void processTransmittedDataOrMgmtFrame(const Ptr< const Ieee80211DataOrMgmtHeader > &header)
Definition: AckHandler.cc:45
inet::ieee80211::IRateSelection::datarateSelectedSignal
static simsignal_t datarateSelectedSignal
Definition: IRateSelection.h:27
inet::ieee80211::NonQosRecoveryProcedure::retryLimitReached
virtual void retryLimitReached(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &header)
Definition: NonQosRecoveryProcedure.cc:132
inet::ieee80211::Dcf::ackHandler
AckHandler * ackHandler
Definition: Dcf.h:62
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::ieee80211::Dcf::sendUp
virtual void sendUp(const std::vector< Packet * > &completeFrames)
Definition: Dcf.cc:230
inet::ieee80211::ST_DATA_WITH_QOS
@ ST_DATA_WITH_QOS
Definition: Ieee80211Frame_m.h:169
inet::physicallayer::Ieee80211ModeSet::getSifsTime
simtime_t getSifsTime() const
Definition: Ieee80211ModeSet.h:67
inet::ieee80211::AckHandler::dropFrame
virtual void dropFrame(const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)
Definition: AckHandler.cc:90
inet::ieee80211::ModeSetListener::modeSet
physicallayer::Ieee80211ModeSet * modeSet
Definition: ModeSetListener.h:19
inet::ieee80211::IFrameSequenceHandler::getContext
virtual const FrameSequenceContext * getContext() const =0
inet::ieee80211::Dcf::frameSequenceHandler
IFrameSequenceHandler * frameSequenceHandler
Definition: Dcf.h:80
inet::ieee80211::Dcf::recipientProcessTransmittedControlResponseFrame
virtual void recipientProcessTransmittedControlResponseFrame(Packet *packet, const Ptr< const Ieee80211MacHeader > &header)
Definition: Dcf.cc:127
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::ieee80211::Dcf::recoveryProcedure
NonQosRecoveryProcedure * recoveryProcedure
Definition: Dcf.h:70
inet::ieee80211::IRateControl::frameTransmitted
virtual void frameTransmitted(Packet *frame, int retryCount, bool isSuccessful, bool isGivenUp)=0
inet::ieee80211::IFrameSequenceHandler::handleStartRxTimeout
virtual void handleStartRxTimeout()=0
inet::units::value::get
const value_type & get() const
Definition: Units.h:108
inet::ieee80211::IRecipientMacDataService::dataFrameReceived
virtual std::vector< Packet * > dataFrameReceived(Packet *dataPacket, const Ptr< const Ieee80211DataHeader > &dataHeader)=0
inet::ieee80211::IFrameSequenceHandler::isSequenceRunning
virtual bool isSequenceRunning()=0
inet::ieee80211::NonQosRecoveryProcedure::rtsFrameTransmissionFailed
virtual void rtsFrameTransmissionFailed(const Ptr< const Ieee80211DataOrMgmtHeader > &protectedHeader, StationRetryCounters *stationCounters)
Definition: NonQosRecoveryProcedure.cc:173
inet::ieee80211::Dcf::dataAndMgmtRateControl
IRateControl * dataAndMgmtRateControl
Definition: Dcf.h:44
inet::ieee80211::Dcf::originatorAckPolicy
IOriginatorAckPolicy * originatorAckPolicy
Definition: Dcf.h:63
inet::ieee80211::ST_CTS
@ ST_CTS
Definition: Ieee80211Frame_m.h:164
inet::ieee80211::InProgressFrames::getFrameToTransmit
virtual Packet * getFrameToTransmit()
Definition: InProgressFrames.cc:85
inet::ieee80211::IRx::isReceptionInProgress
virtual bool isReceptionInProgress() const =0
inet::ieee80211::IRateSelection::computeResponseAckFrameMode
virtual const physicallayer::IIeee80211Mode * computeResponseAckFrameMode(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)=0
inet::ieee80211::Ieee80211Mac::sendUpFrame
virtual void sendUpFrame(Packet *frame)
Definition: Ieee80211Mac.cc:345
inet::ieee80211::Dcf::updateDisplayString
virtual void updateDisplayString() const
Definition: Dcf.cc:70
inet::ieee80211::IFrameSequenceHandler::startFrameSequence
virtual void startFrameSequence(IFrameSequence *frameSequence, FrameSequenceContext *context, ICallback *callback)=0
inet::ieee80211::Dcaf::getPendingQueue
virtual queueing::IPacketQueue * getPendingQueue() const
Definition: Dcaf.h:50
inet::ieee80211::IOriginatorAckPolicy::isAckNeeded
virtual bool isAckNeeded(const Ptr< const Ieee80211DataOrMgmtHeader > &header) const =0
inet::ieee80211::Dcf::hasFrameToTransmit
virtual bool hasFrameToTransmit()
Definition: Dcf.cc:261
inet::ieee80211::IFrameSequenceHandler::frameSequenceFinishedSignal
static simsignal_t frameSequenceFinishedSignal
Definition: IFrameSequenceHandler.h:22
inet::ieee80211::Dcaf::getInProgressFrames
virtual InProgressFrames * getInProgressFrames() const
Definition: Dcaf.h:51
inet::NOT_ADDRESSED_TO_US
@ NOT_ADDRESSED_TO_US
Definition: Simsignals_m.h:76
inet::ieee80211::Dcf::rx
IRx * rx
Definition: Dcf.h:49
inet::ieee80211::StationRetryCounters::getStationShortRetryCount
int getStationShortRetryCount() const
Definition: StationRetryCounters.h:24
inet::ieee80211::Dcf::originatorProtectionMechanism
OriginatorProtectionMechanism * originatorProtectionMechanism
Definition: Dcf.h:77
inet::units::constants::h
const value< double, compose< units::J, units::s > > h(6.62606896e-34)
inet::INITSTAGE_LINK_LAYER
INET_API InitStage INITSTAGE_LINK_LAYER
Initialization of link-layer protocols.
inet::ieee80211::Dcf::recipientProcessReceivedControlFrame
virtual void recipientProcessReceivedControlFrame(Packet *packet, const Ptr< const Ieee80211MacHeader > &header)
Definition: Dcf.cc:236
inet::ieee80211::NonQosRecoveryProcedure::dataOrMgmtFrameTransmissionFailed
virtual void dataOrMgmtFrameTransmissionFailed(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &failedHeader, StationRetryCounters *stationCounters)
Definition: NonQosRecoveryProcedure.cc:158
inet::ieee80211::IFrameSequence::getHistory
virtual std::string getHistory() const =0
inet::ieee80211::ST_RTS
@ ST_RTS
Definition: Ieee80211Frame_m.h:163