48 if (
auto dataHeader = dynamicPtrCast<const inet::ieee80211::Ieee80211DataHeader>(header)) {
49 if (dataHeader->getMoreFragments() || dataHeader->getFragmentNumber() != 0)
50 callback.dissectPacket(packet,
nullptr);
51 else if (dataHeader->getAMsduPresent()) {
52 auto originalTrailerPopOffset = packet->getBackOffset();
53 int paddingLength = 0;
54 while (packet->getDataLength() >
B(0)) {
55 packet->setFrontOffset(packet->getFrontOffset() +
B(paddingLength == 4 ? 0 : paddingLength));
56 const auto& msduSubframeHeader = packet->popAtFront<ieee80211::Ieee80211MsduSubframeHeader>();
57 auto msduEndOffset = packet->getFrontOffset() +
B(msduSubframeHeader->getLength());
58 packet->setBackOffset(msduEndOffset);
60 paddingLength = 4 -
B(msduSubframeHeader->getChunkLength() +
B(msduSubframeHeader->getLength())).get() % 4;
61 packet->setBackOffset(originalTrailerPopOffset);
62 packet->setFrontOffset(msduEndOffset);
68 else if (dynamicPtrCast<const inet::ieee80211::Ieee80211ActionFrame>(header))
69 ASSERT(packet->getDataLength() ==
b(0));
70 else if (dynamicPtrCast<const inet::ieee80211::Ieee80211MgmtHeader>(header))
74 ASSERT(packet->getDataLength() ==
b(0));