Check ICF reception while main PHY is switching. More...
#include "wifi-emlsr-link-switch-test.h"
Classes | |
struct | Events |
Actions and checks to perform upon the transmission of each frame. More... | |
struct | MainPhySwitchInfo |
Store information about a main PHY switch. More... | |
Public Types | |
enum | ChannelSwitchEnd : uint8_t { DURING_PREAMBLE_DETECTION = 0 , BEFORE_PHY_HDR_END , BEFORE_MAC_HDR_END , BEFORE_MAC_PAYLOAD_END , BEFORE_PADDING_END , CSD_COUNT } |
Enumeration indicating the duration of a main PHY channel switch compared to the ICF fields. More... | |
![]() | |
enum | TrafficDirection : uint8_t { DOWNLINK = 0 , UPLINK } |
Enumeration for traffic directions. More... | |
![]() | |
enum class | Duration { QUICK = 1 , EXTENSIVE = 2 , TAKES_FOREVER = 3 } |
How long the test takes to execute. More... | |
Public Member Functions | |
EmlsrIcfSentDuringMainPhySwitchTest () | |
Constructor. | |
![]() | |
EmlsrOperationsTestBase (const std::string &name) | |
Constructor. | |
~EmlsrOperationsTestBase () override=default | |
![]() | |
TestCase (const TestCase &)=delete | |
virtual | ~TestCase () |
Destructor. | |
std::string | GetName () const |
TestCase & | operator= (const TestCase &)=delete |
Protected Member Functions | |
void | CheckInDeviceInterference (const std::string &testStr, uint8_t linkId, Time duration) |
Check that the in-device interference generated by a transmission of the given duration on the given link is tracked by all the PHY interfaces of all the PHYs but the PHY that is transmitting. | |
void | DoRun () override |
Implementation to actually run this TestCase. | |
void | DoSetup () override |
Implementation to do any local setup required for this TestCase. | |
void | EmlsrLinkSwitchCb (uint8_t linkId, Ptr< WifiPhy > phy, bool connected) |
Callback connected to the EmlsrLinkSwitch trace source of the StaWifiMac of the EMLSR client. | |
void | GenerateNoiseOnAllLinks (Ptr< WifiMac > mac, Time duration) |
Generate noise on all the links of the given MAC for the given time duration. | |
void | RunOne () |
Runs a test case and invokes itself for the next test case. | |
void | Transmit (Ptr< WifiMac > mac, uint8_t phyId, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW) override |
Callback invoked when a FEM passes PSDUs to the PHY. | |
![]() | |
void | CheckAuxPhysSleepMode (Ptr< StaWifiMac > staMac, bool sleep) |
Check whether aux PHYs of the given device are in sleep mode/awake. | |
void | CheckBlockedLink (Ptr< WifiMac > mac, Mac48Address dest, uint8_t linkId, WifiQueueBlockedReason reason, bool blocked, std::string description, bool testUnblockedForOtherReasons=true) |
Check whether QoS data unicast transmissions addressed to the given destination on the given link are blocked or unblocked for the given reason on the given device. | |
void | CheckMainPhyTraceInfo (std::size_t index, std::string_view reason, const std::optional< uint8_t > &fromLinkId, uint8_t toLinkId, bool checkFromLinkId=true, bool checkToLinkId=true) |
Check information provided by the EMLSR Manager MainPhySwitch trace. | |
void | CheckMsdTimerRunning (Ptr< StaWifiMac > staMac, uint8_t linkId, bool isRunning, const std::string &msg) |
Check whether the MediumSyncDelay timer is running on the given link of the given device. | |
void | DoSetup () override |
Implementation to do any local setup required for this TestCase. | |
Ptr< PacketSocketClient > | GetApplication (TrafficDirection dir, std::size_t staId, std::size_t count, std::size_t pktSize, uint8_t priority=0) const |
virtual void | MainPhySwitchInfoCallback (std::size_t index, const EmlsrMainPhySwitchTrace &info) |
Callback connected to the EMLSR Manager MainPhySwitch trace source. | |
![]() | |
TestCase (std::string name) | |
Constructor. | |
void | AddTestCase (TestCase *testCase, Duration duration=Duration::QUICK) |
Add an individual child TestCase to this test suite. | |
TestCase * | GetParent () const |
Get the parent of this TestCase. | |
bool | IsStatusFailure () const |
Check if any tests failed. | |
bool | IsStatusSuccess () const |
Check if all tests passed. | |
void | SetDataDir (std::string directory) |
Set the data directory where reference trace files can be found. | |
void | ReportTestFailure (std::string cond, std::string actual, std::string limit, std::string message, std::string file, int32_t line) |
Log the failure of this TestCase. | |
bool | MustAssertOnFailure () const |
Check if this run should assert on failure. | |
bool | MustContinueOnFailure () const |
Check if this run should continue on failure. | |
std::string | CreateDataDirFilename (std::string filename) |
Construct the full path to a file in the data directory. | |
std::string | CreateTempDirFilename (std::string filename) |
Construct the full path to a file in a temporary directory. | |
Private Member Functions | |
void | StartTraffic () override |
Start the generation of traffic (needs to be overridden) | |
Private Attributes | |
std::array< WifiSpectrumBandInfo, 3 > | m_bands |
bands of the 3 frequency channels | |
ChannelSwitchEnd | m_csdIndex |
index to iterate over channel switch durations | |
std::list< Events > | m_events |
list of events for a test run | |
const uint8_t | m_linkIdForTid3 {2} |
ID of the link on which TID 3 is mapped. | |
std::size_t | m_processedEvents {0} |
number of processed events | |
bool | m_setupDone {false} |
whether association, BA, ... have been done | |
std::optional< MainPhySwitchInfo > | m_switchFrom |
info for main PHY leaving a link | |
std::optional< MainPhySwitchInfo > | m_switchTo |
info for main PHY connected to a link | |
uint8_t | m_testIndex {0} |
index to iterate over test scenarios | |
std::string | m_testStr |
test scenario description | |
Additional Inherited Members | |
![]() | |
static constexpr auto | QUICK = Duration::QUICK |
Deprecated test duration simple enums. | |
static constexpr auto | EXTENSIVE = Duration::EXTENSIVE |
static constexpr auto | TAKES_FOREVER = Duration::TAKES_FOREVER |
![]() | |
Ptr< ApWifiMac > | m_apMac |
AP wifi MAC. | |
std::array< std::string, 3 > | m_channelsStr |
array of strings defining the channels for the MLD links | |
std::vector< PacketSocketAddress > | m_dlSockets |
packet socket address for DL traffic | |
Time | m_duration {0} |
simulation duration | |
std::vector< uint8_t > | m_establishBaDl {} |
the TIDs for which BA needs to be established with the AP as originator | |
std::vector< uint8_t > | m_establishBaUl {} |
the TIDs for which BA needs to be established with the AP as recipient | |
const std::array< FrequencyRange, 3 > | m_freqRanges |
array of frequency ranges for MLD links | |
uint16_t | m_lastAid {0} |
AID of last associated station. | |
std::set< uint8_t > | m_linksToEnableEmlsrOn |
IDs of the links on which EMLSR mode has to be enabled. | |
uint8_t | m_mainPhyId {0} |
ID of the main PHY. | |
std::size_t | m_nEmlsrStations {1} |
number of stations to create that activate EMLSR | |
std::size_t | m_nNonEmlsrStations {0} |
number of stations to create that do not activate EMLSR | |
std::size_t | m_nPhysPerEmlsrDevice {3} |
number of PHYs per EMLSR client | |
std::vector< Time > | m_paddingDelay |
Padding Delay advertised by the non-AP MLD. | |
bool | m_putAuxPhyToSleep {false} |
whether aux PHYs are put to sleep during DL/UL TXOPs | |
uint64_t | m_rngRun {1} |
RNG run value. | |
uint32_t | m_rngSeed {1} |
RNG seed value. | |
std::vector< Ptr< StaWifiMac > > | m_staMacs |
MACs of the non-AP MLDs. | |
uint16_t | m_startAid {1} |
first AID to allocate to stations | |
int64_t | m_streamNo {5} |
RNG stream number. | |
std::map< std::size_t, std::shared_ptr< EmlsrMainPhySwitchTrace > > | m_traceInfo |
EMLSR client ID-indexed map of trace info from last main PHY switch. | |
std::vector< Time > | m_transitionDelay |
Transition Delay advertised by the non-AP MLD. | |
Time | m_transitionTimeout {MicroSeconds(128)} |
Transition Timeout advertised by the AP MLD. | |
std::vector< FrameInfo > | m_txPsdus |
transmitted PSDUs | |
std::vector< PacketSocketAddress > | m_ulSockets |
packet socket address for UL traffic | |
Check ICF reception while main PHY is switching.
An AP MLD and an EMLSR client, both having 3 links, are considered in this test. Aux PHYs are not TX capable and do not switch links; the preferred link is link 0. In order to control link switches, a TID-to-Link mapping is configured so that TIDs 0 and 3 are mapped onto link 1 in the DL direction, while TID 0 is mapped to link 1 and TID 3 is mapped to link 2 in the UL direction. In this way, the AP MLD always requests channel access on link 1, while the EMLSR client requests channel access on link 1 or link 2, depending on the TID. This test consists in having the AP MLD and the EMLSR client gain channel access simultaneously: the AP MLD starts transmitting an ICF, while the main PHY starts switching to the link on which the EMLSR client gained channel access, which could be either the link on which the ICF is being transmitted or another one, depending on the TID of the MPDU the EMLSR client has to transmit.
The channel switch delay for the main PHY varies across test scenarios and is computed so that the channel switch terminates during one of the different steps of the reception of the ICF: during preamble detection period, before the PHY header end, before the MAC header end, before the padding start and after the padding start.
┌────────┬──────┬──────┬────────────────────┬───────┐ │PREAMBLE│ PHY │ MAC │ MAC PAYLOAD │ │ │ DETECT │HEADER│HEADER│(COMMON & USER INFO)│PADDING│ └────────┴──────┴──────┴────────────────────┴───────┘
All the combinations of the following are tested:
In all the cases, we check that the EMLSR client responds to the ICF:
At the end of the DL TXOP, it is checked that:
At the end of the UL TXOP, the main PHY returns to the preferred link.
It is also checked that the in-device interference generated by every transmission of the EMLSR client is tracked by all the PHY interfaces of all the PHYs but the PHY that is transmitting for the entire duration of the transmission.
Definition at line 322 of file wifi-emlsr-link-switch-test.h.
enum EmlsrIcfSentDuringMainPhySwitchTest::ChannelSwitchEnd : uint8_t |
Enumeration indicating the duration of a main PHY channel switch compared to the ICF fields.
Enumerator | |
---|---|
DURING_PREAMBLE_DETECTION | |
BEFORE_PHY_HDR_END | |
BEFORE_MAC_HDR_END | |
BEFORE_MAC_PAYLOAD_END | |
BEFORE_PADDING_END | |
CSD_COUNT |
Definition at line 331 of file wifi-emlsr-link-switch-test.h.
EmlsrIcfSentDuringMainPhySwitchTest::EmlsrIcfSentDuringMainPhySwitchTest | ( | ) |
Constructor.
Definition at line 1068 of file wifi-emlsr-link-switch-test.cc.
References EmlsrOperationsTestBase::m_duration, EmlsrOperationsTestBase::m_establishBaDl, EmlsrOperationsTestBase::m_establishBaUl, EmlsrOperationsTestBase::m_linksToEnableEmlsrOn, EmlsrOperationsTestBase::m_mainPhyId, EmlsrOperationsTestBase::m_nEmlsrStations, EmlsrOperationsTestBase::m_nNonEmlsrStations, EmlsrOperationsTestBase::m_paddingDelay, EmlsrOperationsTestBase::m_transitionDelay, ns3::MicroSeconds(), and ns3::Seconds().
|
protected |
Check that the in-device interference generated by a transmission of the given duration on the given link is tracked by all the PHY interfaces of all the PHYs but the PHY that is transmitting.
testStr | the test string |
linkId | the ID of the given link |
duration | the duration of the transmission |
Definition at line 1133 of file wifi-emlsr-link-switch-test.cc.
References ns3::DbmToW(), ns3::PointerValue::Get(), ns3::InterferenceHelper::GetEnergyDuration(), m_bands, EmlsrOperationsTestBase::m_staMacs, m_testStr, and NS_TEST_EXPECT_MSG_EQ.
Referenced by RunOne().
|
overrideprotectedvirtual |
Implementation to actually run this TestCase.
Subclasses should override this method to conduct their tests.
Implements ns3::TestCase.
Definition at line 1213 of file wifi-emlsr-link-switch-test.cc.
References ns3::Simulator::Destroy(), EmlsrOperationsTestBase::m_duration, m_events, NS_TEST_EXPECT_MSG_EQ, ns3::Simulator::Run(), and ns3::Simulator::Stop().
|
overrideprotectedvirtual |
Implementation to do any local setup required for this TestCase.
Subclasses should override this method to perform any costly per-test setup before DoRun is invoked.
Reimplemented from ns3::TestCase.
Definition at line 1085 of file wifi-emlsr-link-switch-test.cc.
References EmlsrOperationsTestBase::DoSetup(), EmlsrLinkSwitchCb(), m_bands, m_linkIdForTid3, EmlsrOperationsTestBase::m_staMacs, ns3::MakeCallback(), ns3::MicroSeconds(), and ns3::Config::SetDefault().
|
protected |
Callback connected to the EmlsrLinkSwitch trace source of the StaWifiMac of the EMLSR client.
linkId | the ID of the link which the PHY is connected to/disconnected from |
phy | a pointer to the PHY that is connected to/disconnected from the given link |
connected | true if the PHY is connected, false if the PHY is disconnected |
Definition at line 1224 of file wifi-emlsr-link-switch-test.cc.
References EmlsrOperationsTestBase::m_mainPhyId, m_setupDone, EmlsrOperationsTestBase::m_staMacs, m_switchFrom, m_switchTo, ns3::Simulator::Now(), NS_LOG_DEBUG, and ns3::Time::US.
Referenced by DoSetup().
|
protected |
Generate noise on all the links of the given MAC for the given time duration.
This is used to align the EDCA backoff boundary on all the links for the given MAC.
mac | the given MAC |
duration | the given duration |
Definition at line 1111 of file wifi-emlsr-link-switch-test.cc.
References ns3::Create(), ns3::DynamicCast(), and NS_TEST_ASSERT_MSG_NE.
Referenced by RunOne().
|
protected |
Runs a test case and invokes itself for the next test case.
Definition at line 1255 of file wifi-emlsr-link-switch-test.cc.
References BEFORE_MAC_HDR_END, BEFORE_MAC_PAYLOAD_END, BEFORE_PADDING_END, BEFORE_PHY_HDR_END, ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(), ns3::WifiPhy::CalculateTxDuration(), CheckInDeviceInterference(), CSD_COUNT, EmlsrOperationsTestBase::DOWNLINK, DURING_PREAMBLE_DETECTION, ns3::DynamicCast(), GenerateNoiseOnAllLinks(), EmlsrOperationsTestBase::GetApplication(), EmlsrOperationsTestBase::m_apMac, m_csdIndex, m_events, m_linkIdForTid3, EmlsrOperationsTestBase::m_mainPhyId, EmlsrOperationsTestBase::m_paddingDelay, EmlsrOperationsTestBase::m_staMacs, m_switchFrom, m_switchTo, m_testIndex, m_testStr, ns3::MicroSeconds(), ns3::MilliSeconds(), ns3::Simulator::Now(), NS_ABORT_MSG, NS_LOG_INFO, NS_TEST_ASSERT_MSG_EQ, NS_TEST_ASSERT_MSG_LT, NS_TEST_ASSERT_MSG_NE, NS_TEST_EXPECT_MSG_EQ, NS_TEST_EXPECT_MSG_GT, RunOne(), ns3::Simulator::Schedule(), ns3::Simulator::ScheduleNow(), EmlsrOperationsTestBase::UPLINK, ns3::Time::US, ns3::WIFI_MAC_CTL_ACK, ns3::WIFI_MAC_CTL_CTS, ns3::WIFI_MAC_CTL_TRIGGER, and ns3::WIFI_MAC_QOSDATA.
Referenced by RunOne(), and StartTraffic().
|
overrideprivatevirtual |
Start the generation of traffic (needs to be overridden)
Reimplemented from EmlsrOperationsTestBase.
Definition at line 1206 of file wifi-emlsr-link-switch-test.cc.
References m_setupDone, and RunOne().
|
overrideprotectedvirtual |
Callback invoked when a FEM passes PSDUs to the PHY.
mac | the MAC transmitting the PSDUs |
phyId | the ID of the PHY transmitting the PSDUs |
psduMap | the PSDU map |
txVector | the TX vector |
txPowerW | the tx power in Watts |
Reimplemented from EmlsrOperationsTestBase.
Definition at line 1167 of file wifi-emlsr-link-switch-test.cc.
References m_events, m_processedEvents, m_setupDone, NS_TEST_ASSERT_MSG_EQ, NS_TEST_EXPECT_MSG_EQ, and EmlsrOperationsTestBase::Transmit().
|
private |
bands of the 3 frequency channels
Definition at line 420 of file wifi-emlsr-link-switch-test.h.
Referenced by CheckInDeviceInterference(), and DoSetup().
|
private |
index to iterate over channel switch durations
Definition at line 413 of file wifi-emlsr-link-switch-test.h.
Referenced by RunOne().
|
private |
list of events for a test run
Definition at line 421 of file wifi-emlsr-link-switch-test.h.
Referenced by DoRun(), RunOne(), and Transmit().
|
private |
ID of the link on which TID 3 is mapped.
Definition at line 423 of file wifi-emlsr-link-switch-test.h.
|
private |
number of processed events
Definition at line 422 of file wifi-emlsr-link-switch-test.h.
Referenced by Transmit().
|
private |
whether association, BA, ... have been done
Definition at line 417 of file wifi-emlsr-link-switch-test.h.
Referenced by EmlsrLinkSwitchCb(), StartTraffic(), and Transmit().
|
private |
info for main PHY leaving a link
Definition at line 418 of file wifi-emlsr-link-switch-test.h.
Referenced by EmlsrLinkSwitchCb(), and RunOne().
|
private |
info for main PHY connected to a link
Definition at line 419 of file wifi-emlsr-link-switch-test.h.
Referenced by EmlsrLinkSwitchCb(), and RunOne().
|
private |
index to iterate over test scenarios
Definition at line 415 of file wifi-emlsr-link-switch-test.h.
Referenced by RunOne().
|
private |
test scenario description
Definition at line 416 of file wifi-emlsr-link-switch-test.h.
Referenced by CheckInDeviceInterference(), and RunOne().