From 2df30d6838e4fefa173052f00aeb8a9795f693c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deronne?= Date: Sun, 5 Feb 2023 14:12:22 +0100 Subject: [PATCH] wifi: Only update bands tracked by interference helper if needed --- src/wifi/model/interference-helper.cc | 7 +++++++ src/wifi/model/interference-helper.h | 9 +++++++++ src/wifi/model/spectrum-wifi-phy.cc | 23 ++++++++++++++++++----- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/wifi/model/interference-helper.cc b/src/wifi/model/interference-helper.cc index 83a0637c2..6d22d8829 100644 --- a/src/wifi/model/interference-helper.cc +++ b/src/wifi/model/interference-helper.cc @@ -274,6 +274,13 @@ InterferenceHelper::RemoveBands(FrequencyRange range) m_firstPowers.erase(range); } +bool +InterferenceHelper::HasBand(WifiSpectrumBand band, const FrequencyRange& range) const +{ + NS_LOG_FUNCTION(this << band.first << band.second << range); + return (m_niChanges.count(range) > 0 && m_niChanges.at(range).count(band) > 0); +} + void InterferenceHelper::AddBand(WifiSpectrumBand band, const FrequencyRange& range) { diff --git a/src/wifi/model/interference-helper.h b/src/wifi/model/interference-helper.h index b4c6d806f..145b17b9b 100644 --- a/src/wifi/model/interference-helper.h +++ b/src/wifi/model/interference-helper.h @@ -159,6 +159,15 @@ class InterferenceHelper : public Object */ void RemoveBands(FrequencyRange range); + /** + * Check whether a given band is tracked by this interference helper. + * + * \param band the band to be checked + * \param range the frequency range the band to check belongs to + * \return true if the band is already tracked by this interference helper, false otherwise + */ + bool HasBand(WifiSpectrumBand band, const FrequencyRange& range) const; + /** * Set the noise figure. * diff --git a/src/wifi/model/spectrum-wifi-phy.cc b/src/wifi/model/spectrum-wifi-phy.cc index 871dfe1fd..a85fb9409 100644 --- a/src/wifi/model/spectrum-wifi-phy.cc +++ b/src/wifi/model/spectrum-wifi-phy.cc @@ -38,6 +38,8 @@ #include "ns3/spectrum-channel.h" #include "ns3/wifi-net-device.h" +#include + namespace ns3 { @@ -119,11 +121,10 @@ SpectrumWifiPhy::UpdateInterferenceHelperBands() NS_LOG_FUNCTION(this); NS_ASSERT(!m_spectrumPhyInterfaces.empty()); uint16_t channelWidth = GetChannelWidth(); - m_interference->RemoveBands(WHOLE_WIFI_SPECTRUM); + std::vector bands; if (channelWidth < 20) { - WifiSpectrumBand band = GetBand(channelWidth); - m_interference->AddBand(band, WHOLE_WIFI_SPECTRUM); + bands.push_back(GetBand(channelWidth)); } else { @@ -131,7 +132,7 @@ SpectrumWifiPhy::UpdateInterferenceHelperBands() { for (uint32_t i = 0; i < (channelWidth / bw); ++i) { - m_interference->AddBand(GetBand(bw, i), WHOLE_WIFI_SPECTRUM); + bands.push_back(GetBand(bw, i)); } } } @@ -183,9 +184,21 @@ SpectrumWifiPhy::UpdateInterferenceHelperBands() } for (const auto& bandRuPair : m_ruBands[channelWidth]) { - m_interference->AddBand(bandRuPair.first, WHOLE_WIFI_SPECTRUM); + bands.push_back(bandRuPair.first); } } + const auto bandsChanged = std::any_of(bands.cbegin(), bands.cend(), [&](const auto& band) { + return !m_interference->HasBand(band, WHOLE_WIFI_SPECTRUM); + }); + if (!bandsChanged) + { + return; + } + m_interference->RemoveBands(WHOLE_WIFI_SPECTRUM); + for (const auto& band : bands) + { + m_interference->AddBand(band, WHOLE_WIFI_SPECTRUM); + } } Ptr