diff --git a/RELEASE_NOTES b/RELEASE_NOTES index a493078b4..df213b966 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -39,6 +39,7 @@ Bugs fixed - Bug 2138 - SimpleNetDevice could send overlapped packets - Bug 2153 - Incorrect power limits in wifi power control algorithms - Bug 2154 - Incorrect power calculation in wifi power adaptation examples +- Bug 2156 - Duplicate packets when using two level aggregation Known issues ------------ diff --git a/src/wifi/model/mac-low.cc b/src/wifi/model/mac-low.cc index e59e4bc17..95d5d4bd0 100644 --- a/src/wifi/model/mac-low.cc +++ b/src/wifi/model/mac-low.cc @@ -3046,13 +3046,16 @@ MacLow::PerformMsduAggregation (Ptr packet, WifiMacHeader *hdr, Ti std::map::const_iterator listenerIt = m_edcaListeners.find (ac); NS_ASSERT (listenerIt != m_edcaListeners.end ()); queue = listenerIt->second->GetQueue (); + + Ptr peekedPacket = queue->DequeueByTidAndAddress (hdr, hdr->GetQosTid (), + WifiMacHeader::ADDR1, hdr->GetAddr1 ()); listenerIt->second->GetMsduAggregator ()->Aggregate (packet, currentAmsduPacket, listenerIt->second->GetSrcAddressForAggregation (*hdr), listenerIt->second->GetDestAddressForAggregation (*hdr)); - Ptr peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), - WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp); + peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), + WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp); while (peekedPacket != 0) { tempPacket = currentAmsduPacket; @@ -3083,6 +3086,7 @@ MacLow::PerformMsduAggregation (Ptr packet, WifiMacHeader *hdr, Ti } else { + queue->PushFront (packet, *hdr); return 0; } } diff --git a/src/wifi/test/wifi-aggregation-test.cc b/src/wifi/test/wifi-aggregation-test.cc index f53287ba4..048c00fb7 100644 --- a/src/wifi/test/wifi-aggregation-test.cc +++ b/src/wifi/test/wifi-aggregation-test.cc @@ -132,7 +132,7 @@ TwoLevelAggregationTest::DoRun (void) bool result = (packet != 0); NS_TEST_EXPECT_MSG_EQ (result, true, "aggregation failed"); NS_TEST_EXPECT_MSG_EQ (packet->GetSize (), 3030, "wrong packet size"); - NS_TEST_EXPECT_MSG_EQ (m_edca->GetEdcaQueue ()->GetSize (), 1, "removing packet from EDCA queue failed"); + NS_TEST_EXPECT_MSG_EQ (m_edca->GetEdcaQueue ()->GetSize (), 0, "aggregated packets not removed from the queue"); //-----------------------------------------------------------------------------------------------------