From b082b99f1d266d1aca7bf9ed24f8bed8eda97c65 Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Sat, 5 Jun 2021 15:16:49 -0700 Subject: [PATCH] wifi: Avoid copy of Event::GetWifiTxVector --- src/wifi/model/interference-helper.cc | 23 ++++++++++------------- src/wifi/model/interference-helper.h | 2 +- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/wifi/model/interference-helper.cc b/src/wifi/model/interference-helper.cc index e8584d2e2..f2dd6ba8c 100644 --- a/src/wifi/model/interference-helper.cc +++ b/src/wifi/model/interference-helper.cc @@ -103,7 +103,7 @@ Event::GetRxPowerWPerBand (void) const return m_rxPowerW; } -WifiTxVector +const WifiTxVector& Event::GetTxVector (void) const { return m_txVector; @@ -420,16 +420,15 @@ InterferenceHelper::CalculatePayloadPer (Ptr event, uint16_t channe uint16_t staId, std::pair window) const { NS_LOG_FUNCTION (this << channelWidth << band.first << band.second << staId << window.first << window.second); - const WifiTxVector txVector = event->GetTxVector (); double psr = 1.0; /* Packet Success Rate */ auto ni_it = nis->find (band)->second; auto j = ni_it.begin (); Time previous = j->first; - WifiMode payloadMode = txVector.GetMode (staId); + WifiMode payloadMode = event->GetTxVector ().GetMode (staId); Time phyPayloadStart = j->first; if (event->GetPpdu ()->GetType () != WIFI_PPDU_TYPE_UL_MU) //j->first corresponds to the start of the UL-OFDMA payload { - phyPayloadStart = j->first + WifiPhy::CalculatePhyPreambleAndHeaderDuration (txVector); + phyPayloadStart = j->first + WifiPhy::CalculatePhyPreambleAndHeaderDuration (event->GetTxVector ()); } Time windowStart = phyPayloadStart + window.first; Time windowEnd = phyPayloadStart + window.second; @@ -440,17 +439,17 @@ InterferenceHelper::CalculatePayloadPer (Ptr event, uint16_t channe Time current = j->first; NS_LOG_DEBUG ("previous= " << previous << ", current=" << current); NS_ASSERT (current >= previous); - double snr = CalculateSnr (powerW, noiseInterferenceW, channelWidth, txVector.GetNss (staId)); + double snr = CalculateSnr (powerW, noiseInterferenceW, channelWidth, event->GetTxVector ().GetNss (staId)); //Case 1: Both previous and current point to the windowed payload if (previous >= windowStart) { - psr *= CalculatePayloadChunkSuccessRate (snr, Min (windowEnd, current) - previous, txVector, staId); + psr *= CalculatePayloadChunkSuccessRate (snr, Min (windowEnd, current) - previous, event->GetTxVector (), staId); NS_LOG_DEBUG ("Both previous and current point to the windowed payload: mode=" << payloadMode << ", psr=" << psr); } //Case 2: previous is before windowed payload and current is in the windowed payload else if (current >= windowStart) { - psr *= CalculatePayloadChunkSuccessRate (snr, Min (windowEnd, current) - windowStart, txVector, staId); + psr *= CalculatePayloadChunkSuccessRate (snr, Min (windowEnd, current) - windowStart, event->GetTxVector (), staId); NS_LOG_DEBUG ("previous is before windowed payload and current is in the windowed payload: mode=" << payloadMode << ", psr=" << psr); } noiseInterferenceW = j->second.GetPower () - powerW; @@ -471,7 +470,6 @@ InterferenceHelper::CalculatePhyHeaderSectionPsr (Ptr event, NiChan PhyEntity::PhyHeaderSections phyHeaderSections) const { NS_LOG_FUNCTION (this << band.first << band.second); - const WifiTxVector txVector = event->GetTxVector (); double psr = 1.0; /* Packet Success Rate */ auto ni_it = nis->find (band)->second; auto j = ni_it.begin (); @@ -505,12 +503,12 @@ InterferenceHelper::CalculatePhyHeaderSectionPsr (Ptr event, NiChan WifiMode mode = section.second.second; if (mode.GetModulationClass () < WIFI_MOD_CLASS_OFDM) { - psr *= CalculateChunkSuccessRate (snr, duration, mode, txVector, WIFI_PPDU_FIELD_NON_HT_HEADER); + psr *= CalculateChunkSuccessRate (snr, duration, mode, event->GetTxVector (), WIFI_PPDU_FIELD_NON_HT_HEADER); } else { //FIXME: this will be directly available with PHY refactoring, hence assume HT-SIG for now since error rate model do not differentiate these non-HT PHY headers yet - psr *= CalculateChunkSuccessRate (snr, duration, mode, txVector, WIFI_PPDU_FIELD_HT_SIG); + psr *= CalculateChunkSuccessRate (snr, duration, mode, event->GetTxVector (), WIFI_PPDU_FIELD_HT_SIG); } NS_LOG_DEBUG ("Current NI change in " << section.first << " [" << start << ", " << stop << "] for " << duration.As (Time::NS) << ": mode=" << mode << ", psr=" << psr); @@ -534,12 +532,11 @@ InterferenceHelper::CalculatePhyHeaderPer (Ptr event, NiChangesPerB WifiPpduField header) const { NS_LOG_FUNCTION (this << band.first << band.second << header); - const WifiTxVector txVector = event->GetTxVector (); auto ni_it = nis->find (band)->second; - auto phyEntity = WifiPhy::GetStaticPhyEntity (txVector.GetModulationClass ()); + auto phyEntity = WifiPhy::GetStaticPhyEntity (event->GetTxVector ().GetModulationClass ()); PhyEntity::PhyHeaderSections sections; - for (const auto & section : phyEntity->GetPhyHeaderSections (txVector, ni_it.begin ()->first)) + for (const auto & section : phyEntity->GetPhyHeaderSections (event->GetTxVector (), ni_it.begin ()->first)) { if (section.first == header) { diff --git a/src/wifi/model/interference-helper.h b/src/wifi/model/interference-helper.h index 511220a6b..34967bf8c 100644 --- a/src/wifi/model/interference-helper.h +++ b/src/wifi/model/interference-helper.h @@ -96,7 +96,7 @@ public: * * \return the TXVECTOR of the PPDU */ - WifiTxVector GetTxVector (void) const; + const WifiTxVector& GetTxVector (void) const; /** * Update the received power (W) for all bands, i.e. add up the received power * to the current received power, for each band.