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

#include <MsduAggregation.h>

Inheritance diagram for inet::ieee80211::MsduAggregation:
inet::ieee80211::IMsduAggregation

Public Member Functions

virtual PacketaggregateFrames (std::vector< Packet * > *frames) override
 
- Public Member Functions inherited from inet::ieee80211::IMsduAggregation
virtual ~IMsduAggregation ()
 

Protected Member Functions

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

Member Function Documentation

◆ aggregateFrames()

Packet * inet::ieee80211::MsduAggregation::aggregateFrames ( std::vector< Packet * > *  frames)
overridevirtual

Implements inet::ieee80211::IMsduAggregation.

47 {
48  EV_DEBUG << "Aggregating " << frames->size() << " packets into A-MSDU.\n";
49  auto firstFrame = frames->at(0);
50  auto firstHeader = firstFrame->peekAtFront<Ieee80211DataHeader>();
51  auto tid = firstHeader->getTid();
52  auto toDS = firstHeader->getToDS();
53  auto fromDS = firstHeader->getFromDS();
54  auto ra = firstHeader->getReceiverAddress();
55  auto aggregatedFrame = new Packet();
56  std::string aggregatedName;
57  for (int i = 0; i < (int)frames->size(); i++) {
58  auto msduSubframeHeader = makeShared<Ieee80211MsduSubframeHeader>();
59  auto frame = frames->at(i);
60  const auto& header = frame->popAtFront<Ieee80211DataHeader>();
61  frame->popAtBack<Ieee80211MacTrailer>(B(4));
62  auto msdu = frame->peekData();
63  msduSubframeHeader->setLength(B(msdu->getChunkLength()).get());
64  setSubframeAddress(msduSubframeHeader, header);
65  aggregatedFrame->insertAtBack(msduSubframeHeader);
66  aggregatedFrame->insertAtBack(msdu);
67  int paddingLength = 4 - B(msduSubframeHeader->getChunkLength() + msdu->getChunkLength()).get() % 4;
68  if (i != (int)frames->size() - 1 && paddingLength != 4) {
69  auto padding = makeShared<ByteCountChunk>(B(paddingLength));
70  aggregatedFrame->insertAtBack(padding);
71  }
72  if (i != 0)
73  aggregatedName.append("+");
74  aggregatedName.append(frame->getName());
75  delete frame;
76  }
77  // The MPDU containing the A-MSDU is carried in any of the following data frame subtypes: QoS Data,
78  // QoS Data + CF-Ack, QoS Data + CF-Poll, QoS Data + CF-Ack + CF-Poll. The A-MSDU structure is
79  // contained in the frame body of a single MPDU.
80  auto amsduHeader = makeShared<Ieee80211DataHeader>();
81  amsduHeader->setType(ST_DATA_WITH_QOS);
82  amsduHeader->setToDS(toDS);
83  amsduHeader->setFromDS(fromDS);
84  amsduHeader->setAMsduPresent(true);
85  amsduHeader->setReceiverAddress(ra);
86  amsduHeader->setTid(tid);
87  amsduHeader->addChunkLength(QOSCONTROL_PART_LENGTH);
88  // TODO set addr3 and addr4 according to fromDS and toDS.
89  aggregatedFrame->insertAtFront(amsduHeader);
90  aggregatedFrame->insertAtBack(makeShared<Ieee80211MacTrailer>());
91  aggregatedFrame->setName(aggregatedName.c_str());
92  EV_TRACE << "Created A-MSDU " << *aggregatedFrame << ".\n";
93  return aggregatedFrame;
94 }

◆ setSubframeAddress()

void inet::ieee80211::MsduAggregation::setSubframeAddress ( const Ptr< Ieee80211MsduSubframeHeader > &  subframe,
const Ptr< const Ieee80211DataHeader > &  header 
)
protectedvirtual
18 {
19  // Note: Addr1 (RA), Addr2 (TA)
20  // Table 8-19—Address field contents
21  MacAddress da, sa;
22  bool toDS = header->getToDS();
23  bool fromDS = header->getFromDS();
24  if (toDS == 0 && fromDS == 0) { // STA to STA
25  da = header->getReceiverAddress();
26  sa = header->getTransmitterAddress();
27  }
28  else if (toDS == 0 && fromDS == 1) { // AP to STA
29  da = header->getReceiverAddress();
30  sa = header->getAddress3();
31  }
32  else if (toDS == 1 && fromDS == 0) { // STA to AP
33  da = header->getAddress3();
34  sa = header->getTransmitterAddress();
35  }
36  else if (toDS == 1 && fromDS == 1) { // AP to AP
37  da = header->getAddress3();
38  sa = header->getAddress4();
39  }
40  ASSERT(!da.isUnspecified());
41  ASSERT(!sa.isUnspecified());
42  subframeHeader->setDa(da);
43  subframeHeader->setSa(sa);
44 }

Referenced by aggregateFrames().


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::MsduAggregation::setSubframeAddress
virtual void setSubframeAddress(const Ptr< Ieee80211MsduSubframeHeader > &subframe, const Ptr< const Ieee80211DataHeader > &header)
Definition: MsduAggregation.cc:17
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