A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
EmlsrDlTxopTest Class Reference

Test the transmission of DL frames to EMLSR clients. More...

#include "wifi-emlsr-test.h"

+ Inheritance diagram for EmlsrDlTxopTest:
+ Collaboration diagram for EmlsrDlTxopTest:

Classes

struct  Params
 Parameters for the EMLSR DL TXOP test. More...
 

Public Member Functions

 EmlsrDlTxopTest (const Params &params)
 Constructor.
 
 ~EmlsrDlTxopTest () override=default
 
- Public Member Functions inherited from EmlsrOperationsTestBase
 EmlsrOperationsTestBase (const std::string &name)
 Constructor.
 
 ~EmlsrOperationsTestBase () override=default
 
- Public Member Functions inherited from ns3::TestCase
 TestCase (const TestCase &)=delete
 
virtual ~TestCase ()
 Destructor.
 
std::string GetName () const
 
TestCaseoperator= (const TestCase &)=delete
 

Protected Member Functions

void CheckBlockAck (const WifiConstPsduMap &psduMap, const WifiTxVector &txVector, uint8_t phyId)
 Check that appropriate actions are taken by the AP MLD receiving a PPDU containing BlockAck frames from EMLSR clients on the given link.
 
void CheckEmlNotificationFrame (Ptr< const WifiMpdu > mpdu, const WifiTxVector &txVector, uint8_t linkId)
 Check that appropriate actions are taken by the AP MLD transmitting an EML Operating Mode Notification response frame to an EMLSR client on the given link.
 
void CheckInitialControlFrame (Ptr< const WifiMpdu > mpdu, const WifiTxVector &txVector, uint8_t linkId)
 Check that appropriate actions are taken by the AP MLD transmitting an initial Control frame to an EMLSR client on the given link.
 
void CheckPmModeAfterAssociation (const Mac48Address &address)
 Check that the AP MLD considers the correct Power Management mode for the links setup with the given non-AP MLD.
 
void CheckQosFrames (const WifiConstPsduMap &psduMap, const WifiTxVector &txVector, uint8_t linkId)
 Check that appropriate actions are taken by the AP MLD transmitting a PPDU containing QoS data frames to EMLSR clients on the given link.
 
void CheckResults ()
 Check that the simulation produced the expected results.
 
void DoRun () override
 Implementation to actually run this TestCase.
 
void DoSetup () override
 Implementation to do any local setup required for this TestCase.
 
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.
 
- Protected Member Functions inherited from EmlsrOperationsTestBase
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 DoSetup () override
 Implementation to do any local setup required for this TestCase.
 
Ptr< PacketSocketClientGetApplication (TrafficDirection dir, std::size_t staId, std::size_t count, std::size_t pktSize) const
 
virtual void Transmit (Ptr< WifiMac > mac, uint8_t phyId, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW)
 Callback invoked when a FEM passes PSDUs to the PHY.
 
- Protected Member Functions inherited from ns3::TestCase
 TestCase (std::string name)
 Constructor.
 
void AddTestCase (TestCase *testCase, Duration duration=Duration::QUICK)
 Add an individual child TestCase to this test suite.
 
TestCaseGetParent () 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 EnableEmlsrMode ()
 Enable EMLSR mode on the next EMLSR client.
 
void StartTraffic () override
 Start the generation of traffic (needs to be overridden)
 

Private Attributes

std::size_t m_countBlockAck
 counter for BlockAck frames (transition delay test)
 
std::size_t m_countQoSframes
 counter for QoS frames (transition delay test)
 
Time m_emlsrEnabledTime
 when EMLSR mode has been enabled on all EMLSR clients
 
std::set< uint8_t > m_emlsrLinks
 IDs of the links on which EMLSR mode has to be enabled.
 
Ptr< ListErrorModelm_errorModel
 error rate model to corrupt BlockAck at AP MLD
 
const Time m_fe2to3delay
 time interval between 2nd and 3rd frame exchange sequences after the enablement of EMLSR mode
 

Additional Inherited Members

