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());
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);
73 aggregatedName.append(
"+");
74 aggregatedName.append(frame->getName());
80 auto amsduHeader = makeShared<Ieee80211DataHeader>();
82 amsduHeader->setToDS(toDS);
83 amsduHeader->setFromDS(fromDS);
84 amsduHeader->setAMsduPresent(
true);
85 amsduHeader->setReceiverAddress(ra);
86 amsduHeader->setTid(tid);
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;