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

#include <SingleProtectionMechanism.h>

Inheritance diagram for inet::ieee80211::SingleProtectionMechanism:
inet::ieee80211::ModeSetListener

Public Member Functions

virtual ~SingleProtectionMechanism ()
 
virtual simtime_t computeDurationField (Packet *packet, const Ptr< const Ieee80211MacHeader > &header, Packet *pendingPacket, const Ptr< const Ieee80211DataOrMgmtHeader > &pendingHeader, TxopProcedure *txop, IRecipientQosAckPolicy *ackPolicy)
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual simtime_t computeRtsDurationField (Packet *rtsPacket, const Ptr< const Ieee80211RtsFrame > &rtsFrame, Packet *pendingPacket, const Ptr< const Ieee80211DataOrMgmtHeader > &pendingHeader, TxopProcedure *txop, IRecipientQosAckPolicy *ackPolicy)
 
virtual simtime_t computeCtsDurationField (const Ptr< const Ieee80211CtsFrame > &ctsFrame)
 
virtual simtime_t computeBlockAckReqDurationField (Packet *packet, const Ptr< const Ieee80211BlockAckReq > &blockAckReq)
 
virtual simtime_t computeBlockAckDurationField (const Ptr< const Ieee80211BlockAck > &blockAck)
 
virtual simtime_t computeDataOrMgmtFrameDurationField (Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader, Packet *pendingPacket, const Ptr< const Ieee80211DataOrMgmtHeader > &pendingHeader, TxopProcedure *txop, IRecipientQosAckPolicy *ackPolicy)
 
- Protected Member Functions inherited from inet::ieee80211::ModeSetListener
virtual void receiveSignal (cComponent *source, simsignal_t signalID, cObject *obj, cObject *details) override
 

Protected Attributes

IQosRateSelectionrateSelection = nullptr
 
- Protected Attributes inherited from inet::ieee80211::ModeSetListener
physicallayer::Ieee80211ModeSetmodeSet = nullptr
 

Constructor & Destructor Documentation

◆ ~SingleProtectionMechanism()

virtual inet::ieee80211::SingleProtectionMechanism::~SingleProtectionMechanism ( )
inlinevirtual
44 {}

Member Function Documentation

◆ computeBlockAckDurationField()

simtime_t inet::ieee80211::SingleProtectionMechanism::computeBlockAckDurationField ( const Ptr< const Ieee80211BlockAck > &  blockAck)
protectedvirtual
87 {
88  throw cRuntimeError("Unimplemented");
89 }

Referenced by computeDurationField().

◆ computeBlockAckReqDurationField()

simtime_t inet::ieee80211::SingleProtectionMechanism::computeBlockAckReqDurationField ( Packet packet,
const Ptr< const Ieee80211BlockAckReq > &  blockAckReq 
)
protectedvirtual
70 {
71  // TODO ACK or BlockAck frame, as applicable
72  if (dynamicPtrCast<const Ieee80211BasicBlockAckReq>(blockAckReq)) {
73  simtime_t blockAckFrameDuration = rateSelection->computeResponseBlockAckFrameMode(packet, blockAckReq)->getDuration(LENGTH_BASIC_BLOCKACK);
74  simtime_t blockAckReqDurationPerId = blockAckFrameDuration + modeSet->getSifsTime();
75  return blockAckReqDurationPerId;
76  }
77  else
78  throw cRuntimeError("Compressed and Multi-Tid Block Ack Requests are not supported");
79 }

Referenced by computeDurationField().

◆ computeCtsDurationField()

simtime_t inet::ieee80211::SingleProtectionMechanism::computeCtsDurationField ( const Ptr< const Ieee80211CtsFrame > &  ctsFrame)
protectedvirtual
61 {
62  throw cRuntimeError("Self CTS is not supported");
63 }

Referenced by computeDurationField().

◆ computeDataOrMgmtFrameDurationField()