- Public Types inherited from EmlsrOperationsTestBase
enum  TrafficDirection : uint8_t { DOWNLINK = 0 , UPLINK }
 Enumeration for traffic directions. More...
 
- Public Types inherited from ns3::TestCase
enum class  Duration { QUICK = 1 , EXTENSIVE = 2 , TAKES_FOREVER = 3 }
 How long the test takes to execute. More...
 
using instead = Duration
 
- Static Public Attributes inherited from ns3::TestCase
static constexpr auto EXTENSIVE = Duration::EXTENSIVE
 
static constexpr auto QUICK = Duration::QUICK
 
static constexpr auto TAKES_FOREVER
 
- Protected Attributes inherited from EmlsrOperationsTestBase
Ptr< ApWifiMacm_apMac
 AP wifi MAC.
 
std::vector< PacketSocketAddressm_dlSockets
 packet socket address for DL traffic
 
Time m_duration {0}
 simulation duration
 
bool m_establishBaDl {false}
 whether BA needs to be established (for TID 0) with the AP as originator
 
bool m_establishBaUl {false}
 whether BA needs to be established (for TID 0) with the AP as recipient
 
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::vector< Timem_paddingDelay
 Padding Delay advertised by the non-AP MLD.
 
std::vector< Ptr< StaWifiMac > > m_staMacs
 MACs of the non-AP MLDs.
 
std::vector< Timem_transitionDelay
 Transition Delay advertised by the non-AP MLD.
 
Time m_transitionTimeout {MicroSeconds(128)}
 Transition Timeout advertised by the AP MLD.
 
std::vector< FrameInfom_txPsdus
 transmitted PSDUs
 
std::vector< PacketSocketAddressm_ulSockets
 packet socket address for UL traffic
 

Detailed Description

Test the transmission of DL frames to EMLSR clients.

This test considers an AP MLD and a configurable number of non-AP MLDs that support EMLSR and a configurable number of non-AP MLDs that do not support EMLSR. All MLDs have three setup links, while the set of EMLSR links for the EMLSR clients is configurable. Block ack agreements (for TID 0, with the AP MLD as originator) are established with all the non-AP MLDs before that EMLSR clients send the EML Operating Mode Notification frame to enable the EMLSR mode on their EMLSR links.

Before enabling EMLSR mode, it is checked that:

  • all EMLSR links (but the link used for ML setup) of the EMLSR clients are considered to be in power save mode and are blocked by the AP MLD; all the other links have transitioned to active mode and are not blocked
  • no MU-RTS Trigger Frame is sent as Initial control frame
  • In case of EMLSR clients having no link that is not an EMLSR link and is different than the link used for ML setup, the two A-MPDUs used to trigger BA establishment are transmitted one after another on the link used for ML setup. Otherwise, the two A-MPDUs are sent concurrently on two distinct links

After enabling EMLSR mode, it is checked that:

  • all EMLSR links of the EMLSR clients are considered to be in active mode and are not blocked by the AP MLD
  • If all setup links are EMLSR links, the first two frame exchanges are both protected by MU-RTS TF and occur one after another. Otherwise, one frame exchange occurs on the non-EMLSR link and is not protected by MU-RTS TF; the other frame exchange occurs on an EMLSR link and is protected by MU-RTS TF
  • the AP MLD blocks transmission on all other EMLSR links when sending an ICF to an EMLSR client
  • After completing a frame exchange with an EMLSR client, the AP MLD can start another frame exchange with that EMLSR client within the same TXOP (after a SIFS) without sending an ICF
  • During the transition delay, all EMLSR links are not used for DL transmissions
  • The padding added to Initial Control frames is the largest among all the EMLSR clients solicited by the ICF

After disabling EMLSR mode, it is checked that:

  • all EMLSR links (but the link used to exchange EML Notification frames) of the EMLSR clients are considered to be in power save mode and are blocked by the AP MLD
  • an MU-RTS Trigger Frame is sent by the AP MLD as ICF for sending the EML Notification response, unless the link used to exchange EML Notification frames is a non-EMLSR link
  • no MU-RTS Trigger Frame is used as ICF for QoS data frames
  • In case of EMLSR clients having no link that is not an EMLSR link and is different than the link used to exchange EML Notification frames, the two A-MPDUs are transmitted one after another on the link used to exchange EML Notification frames. Otherwise, the two A-MPDUs are sent concurrently on two distinct links

