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

#include <InProgressFrames.h>

Inheritance diagram for inet::ieee80211::InProgressFrames:

Public Member Functions

virtual ~InProgressFrames ()
 
virtual std::string str () const override
 
virtual void forEachChild (cVisitor *v) override
 
virtual int getLength () const
 
virtual PacketgetFrames (int i) const
 
virtual PacketgetFrameToTransmit ()
 
virtual PacketgetPendingFrameFor (Packet *frame)
 
virtual void dropFrame (Packet *packet)
 
virtual void dropFrames (std::set< std::pair< MacAddress, std::pair< Tid, SequenceControlField >>> seqAndFragNums)
 
virtual bool hasInProgressFrames ()
 
virtual std::vector< Packet * > getOutstandingFrames ()
 
virtual void clearDroppedFrames ()
 

Static Public Attributes

static simsignal_t packetEnqueuedSignal = cComponent::registerSignal("packetEnqueued")
 
static simsignal_t packetDequeuedSignal = cComponent::registerSignal("packetDequeued")
 

Protected Member Functions

virtual void initialize (int stage) override
 
virtual void updateDisplayString () const
 
void ensureHasFrameToTransmit ()
 
bool hasEligibleFrameToTransmit ()
 

Protected Attributes

queueing::IPacketQueuependingQueue = nullptr
 
IOriginatorMacDataServicedataService = nullptr
 
IAckHandlerackHandler = nullptr
 
std::vector< Packet * > inProgressFrames
 
std::vector< Packet * > droppedFrames
 

Constructor & Destructor Documentation

◆ ~InProgressFrames()

inet::ieee80211::InProgressFrames::~InProgressFrames ( )
virtual
176 {
177  for (auto frame : inProgressFrames)
178  delete frame;
179  for (auto frame : droppedFrames)
180  delete frame;
181 }

Member Function Documentation

◆ clearDroppedFrames()

void inet::ieee80211::InProgressFrames::clearDroppedFrames ( )
virtual
168 {
169  Enter_Method("clearDroppedFrames");
170  for (auto frame : droppedFrames)
171  delete frame;
172  droppedFrames.clear();
173 }

◆ dropFrame()

void inet::ieee80211::InProgressFrames::dropFrame ( Packet packet)
virtual
127 {
128  EV_DEBUG << "Dropping frame " << packet->getName() << ".\n";
129  inProgressFrames.erase(std::remove(inProgressFrames.begin(), inProgressFrames.end(), packet), inProgressFrames.end());
130  droppedFrames.push_back(packet);
132  emit(packetDequeuedSignal, packet);
133 }

◆ dropFrames()

void inet::ieee80211::InProgressFrames::dropFrames ( std::set< std::pair< MacAddress, std::pair< Tid, SequenceControlField >>>  seqAndFragNums)
virtual
136 {
137  for (auto it = inProgressFrames.begin(); it != inProgressFrames.end();) {
138  auto frame = *it;
139  auto header = frame->peekAtFront<Ieee80211MacHeader>();
140  if (header->getType() == ST_DATA_WITH_QOS) {
141  auto dataheader = CHK(dynamicPtrCast<const Ieee80211DataHeader>(header));
142  if (seqAndFragNums.count(std::make_pair(dataheader->getReceiverAddress(), std::make_pair(dataheader->getTid(), SequenceControlField(dataheader->getSequenceNumber().get(), dataheader->getFragmentNumber())))) != 0) {
143  EV_DEBUG << "Dropping frame " << frame->getName() << ".\n";
144  it = inProgressFrames.erase(it);
145  droppedFrames.push_back(frame);
147  emit(packetDequeuedSignal, frame);
148  }
149  else
150  it++;
151  }
152  else
153  it++;
154  }
155 }

◆ ensureHasFrameToTransmit()

