wifi: Only update bands tracked by interference helper if needed

This commit is contained in:
Sébastien Deronne
2023-02-05 14:12:22 +01:00
committed by Sebastien Deronne
parent d666ad494e
commit 2df30d6838
3 changed files with 34 additions and 5 deletions

View File

@@ -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)
{

View File

@@ -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.
*

View File

@@ -38,6 +38,8 @@
#include "ns3/spectrum-channel.h"
#include "ns3/wifi-net-device.h"
#include <algorithm>
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<WifiSpectrumBand> 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<Channel>