diff --git a/src/devices/wifi/msdu-aggregator.cc b/src/devices/wifi/msdu-aggregator.cc index ce7f3f436..889fca23f 100644 --- a/src/devices/wifi/msdu-aggregator.cc +++ b/src/devices/wifi/msdu-aggregator.cc @@ -44,33 +44,31 @@ MsduAggregator::Deaggregate (Ptr aggregatedPacket) DeaggregatedMsdus set; AmsduSubframeHeader hdr; + Ptr extractedMsdu = Create (); uint32_t maxSize = aggregatedPacket->GetSize (); - // The worst condition is: two aggregated packets with no padding. - // 28 bytes is the size of two Amsdu subframe headers. - uint8_t *buffer = new uint8_t[maxSize-28]; + uint16_t extractedLength; uint32_t padding; uint32_t deserialized = 0; while (deserialized < maxSize) { deserialized += aggregatedPacket->RemoveHeader (hdr); - deserialized += aggregatedPacket->CopyData (buffer, hdr.GetLength ()); - aggregatedPacket->RemoveAtStart (hdr.GetLength ()); + extractedLength = hdr.GetLength (); + extractedMsdu = aggregatedPacket->CreateFragment (0, static_cast(extractedLength)); + aggregatedPacket->RemoveAtStart (extractedLength); + deserialized += extractedLength; - padding = (4 - ((hdr.GetLength () + 14) %4 )) % 4; + padding = (4 - ((extractedLength + 14) %4 )) % 4; if (padding > 0 && deserialized < maxSize) { aggregatedPacket->RemoveAtStart (padding); deserialized += padding; } - //a new packet is created with the content of extracted msdu - Ptr p = Create (buffer, hdr.GetLength ()); - std::pair, AmsduSubframeHeader> packetHdr (p,hdr); + std::pair, AmsduSubframeHeader> packetHdr (extractedMsdu, hdr); set.push_back (packetHdr); } - delete [] buffer; NS_LOG_INFO ("Deaggreated A-MSDU: extracted "<< set.size () << " MSDUs"); return set; }