1.1 --- a/src/devices/wifi/msdu-aggregator.cc Wed Jun 03 17:42:22 2009 +0200
1.2 +++ b/src/devices/wifi/msdu-aggregator.cc Wed Jun 03 20:58:39 2009 +0200
1.3 @@ -44,33 +44,31 @@
1.4 DeaggregatedMsdus set;
1.5
1.6 AmsduSubframeHeader hdr;
1.7 + Ptr<Packet> extractedMsdu = Create<Packet> ();
1.8 uint32_t maxSize = aggregatedPacket->GetSize ();
1.9 - // The worst condition is: two aggregated packets with no padding.
1.10 - // 28 bytes is the size of two Amsdu subframe headers.
1.11 - uint8_t *buffer = new uint8_t[maxSize-28];
1.12 + uint16_t extractedLength;
1.13 uint32_t padding;
1.14 uint32_t deserialized = 0;
1.15
1.16 while (deserialized < maxSize)
1.17 {
1.18 deserialized += aggregatedPacket->RemoveHeader (hdr);
1.19 - deserialized += aggregatedPacket->CopyData (buffer, hdr.GetLength ());
1.20 - aggregatedPacket->RemoveAtStart (hdr.GetLength ());
1.21 + extractedLength = hdr.GetLength ();
1.22 + extractedMsdu = aggregatedPacket->CreateFragment (0, static_cast<uint32_t>(extractedLength));
1.23 + aggregatedPacket->RemoveAtStart (extractedLength);
1.24 + deserialized += extractedLength;
1.25
1.26 - padding = (4 - ((hdr.GetLength () + 14) %4 )) % 4;
1.27 + padding = (4 - ((extractedLength + 14) %4 )) % 4;
1.28
1.29 if (padding > 0 && deserialized < maxSize)
1.30 {
1.31 aggregatedPacket->RemoveAtStart (padding);
1.32 deserialized += padding;
1.33 }
1.34 - //a new packet is created with the content of extracted msdu
1.35 - Ptr<Packet> p = Create<Packet> (buffer, hdr.GetLength ());
1.36
1.37 - std::pair<Ptr<Packet>, AmsduSubframeHeader> packetHdr (p,hdr);
1.38 + std::pair<Ptr<Packet>, AmsduSubframeHeader> packetHdr (extractedMsdu, hdr);
1.39 set.push_back (packetHdr);
1.40 }
1.41 - delete [] buffer;
1.42 NS_LOG_INFO ("Deaggreated A-MSDU: extracted "<< set.size () << " MSDUs");
1.43 return set;
1.44 }