wifi: Add a test suite for EHT Information Elements

This commit is contained in:
Stefano Avallone
2022-08-22 11:09:40 +02:00
committed by Stefano Avallone
parent 3364db4eb1
commit 3d03421133
2 changed files with 338 additions and 0 deletions

View File

@@ -312,6 +312,7 @@ build_lib(
test/tx-duration-test.cc
test/wifi-aggregation-test.cc
test/wifi-dynamic-bw-op-test.cc
test/wifi-eht-info-elems-test.cc
test/wifi-error-rate-models-test.cc
test/wifi-mac-ofdma-test.cc
test/wifi-mac-queue-test.cc

View File

@@ -0,0 +1,337 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2022 Universita' degli Studi di Napoli Federico II
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Stefano Avallone <stavallo@unina.it>
*/
#include "ns3/header-serialization-test.h"
#include "ns3/log.h"
#include "ns3/mgt-headers.h"
#include "ns3/multi-link-element.h"
#include "ns3/reduced-neighbor-report.h"
#include "ns3/wifi-phy-operating-channel.h"
#include <sstream>
#include <vector>
using namespace ns3;
NS_LOG_COMPONENT_DEFINE ("WifiEhtInfoElemsTest");
/**
* \ingroup wifi-test
* \ingroup tests
*
* \brief Test Multi-Link Element (Basic variant) serialization and deserialization
*/
class BasicMultiLinkElementTest : public HeaderSerializationTestCase
{
public:
/**
* Constructor
*/
BasicMultiLinkElementTest ();
virtual ~BasicMultiLinkElementTest ();
/**
* Get a Multi-Link Element including the given Common Info field and the
* given Per-STA Profile Subelements
*
* \param commonInfo the given Common Info field
* \param subelements the given set of Per-STA Profile Subelements
* \return a Multi-Link Element
*/
MultiLinkElement GetMultiLinkElement (const CommonInfoBasicMle& commonInfo,
std::vector<MultiLinkElement::PerStaProfileSubelement> subelements);
private:
virtual void DoRun (void);
WifiMacType m_frameType; //!< the type of frame possibly included in the MLE
};
BasicMultiLinkElementTest::BasicMultiLinkElementTest ()
: HeaderSerializationTestCase ("Check serialization and deserialization of Basic variant Multi-Link elements"),
m_frameType (WIFI_MAC_MGT_ASSOCIATION_REQUEST)
{
}
BasicMultiLinkElementTest::~BasicMultiLinkElementTest ()
{
}
MultiLinkElement
BasicMultiLinkElementTest::GetMultiLinkElement (const CommonInfoBasicMle& commonInfo,
std::vector<MultiLinkElement::PerStaProfileSubelement> subelements)
{
MultiLinkElement mle (MultiLinkElement::BASIC_VARIANT, m_frameType);
mle.SetMldMacAddress (commonInfo.m_mldMacAddress);
if (commonInfo.m_linkIdInfo.has_value ())
{
mle.SetLinkIdInfo (*commonInfo.m_linkIdInfo);
}
if (commonInfo.m_bssParamsChangeCount.has_value ())
{
mle.SetBssParamsChangeCount (*commonInfo.m_bssParamsChangeCount);
}
if (commonInfo.m_mediumSyncDelayInfo.has_value ())
{
mle.SetMediumSyncDelayTimer (MicroSeconds (32 * commonInfo.m_mediumSyncDelayInfo->mediumSyncDuration));
mle.SetMediumSyncOfdmEdThreshold (commonInfo.m_mediumSyncDelayInfo->mediumSyncOfdmEdThreshold - 72);
mle.SetMediumSyncMaxNTxops (commonInfo.m_mediumSyncDelayInfo->mediumSyncMaxNTxops + 1);
}
for (std::size_t i = 0; i < subelements.size (); ++i)
{
mle.AddPerStaProfileSubelement ();
mle.GetPerStaProfile (i) = std::move (subelements[i]);
}
return mle;
}
void
BasicMultiLinkElementTest::DoRun (void)
{
CommonInfoBasicMle commonInfo =
{
.m_mldMacAddress = Mac48Address ("01:23:45:67:89:ab"),
};
// Common Info with MLD MAC address
TestHeaderSerialization (GetMultiLinkElement (commonInfo, {}), m_frameType);
commonInfo.m_linkIdInfo = 3;
// Adding Link ID Info
TestHeaderSerialization (GetMultiLinkElement (commonInfo, {}), m_frameType);
commonInfo.m_bssParamsChangeCount = 1;
// Adding BSS Paraemeters Change Count
TestHeaderSerialization (GetMultiLinkElement (commonInfo, {}), m_frameType);
commonInfo.m_mediumSyncDelayInfo = CommonInfoBasicMle::MediumSyncDelayInfo
{
.mediumSyncDuration = 1,
.mediumSyncOfdmEdThreshold = 4,
.mediumSyncMaxNTxops = 5
};
// Adding Medium Sync Delay Information
TestHeaderSerialization (GetMultiLinkElement (commonInfo, {}), m_frameType);
SupportedRates rates;
rates.AddSupportedRate (6);
rates.AddSupportedRate (12);
rates.AddSupportedRate (24);
CapabilityInformation capabilities;
capabilities.SetShortPreamble (true);
capabilities.SetShortSlotTime (true);
capabilities.SetEss ();
MgtAssocRequestHeader assoc;
assoc.SetSsid (Ssid ("MySsid"));
assoc.SetSupportedRates (rates);
assoc.SetCapabilities (capabilities);
assoc.SetListenInterval (0);
MultiLinkElement::PerStaProfileSubelement perStaProfile (MultiLinkElement::BASIC_VARIANT, m_frameType);
perStaProfile.SetLinkId (5);
perStaProfile.SetCompleteProfile ();
perStaProfile.SetStaMacAddress (Mac48Address ("ba:98:76:54:32:10"));
perStaProfile.SetAssocRequest (assoc);
// Adding Per-STA Profile Subelement
TestHeaderSerialization (GetMultiLinkElement (commonInfo, {perStaProfile}), m_frameType);
// Adding two Per-STA Profile Subelements
TestHeaderSerialization (GetMultiLinkElement (commonInfo, {perStaProfile, perStaProfile}), m_frameType);
}
/**
* \ingroup wifi-test
* \ingroup tests
*
* \brief Test Reduced Neighbor Report serialization and deserialization
*/
class ReducedNeighborReportTest : public HeaderSerializationTestCase
{
public:
/**
* Constructor
*/
ReducedNeighborReportTest ();
virtual ~ReducedNeighborReportTest ();
/// typedef for const iterator on the set of available channels
using PhyOpChannelIt = WifiPhyOperatingChannel::ConstIterator;
/**
* Get a Reduced Neighbor Report element including the given operating channels
*
* \param channel2_4It a channel in the 2.4 GHz band
* \param channel5It a channel in the 5 GHz band
* \param channel6It a channel in the 6 GHz band
* \return a Reduced Neighbor Report element
*/
ReducedNeighborReport GetReducedNeighborReport (PhyOpChannelIt channel2_4It,
PhyOpChannelIt channel5It,
PhyOpChannelIt channel6It);
private:
virtual void DoRun (void);
};
ReducedNeighborReportTest::ReducedNeighborReportTest ()
: HeaderSerializationTestCase ("Check serialization and deserialization of Reduced Neighbor Report elements")
{
}
ReducedNeighborReportTest::~ReducedNeighborReportTest ()
{
}
ReducedNeighborReport
ReducedNeighborReportTest::GetReducedNeighborReport (PhyOpChannelIt channel2_4It,
PhyOpChannelIt channel5It,
PhyOpChannelIt channel6It)
{
ReducedNeighborReport rnr;
std::stringstream info;
if (channel2_4It != WifiPhyOperatingChannel::m_frequencyChannels.cend ())
{
WifiPhyOperatingChannel channel (channel2_4It);
info << "{Ch=" << +channel.GetNumber () << ", Bw=" << channel.GetWidth () << ", 2.4 GHz} ";
rnr.AddNbrApInfoField ();
std::size_t nbrId = rnr.GetNNbrApInfoFields () - 1;
rnr.SetOperatingChannel (nbrId, channel);
// Add a TBTT Information Field
rnr.AddTbttInformationField (nbrId);
rnr.SetBssid (nbrId, 0, Mac48Address ("00:00:00:00:00:24"));
rnr.SetShortSsid (nbrId, 0, 0);
rnr.SetBssParameters (nbrId, 0, 10);
rnr.SetPsd20MHz (nbrId, 0, 50);
rnr.SetMldParameters (nbrId, 0, 0, 2, 3);
}
if (channel5It != WifiPhyOperatingChannel::m_frequencyChannels.cend ())
{
WifiPhyOperatingChannel channel (channel5It);
info << "{Ch=" << +channel.GetNumber () << ", Bw=" << channel.GetWidth () << ", 5 GHz} ";
rnr.AddNbrApInfoField ();
std::size_t nbrId = rnr.GetNNbrApInfoFields () - 1;
rnr.SetOperatingChannel (nbrId, channel);
// Add a TBTT Information Field
rnr.AddTbttInformationField (nbrId);
rnr.SetBssid (nbrId, 0, Mac48Address ("00:00:00:00:00:05"));
rnr.SetShortSsid (nbrId, 0, 0);
rnr.SetBssParameters (nbrId, 0, 20);
rnr.SetPsd20MHz (nbrId, 0, 60);
rnr.SetMldParameters (nbrId, 0, 0, 3, 4);
// 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);
}
if (channel6It != WifiPhyOperatingChannel::m_frequencyChannels.cend ())
{
WifiPhyOperatingChannel channel (channel6It);
info << "{Ch=" << +channel.GetNumber () << ", Bw=" << channel.GetWidth () << ", 6 GHz} ";
rnr.AddNbrApInfoField ();
std::size_t nbrId = rnr.GetNNbrApInfoFields () - 1;
rnr.SetOperatingChannel (nbrId, channel);
// Add a TBTT Information Field
rnr.AddTbttInformationField (nbrId);
rnr.SetBssid (nbrId, 0, Mac48Address ("00:00:00:00:00:06"));
rnr.SetShortSsid (nbrId, 0, 0);
rnr.SetBssParameters (nbrId, 0, 40);
rnr.SetPsd20MHz (nbrId, 0, 80);
rnr.SetMldParameters (nbrId, 0, 0, 5, 6);
}
NS_LOG_DEBUG (info.str ());
return rnr;
}
void
ReducedNeighborReportTest::DoRun (void)
{
PhyOpChannelIt channel2_4It, channel5It, channel6It;
channel2_4It = channel5It = channel6It = WifiPhyOperatingChannel::m_frequencyChannels.cbegin ();
// Test all available frequency channels
while (channel2_4It != WifiPhyOperatingChannel::m_frequencyChannels.cend ()
|| channel5It != WifiPhyOperatingChannel::m_frequencyChannels.cend ()
|| channel6It != WifiPhyOperatingChannel::m_frequencyChannels.cend ())
{
if (channel2_4It != WifiPhyOperatingChannel::m_frequencyChannels.cend ())
{
channel2_4It = WifiPhyOperatingChannel::FindFirst (0, 0, 0, WIFI_STANDARD_80211be,
WIFI_PHY_BAND_2_4GHZ, channel2_4It);
}
if (channel5It != WifiPhyOperatingChannel::m_frequencyChannels.cend ())
{
channel5It = WifiPhyOperatingChannel::FindFirst (0, 0, 0, WIFI_STANDARD_80211be,
WIFI_PHY_BAND_5GHZ, channel5It);
}
if (channel6It != WifiPhyOperatingChannel::m_frequencyChannels.cend ())
{
channel6It = WifiPhyOperatingChannel::FindFirst (0, 0, 0, WIFI_STANDARD_80211be,
WIFI_PHY_BAND_6GHZ, channel6It);
}
TestHeaderSerialization (GetReducedNeighborReport (channel2_4It, channel5It, channel6It));
// advance all channel iterators
if (channel2_4It != WifiPhyOperatingChannel::m_frequencyChannels.cend ()) channel2_4It++;
if (channel5It != WifiPhyOperatingChannel::m_frequencyChannels.cend ()) channel5It++;
if (channel6It != WifiPhyOperatingChannel::m_frequencyChannels.cend ()) channel6It++;
}
}
/**
* \ingroup wifi-test
* \ingroup tests
*
* \brief wifi EHT Information Elements Test Suite
*/
class WifiEhtInfoElemsTestSuite : public TestSuite
{
public:
WifiEhtInfoElemsTestSuite ();
};
WifiEhtInfoElemsTestSuite::WifiEhtInfoElemsTestSuite ()
: TestSuite ("wifi-eht-info-elems", UNIT)
{
AddTestCase (new BasicMultiLinkElementTest (), TestCase::QUICK);
AddTestCase (new ReducedNeighborReportTest (), TestCase::QUICK);
}
static WifiEhtInfoElemsTestSuite g_wifiEhtInfoElemsTestSuite; ///< the test suite