Definition at line 349 of file wifi-emlsr-test.h.

Constructor & Destructor Documentation

◆ EmlsrDlTxopTest()

EmlsrDlTxopTest::EmlsrDlTxopTest ( const Params params)

◆ ~EmlsrDlTxopTest()

EmlsrDlTxopTest::~EmlsrDlTxopTest ( )
overridedefault

Member Function Documentation

◆ CheckBlockAck()

void EmlsrDlTxopTest::CheckBlockAck ( const WifiConstPsduMap psduMap,
const WifiTxVector txVector,
uint8_t  phyId 
)
protected

Check that appropriate actions are taken by the AP MLD receiving a PPDU containing BlockAck frames from EMLSR clients on the given link.

Parameters
psduMapthe PSDU carrying BlockAck frames
txVectorthe TXVECTOR used to send the PPDU
phyIdthe ID of the PHY transmitting the PSDU(s)

Definition at line 2036 of file wifi-emlsr-test.cc.

References ns3::WifiPhy::CalculateTxDuration(), EmlsrOperationsTestBase::CheckBlockedLink(), ns3::WifiMac::GetAddress(), ns3::Mac48Address::GetBroadcast(), ns3::WifiTxVector::GetChannelWidth(), ns3::WifiMac::GetNLinks(), ns3::EventId::GetUid(), ns3::WifiMac::GetWifiPhy(), ns3::WifiMac::GetWifiRemoteStationManager(), ns3::Time::IsZero(), EmlsrOperationsTestBase::m_apMac, m_countBlockAck, m_emlsrEnabledTime, m_emlsrLinks, m_errorModel, m_fe2to3delay, EmlsrOperationsTestBase::m_nEmlsrStations, EmlsrOperationsTestBase::m_staMacs, EmlsrOperationsTestBase::m_transitionDelay, ns3::MicroSeconds(), ns3::Simulator::Now(), NS_TEST_ASSERT_MSG_EQ, ns3::Simulator::Schedule(), ns3::ListErrorModel::SetList(), and ns3::WIFI_MAC_CTL_END.

Referenced by Transmit().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ CheckEmlNotificationFrame()

void EmlsrDlTxopTest::CheckEmlNotificationFrame ( Ptr< const WifiMpdu mpdu,
const WifiTxVector txVector,
uint8_t  linkId 
)
protected

Check that appropriate actions are taken by the AP MLD transmitting an EML Operating Mode Notification response frame to an EMLSR client on the given link.

Parameters
mpduthe MPDU carrying the EML Operating Mode Notification frame
txVectorthe TXVECTOR used to send the PPDU
linkIdthe ID of the given link

Definition at line 1616 of file wifi-emlsr-test.cc.

References ns3::WifiPhy::CalculateTxDuration(), ns3::GetAckSize(), ns3::WifiMac::GetWifiPhy(), EmlsrOperationsTestBase::m_apMac, EmlsrOperationsTestBase::m_nEmlsrStations, EmlsrOperationsTestBase::m_staMacs, NS_TEST_ASSERT_MSG_EQ, ns3::WifiActionHeader::Remove(), and ns3::Simulator::Schedule().

Referenced by Transmit().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ CheckInitialControlFrame()

void EmlsrDlTxopTest::CheckInitialControlFrame ( Ptr< const WifiMpdu mpdu,
const WifiTxVector txVector,
uint8_t  linkId 
)
protected

Check that appropriate actions are taken by the AP MLD transmitting an initial Control frame to an EMLSR client on the given link.

Parameters
mpduthe MPDU carrying the MU-RTS TF
txVectorthe TXVECTOR used to send the PPDU
linkIdthe ID of the given link

Definition at line 1709 of file wifi-emlsr-test.cc.

