aggregated MSDUs must not lose their tags
authorMirko Banchi <mk.banchi@gmail.com>
Wed Jun 03 20:58:39 2009 +0200 (8 months ago)
changeset 44993b5ef83fae25
parent 4498 1b3d01bd974d
child 4500 443df3250809
aggregated MSDUs must not lose their tags
src/devices/wifi/msdu-aggregator.cc
     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  }