wifi: Update RNR MLD Parameters to 802.11be draft 6.0

This commit is contained in:
Sharan Naribole
2024-09-03 15:27:07 +02:00
committed by Stefano Avallone
parent 04784deddb
commit 1acc3840ec
7 changed files with 45 additions and 68 deletions

View File

@@ -687,7 +687,7 @@ ApWifiMac::GetReducedNeighborReport(uint8_t linkId) const
rnr.SetShortSsid(nbrId, 0, 0);
rnr.SetBssParameters(nbrId, 0, 0);
rnr.SetPsd20MHz(nbrId, 0, 0);
rnr.SetMldParameters(nbrId, 0, 0, index, 0);
rnr.SetMldParameters(nbrId, 0, {0, index, 0, 0, 0});
}
}
return rnr;

View File

@@ -520,17 +520,13 @@ ReducedNeighborReport::GetPsd20MHz(std::size_t nbrApInfoId, std::size_t index) c
void
ReducedNeighborReport::SetMldParameters(std::size_t nbrApInfoId,
std::size_t index,
uint8_t mldId,
uint8_t linkId,
uint8_t changeCount)
const MldParameters& mldParams)
{
NS_ASSERT(nbrApInfoId < m_nbrApInfoFields.size());
NS_ASSERT(index < m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.size());
auto it = std::next(m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.begin(), index);
it->mldParameters.mldId = mldId;
it->mldParameters.linkId = (linkId & 0x0f);
it->mldParameters.bssParamsChangeCount = changeCount;
it->mldParameters = mldParams;
m_nbrApInfoFields.at(nbrApInfoId).hasMldParams = true;
}
@@ -543,23 +539,13 @@ ReducedNeighborReport::HasMldParameters(std::size_t nbrApInfoId) const
return m_nbrApInfoFields.at(nbrApInfoId).hasMldParams;
}
uint8_t
ReducedNeighborReport::GetMldId(std::size_t nbrApInfoId, std::size_t index) const
const ReducedNeighborReport::MldParameters&
ReducedNeighborReport::GetMldParameters(std::size_t nbrApInfoId, std::size_t index) const
{
NS_ASSERT(HasMldParameters(nbrApInfoId));
NS_ASSERT(index < m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.size());
return m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).mldParameters.mldId;
}
uint8_t
ReducedNeighborReport::GetLinkId(std::size_t nbrApInfoId, std::size_t index) const
{
NS_ASSERT(HasMldParameters(nbrApInfoId));
NS_ASSERT(index < m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.size());
return m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).mldParameters.linkId &
0x0f;
return m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).mldParameters;
}
void
@@ -661,10 +647,12 @@ ReducedNeighborReport::SerializeInformationField(Buffer::Iterator start) const
}
if (neighborApInfo.hasMldParams)
{
start.WriteU8(tbttInformation.mldParameters.mldId);
start.WriteU8(tbttInformation.mldParameters.apMldId);
uint16_t other = 0;
other |= (tbttInformation.mldParameters.linkId & 0x0f);
other |= (tbttInformation.mldParameters.bssParamsChangeCount << 4);
other |= (tbttInformation.mldParameters.allUpdates << 12);
other |= (tbttInformation.mldParameters.disabledLink << 13);
start.WriteHtolsbU16(other);
}
}
@@ -723,14 +711,14 @@ ReducedNeighborReport::DeserializeInformationField(Buffer::Iterator start, uint1
}
if (m_nbrApInfoFields.back().hasMldParams)
{
m_nbrApInfoFields.back().tbttInformationSet.back().mldParameters.mldId = i.ReadU8();
auto& mldParams = m_nbrApInfoFields.back().tbttInformationSet.back().mldParameters;
mldParams.apMldId = i.ReadU8();
uint16_t other = i.ReadLsbtohU16();
count += 3;
m_nbrApInfoFields.back().tbttInformationSet.back().mldParameters.linkId =
other & 0x000f;
m_nbrApInfoFields.back()
.tbttInformationSet.back()
.mldParameters.bssParamsChangeCount = (other >> 4) & 0x00ff;
mldParams.linkId = other & 0x000f;
mldParams.bssParamsChangeCount = (other >> 4) & 0x00ff;
mldParams.allUpdates = (other >> 12) & 0x01;
mldParams.disabledLink = (other >> 13) & 0x01;
}
}
}