References ns3::WifiPhy::CalculateTxDuration(), EmlsrOperationsTestBase::CheckBlockedLink(), ns3::WifiMac::GetAddress(), ns3::WifiMode::GetDataRate(), ns3::ApWifiMac::GetMldOrLinkAddressByAid(), ns3::WifiTxVector::GetMode(), ns3::WifiMac::GetNLinks(), ns3::WifiPhy::GetPhyBand(), ns3::WifiTxVector::GetPreambleType(), ns3::WifiMac::GetWifiPhy(), ns3::WifiMac::GetWifiRemoteStationManager(), ns3::CtrlTriggerHeader::IsMuRts(), ns3::Time::IsStrictlyPositive(), EmlsrOperationsTestBase::m_apMac, m_emlsrEnabledTime, EmlsrOperationsTestBase::m_nEmlsrStations, EmlsrOperationsTestBase::m_paddingDelay, EmlsrOperationsTestBase::m_staMacs, Max, ns3::NanoSeconds(), NS_TEST_ASSERT_MSG_EQ, NS_TEST_EXPECT_MSG_EQ, NS_TEST_EXPECT_MSG_LT, ns3::Simulator::Schedule(), ns3::CtrlTriggerHeader::SetPaddingSize(), ns3::Time::US, and ns3::WIFI_PREAMBLE_HT_MF.

Referenced by Transmit().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ CheckPmModeAfterAssociation()

void EmlsrDlTxopTest::CheckPmModeAfterAssociation ( const Mac48Address address)
protected

Check that the AP MLD considers the correct Power Management mode for the links setup with the given non-AP MLD.

This method is intended to be called shortly after ML setup.

Parameters
addressa link address of the given non-AP MLD

Definition at line 1576 of file wifi-emlsr-test.cc.

References EmlsrOperationsTestBase::CheckBlockedLink(), ns3::WifiMac::GetNLinks(), ns3::WifiMac::GetWifiRemoteStationManager(), EmlsrOperationsTestBase::m_apMac, m_emlsrLinks, EmlsrOperationsTestBase::m_mainPhyId, EmlsrOperationsTestBase::m_nEmlsrStations, EmlsrOperationsTestBase::m_nNonEmlsrStations, EmlsrOperationsTestBase::m_staMacs, NS_TEST_ASSERT_MSG_EQ, and NS_TEST_EXPECT_MSG_EQ.

Referenced by Transmit().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ CheckQosFrames()

void EmlsrDlTxopTest::CheckQosFrames ( const WifiConstPsduMap psduMap,
const WifiTxVector txVector,
uint8_t  linkId 
)
protected

Check that appropriate actions are taken by the AP MLD transmitting a PPDU containing QoS data frames to EMLSR clients on the given link.

Parameters
psduMapthe PSDU(s) carrying QoS data frames
txVectorthe TXVECTOR used to send the PPDU
linkIdthe ID of the given link

Definition at line 1831 of file wifi-emlsr-test.cc.

References ns3::Node::AddApplication(), ns3::WifiMac::BlockUnicastTxOnLinks(), ns3::WifiPhy::CalculateTxDuration(), EmlsrOperationsTestBase::CheckBlockedLink(), EmlsrOperationsTestBase::DOWNLINK, ns3::WifiMac::GetAddress(), EmlsrOperationsTestBase::GetApplication(), ns3::WifiMac::GetDevice(), ns3::WifiMac::GetNLinks(), ns3::WifiNetDevice::GetNode(), ns3::WifiPhy::GetPhyBand(), ns3::WifiMac::GetWifiPhy(), ns3::Time::IsZero(), EmlsrOperationsTestBase::m_apMac, m_countQoSframes, m_emlsrEnabledTime, m_emlsrLinks, m_fe2to3delay, EmlsrOperationsTestBase::m_nEmlsrStations, EmlsrOperationsTestBase::m_staMacs, EmlsrOperationsTestBase::m_transitionDelay, ns3::MicroSeconds(), ns3::NanoSeconds(), ns3::Simulator::Now(), NS_TEST_EXPECT_MSG_EQ, ns3::Simulator::Schedule(), and ns3::WifiMac::UnblockUnicastTxOnLinks().

