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

#include <FrameSequenceHandler.h>

Inheritance diagram for inet::ieee80211::FrameSequenceHandler:
inet::ieee80211::IFrameSequenceHandler

Public Member Functions

virtual const FrameSequenceContextgetContext () const override
 
virtual const IFrameSequencegetFrameSequence () const override
 
virtual void startFrameSequence (IFrameSequence *frameSequence, FrameSequenceContext *context, IFrameSequenceHandler::ICallback *callback) override
 
virtual void processResponse (Packet *frame) override
 
virtual void transmissionComplete () override
 
virtual void handleStartRxTimeout () override
 
virtual bool isSequenceRunning () override
 
virtual ~FrameSequenceHandler ()
 
- Public Member Functions inherited from inet::ieee80211::IFrameSequenceHandler
virtual ~IFrameSequenceHandler ()
 

Protected Member Functions

virtual void startFrameSequenceStep ()
 
virtual void finishFrameSequenceStep ()
 
virtual void finishFrameSequence ()
 
virtual void abortFrameSequence ()
 

Protected Attributes

IFrameSequenceHandler::ICallbackcallback = nullptr
 
IFrameSequenceframeSequence = nullptr
 
FrameSequenceContextcontext = nullptr
 

Additional Inherited Members

- Static Public Attributes inherited from inet::ieee80211::IFrameSequenceHandler
static simsignal_t frameSequenceStartedSignal = cComponent::registerSignal("frameSequenceStarted")
 
static simsignal_t frameSequenceFinishedSignal = cComponent::registerSignal("frameSequenceFinished")
 

Constructor & Destructor Documentation

◆ ~FrameSequenceHandler()

inet::ieee80211::FrameSequenceHandler::~FrameSequenceHandler ( )
virtual
173 {
174  delete frameSequence;
175  delete context;
176 }

Member Function Documentation

◆ abortFrameSequence()

void inet::ieee80211::FrameSequenceHandler::abortFrameSequence ( )
protectedvirtual
150 {
151  EV_INFO << "Frame sequence aborted.\n";
152  auto inProgressFrames = context->getInProgressFrames();
153  auto step = context->getLastStep();
154  auto failedTxStep = check_and_cast<ITransmitStep *>(dynamic_cast<IReceiveStep *>(step) ? context->getStepBeforeLast() : step);
155  auto frameToTransmit = failedTxStep->getFrameToTransmit();
156  auto header = frameToTransmit->peekAtFront<Ieee80211MacHeader>();
157  if (auto dataOrMgmtHeader = dynamicPtrCast<const Ieee80211DataOrMgmtHeader>(header))
158  callback->originatorProcessFailedFrame(frameToTransmit);
159  else if (auto rtsTxStep = dynamic_cast<RtsTransmitStep *>(failedTxStep))
160  callback->originatorProcessRtsProtectionFailed(const_cast<Packet *>(rtsTxStep->getProtectedFrame()));
161  else if (auto blockAckReq = dynamicPtrCast<const Ieee80211BlockAckReq>(header))
162  callback->originatorProcessFailedFrame(frameToTransmit);
164  delete context;
165  delete frameSequence;
166  context = nullptr;
167  frameSequence = nullptr;
168  callback = nullptr;
169  inProgressFrames->clearDroppedFrames();
170 }

Referenced by finishFrameSequenceStep(), and handleStartRxTimeout().

◆ finishFrameSequence()

void inet::ieee80211::FrameSequenceHandler::finishFrameSequence ( )
protectedvirtual
137 {
138  EV_INFO << "Frame sequence finished.\n";
139  auto inProgressFrames = context->getInProgressFrames();
141  delete context;
142  delete frameSequence;
143  context = nullptr;
144  frameSequence = nullptr;
145  callback = nullptr;
146  inProgressFrames->clearDroppedFrames();
147 }

Referenced by startFrameSequenceStep().

◆ finishFrameSequenceStep()

