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

#include <MpduDeaggregation.h>

Inheritance diagram for inet::ieee80211::MpduDeaggregation:
inet::ieee80211::IMpduDeaggregation

Public Member Functions

virtual std::vector< Packet * > * deaggregateFrame (Packet *frame) override
 
- Public Member Functions inherited from inet::ieee80211::IMpduDeaggregation
virtual ~IMpduDeaggregation ()
 

Member Function Documentation

◆ deaggregateFrame()

std::vector< Packet * > * inet::ieee80211::MpduDeaggregation::deaggregateFrame ( Packet frame)
overridevirtual

Implements inet::ieee80211::IMpduDeaggregation.

16 {
17  EV_DEBUG << "Deaggregating A-MPDU " << *aggregatedFrame << " into multiple packets.\n";
18  std::vector<Packet *> *frames = new std::vector<Packet *>();
19  int paddingLength = 0;
20  cStringTokenizer tokenizer(aggregatedFrame->getName(), "+");
21  while (aggregatedFrame->getDataLength() > b(0)) {
22  aggregatedFrame->setFrontOffset(aggregatedFrame->getFrontOffset() + B(paddingLength == 4 ? 0 : paddingLength));
23  const auto& mpduSubframeHeader = aggregatedFrame->popAtFront<Ieee80211MpduSubframeHeader>();
24  const auto& mpdu = aggregatedFrame->peekDataAt(b(0), B(mpduSubframeHeader->getLength()));
25  paddingLength = 4 - B(mpduSubframeHeader->getChunkLength() + mpdu->getChunkLength()).get() % 4;
26  aggregatedFrame->setFrontOffset(aggregatedFrame->getFrontOffset() + mpdu->getChunkLength());
27  auto frame = new Packet();
28  frame->setName(tokenizer.nextToken());
29  frame->insertAtBack(mpdu);
30  EV_TRACE << "Created " << *frame << " from A-MPDU.\n";
31  // TODO check CRC?
32  frames->push_back(frame);
33  }
34  delete aggregatedFrame;
35  EV_TRACE << "Created " << frames->size() << " packets from A-MPDU.\n";
36  return frames;
37 }

The documentation for this class was generated from the following files:
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::units::values::b
value< int64_t, units::b > b
Definition: Units.h:1241