Referenced by Transmit().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ CheckResults()

void EmlsrDlTxopTest::CheckResults ( )
protected

Check that the simulation produced the expected results.

Before enabling EMLSR mode, no MU-RTS TF should be sent. Four packets are generated after association to trigger the establishment of a Block Ack agreement. The TXOP Limit and the MCS are set such that two packets can be transmitted in a TXOP, hence we expect that the AP MLD sends two A-MPDUs to each non-AP MLD.

EMLSR client with EMLSR mode to be enabled on all links: after ML setup, all other links stay in power save mode, hence BA establishment occurs on the same link.

[link 0] ─────────────────────────────────────────────────────────────────────────── | power save mode

┌─────┐ ┌─────┐ ┌───┬───┐ ┌───┬───┐ ┌───┐ │Assoc│ │ADDBA│ ┌───┐ │QoS│QoS│ │QoS│QoS│ [link 1] │ACK│ │Resp │ │ Req │ │ACK│ │ 0 │ 1 │ │ 2 │ 3 │ ───┬─────┬┴───┴──┴─────┴┬───┬─┴─────┴┬───┬─┬─────┬┴───┴─┴───┴───┴┬──┬─┴───┴───┴┬──┬─── │Assoc│ │ACK│ │ACK│ │ADDBA│ │BA│ │BA│ │ Req │ └───┘ └───┘ │Resp │ └──┘ └──┘ └─────┘ └─────┘

[link 2] ─────────────────────────────────────────────────────────────────────────── | power save mode

EMLSR client with EMLSR mode to be enabled on not all the links: after ML setup, the other EMLSR links stay in power save mode, the non-EMLSR link (link 1) transitions to active mode.

                                        ┌─────┐                   ┌───┬───┐
                                 ┌───┐  │ADDBA│             ┌───┐ │QoS│QoS│

[link 0 - non EMLSR] │ACK│ │ Req │ │ACK│ │ 2 │ 3 │ ──────────────────────────────┬────┬┴───┴──┴─────┴┬───┬─┬─────┬┴───┴─┴───┴───┴┬──┬─ │Data│ │ACK│ │ADDBA│ │BA│ │Null│ └───┘ │Resp │ └──┘ └────┘ └─────┘ ┌─────┐ ┌───┬───┐ ┌───┐ │Assoc│ │QoS│QoS│ [link 1] │ACK│ │Resp │ │ 0 │ 1 │ ───┬─────┬┴───┴──┴─────┴┬───┬──────────────────────────────────┴───┴───┴┬──┬─────── │Assoc│ │ACK│ │BA│ │ Req │ └───┘ └──┘ └─────┘

[link 2] ─────────────────────────────────────────────────────────────────────────── | power save mode

Non-EMLSR client (not shown): after ML setup, all other links transition to active mode by sending a Data Null frame; QoS data frame exchanges occur on two links simultaneously.

If this is an EMLSR client and there is no setup link other than the one used to establish association that is not an EMLSR link, then the two A-MPDUs are sent one after another on the link used to establish association.

Otherwise, the two A-MPDUs can be sent concurrently on two distinct links (may be the link used to establish association and a non-EMLSR link).

After enabling EMLSR mode, MU-RTS TF should only be sent on EMLSR links. After the exchange of EML Operating Mode Notification frames, a number of packets are generated at the AP MLD to prepare two A-MPDUs for each non-AP MLD.

EMLSR client with EMLSR mode to be enabled on all links (A is the EMLSR client, B is the non-EMLSR client): ┌─────┬─────┐ │QoS 4│QoS 5│ │ to A│ to A│ ┌───┐ ├─────┼─────┤ │MU │ │QoS 4│QoS 5│ [link 0] │RTS│ │ to B│ to B│ ──────────────────────────┴───┴┬───┬┴─────┴─────┴┬──┬──────────── │CTS│ │BA│ ├───┤ ├──┤ │CTS│ │BA│ └───┘ └──┘ ┌───┐ ┌─────┬─────┐ ┌───┐ │EML│ │QoS 6│QoS 7│ [link 1] │ACK│ │OM │ │ to B│ to B│ ────┬───┬┴───┴──┴───┴┬───┬─┴─────┴─────┴┬──┬──────────────────────────────────── │EML│ │ACK│ │BA│ │OM │ └───┘ └──┘ └───┘ ┌───┐ ┌─────┬─────┐ │MU │ │QoS 6│QoS 7│ [link 2] │RTS│ │ to A│ to A│ ─────────────────────────────────────────────────────────┴───┴┬───┬┴─────┴─────┴┬──┬─ │CTS│ │BA│ └───┘ └──┘

