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>();
64 header->setToDS(amsduHeader->getToDS());
65 header->setFromDS(amsduHeader->getFromDS());
67 header->setSequenceNumber(SequenceNumberCyclic(0));
69 frame->insertAtFront(header);
70 frame->insertAtBack(makeShared<Ieee80211MacTrailer>());
71 EV_TRACE <<
"Created " << *frame <<
" from A-MSDU.\n";
72 frames->push_back(frame);
74 delete aggregatedFrame;
75 EV_TRACE <<
"Created " << frames->size() <<
" packets from A-MSDU.\n";