simtime_t inet::ieee80211::SingleProtectionMechanism::computeDataOrMgmtFrameDurationField ( Packet packet,
const Ptr< const Ieee80211DataOrMgmtHeader > &  dataOrMgmtHeader,
Packet pendingPacket,
const Ptr< const Ieee80211DataOrMgmtHeader > &  pendingHeader,
TxopProcedure txop,
IRecipientQosAckPolicy ackPolicy 
)
protectedvirtual
111 {
112  bool mgmtFrame = false;
113  bool mgmtFrameWithNoAck = false;
114  bool groupAddressed = dataOrMgmtHeader->getReceiverAddress().isMulticast();
115  if (dynamicPtrCast<const Ieee80211MgmtHeader>(dataOrMgmtHeader)) {
116  mgmtFrame = true;
117  mgmtFrameWithNoAck = false; // FIXME ack policy?
118  }
119  bool nonQoSData = dataOrMgmtHeader->getType() == ST_DATA;
120  bool individuallyAddressedDataWithNormalAck = false;
121  bool individuallyAddressedDataWithNoAckOrBlockAck = false;
122  if (auto dataHeader = dynamicPtrCast<const Ieee80211DataHeader>(dataOrMgmtHeader)) {
123  individuallyAddressedDataWithNormalAck = !groupAddressed && dataHeader->getAckPolicy() == AckPolicy::NORMAL_ACK;
124  individuallyAddressedDataWithNoAckOrBlockAck = !groupAddressed && (dataHeader->getAckPolicy() == AckPolicy::NO_ACK || dataHeader->getAckPolicy() == AckPolicy::BLOCK_ACK);
125  }
126  if (mgmtFrame || nonQoSData || individuallyAddressedDataWithNormalAck) {
127  simtime_t ackFrameDuration = rateSelection->computeResponseAckFrameMode(packet, dataOrMgmtHeader)->getDuration(LENGTH_ACK);
128  if (txop->isFinalFragment(dataOrMgmtHeader)) {
129  return ackFrameDuration + modeSet->getSifsTime();
130  }
131  else {
132  simtime_t ackFrameDuration = rateSelection->computeResponseAckFrameMode(packet, dataOrMgmtHeader)->getDuration(LENGTH_ACK);
133  simtime_t duration = ackFrameDuration + modeSet->getSifsTime();
134  if (pendingHeader) {
135  auto pendingFrameMode = rateSelection->computeMode(pendingPacket, pendingHeader, txop);
136  simtime_t pendingFrameDuration = pendingFrameMode->getDuration(pendingPacket->getDataLength());
137  duration += pendingFrameDuration + modeSet->getSifsTime();
138  if (ackPolicy->isAckNeeded(pendingHeader)) {
139  RateSelection::setFrameMode(pendingPacket, pendingHeader, pendingFrameMode); // KLUDGE
140  simtime_t ackToPendingFrameDuration = rateSelection->computeResponseAckFrameMode(pendingPacket, pendingHeader)->getDuration(LENGTH_ACK);
141  duration += ackToPendingFrameDuration + modeSet->getSifsTime();
142  }
143  }
144  return duration;
145  }
146  }
147  if (individuallyAddressedDataWithNoAckOrBlockAck || mgmtFrameWithNoAck || groupAddressed) {
148  if (txop->isFinalFragment(dataOrMgmtHeader))
149  return 0;
150  else {
151  simtime_t duration = 0;
152  if (pendingHeader) {
153  auto pendingFrameMode = rateSelection->computeMode(pendingPacket, pendingHeader, txop);
154  simtime_t pendingFrameDuration = pendingFrameMode->getDuration(pendingPacket->getDataLength());
155  duration = pendingFrameDuration + modeSet->getSifsTime();
156  if (ackPolicy->isAckNeeded(pendingHeader)) {
157  RateSelection::setFrameMode(pendingPacket, pendingHeader, pendingFrameMode); // KLUDGE
158  simtime_t ackToPendingFrameDuration = rateSelection->computeResponseAckFrameMode(pendingPacket, pendingHeader)->getDuration(LENGTH_ACK);
159  duration += ackToPendingFrameDuration + modeSet->getSifsTime();
160  }
161  }
162  return duration;
163  }
164  }
165  throw cRuntimeError("Unknown frame");
166 }

Referenced by computeDurationField().

◆ computeDurationField()