EMLSR client with EMLSR mode to be enabled on not all the links (A is the EMLSR client, B is the non-EMLSR client): ┌─────┬─────┐ │QoS 4│QoS 5│ │ to A│ to A│ ├─────┼─────┤ │QoS 4│QoS 5│ [link 0 - non EMLSR] │ to B│ to B│ ───────────────────────────┴─────┴─────┴┬──┬─────────────────────────── │BA│ ├──┤ │BA│ └──┘ ┌─────┬─────┐ │QoS 6│QoS 7│ │ to A│ to A│ ┌───┐ ┌───┐ ├─────┼─────┤ ┌───┐ │EML│ │MU │ │QoS 6│QoS 7│ [link 1] │ACK│ │OM │ │RTS│ │ to B│ to B│ ────┬───┬┴───┴──┴───┴┬───┬─┴───┴┬───┬┴─────┴─────┴┬──┬──────────── │EML│ │ACK│ │CTS│ │BA│ │OM │ └───┘ ├───┤ ├──┤ └───┘ │CTS│ │BA│ └───┘ └──┘

[link 2] ────────────────────────────────────────────────────────────────────────────────

Store a QoS data frame or an MU-RTS TF followed by a QoS data frame

Let's focus on the first two frame exchanges for each EMLSR clients. If all setup links are EMLSR links, both frame exchanges are protected by MU-RTS TF and occur one after another. Otherwise, one frame exchange occurs on the non-EMLSR link and is not protected by MU-RTS TF; the other frame exchange occurs on an EMLSR link and is protected by MU-RTS TF.

A and B are two EMLSR clients. No ICF before the second QoS data frame because B has not switched to listening mode. ICF is sent before the third QoS data frame because A has switched to listening mode. C is a non-EMLSR client.

                   ┌─────┐          A switches to listening
                   │QoS x│          after transition delay
                   │ to A│          |
         ┌───┐     ├─────┤    ┌─────┐
         │MU │     │QoS x│    │QoS y│

[link 0] │RTS│ │ to B│ │ to B│ ────────────┴───┴┬───┬┴─────┴┬──┬┴─────┴┬──┬──────────── │CTS│ │BA│ │BA│ ├───┤ ├──┤ └──┘ │CTS│ │BA│ └───┘ └──┘ AP continues the TXOP A switches to listening after PIFS recovery after transition delay │ │ ┌─────┐ ┌───┐ ┌─────┐ │┌───┐ ┌───┐ │QoS z│ │MU │ │QoS x│ ││MU │ ┌───┐ │CF-│ [link 1] │ to C│ │RTS│ │ to A│ ││RTS│ │BAR│ │End│ ───────────────────────────────┴─────┴┬──┬┴───┴┬───┬┴─────┴┬──┬┴───┴┬───┬┴───┴┬──┬┴───┴─ │BA│ │CTS│ │BA│ │CTS│ │BA│ └──┘ └───┘ └──x └───┘ └──┘

After disabling EMLSR mode, no MU-RTS TF should be sent. After the exchange of EML Operating Mode Notification frames, a number of packets are generated at the AP MLD to prepare two A-MPDUs for each EMLSR client.

EMLSR client with EMLSR mode to be enabled on all links (A is the EMLSR client, B is the non-EMLSR client):

