wifi: Add methods to HeRu

Also switch to uint16_t for bandwidth in HeRu
This commit is contained in:
Rediet
2020-07-06 16:08:05 +02:00
committed by Sébastien Deronne
parent aa2496bb45
commit 2d15c8d4d8
2 changed files with 81 additions and 44 deletions

View File

@@ -149,7 +149,7 @@ const HeRu::SubcarrierGroups HeRu::m_heRuSubcarrierGroups =
std::size_t
HeRu::GetNRus (uint8_t bw, RuType ruType)
HeRu::GetNRus (uint16_t bw, RuType ruType)
{
if (bw == 160 && ruType == RU_2x996_TONE)
{
@@ -169,7 +169,7 @@ HeRu::GetNRus (uint8_t bw, RuType ruType)
}
HeRu::SubcarrierGroup
HeRu::GetSubcarrierGroup (uint8_t bw, RuType ruType, std::size_t index)
HeRu::GetSubcarrierGroup (uint16_t bw, RuType ruType, std::size_t index)
{
if (ruType == HeRu::RU_2x996_TONE) //handle special case of RU covering 160 MHz channel
{
@@ -208,7 +208,7 @@ HeRu::GetSubcarrierGroup (uint8_t bw, RuType ruType, std::size_t index)
}
bool
HeRu::DoesOverlap (uint8_t bw, RuSpec ru, const std::vector<RuSpec> &v)
HeRu::DoesOverlap (uint16_t bw, RuSpec ru, const std::vector<RuSpec> &v)
{
// A 2x996-tone RU spans 160 MHz, hence it overlaps with any other RU
if (bw == 160 && ru.ruType == RU_2x996_TONE && !v.empty ())
@@ -233,7 +233,7 @@ HeRu::DoesOverlap (uint8_t bw, RuSpec ru, const std::vector<RuSpec> &v)
}
bool
HeRu::DoesOverlap (uint8_t bw, RuSpec ru, const SubcarrierGroup &toneRanges)
HeRu::DoesOverlap (uint16_t bw, RuSpec ru, const SubcarrierGroup &toneRanges)
{
for (const auto & range : toneRanges)
{
@@ -254,6 +254,44 @@ HeRu::DoesOverlap (uint8_t bw, RuSpec ru, const SubcarrierGroup &toneRanges)
return false;
}
HeRu::RuSpec
HeRu::FindOverlappingRu (uint16_t bw, RuSpec referenceRu, RuType searchedRuType)
{
RuSpec searchedRu;
searchedRu.ruType = searchedRuType;
std::size_t numRus = HeRu::GetNRus (bw, searchedRuType);
std::size_t numRusPer80Mhz;
std::vector<bool> primary80MhzFlags;
if (bw == 160)
{
primary80MhzFlags.push_back (true);
primary80MhzFlags.push_back (false);
numRusPer80Mhz = numRus / 2;
}
else
{
primary80MhzFlags.push_back (referenceRu.primary80MHz);
numRusPer80Mhz = numRus;
}
std::size_t index = 1;
for (const auto primary80Mhz : primary80MhzFlags)
{
searchedRu.primary80MHz = primary80Mhz;
for (std::size_t indexPer80Mhz = 1; indexPer80Mhz <= numRusPer80Mhz; ++indexPer80Mhz, ++index)
{
searchedRu.index = index;
if (DoesOverlap (bw, referenceRu, {searchedRu}))
{
return searchedRu;
}
}
}
NS_ABORT_MSG ("The searched RU type " << searchedRuType << " was not found for bw=" << bw << " and referenceRu=" << referenceRu);
return searchedRu;
}
std::ostream& operator<< (std::ostream& os, const HeRu::RuType &ruType)
{
switch (ruType)
@@ -317,36 +355,28 @@ HeRu::GetBandwidth (RuType ruType)
}
HeRu::RuType
HeRu::GetEqualSizedRusForStations (uint16_t bandwidth, std::size_t& nStations)
HeRu::GetRuType (uint16_t bandwidth)
{
RuType ruType;
uint8_t nRusAssigned = 0;
// iterate over all the available RU types
for (auto& ru : m_heRuSubcarrierGroups)
switch (bandwidth)
{
if (ru.first.first == bandwidth && ru.second.size () <= nStations)
{
ruType = ru.first.second;
nRusAssigned = ru.second.size ();
break;
}
else if (bandwidth == 160 && ru.first.first == 80 && (2 * ru.second.size () <= nStations))
{
ruType = ru.first.second;
nRusAssigned = 2 * ru.second.size ();
break;
}
case 2:
return RU_26_TONE;
case 4:
return RU_52_TONE;
case 8:
return RU_106_TONE;
case 20:
return RU_242_TONE;
case 40:
return RU_484_TONE;
case 80:
return RU_996_TONE;
case 160:
return RU_2x996_TONE;
default:
NS_ABORT_MSG (bandwidth << " MHz bandwidth not found");
return RU_242_TONE;
}
if (nRusAssigned == 0)
{
NS_ABORT_IF (bandwidth != 160 || nStations != 1);
nRusAssigned = 1;
ruType = RU_2x996_TONE;
}
nStations = nRusAssigned;
return ruType;
}
} //namespace ns3

View File

@@ -23,9 +23,9 @@
#include <map>
#include <vector>
#include <cstdint>
#include <ostream>
namespace ns3 {
@@ -77,7 +77,7 @@ public:
* \param ruType the RU type (number of tones)
* \return the number of distinct RUs available
*/
static std::size_t GetNRus (uint8_t bw, RuType ruType);
static std::size_t GetNRus (uint16_t bw, RuType ruType);
/**
* Get the subcarrier group of the RU having the given index among all the
@@ -93,7 +93,7 @@ public:
* \param index the index (starting at 1) of the RU
* \return the subcarrier range of the specified RU
*/
static SubcarrierGroup GetSubcarrierGroup (uint8_t bw, RuType ruType, std::size_t index);
static SubcarrierGroup GetSubcarrierGroup (uint16_t bw, RuType ruType, std::size_t index);
/**
* Check whether the given RU overlaps with the given set of RUs.
@@ -105,7 +105,7 @@ public:
* \param v the given set of RUs
* \return true if the given RU overlaps with the given set of RUs.
*/
static bool DoesOverlap (uint8_t bw, RuSpec ru, const std::vector<RuSpec> &v);
static bool DoesOverlap (uint16_t bw, RuSpec ru, const std::vector<RuSpec> &v);
/**
* Check whether the given RU overlaps with the given tone ranges.
@@ -117,7 +117,19 @@ public:
* \param toneRanges the given set of tone ranges
* \return true if the given RU overlaps with the given set of tone ranges.
*/
static bool DoesOverlap (uint8_t bw, RuSpec ru, const SubcarrierGroup &toneRanges);
static bool DoesOverlap (uint16_t bw, RuSpec ru, const SubcarrierGroup &toneRanges);
/**
* Find the RU allocation of the given RU type overlapping the given
* reference RU allocation.
* Note that an assert is generated if the RU allocation is not found.
*
* \param bw the bandwidth (MHz) of the HE PPDU (20, 40, 80, 160)
* \param referenceRu the reference RU allocation
* \param searchedRuType the searched RU type
* \return the searched RU allocation.
*/
static RuSpec FindOverlappingRu (uint16_t bw, RuSpec referenceRu, RuType searchedRuType);
/**
* Get the approximate bandwidth occupied by a RU.
@@ -128,17 +140,12 @@ public:
static uint16_t GetBandwidth (RuType ruType);
/**
* Given the channel bandwidth and the number of stations candidate for being
* assigned an RU, maximize the number of candidate stations that can be assigned
* an RU subject to the constraint that all the stations must be assigned an RU
* of the same size (in terms of number of tones).
* Get the RU corresponding to the approximate bandwidth.
*
* \param bandwidth the channel bandwidth in MHz
* \param nStations the number of candidate stations. On return, it is set to
* the number of stations that are assigned an RU
* \param bandwidth the approximate bandwidth (in MHz) occupied by the RU
* \return the RU type
*/
static RuType GetEqualSizedRusForStations (uint16_t bandwidth, std::size_t& nStations);
static RuType GetRuType (uint16_t bandwidth);
/// (bandwidth, number of tones) pair
typedef std::pair<uint8_t, RuType> BwTonesPair;