void inet::ieee80211::FrameSequenceHandler::finishFrameSequenceStep ( )
protectedvirtual
107 {
108  ASSERT(isSequenceRunning());
109  auto lastStep = context->getLastStep();
110  auto stepResult = frameSequence->completeStep(context);
111  EV_INFO << "Finishing last frame sequence step: history = " << frameSequence->getHistory() << "\n";
112  if (!stepResult) {
113  lastStep->setCompletion(IFrameSequenceStep::Completion::REJECTED);
115  }
116  else {
117  lastStep->setCompletion(IFrameSequenceStep::Completion::ACCEPTED);
118  switch (lastStep->getType()) {
120  auto transmitStep = static_cast<ITransmitStep *>(lastStep);
121  callback->originatorProcessTransmittedFrame(transmitStep->getFrameToTransmit());
122  break;
123  }
125  auto receiveStep = static_cast<IReceiveStep *>(lastStep);
126  auto transmitStep = check_and_cast<ITransmitStep *>(context->getStepBeforeLast());
127  callback->originatorProcessReceivedFrame(receiveStep->getReceivedFrame(), transmitStep->getFrameToTransmit());
128  break;
129  }
130  default:
131  throw cRuntimeError("Unknown frame sequence step type");
132  }
133  }
134 }

Referenced by processResponse(), and transmissionComplete().

◆ getContext()

virtual const FrameSequenceContext* inet::ieee80211::FrameSequenceHandler::getContext ( ) const
inlineoverridevirtual

Implements inet::ieee80211::IFrameSequenceHandler.

32 { return context; }

◆ getFrameSequence()

virtual const IFrameSequence* inet::ieee80211::FrameSequenceHandler::getFrameSequence ( ) const
inlineoverridevirtual

◆ handleStartRxTimeout()

void inet::ieee80211::FrameSequenceHandler::handleStartRxTimeout ( )
overridevirtual

Implements inet::ieee80211::IFrameSequenceHandler.

18 {
19  auto lastStep = context->getLastStep();
20  switch (lastStep->getType()) {
23  break;
25  throw cRuntimeError("Received timeout while in transmit step");
26  default:
27  throw cRuntimeError("Unknown step type");
28  }
29 }

◆ isSequenceRunning()

virtual bool inet::ieee80211::FrameSequenceHandler::isSequenceRunning ( )
inlineoverridevirtual

◆ processResponse()

void inet::ieee80211::FrameSequenceHandler::processResponse ( Packet frame)
overridevirtual

Implements inet::ieee80211::IFrameSequenceHandler.

32 {
33  ASSERT(callback != nullptr);
34  auto lastStep = context->getLastStep();
35  switch (lastStep->getType()) {
37  // TODO check if not for us and abort
38  auto receiveStep = check_and_cast<IReceiveStep *>(context->getLastStep());
39  receiveStep->setFrameToReceive(frame);
41  if (isSequenceRunning())
43  break;
44  }
46  throw cRuntimeError("Received frame while current step is transmit");
47  default:
48  throw cRuntimeError("Unknown step type");
49  }
50 }

◆ startFrameSequence()

void inet::ieee80211::FrameSequenceHandler::startFrameSequence ( IFrameSequence frameSequence,
FrameSequenceContext context,
IFrameSequenceHandler::ICallback callback 
)
overridevirtual

Implements inet::ieee80211::IFrameSequenceHandler.

62 {
63  EV_INFO << "Starting frame sequence.\n";
64  this->callback = callback;
65  if (!isSequenceRunning()) {
67  this->context = context;
70  }
71  else
72  throw cRuntimeError("Channel access granted while a frame sequence is running");
73 }

◆ startFrameSequenceStep()

void inet::ieee80211::FrameSequenceHandler::startFrameSequenceStep ( )
protectedvirtual
76 {
77  ASSERT(isSequenceRunning());
78  auto nextStep = frameSequence->prepareStep(context);
79  EV_INFO << "Starting next frame sequence step: history = " << frameSequence->getHistory() << "\n";
80  if (nextStep == nullptr)
82  else {
83  context->addStep(nextStep);
84  switch (nextStep->getType()) {
86  auto transmitStep = static_cast<TransmitStep *>(nextStep);
87  EV_INFO << "Transmitting, frame = " << transmitStep->getFrameToTransmit() << ".\n";
88  callback->transmitFrame(transmitStep->getFrameToTransmit(), transmitStep->getIfs());
89  // TODO lifetime
90 // if (auto dataFrame = dynamic_cast<const Ptr<const Ieee80211DataHeader>& >(transmitStep->getFrameToTransmit()))
91 // transmitLifetimeHandler->frameTransmitted(dataFrame);
92  break;
93  }
95  // start reception timer, break loop if timer expires before reception is over
96  auto receiveStep = static_cast<IReceiveStep *>(nextStep);
97  callback->scheduleStartRxTimer(receiveStep->getTimeout());
98  break;
99  }
100  default:
101  throw cRuntimeError("Unknown frame sequence step type");
102  }
103  }
104 }

Referenced by processResponse(), startFrameSequence(), and transmissionComplete().

◆ transmissionComplete()