[link 0] | power save mode ──────────────────────────────────────────────────────── ┌─────┬─────┐ ┌──────┬──────┐ │QoS 8│QoS 9│ │QoS 10│QoS 11│ │ to A│ to A│ │ to A │ to A │ ┌───┐ ┌───┐ ├─────┼─────┤ ├──────┼──────┤ ┌───┐ │MU │ │EML│ │QoS 8│QoS 9│ │QoS 10│QoS 11│ [link 1] │ACK│ │RTS│ │OM │ │ to B│ to B│ │ to B │ to B │ ────┬───┬┴───┴──┴───┴┬───┬┴───┴┬───┬──┴─────┴─────┴┬──┬────┴──────┴──────┴┬──┬───── │EML│ │CTS│ │ACK│ │BA│ │BA│ │OM │ └───┘ └───┘ ├──┤ ├──┤ └───┘ │BA│ │BA│ └──┘ └──┘

[link 2] | power save mode ────────────────────────────────────────────────────────────────────────────

EMLSR client with EMLSR mode to be enabled on not all the links (A is the EMLSR client, B is the non-EMLSR client): ┌─────┬─────┐ │QoS 8│QoS 9│ │ to A│ to A│ ├─────┼─────┤ │QoS 8│QoS 9│ [link 0 - non EMLSR] │ to B│ to B│ ─────────────────────────────────────────┴─────┴─────┴┬──┬───────────── │BA│ ├──┤ │BA│ └──┘ ┌──────┬──────┐ │QoS 10│QoS 11│ │ to A │ to A │ ┌───┐ ┌───┐ ├──────┼──────┤ ┌───┐ │MU │ │EML│ │QoS 10│QoS 11│ [link 1] │ACK│ │RTS│ │OM │ │ to B │ to B │ ────┬───┬┴───┴──┴───┴┬───┬┴───┴┬───┬──┴──────┴──────┴┬──┬───── │EML│ │CTS│ │ACK│ │BA│ │OM │ └───┘ └───┘ ├──┤ └───┘ │BA│ └──┘

[link 2] | power save mode ────────────────────────────────────────────────────────────────────────────

Definition at line 888 of file wifi-emlsr-test.cc.

References ns3::WifiPhy::CalculateTxDuration(), ns3::CtrlTriggerHeader::IsMuRts(), ns3::IsTrigger(), EmlsrOperationsTestBase::m_mainPhyId, EmlsrOperationsTestBase::m_nEmlsrStations, EmlsrOperationsTestBase::m_nNonEmlsrStations, EmlsrOperationsTestBase::m_staMacs, EmlsrOperationsTestBase::m_txPsdus, NS_TEST_ASSERT_MSG_EQ, NS_TEST_EXPECT_MSG_EQ, NS_TEST_EXPECT_MSG_GT, and NS_TEST_EXPECT_MSG_LT.

Referenced by DoRun().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ DoRun()

void EmlsrDlTxopTest::DoRun ( )
overrideprotectedvirtual

Implementation to actually run this TestCase.

Subclasses should override this method to conduct their tests.

Implements ns3::TestCase.

Definition at line 2245 of file wifi-emlsr-test.cc.

References CheckResults(), ns3::Simulator::Destroy(), EmlsrOperationsTestBase::m_duration, ns3::Simulator::Run(), and ns3::Simulator::Stop().

+ Here is the call graph for this function:

◆ DoSetup()

void EmlsrDlTxopTest::DoSetup ( )
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 791 of file wifi-emlsr-test.cc.

References ns3::AC_BE, ns3::Object::AggregateObject(), ns3::WifiAcknowledgment::DL_MU_AGGREGATE_TF, EmlsrOperationsTestBase::DoSetup(), ns3::WifiMac::GetFrameExchangeManager(), ns3::WifiMac::GetNLinks(), ns3::WifiMac::GetQosTxop(), ns3::WifiMac::GetWifiPhy(), EmlsrOperationsTestBase::m_apMac, m_errorModel, EmlsrOperationsTestBase::m_nEmlsrStations, EmlsrOperationsTestBase::m_nNonEmlsrStations, ns3::MicroSeconds(), ns3::WifiPhy::SetPostReceptionErrorModel(), and ns3::Txop::SetTxopLimits().