void inet::ieee80211::InProgressFrames::ensureHasFrameToTransmit ( )
protected
62 {
63 // TODO delete old frames from inProgressFrames
64 // if (auto dataFrame = dynamic_cast<Ieee80211DataHeader*>(frame)) {
65 // if (transmitLifetimeHandler->isLifetimeExpired(dataFrame))
66 // return frame;
67 // }
70  if (frames) {
71  for (auto frame : *frames) {
72  EV_DEBUG << "Inserting frame " << frame->getName() << " extracted from MAC data service.\n";
73  take(frame);
74  ackHandler->frameGotInProgress(frame->peekAtFront<Ieee80211DataOrMgmtHeader>());
75  inProgressFrames.push_back(frame);
76  frame->setArrivalTime(simTime());
78  emit(packetEnqueuedSignal, frame);
79  }
80  delete frames;
81  }
82  }
83 }

Referenced by getFrameToTransmit().

◆ forEachChild()

void inet::ieee80211::InProgressFrames::forEachChild ( cVisitor *  v)
overridevirtual
46 {
47  cSimpleModule::forEachChild(v);
48  for (auto frame : inProgressFrames)
49  v->visit(frame);
50 }

◆ getFrames()

virtual Packet* inet::ieee80211::InProgressFrames::getFrames ( int  i) const
inlinevirtual
46 { return inProgressFrames[i]; }

◆ getFrameToTransmit()

◆ getLength()

virtual int inet::ieee80211::InProgressFrames::getLength ( ) const
inlinevirtual
45 { return inProgressFrames.size(); }

◆ getOutstandingFrames()

std::vector< Packet * > inet::ieee80211::InProgressFrames::getOutstandingFrames ( )
virtual
158 {
159  std::vector<Packet *> outstandingFrames;
160  for (auto frame : inProgressFrames) {
161  if (ackHandler->isOutstandingFrame(frame->peekAtFront<Ieee80211DataOrMgmtHeader>()))
162  outstandingFrames.push_back(frame);
163  }
164  return outstandingFrames;
165 }

Referenced by inet::ieee80211::OriginatorQosAckPolicy::getOutstandingFramesPerReceiver().

◆ getPendingFrameFor()

Packet * inet::ieee80211::InProgressFrames::getPendingFrameFor ( Packet frame)
virtual
96 {
97  auto frameToTransmit = getFrameToTransmit();
98  if (dynamicPtrCast<const Ieee80211RtsFrame>(frame->peekAtFront<Ieee80211MacHeader>()))
99  return frameToTransmit;
100  else {
101  for (auto frame : inProgressFrames) {
102  if (ackHandler->isEligibleToTransmit(frame->peekAtFront<Ieee80211DataOrMgmtHeader>()) && frameToTransmit != frame)
103  return frame;
104  }
106  if (frames) {
107  auto firstFrame = (*frames)[0];
108  for (auto frame : *frames) {
109  take(frame);
110  ackHandler->frameGotInProgress(frame->peekAtFront<Ieee80211DataOrMgmtHeader>());
111  inProgressFrames.push_back(frame);
112  frame->setArrivalTime(simTime());
114  emit(packetEnqueuedSignal, frame);
115  }
116  delete frames;
117  // FIXME If the next Txop sequence were a BlockAckReqBlockAckFs then this would return
118  // a wrong pending frame.
119  return firstFrame;
120  }
121  else
122  return nullptr;
123  }
124 }

◆ hasEligibleFrameToTransmit()

bool inet::ieee80211::InProgressFrames::hasEligibleFrameToTransmit ( )
protected
53 {
54  for (auto frame : inProgressFrames) {
55  if (ackHandler->isEligibleToTransmit(frame->peekAtFront<Ieee80211DataOrMgmtHeader>()))
56  return true;
57  }
58  return false;
59 }

Referenced by ensureHasFrameToTransmit().

◆ hasInProgressFrames()

◆ initialize()

void inet::ieee80211::InProgressFrames::initialize ( int  stage)
overrideprotectedvirtual
21 {
22  if (stage == INITSTAGE_LOCAL) {
23  pendingQueue = check_and_cast<queueing::IPacketQueue *>(getModuleByPath(par("pendingQueueModule")));
24  dataService = check_and_cast<IOriginatorMacDataService *>(getModuleByPath(par("originatorMacDataServiceModule")));
25  ackHandler = check_and_cast<IAckHandler *>(getModuleByPath(par("ackHandlerModule")));
27  }
28 }

◆ str()