simtime_t inet::ieee80211::SingleProtectionMechanism::computeDurationField ( Packet packet,
const Ptr< const Ieee80211MacHeader > &  header,
Packet pendingPacket,
const Ptr< const Ieee80211DataOrMgmtHeader > &  pendingHeader,
TxopProcedure txop,
IRecipientQosAckPolicy ackPolicy 
)
virtual
169 {
170  if (auto rtsFrame = dynamicPtrCast<const Ieee80211RtsFrame>(header))
171  return computeRtsDurationField(packet, rtsFrame, pendingPacket, pendingHeader, txop, ackPolicy);
172  else if (auto ctsFrame = dynamicPtrCast<const Ieee80211CtsFrame>(header))
173  return computeCtsDurationField(ctsFrame);
174  else if (auto blockAckReq = dynamicPtrCast<const Ieee80211BlockAckReq>(header))
175  return computeBlockAckReqDurationField(packet, blockAckReq);
176  else if (auto blockAck = dynamicPtrCast<const Ieee80211BlockAck>(header))
177  return computeBlockAckDurationField(blockAck);
178  else if (auto dataOrMgmtHeader = dynamicPtrCast<const Ieee80211DataOrMgmtHeader>(header))
179  return computeDataOrMgmtFrameDurationField(packet, dataOrMgmtHeader, pendingPacket, pendingHeader, txop, ackPolicy);
180  else
181  throw cRuntimeError("Unknown frame type");
182 }

◆ computeRtsDurationField()

simtime_t inet::ieee80211::SingleProtectionMechanism::computeRtsDurationField ( Packet rtsPacket,
const Ptr< const Ieee80211RtsFrame > &  rtsFrame,
Packet pendingPacket,
const Ptr< const Ieee80211DataOrMgmtHeader > &  pendingHeader,
TxopProcedure txop,
IRecipientQosAckPolicy ackPolicy 
)
protectedvirtual
34 {
35  // TODO We assume that the RTS frame is not part of a dual clear-to-send
36  auto pendingFrameMode = rateSelection->computeMode(pendingPacket, pendingHeader, txop);
37  simtime_t pendingFrameDuration = pendingFrameMode->getDuration(pendingPacket->getDataLength());
38  simtime_t ctsFrameDuration = rateSelection->computeResponseCtsFrameMode(rtsPacket, rtsFrame)->getDuration(LENGTH_CTS);
39  simtime_t durationId = ctsFrameDuration + modeSet->getSifsTime() + pendingFrameDuration + modeSet->getSifsTime();
40  if (auto dataOrMgmtHeader = dynamicPtrCast<const Ieee80211DataOrMgmtHeader>(pendingHeader)) {
41  if (ackPolicy->isAckNeeded(dataOrMgmtHeader)) {
42  RateSelection::setFrameMode(pendingPacket, dataOrMgmtHeader, pendingFrameMode); // KLUDGE
43  simtime_t ackFrameDuration = rateSelection->computeResponseAckFrameMode(pendingPacket, dataOrMgmtHeader)->getDuration(LENGTH_ACK);
44  durationId += ackFrameDuration + modeSet->getSifsTime();
45  }
46  }
47  return durationId;
48 }

Referenced by computeDurationField().

◆ initialize()

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

Reimplemented from inet::ieee80211::ModeSetListener.

20 {
22  if (stage == INITSTAGE_LOCAL) {
23  rateSelection = check_and_cast<IQosRateSelection *>(getModuleByPath(par("rateSelectionModule")));
24  }
25 }

◆ numInitStages()

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

Reimplemented from inet::ieee80211::ModeSetListener.

34 { return NUM_INIT_STAGES; }

Member Data Documentation

◆ rateSelection

IQosRateSelection* inet::ieee80211::SingleProtectionMechanism::rateSelection = nullptr
protected