+ Here is the call graph for this function:

◆ EnableEmlsrMode()

void EmlsrDlTxopTest::EnableEmlsrMode ( )
private

Enable EMLSR mode on the next EMLSR client.

Definition at line 868 of file wifi-emlsr-test.cc.

References EnableEmlsrMode(), m_emlsrEnabledTime, m_emlsrLinks, EmlsrOperationsTestBase::m_lastAid, EmlsrOperationsTestBase::m_nEmlsrStations, EmlsrOperationsTestBase::m_staMacs, ns3::MilliSeconds(), ns3::Simulator::Now(), ns3::Simulator::Schedule(), and StartTraffic().

Referenced by EnableEmlsrMode(), and StartTraffic().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ StartTraffic()

void EmlsrDlTxopTest::StartTraffic ( )
overrideprivatevirtual

Start the generation of traffic (needs to be overridden)

Reimplemented from EmlsrOperationsTestBase.

Definition at line 819 of file wifi-emlsr-test.cc.

References ns3::Node::AddApplication(), EmlsrOperationsTestBase::DOWNLINK, EnableEmlsrMode(), EmlsrOperationsTestBase::GetApplication(), ns3::WifiMac::GetDevice(), ns3::WifiMac::GetNLinks(), ns3::WifiNetDevice::GetNode(), ns3::Time::IsZero(), EmlsrOperationsTestBase::m_apMac, m_emlsrEnabledTime, m_emlsrLinks, m_fe2to3delay, EmlsrOperationsTestBase::m_lastAid, EmlsrOperationsTestBase::m_nEmlsrStations, EmlsrOperationsTestBase::m_nNonEmlsrStations, EmlsrOperationsTestBase::m_staMacs, ns3::MilliSeconds(), and ns3::Simulator::Schedule().

Referenced by EnableEmlsrMode().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ Transmit()

void EmlsrDlTxopTest::Transmit ( Ptr< WifiMac mac,
uint8_t  phyId,
WifiConstPsduMap  psduMap,
WifiTxVector  txVector,
double  txPowerW 
)
overrideprotectedvirtual

Member Data Documentation

◆ m_countBlockAck

std::size_t EmlsrDlTxopTest::m_countBlockAck
private

counter for BlockAck frames (transition delay test)

Definition at line 460 of file wifi-emlsr-test.h.

Referenced by CheckBlockAck().

◆ m_countQoSframes

std::size_t EmlsrDlTxopTest::m_countQoSframes
private

counter for QoS frames (transition delay test)

Definition at line 459 of file wifi-emlsr-test.h.

Referenced by CheckQosFrames().

◆ m_emlsrEnabledTime

Time EmlsrDlTxopTest::m_emlsrEnabledTime
private

when EMLSR mode has been enabled on all EMLSR clients

Definition at line 456 of file wifi-emlsr-test.h.

Referenced by CheckBlockAck(), CheckInitialControlFrame(), CheckQosFrames(), EnableEmlsrMode(), and StartTraffic().

◆ m_emlsrLinks

std::set<uint8_t> EmlsrDlTxopTest::m_emlsrLinks
private

IDs of the links on which EMLSR mode has to be enabled.

Definition at line 455 of file wifi-emlsr-test.h.

Referenced by CheckBlockAck(), CheckPmModeAfterAssociation(), CheckQosFrames(), EnableEmlsrMode(), StartTraffic(), and Transmit().

◆ m_errorModel

Ptr<ListErrorModel> EmlsrDlTxopTest::m_errorModel
private

error rate model to corrupt BlockAck at AP MLD

Definition at line 461 of file wifi-emlsr-test.h.

Referenced by CheckBlockAck(), and DoSetup().

◆ m_fe2to3delay

const Time EmlsrDlTxopTest::m_fe2to3delay
private

time interval between 2nd and 3rd frame exchange sequences after the enablement of EMLSR mode

Definition at line 457 of file wifi-emlsr-test.h.

Referenced by CheckBlockAck(), CheckQosFrames(), and StartTraffic().


The documentation for this class was generated from the following files: