Switch main PHY back timer test. More...
#include "wifi-emlsr-link-switch-test.h"
Classes | |
struct | Events |
Actions and checks to perform upon the transmission of each frame. More... | |
Public Types | |
enum | TestScenario : uint8_t { RXSTART_WHILE_SWITCH_NO_INTERRUPT = 0 , RXSTART_WHILE_SWITCH_INTERRUPT , RXSTART_AFTER_SWITCH_HT_PPDU , NON_HT_PPDU_DONT_USE_MAC_HDR , NON_HT_PPDU_USE_MAC_HDR , LONG_SWITCH_BACK_DELAY_DONT_USE_MAC_HDR , LONG_SWITCH_BACK_DELAY_USE_MAC_HDR , COUNT } |
Enumeration indicating the tested scenario. 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 | |
EmlsrSwitchMainPhyBackTest () | |
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 | DoRun () override |
Implementation to actually run this TestCase. | |
void | DoSetup () override |
Implementation to do any local setup required for this TestCase. | |
void | InsertEventsForQosTid4 () |
Insert events corresponding to the UL TXOP to transmit the QoS Data frame with TID 4. | |
void | MainPhySwitchInfoCallback (std::size_t index, const EmlsrMainPhySwitchTrace &info) override |
Callback connected to the EMLSR Manager MainPhySwitch trace source. | |
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. | |
Ptr< PacketSocketClient > | GetApplication (TrafficDirection dir, std::size_t staId, std::size_t count, std::size_t pktSize, uint8_t priority=0) const |
![]() | |
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 | |
Ptr< WifiMpdu > | m_bcastFrame |
the broadcast frame sent by the AP MLD | |
bool | m_dlPktDone {false} |
whether the DL packet has been generated | |
std::list< Events > | m_events |
list of events for a test run | |
Time | m_expectedMainPhySwitchBackTime |
expected main PHY switch back time | |
const uint8_t | m_linkIdForTid0 {1} |
ID of the link on which TID 0 is mapped. | |
const uint8_t | m_linkIdForTid4 {0} |
ID of the link on which TID 4 is mapped. | |
std::size_t | m_processedEvents {0} |
number of processed events | |
bool | m_setupDone {false} |
whether association, BA, ... have been done | |
Time | m_switchMainPhyBackDelay |
the switch main PHY back delay | |
uint8_t | m_testIndex {0} |
index to iterate over test scenarios | |
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 | |
Switch main PHY back timer test.
An AP MLD and an EMLSR client, both having 3 links, are considered in this test. Aux PHYs are not TX capable, do not switch links and support up to the HT modulation class; the preferred link is link 2. In order to control link switches, a TID-to-Link mapping is configured so that TID 0 is mapped onto link 1 and TID 4 is mapped onto link 0 (for both DL and UL). In this test, the main PHY switches to link 1 to start an UL TXOP but, while the main PHY is switching or shortly after the channel switch ends, the AP MLD transmits a QoS Data broadcast frame on link 1 using a modulation supported by the aux PHYs. Different situations are tested and it is verified that the main PHY switches back to the preferred link as expected. Scenarios:
Except for the NON_HT_PPDU_DONT_USE_MAC_HDR case, in which the main PHY stays on link 1 and transmits a data frame, receives the Ack and switches back to the preferred link at the TXOP end, in all other cases the main PHY switches back to the preferred link without sending a frame on link 1. A few microseconds after starting the switch to the preferred link, a frame with TID 4 is queued. If interrupt switching is enabled, the switch to the preferred link is interrupted and the main PHY switches to link 0, where it transmits the data frame with TID 4 as soon as completing the switch. Afterwards, the main PHY switches back to the preferred link and, except for the NON_HT_PPDU_DONT_USE_MAC_HDR case, it switches to link 1 to transmit the queued frame with TID 0.
Definition at line 497 of file wifi-emlsr-link-switch-test.h.
enum EmlsrSwitchMainPhyBackTest::TestScenario : uint8_t |
Enumeration indicating the tested scenario.
Definition at line 506 of file wifi-emlsr-link-switch-test.h.
EmlsrSwitchMainPhyBackTest::EmlsrSwitchMainPhyBackTest | ( | ) |
Constructor.
Definition at line 1547 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().
|
overrideprotectedvirtual |
Implementation to actually run this TestCase.
Subclasses should override this method to conduct their tests.
Implements ns3::TestCase.
Definition at line 1638 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 EmlsrOperationsTestBase.
Definition at line 1564 of file wifi-emlsr-link-switch-test.cc.
References ns3::Create(), EmlsrOperationsTestBase::DoSetup(), ns3::Mac48Address::GetBroadcast(), EmlsrOperationsTestBase::m_apMac, m_bcastFrame, m_linkIdForTid0, m_linkIdForTid4, ns3::MicroSeconds(), ns3::WifiMacHeader::SetAddr1(), ns3::WifiMacHeader::SetAddr2(), ns3::WifiMacHeader::SetAddr3(), ns3::Config::SetDefault(), ns3::WifiMacHeader::SetDsFrom(), ns3::WifiMacHeader::SetDsNotTo(), ns3::WifiMacHeader::SetQosTid(), and ns3::WIFI_MAC_QOSDATA.
|
protected |
Insert events corresponding to the UL TXOP to transmit the QoS Data frame with TID 4.
Definition at line 1798 of file wifi-emlsr-link-switch-test.cc.
References COUNT, ns3::DynamicCast(), EmlsrOperationsTestBase::m_apMac, m_dlPktDone, m_events, m_linkIdForTid4, EmlsrOperationsTestBase::m_mainPhyId, EmlsrOperationsTestBase::m_staMacs, m_testIndex, ns3::MilliSeconds(), NON_HT_PPDU_DONT_USE_MAC_HDR, ns3::Simulator::Now(), NS_TEST_EXPECT_MSG_EQ, RunOne(), ns3::Simulator::Schedule(), ns3::WIFI_MAC_CTL_ACK, ns3::WIFI_MAC_CTL_END, and ns3::WIFI_MAC_QOSDATA.
Referenced by MainPhySwitchInfoCallback().
|
overrideprotectedvirtual |
Callback connected to the EMLSR Manager MainPhySwitch trace source.
index | the index of the EMLSR client whose main PHY switch event is logged |
info | the information associated with the main PHY switch event |
Reimplemented from EmlsrOperationsTestBase.
Definition at line 1649 of file wifi-emlsr-link-switch-test.cc.
References ns3::AC_BE, EmlsrOperationsTestBase::GetApplication(), ns3::EmlsrMainPhySwitchTrace::GetName(), InsertEventsForQosTid4(), LONG_SWITCH_BACK_DELAY_DONT_USE_MAC_HDR, LONG_SWITCH_BACK_DELAY_USE_MAC_HDR, EmlsrOperationsTestBase::m_apMac, m_bcastFrame, m_dlPktDone, m_expectedMainPhySwitchBackTime, m_linkIdForTid4, m_setupDone, EmlsrOperationsTestBase::m_staMacs, m_switchMainPhyBackDelay, m_testIndex, EmlsrOperationsTestBase::MainPhySwitchInfoCallback(), ns3::MicroSeconds(), NON_HT_PPDU_DONT_USE_MAC_HDR, NON_HT_PPDU_USE_MAC_HDR, ns3::Simulator::Now(), NS_LOG_INFO, NS_TEST_ASSERT_MSG_EQ, NS_TEST_EXPECT_MSG_EQ, RXSTART_AFTER_SWITCH_HT_PPDU, RXSTART_WHILE_SWITCH_INTERRUPT, RXSTART_WHILE_SWITCH_NO_INTERRUPT, ns3::Simulator::Schedule(), and EmlsrOperationsTestBase::UPLINK.
|
protected |
Runs a test case and invokes itself for the next test case.
Definition at line 1863 of file wifi-emlsr-link-switch-test.cc.
References ns3::AC_BE, ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(), ns3::WifiPhy::CalculateTxDuration(), COUNT, ns3::DynamicCast(), EmlsrOperationsTestBase::GetApplication(), ns3::Mac48Address::GetBroadcast(), ns3::HtPhy::GetHtMcs0(), ns3::WifiTxVector::GetMode(), ns3::OfdmPhy::GetOfdmRate6Mbps(), LONG_SWITCH_BACK_DELAY_DONT_USE_MAC_HDR, LONG_SWITCH_BACK_DELAY_USE_MAC_HDR, EmlsrOperationsTestBase::m_apMac, m_bcastFrame, m_dlPktDone, m_events, m_expectedMainPhySwitchBackTime, m_linkIdForTid0, EmlsrOperationsTestBase::m_mainPhyId, EmlsrOperationsTestBase::m_staMacs, m_switchMainPhyBackDelay, m_testIndex, ns3::MicroSeconds(), ns3::MilliSeconds(), NON_HT_PPDU_DONT_USE_MAC_HDR, NON_HT_PPDU_USE_MAC_HDR, ns3::Simulator::Now(), NS_LOG_INFO, NS_TEST_ASSERT_MSG_EQ, NS_TEST_EXPECT_MSG_EQ, RunOne(), RXSTART_AFTER_SWITCH_HT_PPDU, RXSTART_WHILE_SWITCH_INTERRUPT, RXSTART_WHILE_SWITCH_NO_INTERRUPT, ns3::Simulator::Schedule(), ns3::SU_STA_ID, EmlsrOperationsTestBase::UPLINK, ns3::WIFI_MAC_CTL_ACK, and ns3::WIFI_MAC_QOSDATA.
Referenced by InsertEventsForQosTid4(), RunOne(), and StartTraffic().
|
overrideprivatevirtual |
Start the generation of traffic (needs to be overridden)
Reimplemented from EmlsrOperationsTestBase.
Definition at line 1631 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 1592 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().
the broadcast frame sent by the AP MLD
Definition at line 565 of file wifi-emlsr-link-switch-test.h.
Referenced by DoSetup(), MainPhySwitchInfoCallback(), and RunOne().
|
private |
whether the DL packet has been generated
Definition at line 560 of file wifi-emlsr-link-switch-test.h.
Referenced by InsertEventsForQosTid4(), MainPhySwitchInfoCallback(), and RunOne().
|
private |
list of events for a test run
Definition at line 561 of file wifi-emlsr-link-switch-test.h.
Referenced by DoRun(), InsertEventsForQosTid4(), RunOne(), and Transmit().
|
private |
expected main PHY switch back time
Definition at line 567 of file wifi-emlsr-link-switch-test.h.
Referenced by MainPhySwitchInfoCallback(), and RunOne().
|
private |
ID of the link on which TID 0 is mapped.
Definition at line 563 of file wifi-emlsr-link-switch-test.h.
|
private |
ID of the link on which TID 4 is mapped.
Definition at line 564 of file wifi-emlsr-link-switch-test.h.
Referenced by DoSetup(), InsertEventsForQosTid4(), and MainPhySwitchInfoCallback().
|
private |
number of processed events
Definition at line 562 of file wifi-emlsr-link-switch-test.h.
Referenced by Transmit().
|
private |
whether association, BA, ... have been done
Definition at line 559 of file wifi-emlsr-link-switch-test.h.
Referenced by MainPhySwitchInfoCallback(), StartTraffic(), and Transmit().
|
private |
the switch main PHY back delay
Definition at line 566 of file wifi-emlsr-link-switch-test.h.
Referenced by MainPhySwitchInfoCallback(), and RunOne().
|
private |
index to iterate over test scenarios
Definition at line 558 of file wifi-emlsr-link-switch-test.h.
Referenced by InsertEventsForQosTid4(), MainPhySwitchInfoCallback(), and RunOne().