Add a fragment to the reassembly buffer.
If the new fragment completes a frame, then the reassembled frame is returned (and fragments are removed from the buffer), otherwise the function returns nullptr.
25 const auto& header = packet->peekAtFront<Ieee80211DataOrMgmtHeader>();
27 if (!header->getMoreFragments() && header->getFragmentNumber() == 0)
30 if (dynamicPtrCast<const Ieee80211MgmtHeader>(header))
34 key.macAddress = header->getTransmitterAddress();
37 if (
const Ptr<const Ieee80211DataHeader>& qosDataHeader = dynamicPtrCast<const Ieee80211DataHeader>(header))
38 key.tid = qosDataHeader->getTid();
39 key.seqNum = header->getSequenceNumber().get();
40 short fragNum = header->getFragmentNumber();
43 value.fragments.resize(16);
46 uint16_t fragmentBit = 1 << fragNum;
47 value.receivedFragments |= fragmentBit;
48 if (!header->getMoreFragments())
49 value.allFragments = (fragmentBit << 1) - 1;
50 if (!value.fragments[fragNum])
51 value.fragments[fragNum] = packet;
58 if (value.allFragments != 0 && value.allFragments == value.receivedFragments) {
59 Defragmentation defragmentation;
60 value.fragments.erase(
std::remove(value.fragments.begin(), value.fragments.end(),
nullptr), value.fragments.end());
61 auto defragmentedFrame = defragmentation.defragmentFrames(&value.fragments);
65 for (
auto fragment : value.fragments)
68 return defragmentedFrame;