std::string inet::ieee80211::InProgressFrames::str ( ) const
overridevirtual
37 {
38  if (inProgressFrames.size() == 0)
39  return std::string("empty");
40  std::stringstream out;
41  out << "length=" << inProgressFrames.size();
42  return out.str();
43 }

◆ updateDisplayString()

void inet::ieee80211::InProgressFrames::updateDisplayString ( ) const
protectedvirtual
31 {
32  std::string text = std::to_string(inProgressFrames.size()) + " packets";
33  getDisplayString().setTagArg("t", 0, text.c_str());
34 }

Referenced by dropFrame(), dropFrames(), ensureHasFrameToTransmit(), getPendingFrameFor(), and initialize().

Member Data Documentation

◆ ackHandler

IAckHandler* inet::ieee80211::InProgressFrames::ackHandler = nullptr
protected

◆ dataService

IOriginatorMacDataService* inet::ieee80211::InProgressFrames::dataService = nullptr
protected

◆ droppedFrames

std::vector<Packet *> inet::ieee80211::InProgressFrames::droppedFrames
protected

◆ inProgressFrames

◆ packetDequeuedSignal

simsignal_t inet::ieee80211::InProgressFrames::packetDequeuedSignal = cComponent::registerSignal("packetDequeued")
static

Referenced by dropFrame(), and dropFrames().

◆ packetEnqueuedSignal

simsignal_t inet::ieee80211::InProgressFrames::packetEnqueuedSignal = cComponent::registerSignal("packetEnqueued")
static

◆ pendingQueue

queueing::IPacketQueue* inet::ieee80211::InProgressFrames::pendingQueue = nullptr
protected

The documentation for this class was generated from the following files:
CHK
#define CHK(x)
Definition: INETDefs.h:87
inet::ieee80211::InProgressFrames::packetEnqueuedSignal
static simsignal_t packetEnqueuedSignal
Definition: InProgressFrames.h:23
inet::ieee80211::InProgressFrames::ensureHasFrameToTransmit
void ensureHasFrameToTransmit()
Definition: InProgressFrames.cc:61
inet::ieee80211::InProgressFrames::updateDisplayString
virtual void updateDisplayString() const
Definition: InProgressFrames.cc:30
inet::ieee80211::IAckHandler::frameGotInProgress
virtual void frameGotInProgress(const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)=0
inet::remove
void remove(std::vector< T > &v, const Tk &a)
Definition: stlutils.h:107
inet::ieee80211::InProgressFrames::packetDequeuedSignal
static simsignal_t packetDequeuedSignal
Definition: InProgressFrames.h:24
inet::ieee80211::InProgressFrames::inProgressFrames
std::vector< Packet * > inProgressFrames
Definition: InProgressFrames.h:30
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::ieee80211::InProgressFrames::droppedFrames
std::vector< Packet * > droppedFrames
Definition: InProgressFrames.h:31
inet::ieee80211::ST_DATA_WITH_QOS
@ ST_DATA_WITH_QOS
Definition: Ieee80211Frame_m.h:169
inet::ieee80211::InProgressFrames::pendingQueue
queueing::IPacketQueue * pendingQueue
Definition: InProgressFrames.h:27
inet::ieee80211::IOriginatorMacDataService::extractFramesToTransmit
virtual std::vector< Packet * > * extractFramesToTransmit(queueing::IPacketQueue *pendingQueue)=0
inet::ieee80211::IAckHandler::isOutstandingFrame
virtual bool isOutstandingFrame(const Ptr< const Ieee80211DataOrMgmtHeader > &header)=0
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::ieee80211::InProgressFrames::getFrameToTransmit
virtual Packet * getFrameToTransmit()
Definition: InProgressFrames.cc:85
inet::ieee80211::IAckHandler::isEligibleToTransmit
virtual bool isEligibleToTransmit(const Ptr< const Ieee80211DataOrMgmtHeader > &header)=0
inet::ieee80211::InProgressFrames::hasEligibleFrameToTransmit
bool hasEligibleFrameToTransmit()
Definition: InProgressFrames.cc:52
inet::ieee80211::InProgressFrames::dataService
IOriginatorMacDataService * dataService
Definition: InProgressFrames.h:28
inet::ieee80211::InProgressFrames::ackHandler
IAckHandler * ackHandler
Definition: InProgressFrames.h:29