void inet::ieee80211::FrameSequenceHandler::transmissionComplete ( )
overridevirtual

Implements inet::ieee80211::IFrameSequenceHandler.

53 {
54  if (isSequenceRunning()) {
56  if (isSequenceRunning())
58  }
59 }

Member Data Documentation

◆ callback

◆ context

◆ frameSequence

IFrameSequence* inet::ieee80211::FrameSequenceHandler::frameSequence = nullptr
protected

The documentation for this class was generated from the following files:
inet::ieee80211::FrameSequenceHandler::startFrameSequenceStep
virtual void startFrameSequenceStep()
Definition: FrameSequenceHandler.cc:75
inet::ieee80211::IFrameSequenceHandler::ICallback::scheduleStartRxTimer
virtual void scheduleStartRxTimer(simtime_t timeout)=0
inet::ieee80211::IFrameSequenceHandler::ICallback::originatorProcessTransmittedFrame
virtual void originatorProcessTransmittedFrame(Packet *packet)=0
inet::ieee80211::IFrameSequence::startSequence
virtual void startSequence(FrameSequenceContext *context, int step)=0
inet::ieee80211::FrameSequenceHandler::finishFrameSequence
virtual void finishFrameSequence()
Definition: FrameSequenceHandler.cc:136
inet::ieee80211::IFrameSequenceStep::Completion::ACCEPTED
@ ACCEPTED
inet::ieee80211::IFrameSequenceHandler::ICallback::originatorProcessReceivedFrame
virtual void originatorProcessReceivedFrame(Packet *packet, Packet *lastTransmittedFrame)=0
inet::ieee80211::IFrameSequenceHandler::ICallback::originatorProcessFailedFrame
virtual void originatorProcessFailedFrame(Packet *packet)=0
inet::ieee80211::FrameSequenceContext::getInProgressFrames
virtual InProgressFrames * getInProgressFrames() const
Definition: FrameSequenceContext.h:80
inet::ieee80211::IFrameSequenceHandler::ICallback::frameSequenceFinished
virtual void frameSequenceFinished()=0
inet::ieee80211::FrameSequenceContext::getStepBeforeLast
virtual IFrameSequenceStep * getStepBeforeLast() const
Definition: FrameSequenceContext.h:78
inet::ieee80211::IFrameSequenceStep::Type::RECEIVE
@ RECEIVE
inet::ieee80211::FrameSequenceHandler::isSequenceRunning
virtual bool isSequenceRunning() override
Definition: FrameSequenceHandler.h:38
inet::ieee80211::FrameSequenceHandler::finishFrameSequenceStep
virtual void finishFrameSequenceStep()
Definition: FrameSequenceHandler.cc:106
inet::ieee80211::IFrameSequenceStep::Completion::REJECTED
@ REJECTED
inet::math::step
double step(double a, double b)
Definition: INETMath.h:131
inet::ieee80211::IFrameSequenceStep::Type::TRANSMIT
@ TRANSMIT
inet::ieee80211::FrameSequenceContext::addStep
virtual void addStep(IFrameSequenceStep *step)
Definition: FrameSequenceContext.h:74
inet::ieee80211::IFrameSequenceHandler::ICallback::originatorProcessRtsProtectionFailed
virtual void originatorProcessRtsProtectionFailed(Packet *packet)=0
inet::ieee80211::IFrameSequence::completeStep
virtual bool completeStep(FrameSequenceContext *context)=0
inet::ieee80211::FrameSequenceHandler::context
FrameSequenceContext * context
Definition: FrameSequenceHandler.h:23
inet::ieee80211::FrameSequenceHandler::callback
IFrameSequenceHandler::ICallback * callback
Definition: FrameSequenceHandler.h:21
inet::ieee80211::IFrameSequence::prepareStep
virtual IFrameSequenceStep * prepareStep(FrameSequenceContext *context)=0
inet::ieee80211::FrameSequenceContext::getLastStep
virtual IFrameSequenceStep * getLastStep() const
Definition: FrameSequenceContext.h:77
inet::ieee80211::IFrameSequenceHandler::ICallback::transmitFrame
virtual void transmitFrame(Packet *packet, simtime_t ifs)=0
inet::ieee80211::FrameSequenceHandler::abortFrameSequence
virtual void abortFrameSequence()
Definition: FrameSequenceHandler.cc:149
inet::ieee80211::FrameSequenceHandler::frameSequence
IFrameSequence * frameSequence
Definition: FrameSequenceHandler.h:22
inet::ieee80211::IFrameSequence::getHistory
virtual std::string getHistory() const =0