From 2e370e908516d3266e4c7d938fcda3e308784475 Mon Sep 17 00:00:00 2001 From: Stefano Avallone Date: Mon, 28 Jan 2019 19:56:29 +0100 Subject: [PATCH] wifi: Install one MsduAggregator and MpduAggregator per station Hence, have them stored by the unique MacLow object --- src/wifi/model/mac-low.cc | 64 ++++++++++++++++++++---------- src/wifi/model/mac-low.h | 30 ++++++++++++++ src/wifi/model/qos-txop.cc | 43 ++++---------------- src/wifi/model/qos-txop.h | 30 -------------- src/wifi/model/regular-wifi-mac.cc | 26 +++++------- 5 files changed, 91 insertions(+), 102 deletions(-) diff --git a/src/wifi/model/mac-low.cc b/src/wifi/model/mac-low.cc index 9f37f110c..65e6a8b3d 100644 --- a/src/wifi/model/mac-low.cc +++ b/src/wifi/model/mac-low.cc @@ -107,7 +107,9 @@ private: MacLow::MacLow () - : m_normalAckTimeoutEvent (), + : m_msduAggregator (0), + m_mpduAggregator (0), + m_normalAckTimeoutEvent (), m_blockAckTimeoutEvent (), m_ctsTimeoutEvent (), m_sendCtsEvent (), @@ -182,6 +184,8 @@ MacLow::DoDispose (void) m_sendDataEvent.Cancel (); m_waitIfsEvent.Cancel (); m_endTxNoAckEvent.Cancel (); + m_msduAggregator = 0; + m_mpduAggregator = 0; m_phy = 0; m_stationManager = 0; if (m_phyMacLowListener != 0) @@ -284,6 +288,32 @@ MacLow::SetWifiRemoteStationManager (const Ptr manager m_stationManager = manager; } +Ptr +MacLow::GetMsduAggregator (void) const +{ + return m_msduAggregator; +} + +Ptr +MacLow::GetMpduAggregator (void) const +{ + return m_mpduAggregator; +} + +void +MacLow::SetMsduAggregator (const Ptr aggr) +{ + NS_LOG_FUNCTION (this << aggr); + m_msduAggregator = aggr; +} + +void +MacLow::SetMpduAggregator (const Ptr aggr) +{ + NS_LOG_FUNCTION (this << aggr); + m_mpduAggregator = aggr; +} + void MacLow::SetAddress (Mac48Address ad) { @@ -568,14 +598,13 @@ MacLow::StartTransmission (Ptr packet, m_txParams.EnableAck (); } AcIndex ac = QosUtilsMapTidToAc (GetTid (packet, *hdr)); - std::map >::const_iterator edcaIt = m_edca.find (ac); Ptr aggregatedPacket = Create (); for (uint32_t i = 0; i < sentMpdus; i++) { Ptr newPacket = (m_txPackets[GetTid (packet, *hdr)].at (i).packet)->Copy (); newPacket->AddHeader (m_txPackets[GetTid (packet, *hdr)].at (i).hdr); AddWifiMacTrailer (newPacket); - edcaIt->second->GetMpduAggregator ()->Aggregate (newPacket, aggregatedPacket, GetMaxAmpduSize (ac)); + m_mpduAggregator->Aggregate (newPacket, aggregatedPacket, GetMaxAmpduSize (ac)); } m_currentPacket = aggregatedPacket; m_currentHdr = (m_txPackets[GetTid (packet, *hdr)].at (0).hdr); @@ -1600,10 +1629,6 @@ MacLow::ForwardDown (Ptr packet, const WifiMacHeader* hdr, WifiTxV bool last = false; MpduType mpdutype = NORMAL_MPDU; - uint8_t tid = GetTid (packet, *hdr); - AcIndex ac = QosUtilsMapTidToAc (tid); - std::map >::const_iterator edcaIt = m_edca.find (ac); - if (queueSize == 1) { singleMpdu = true; @@ -1631,7 +1656,7 @@ MacLow::ForwardDown (Ptr packet, const WifiMacHeader* hdr, WifiTxV mpdutype = LAST_MPDU_IN_AGGREGATE; } - edcaIt->second->GetMpduAggregator ()->AddHeaderAndPad (newPacket, last, singleMpdu); + m_mpduAggregator->AddHeaderAndPad (newPacket, last, singleMpdu); if (delay.IsZero ()) { @@ -2788,7 +2813,6 @@ MacLow::StopMpduAggregation (Ptr peekedPacket, WifiMacHeader peeke Time aPPDUMaxTime = MicroSeconds (5484); uint8_t tid = GetTid (peekedPacket, peekedHdr); AcIndex ac = QosUtilsMapTidToAc (tid); - std::map >::const_iterator edcaIt = m_edca.find (ac); if (m_stationManager->GetGreenfieldSupported ()) { @@ -2802,7 +2826,7 @@ MacLow::StopMpduAggregation (Ptr peekedPacket, WifiMacHeader peeke return true; } - if (!edcaIt->second->GetMpduAggregator ()->CanBeAggregated (peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, aggregatedPacket, blockAckSize, GetMaxAmpduSize (ac))) + if (!m_mpduAggregator->CanBeAggregated (peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, aggregatedPacket, blockAckSize, GetMaxAmpduSize (ac))) { NS_LOG_DEBUG ("no more packets can be aggregated because the maximum A-MPDU size has been reached"); return true; @@ -2843,7 +2867,7 @@ MacLow::AggregateToAmpdu (Ptr packet, const WifiMacHeader hdr) NS_ASSERT (edcaIt != m_edca.end ()); queue = edcaIt->second->GetWifiMacQueue (); - if (!hdr.GetAddr1 ().IsBroadcast () && edcaIt->second->GetMpduAggregator () != 0) + if (!hdr.GetAddr1 ().IsBroadcast () && m_mpduAggregator != 0) { //Have to make sure that the block ACK agreement is established before sending an AMPDU if (edcaIt->second->GetBaAgreementEstablished (hdr.GetAddr1 (), tid)) @@ -2871,7 +2895,7 @@ MacLow::AggregateToAmpdu (Ptr packet, const WifiMacHeader hdr) newPacket->AddHeader (peekedHdr); AddWifiMacTrailer (newPacket); - aggregated = edcaIt->second->GetMpduAggregator ()->Aggregate (newPacket, currentAggregatedPacket, GetMaxAmpduSize (ac)); + aggregated = m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket, GetMaxAmpduSize (ac)); if (aggregated) { @@ -2904,7 +2928,7 @@ MacLow::AggregateToAmpdu (Ptr packet, const WifiMacHeader hdr) currentSequenceNumber = edcaIt->second->PeekNextSequenceNumberFor (&peekedHdr); /* here is performed MSDU aggregation (two-level aggregation) */ - if (peekedPacket != 0 && edcaIt->second->GetMsduAggregator () != 0) + if (peekedPacket != 0 && m_msduAggregator != 0) { tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize); if (tempPacket != 0) //MSDU aggregation @@ -2945,7 +2969,7 @@ MacLow::AggregateToAmpdu (Ptr packet, const WifiMacHeader hdr) newPacket->AddHeader (peekedHdr); AddWifiMacTrailer (newPacket); - aggregated = edcaIt->second->GetMpduAggregator ()->Aggregate (newPacket, currentAggregatedPacket, GetMaxAmpduSize (ac)); + aggregated = m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket, GetMaxAmpduSize (ac)); if (aggregated) { m_aggregateQueue[tid]->Enqueue (Create (aggPacket, peekedHdr)); @@ -3001,7 +3025,7 @@ MacLow::AggregateToAmpdu (Ptr packet, const WifiMacHeader hdr) tstamp = item->GetTimeStamp (); currentSequenceNumber = edcaIt->second->PeekNextSequenceNumberFor (&peekedHdr); - if (edcaIt->second->GetMsduAggregator () != 0) + if (m_msduAggregator != 0) { tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize); if (tempPacket != 0) //MSDU aggregation @@ -3027,7 +3051,7 @@ MacLow::AggregateToAmpdu (Ptr packet, const WifiMacHeader hdr) tstamp = item->GetTimeStamp (); currentSequenceNumber = edcaIt->second->PeekNextSequenceNumberFor (&peekedHdr); - if (edcaIt->second->GetMsduAggregator () != 0 && IsInWindow (currentSequenceNumber, startingSequenceNumber, maxMpdus)) + if (m_msduAggregator != 0 && IsInWindow (currentSequenceNumber, startingSequenceNumber, maxMpdus)) { tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize); if (tempPacket != 0) //MSDU aggregation @@ -3053,7 +3077,7 @@ MacLow::AggregateToAmpdu (Ptr packet, const WifiMacHeader hdr) m_aggregateQueue[tid]->Enqueue (Create (aggPacket, peekedHdr)); newPacket->AddHeader (peekedHdr); AddWifiMacTrailer (newPacket); - edcaIt->second->GetMpduAggregator ()->Aggregate (newPacket, currentAggregatedPacket, GetMaxAmpduSize (ac)); + m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket, GetMaxAmpduSize (ac)); currentAggregatedPacket->AddHeader (blockAckReq); } @@ -3095,7 +3119,7 @@ MacLow::AggregateToAmpdu (Ptr packet, const WifiMacHeader hdr) peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK); currentAggregatedPacket = Create (); - edcaIt->second->GetMpduAggregator ()->AggregateSingleMpdu (packet, currentAggregatedPacket); + m_mpduAggregator->AggregateSingleMpdu (packet, currentAggregatedPacket); m_aggregateQueue[tid]->Enqueue (Create (packet, peekedHdr)); if (m_txParams.MustSendRts ()) { @@ -3166,7 +3190,7 @@ MacLow::PerformMsduAggregation (Ptr packet, WifiMacHeader *hdr, Ti *hdr = peekedItem->GetHeader (); } - edcaIt->second->GetMsduAggregator ()->Aggregate (packet, currentAmsduPacket, + m_msduAggregator->Aggregate (packet, currentAmsduPacket, edcaIt->second->MapSrcAddressForAggregation (*hdr), edcaIt->second->MapDestAddressForAggregation (*hdr), GetMaxAmsduSize (ac)); @@ -3178,7 +3202,7 @@ MacLow::PerformMsduAggregation (Ptr packet, WifiMacHeader *hdr, Ti *tstamp = peekedItem->GetTimeStamp (); tempPacket = currentAmsduPacket; - msduAggregation = edcaIt->second->GetMsduAggregator ()->Aggregate (peekedItem->GetPacket (), tempPacket, + msduAggregation = m_msduAggregator->Aggregate (peekedItem->GetPacket (), tempPacket, edcaIt->second->MapSrcAddressForAggregation (*hdr), edcaIt->second->MapDestAddressForAggregation (*hdr), GetMaxAmsduSize (ac)); diff --git a/src/wifi/model/mac-low.h b/src/wifi/model/mac-low.h index f69b3c681..16cfb7699 100644 --- a/src/wifi/model/mac-low.h +++ b/src/wifi/model/mac-low.h @@ -52,6 +52,8 @@ class MgtAddBaResponseHeader; class WifiRemoteStationManager; class CtrlBAckRequestHeader; class CtrlBAckResponseHeader; +class MsduAggregator; +class MpduAggregator; /** * \ingroup wifi @@ -461,6 +463,31 @@ public: */ uint32_t GetMaxAmpduSize (AcIndex ac) const; + /** + * Returns the aggregator used to construct A-MSDU subframes. + * + * \return the aggregator used to construct A-MSDU subframes. + */ + Ptr GetMsduAggregator (void) const; + /** + * Returns the aggregator used to construct A-MPDU subframes. + * + * \return the aggregator used to construct A-MPDU subframes. + */ + Ptr GetMpduAggregator (void) const; + + /** + * Set the aggregator used to construct A-MSDU subframes. + * + * \param aggr pointer to the MSDU aggregator. + */ + void SetMsduAggregator (const Ptr aggr); + /** + * Set the aggregator used to construct A-MPDU subframes. + * + * \param aggr pointer to the MPDU aggregator. + */ + void SetMpduAggregator (const Ptr aggr); private: /** @@ -924,6 +951,9 @@ private: typedef std::vector > ChannelAccessManagers; ChannelAccessManagers m_channelAccessManagers; //!< List of ChannelAccessManager + Ptr m_msduAggregator; //!< A-MSDU aggregator + Ptr m_mpduAggregator; //!< A-MPDU aggregator + EventId m_normalAckTimeoutEvent; //!< Normal ACK timeout event EventId m_blockAckTimeoutEvent; //!< Block ACK timeout event EventId m_ctsTimeoutEvent; //!< CTS timeout event diff --git a/src/wifi/model/qos-txop.cc b/src/wifi/model/qos-txop.cc index 01bb1cf2c..07b9d5edb 100644 --- a/src/wifi/model/qos-txop.cc +++ b/src/wifi/model/qos-txop.cc @@ -88,9 +88,7 @@ QosTxop::GetTypeId (void) } QosTxop::QosTxop () - : m_msduAggregator (0), - m_mpduAggregator (0), - m_typeOfStation (STA), + : m_typeOfStation (STA), m_blockAckType (COMPRESSED_BLOCK_ACK), m_startTxop (Seconds (0)), m_isAccessRequestedForRts (false), @@ -119,8 +117,6 @@ QosTxop::DoDispose (void) NS_LOG_FUNCTION (this); m_baManager = 0; m_qosBlockedDestinations = 0; - m_msduAggregator = 0; - m_mpduAggregator = 0; Txop::DoDispose (); } @@ -298,16 +294,17 @@ QosTxop::NotifyAccessGranted (void) m_currentIsFragmented = false; WifiMacHeader peekedHdr; Ptr item; + Ptr msduAggregator = GetLow ()->GetMsduAggregator (); if (m_currentHdr.IsQosData () && (item = m_queue->PeekByTidAndAddress (m_currentHdr.GetQosTid (), m_currentHdr.GetAddr1 ())) && !m_currentHdr.GetAddr1 ().IsBroadcast () - && m_msduAggregator != 0 && !m_currentHdr.IsRetry ()) + && msduAggregator != 0 && !m_currentHdr.IsRetry ()) { peekedHdr = item->GetHeader (); /* here is performed aggregation */ Ptr currentAggregatedPacket = Create (); - m_msduAggregator->Aggregate (m_currentPacket, currentAggregatedPacket, + msduAggregator->Aggregate (m_currentPacket, currentAggregatedPacket, MapSrcAddressForAggregation (peekedHdr), MapDestAddressForAggregation (peekedHdr), GetLow ()->GetMaxAmsduSize (QosUtilsMapTidToAc (m_currentHdr.GetQosTid ()))); @@ -318,7 +315,7 @@ QosTxop::NotifyAccessGranted (void) while (peekedItem != 0) { peekedHdr = peekedItem->GetHeader (); - aggregated = m_msduAggregator->Aggregate (peekedItem->GetPacket (), currentAggregatedPacket, + aggregated = msduAggregator->Aggregate (peekedItem->GetPacket (), currentAggregatedPacket, MapSrcAddressForAggregation (peekedHdr), MapDestAddressForAggregation (peekedHdr), GetLow ()->GetMaxAmsduSize (QosUtilsMapTidToAc (m_currentHdr.GetQosTid ()))); @@ -829,18 +826,6 @@ QosTxop::MissedBlockAck (uint8_t nMpdus) RestartAccessIfNeeded (); } -Ptr -QosTxop::GetMsduAggregator (void) const -{ - return m_msduAggregator; -} - -Ptr -QosTxop::GetMpduAggregator (void) const -{ - return m_mpduAggregator; -} - void QosTxop::RestartAccessIfNeeded (void) { @@ -1336,20 +1321,6 @@ QosTxop::MapDestAddressForAggregation (const WifiMacHeader &hdr) return retval; } -void -QosTxop::SetMsduAggregator (const Ptr aggr) -{ - NS_LOG_FUNCTION (this << aggr); - m_msduAggregator = aggr; -} - -void -QosTxop::SetMpduAggregator (const Ptr aggr) -{ - NS_LOG_FUNCTION (this << aggr); - m_mpduAggregator = aggr; -} - void QosTxop::PushFront (Ptr packet, const WifiMacHeader &hdr) { @@ -1424,7 +1395,7 @@ QosTxop::VerifyBlockAck (void) m_baManager->SwitchToBlockAckIfNeeded (recipient, tid, sequence); } if ((m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED)) - && (GetMpduAggregator () == 0 || GetLow ()->GetMaxAmpduSize (QosUtilsMapTidToAc (tid)) == 0)) + && (GetLow ()->GetMpduAggregator () == 0 || GetLow ()->GetMaxAmpduSize (QosUtilsMapTidToAc (tid)) == 0)) { m_currentHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK); } @@ -1481,7 +1452,7 @@ QosTxop::SetupBlockAckIfNeeded (void) Mac48Address recipient = m_currentHdr.GetAddr1 (); uint32_t packets = m_queue->GetNPacketsByTidAndAddress (tid, recipient); if ((GetBlockAckThreshold () > 0 && packets >= GetBlockAckThreshold ()) - || (m_mpduAggregator != 0 && GetLow ()->GetMaxAmpduSize (QosUtilsMapTidToAc (tid)) > 0 && packets > 1) + || (GetLow ()->GetMpduAggregator () != 0 && GetLow ()->GetMaxAmpduSize (QosUtilsMapTidToAc (tid)) > 0 && packets > 1) || m_stationManager->GetVhtSupported () || m_stationManager->GetHeSupported ()) { diff --git a/src/wifi/model/qos-txop.h b/src/wifi/model/qos-txop.h index c521424f6..e24bbb97c 100644 --- a/src/wifi/model/qos-txop.h +++ b/src/wifi/model/qos-txop.h @@ -34,8 +34,6 @@ class HeAggregationTest; namespace ns3 { class QosBlockedDestinations; -class MsduAggregator; -class MpduAggregator; class MgtAddBaResponseHeader; class MgtDelBaHeader; class AggregationCapableTransmissionListener; @@ -132,19 +130,6 @@ public: */ TypeOfStation GetTypeOfStation (void) const; - /** - * Returns the aggregator used to construct A-MSDU subframes. - * - * \return the aggregator used to construct A-MSDU subframes. - */ - Ptr GetMsduAggregator (void) const; - /** - * Returns the aggregator used to construct A-MPDU subframes. - * - * \return the aggregator used to construct A-MPDU subframes. - */ - Ptr GetMpduAggregator (void) const; - /** * \param address recipient address of the peer station * \param tid traffic ID. @@ -281,19 +266,6 @@ public: */ void SetAccessCategory (AcIndex ac); - /** - * Set the aggregator used to construct A-MSDU subframes. - * - * \param aggr pointer to the MSDU aggregator. - */ - void SetMsduAggregator (const Ptr aggr); - /** - * Set the aggregator used to construct A-MPDU subframes. - * - * \param aggr pointer to the MPDU aggregator. - */ - void SetMpduAggregator (const Ptr aggr); - /** * \param packet packet to send. * \param hdr header of packet to send. @@ -589,8 +561,6 @@ private: void DoInitialize (void); AcIndex m_ac; //!< the access category - Ptr m_msduAggregator; //!< A-MSDU aggregator - Ptr m_mpduAggregator; //!< A-MPDU aggregator TypeOfStation m_typeOfStation; //!< the type of station Ptr m_qosBlockedDestinations; //!< QOS blocked destinations Ptr m_baManager; //!< the Block ACK manager diff --git a/src/wifi/model/regular-wifi-mac.cc b/src/wifi/model/regular-wifi-mac.cc index 3c9013d4d..c3d879362 100644 --- a/src/wifi/model/regular-wifi-mac.cc +++ b/src/wifi/model/regular-wifi-mac.cc @@ -1318,18 +1318,15 @@ void RegularWifiMac::EnableAggregation (void) { NS_LOG_FUNCTION (this); - for (EdcaQueues::const_iterator i = m_edca.begin (); i != m_edca.end (); ++i) + if (m_low->GetMsduAggregator () == 0) { - if (i->second->GetMsduAggregator () == 0) - { - Ptr msduAggregator = CreateObject (); - i->second->SetMsduAggregator (msduAggregator); - } - if (i->second->GetMpduAggregator () == 0) - { - Ptr mpduAggregator = CreateObject (); - i->second->SetMpduAggregator (mpduAggregator); - } + Ptr msduAggregator = CreateObject (); + m_low->SetMsduAggregator (msduAggregator); + } + if (m_low->GetMpduAggregator () == 0) + { + Ptr mpduAggregator = CreateObject (); + m_low->SetMpduAggregator (mpduAggregator); } } @@ -1337,11 +1334,8 @@ void RegularWifiMac::DisableAggregation (void) { NS_LOG_FUNCTION (this); - for (EdcaQueues::const_iterator i = m_edca.begin (); i != m_edca.end (); ++i) - { - i->second->SetMsduAggregator (0); - i->second->SetMpduAggregator (0); - } + m_low->SetMsduAggregator (0); + m_low->SetMpduAggregator (0); } } //namespace ns3