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

#include <PrimitiveFrameSequences.h>

Inheritance diagram for inet::ieee80211::RtsCtsFs:
inet::ieee80211::IFrameSequence

Public Member Functions

virtual void startSequence (FrameSequenceContext *context, int firstStep) override
 
virtual IFrameSequenceStepprepareStep (FrameSequenceContext *context) override
 
virtual bool completeStep (FrameSequenceContext *context) override
 
virtual std::string getHistory () const override
 
- Public Member Functions inherited from inet::ieee80211::IFrameSequence
virtual ~IFrameSequence ()
 

Protected Attributes

int firstStep = -1
 
int step = -1
 

Member Function Documentation

◆ completeStep()

bool inet::ieee80211::RtsCtsFs::completeStep ( FrameSequenceContext context)
overridevirtual

Implements inet::ieee80211::IFrameSequence.

280 {
281  switch (step) {
282  case 0:
283  step++;
284  return true;
285  case 1: {
286  auto receiveStep = check_and_cast<IReceiveStep *>(context->getStep(firstStep + step));
287  step++;
288  auto receivedPacket = receiveStep->getReceivedFrame();
289  const auto& receivedHeader = receivedPacket->peekAtFront<Ieee80211MacHeader>();
290  return context->isForUs(receivedHeader) && receivedHeader->getType() == ST_CTS;
291  }
292  default:
293  throw cRuntimeError("Unknown step");
294  }
295 }

◆ getHistory()

virtual std::string inet::ieee80211::RtsCtsFs::getHistory ( ) const
inlineoverridevirtual

Implements inet::ieee80211::IFrameSequence.

100 { return std::string("RTS") + (step == 2 ? " CTS" : ""); } // TODO completeStep = true?

◆ prepareStep()

IFrameSequenceStep * inet::ieee80211::RtsCtsFs::prepareStep ( FrameSequenceContext context)
overridevirtual

Implements inet::ieee80211::IFrameSequence.

255 {
256  switch (step) {
257  case 0: {
258  auto packet = context->getInProgressFrames()->getFrameToTransmit();
259  auto dataOrMgmtHeader = packet->peekAtFront<Ieee80211DataOrMgmtHeader>();
260  auto rtsFrame = context->getRtsProcedure()->buildRtsFrame(dataOrMgmtHeader);
261  auto rtsPacket = new Packet("RTS");
262  rtsPacket->insertAtBack(rtsFrame);
263  rtsPacket->insertAtBack(makeShared<Ieee80211MacTrailer>());
264  return new RtsTransmitStep(packet, rtsPacket, context->getIfs());
265  }
266  case 1: {
267  auto txStep = check_and_cast<RtsTransmitStep *>(context->getLastStep());
268  auto packet = txStep->getFrameToTransmit();
269  auto rtsFrame = packet->peekAtFront<Ieee80211RtsFrame>();
270  return new ReceiveStep(context->getCtsTimeout(packet, rtsFrame));
271  }
272  case 2:
273  return nullptr;
274  default:
275  throw cRuntimeError("Unknown step");
276  }
277 }

◆ startSequence()

void inet::ieee80211::RtsCtsFs::startSequence ( FrameSequenceContext context,
int  firstStep 
)
overridevirtual

Implements inet::ieee80211::IFrameSequence.

249 {
250  this->firstStep = firstStep;
251  step = 0;
252 }

Member Data Documentation

◆ firstStep

int inet::ieee80211::RtsCtsFs::firstStep = -1
protected

Referenced by completeStep(), and startSequence().

◆ step

int inet::ieee80211::RtsCtsFs::step = -1
protected

The documentation for this class was generated from the following files:
inet::ieee80211::RtsCtsFs::firstStep
int firstStep
Definition: PrimitiveFrameSequences.h:92
inet::ieee80211::RtsCtsFs::step
int step
Definition: PrimitiveFrameSequences.h:93
inet::ieee80211::ST_CTS
@ ST_CTS
Definition: Ieee80211Frame_m.h:164