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

#include <MsduDeaggregation.h>

Inheritance diagram for inet::ieee80211::MsduDeaggregation:
inet::ieee80211::IMsduDeaggregation

Public Member Functions

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

Protected Member Functions

virtual void setExplodedFrameAddress (const Ptr< Ieee80211DataHeader > &header, const Ptr< const Ieee80211MsduSubframeHeader > &subframe, const Ptr< const Ieee80211DataHeader > &aMsduHeader)
 

Member Function Documentation

◆ deaggregateFrame()

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

Implements inet::ieee80211::IMsduDeaggregation.

44 {
45  EV_DEBUG << "Deaggregating A-MSDU " << *aggregatedFrame << " into multiple packets.\n";
46  std::vector<Packet *> *frames = new std::vector<Packet *>();
47  const auto& amsduHeader = aggregatedFrame->popAtFront<Ieee80211DataHeader>();
48  aggregatedFrame->popAtBack<Ieee80211MacTrailer>(B(4));
49  int tid = amsduHeader->getTid();
50  int paddingLength = 0;
51  cStringTokenizer tokenizer(aggregatedFrame->getName(), "+");
52  while (aggregatedFrame->getDataLength() > b(0)) {
53  aggregatedFrame->setFrontOffset(aggregatedFrame->getFrontOffset() + B(paddingLength == 4 ? 0 : paddingLength));
54  const auto& msduSubframeHeader = aggregatedFrame->popAtFront<Ieee80211MsduSubframeHeader>();
55  const auto& msdu = aggregatedFrame->peekDataAt(b(0), B(msduSubframeHeader->getLength()));
56  paddingLength = 4 - B(msduSubframeHeader->getChunkLength() + msdu->getChunkLength()).get() % 4;
57  aggregatedFrame->setFrontOffset(aggregatedFrame->getFrontOffset() + msdu->getChunkLength());
58  auto frame = new Packet();
59  frame->setName(tokenizer.nextToken());
60  frame->insertAtBack(msdu);
61  auto header = makeShared<Ieee80211DataHeader>();
62  header->setType(ST_DATA_WITH_QOS);
63  header->addChunkLength(QOSCONTROL_PART_LENGTH);
64  header->setToDS(amsduHeader->getToDS());
65  header->setFromDS(amsduHeader->getFromDS());
66  header->setTid(tid);
67  header->setSequenceNumber(SequenceNumberCyclic(0));
68  setExplodedFrameAddress(header, msduSubframeHeader, amsduHeader);
69  frame->insertAtFront(header);
70  frame->insertAtBack(makeShared<Ieee80211MacTrailer>());
71  EV_TRACE << "Created " << *frame << " from A-MSDU.\n";
72  frames->push_back(frame);
73  }
74  delete aggregatedFrame;
75  EV_TRACE << "Created " << frames->size() << " packets from A-MSDU.\n";
76  return frames;
77 }

◆ setExplodedFrameAddress()

void inet::ieee80211::MsduDeaggregation::setExplodedFrameAddress ( const Ptr< Ieee80211DataHeader > &  header,
const Ptr< const Ieee80211MsduSubframeHeader > &  subframe,
const Ptr< const Ieee80211DataHeader > &  aMsduHeader 
)
protectedvirtual
16 {
17  bool toDS = aMsduHeader->getToDS();
18  bool fromDS = aMsduHeader->getFromDS();
19  if (fromDS == 0 && toDS == 0) { // STA to STA
20  header->setTransmitterAddress(aMsduHeader->getTransmitterAddress());
21  header->setReceiverAddress(aMsduHeader->getReceiverAddress());
22  }
23  else if (fromDS == 1 && toDS == 0) { // AP to STA
24  header->setTransmitterAddress(aMsduHeader->getTransmitterAddress());
25  header->setReceiverAddress(subframeHeader->getDa());
26  header->setAddress3(subframeHeader->getSa());
27  }
28  else if (fromDS == 0 && toDS == 1) { // STA to AP
29  header->setTransmitterAddress(subframeHeader->getSa());
30  header->setReceiverAddress(aMsduHeader->getReceiverAddress());
31  header->setAddress3(subframeHeader->getDa());
32  }
33  else if (fromDS == 1 && toDS == 1) { // AP to AP
34  header->setReceiverAddress(aMsduHeader->getReceiverAddress());
35  header->setTransmitterAddress(aMsduHeader->getTransmitterAddress());
36  header->setAddress3(subframeHeader->getDa());
37  header->setAddress4(subframeHeader->getSa());
38  }
39  ASSERT(!header->getReceiverAddress().isUnspecified());
40  ASSERT(!header->getTransmitterAddress().isUnspecified());
41 }

Referenced by deaggregateFrame().


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::ieee80211::MsduDeaggregation::setExplodedFrameAddress
virtual void setExplodedFrameAddress(const Ptr< Ieee80211DataHeader > &header, const Ptr< const Ieee80211MsduSubframeHeader > &subframe, const Ptr< const Ieee80211DataHeader > &aMsduHeader)
Definition: MsduDeaggregation.cc:15
inet::units::values::b
value< int64_t, units::b > b
Definition: Units.h:1241
inet::ieee80211::ST_DATA_WITH_QOS
@ ST_DATA_WITH_QOS
Definition: Ieee80211Frame_m.h:169
inet::ieee80211::QOSCONTROL_PART_LENGTH
const b QOSCONTROL_PART_LENGTH
Definition: Ieee80211Frame_m.h:101