View File

@@ -34,9 +34,11 @@ class ReducedNeighborReport : public WifiInformationElement
*/
struct MldParameters
{
uint8_t mldId; //!< MLD ID
uint8_t linkId; //!< Link ID
uint8_t apMldId; //!< AP MLD ID
uint8_t linkId : 4; //!< Link ID
uint8_t bssParamsChangeCount; //!< BSS Parameters Change Count
uint8_t allUpdates : 1; ///< All Updates Included
uint8_t disabledLink : 1; ///< Disabled Link Indication
};
/**
@@ -44,12 +46,12 @@ class ReducedNeighborReport : public WifiInformationElement
*/
struct TbttInformation
{
uint8_t neighborApTbttOffset{0}; //!< Neighbor AP TBTT Offset
Mac48Address bssid; //!< BSSID (optional)
uint32_t shortSsid{0}; //!< Short SSID (optional)
uint8_t bssParameters{0}; //!< BSS parameters (optional)
uint8_t psd20MHz{0}; //!< 20 MHz PSD (optional)
MldParameters mldParameters{0, 0, 0}; //!< MLD Parameters (optional)
uint8_t neighborApTbttOffset{0}; //!< Neighbor AP TBTT Offset
Mac48Address bssid; //!< BSSID (optional)
uint32_t shortSsid{0}; //!< Short SSID (optional)
uint8_t bssParameters{0}; //!< BSS parameters (optional)
uint8_t psd20MHz{0}; //!< 20 MHz PSD (optional)
MldParameters mldParameters{}; //!< MLD Parameters (optional)
};
/**
@@ -249,15 +251,11 @@ class ReducedNeighborReport : public WifiInformationElement
*
* @param nbrApInfoId identifier of the given Neighbor AP Information field
* @param index the index of the given TBTT Information field
* @param mldId the MLD ID value
* @param linkId the Link ID value
* @param changeSequence the Change Sequence value
* @param mldParams the MLD parameters
*/
void SetMldParameters(std::size_t nbrApInfoId,
std::size_t index,
uint8_t mldId,
uint8_t linkId,
uint8_t changeSequence);
const MldParameters& mldParams);
/**
* Return true if the MLD Parameters subfield is present in all the TBTT Information fields
* of the given Neighbor AP Information field.
@@ -267,23 +265,14 @@ class ReducedNeighborReport : public WifiInformationElement
*/
bool HasMldParameters(std::size_t nbrApInfoId) const;
/**
* Get the MLD ID value in the MLD Parameters subfield (must be present) in the
* <i>i</i>-th TBTT Information field of the given Neighbor AP Information field.
* Get the MLD Parameters subfield (must be present) in the <i>i</i>-th TBTT Information field
* of the given Neighbor AP Information field.
*
* @param nbrApInfoId identifier of the given Neighbor AP Information field
* @param index the index of the given TBTT Information field
* @return the MLD ID value
* @return the MLD parameters
*/
uint8_t GetMldId(std::size_t nbrApInfoId, std::size_t index) const;
/**
* Get the Link ID value in the MLD Parameters subfield (must be present) in the
* <i>i</i>-th TBTT Information field of the given Neighbor AP Information field.
*
* @param nbrApInfoId identifier of the given Neighbor AP Information field
* @param index the index of the given TBTT Information field
* @return the Link ID value
*/
uint8_t GetLinkId(std::size_t nbrApInfoId, std::size_t index) const;
const MldParameters& GetMldParameters(std::size_t nbrApInfoId, std::size_t index) const;
private:
/**

View File

@@ -328,7 +328,7 @@ WifiAssocManager::GetNextAffiliatedAp(const ReducedNeighborReport& rnr, std::siz
std::size_t tbttInfoFieldIndex = 0;
while (tbttInfoFieldIndex < rnr.GetNTbttInformationFields(nbrApInfoId) &&
rnr.GetMldId(nbrApInfoId, tbttInfoFieldIndex) != 0)
rnr.GetMldParameters(nbrApInfoId, tbttInfoFieldIndex).apMldId != 0)
{
tbttInfoFieldIndex++;
}

View File

@@ -196,7 +196,7 @@ WifiDefaultAssocManager::EndScanning()
Mac48Address bssid = rnr->get().GetBssid(apIt->m_nbrApInfoId, apIt->m_tbttInfoFieldId);
setupLinks.emplace_back(StaWifiMac::ApInfo::SetupLinksInfo{
linkId,
rnr->get().GetLinkId(apIt->m_nbrApInfoId, apIt->m_tbttInfoFieldId),
rnr->get().GetMldParameters(apIt->m_nbrApInfoId, apIt->m_tbttInfoFieldId).linkId,
bssid});
if (needChannelSwitch)

View File

@@ -649,7 +649,7 @@ ReducedNeighborReportTest::GetReducedNeighborReport(PhyOpChannelIt channel2_4It,
rnr.SetShortSsid(nbrId, 0, 0);
rnr.SetBssParameters(nbrId, 0, 10);
rnr.SetPsd20MHz(nbrId, 0, 50);
rnr.SetMldParameters(nbrId, 0, 0, 2, 3);
rnr.SetMldParameters(nbrId, 0, {0, 2, 3, 1, 1});
}
if (channel5It != WifiPhyOperatingChannel::m_frequencyChannels.cend())
@@ -666,14 +666,14 @@ ReducedNeighborReportTest::GetReducedNeighborReport(PhyOpChannelIt channel2_4It,
rnr.SetShortSsid(nbrId, 0, 0);
rnr.SetBssParameters(nbrId, 0, 20);
rnr.SetPsd20MHz(nbrId, 0, 60);
rnr.SetMldParameters(nbrId, 0, 0, 3, 4);
rnr.SetMldParameters(nbrId, 0, {0, 3, 4, 0, 1});
// Add another TBTT Information Field
rnr.AddTbttInformationField(nbrId);
rnr.SetBssid(nbrId, 1, Mac48Address("00:00:00:00:01:05"));
rnr.SetShortSsid(nbrId, 1, 0);
rnr.SetBssParameters(nbrId, 1, 30);
rnr.SetPsd20MHz(nbrId, 1, 70);
rnr.SetMldParameters(nbrId, 1, 0, 4, 5);
rnr.SetMldParameters(nbrId, 1, {0, 4, 5, 1, 0});
}
if (channel6It != WifiPhyOperatingChannel::m_frequencyChannels.cend())
@@ -690,7 +690,7 @@ ReducedNeighborReportTest::GetReducedNeighborReport(PhyOpChannelIt channel2_4It,
rnr.SetShortSsid(nbrId, 0, 0);
rnr.SetBssParameters(nbrId, 0, 40);
rnr.SetPsd20MHz(nbrId, 0, 80);
rnr.SetMldParameters(nbrId, 0, 0, 5, 6);
rnr.SetMldParameters(nbrId, 0, {0, 5, 6, 0, 0});
}
NS_LOG_DEBUG(info.str());

View File

@@ -71,11 +71,11 @@ GetRnrLinkInfoTest::DoRun()
rnr.AddTbttInformationField(nbrId);
tbttId = rnr.GetNTbttInformationFields(nbrId) - 1;
rnr.SetMldParameters(nbrId, tbttId, 0, 0, 0);
rnr.SetMldParameters(nbrId, tbttId, {0, 0, 0, 1, 1});
rnr.AddTbttInformationField(nbrId);
tbttId = rnr.GetNTbttInformationFields(nbrId) - 1;
rnr.SetMldParameters(nbrId, tbttId, 5, 0, 0);
rnr.SetMldParameters(nbrId, tbttId, {5, 0, 0, 1, 0});
// Add a third Neighbor AP Information field with MLD Parameters; none of the
// TBTT Information fields is related to an AP affiliated to the same AP MLD
@@ -85,11 +85,11 @@ GetRnrLinkInfoTest::DoRun()
rnr.AddTbttInformationField(nbrId);
tbttId = rnr.GetNTbttInformationFields(nbrId) - 1;
rnr.SetMldParameters(nbrId, tbttId, 3, 0, 0);
rnr.SetMldParameters(nbrId, tbttId, {3, 0, 0, 0, 1});
rnr.AddTbttInformationField(nbrId);
tbttId = rnr.GetNTbttInformationFields(nbrId) - 1;
rnr.SetMldParameters(nbrId, tbttId, 4, 0, 0);
rnr.SetMldParameters(nbrId, tbttId, {4, 0, 0, 0, 0});
// Add a fourth Neighbor AP Information field with MLD Parameters; the first
// TBTT Information field is not related to an AP affiliated to the same AP MLD
@@ -99,11 +99,11 @@ GetRnrLinkInfoTest::DoRun()
rnr.AddTbttInformationField(nbrId);
tbttId = rnr.GetNTbttInformationFields(nbrId) - 1;
rnr.SetMldParameters(nbrId, tbttId, 6, 0, 0);
rnr.SetMldParameters(nbrId, tbttId, {6, 0, 0, 1, 1});
rnr.AddTbttInformationField(nbrId);
tbttId = rnr.GetNTbttInformationFields(nbrId) - 1;
rnr.SetMldParameters(nbrId, tbttId, 0, 0, 0);
rnr.SetMldParameters(nbrId, tbttId, {0, 0, 0, 0, 0});
// check implementation of WifiAssocManager::GetNextAffiliatedAp()
auto ret = WifiAssocManager::GetNextAffiliatedAp(rnr, 0);
@@ -1117,7 +1117,7 @@ MultiLinkSetupTest::CheckBeacon(Ptr<WifiMpdu> mpdu, uint8_t linkId)
NS_TEST_EXPECT_MSG_EQ(rnr->GetNTbttInformationFields(nbrApInfoId),
1,
"Expected only one TBTT Info subfield per Neighbor AP Info");
uint8_t nbrLinkId = rnr->GetLinkId(nbrApInfoId, 0);
uint8_t nbrLinkId = rnr->GetMldParameters(nbrApInfoId, 0).linkId;
NS_TEST_EXPECT_MSG_EQ(rnr->GetBssid(nbrApInfoId, 0),
m_apMac->GetFrameExchangeManager(nbrLinkId)->GetAddress(),
"BSSID advertised in Neighbor AP Info field "
@@ -1176,7 +1176,7 @@ MultiLinkSetupTest::CheckProbeResponse(Ptr<WifiMpdu> mpdu, uint8_t linkId)
NS_TEST_EXPECT_MSG_EQ(rnr->GetNTbttInformationFields(nbrApInfoId),
1,
"Expected only one TBTT Info subfield per Neighbor AP Info");
uint8_t nbrLinkId = rnr->GetLinkId(nbrApInfoId, 0);
uint8_t nbrLinkId = rnr->GetMldParameters(nbrApInfoId, 0).linkId;
NS_TEST_EXPECT_MSG_EQ(rnr->GetBssid(nbrApInfoId, 0),
m_apMac->GetFrameExchangeManager(nbrLinkId)->GetAddress(),
"BSSID advertised in Neighbor AP Info field "