The documentation for this class was generated from the following files:
inet::ieee80211::ST_DATA
@ ST_DATA
Definition: Ieee80211Frame_m.h:168
inet::ieee80211::SingleProtectionMechanism::computeCtsDurationField
virtual simtime_t computeCtsDurationField(const Ptr< const Ieee80211CtsFrame > &ctsFrame)
Definition: SingleProtectionMechanism.cc:60
inet::ieee80211::BLOCK_ACK
@ BLOCK_ACK
Definition: Ieee80211Frame_m.h:196
inet::ieee80211::RateSelection::setFrameMode
static void setFrameMode(Packet *packet, const Ptr< const Ieee80211MacHeader > &header, const physicallayer::IIeee80211Mode *mode)
Definition: RateSelection.cc:165
inet::ieee80211::SingleProtectionMechanism::computeBlockAckDurationField
virtual simtime_t computeBlockAckDurationField(const Ptr< const Ieee80211BlockAck > &blockAck)
Definition: SingleProtectionMechanism.cc:86
inet::ieee80211::ModeSetListener::initialize
virtual void initialize(int stage) override
Definition: ModeSetListener.cc:17
inet::ieee80211::IQosRateSelection::computeResponseCtsFrameMode
virtual const physicallayer::IIeee80211Mode * computeResponseCtsFrameMode(Packet *packet, const Ptr< const Ieee80211RtsFrame > &rtsFrame)=0
inet::physicallayer::IIeee80211Mode::getDuration
virtual const simtime_t getDuration(b dataLength) const =0
inet::ieee80211::IQosRateSelection::computeResponseAckFrameMode
virtual const physicallayer::IIeee80211Mode * computeResponseAckFrameMode(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)=0
inet::ieee80211::LENGTH_ACK
const b LENGTH_ACK
Definition: Ieee80211Frame_m.h:94
inet::ieee80211::SingleProtectionMechanism::computeDataOrMgmtFrameDurationField
virtual simtime_t computeDataOrMgmtFrameDurationField(Packet *packet, const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader, Packet *pendingPacket, const Ptr< const Ieee80211DataOrMgmtHeader > &pendingHeader, TxopProcedure *txop, IRecipientQosAckPolicy *ackPolicy)
Definition: SingleProtectionMechanism.cc:110
inet::ieee80211::IQosRateSelection::computeMode
virtual const physicallayer::IIeee80211Mode * computeMode(Packet *packet, const Ptr< const Ieee80211MacHeader > &header, TxopProcedure *txopProcedure)=0
inet::ieee80211::LENGTH_CTS
const b LENGTH_CTS
Definition: Ieee80211Frame_m.h:93
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::ieee80211::IQosRateSelection::computeResponseBlockAckFrameMode
virtual const physicallayer::IIeee80211Mode * computeResponseBlockAckFrameMode(Packet *packet, const Ptr< const Ieee80211BlockAckReq > &blockAckReq)=0
inet::physicallayer::Ieee80211ModeSet::getSifsTime
simtime_t getSifsTime() const
Definition: Ieee80211ModeSet.h:67
inet::ieee80211::SingleProtectionMechanism::rateSelection
IQosRateSelection * rateSelection
Definition: SingleProtectionMechanism.h:30
inet::ieee80211::SingleProtectionMechanism::computeBlockAckReqDurationField
virtual simtime_t computeBlockAckReqDurationField(Packet *packet, const Ptr< const Ieee80211BlockAckReq > &blockAckReq)
Definition: SingleProtectionMechanism.cc:69
inet::ieee80211::ModeSetListener::modeSet
physicallayer::Ieee80211ModeSet * modeSet
Definition: ModeSetListener.h:19
inet::ieee80211::LENGTH_BASIC_BLOCKACK
const b LENGTH_BASIC_BLOCKACK
Definition: Ieee80211Frame_m.h:99
inet::ieee80211::NO_ACK
@ NO_ACK
Definition: Ieee80211Frame_m.h:194
inet::ieee80211::SingleProtectionMechanism::computeRtsDurationField
virtual simtime_t computeRtsDurationField(Packet *rtsPacket, const Ptr< const Ieee80211RtsFrame > &rtsFrame, Packet *pendingPacket, const Ptr< const Ieee80211DataOrMgmtHeader > &pendingHeader, TxopProcedure *txop, IRecipientQosAckPolicy *ackPolicy)
Definition: SingleProtectionMechanism.cc:33
inet::ieee80211::NORMAL_ACK
@ NORMAL_ACK
Definition: Ieee80211Frame_m.h:193