A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
wifi-emlsr-test.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2023 Universita' degli Studi di Napoli Federico II
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Stefano Avallone <stavallo@unina.it>
7 */
8
9#ifndef WIFI_EMLSR_TEST_H
10#define WIFI_EMLSR_TEST_H
11
12#include "ns3/ap-wifi-mac.h"
13#include "ns3/error-model.h"
14#include "ns3/header-serialization-test.h"
15#include "ns3/packet-socket-address.h"
16#include "ns3/packet-socket-client.h"
17#include "ns3/sta-wifi-mac.h"
18#include "ns3/test.h"
19#include "ns3/wifi-mac-queue-scheduler.h"
20#include "ns3/wifi-mac.h"
21#include "ns3/wifi-ppdu.h"
22#include "ns3/wifi-psdu.h"
23
24using namespace ns3;
25
26/**
27 * \ingroup wifi-test
28 * \ingroup tests
29 *
30 * \brief Test EML Operating Mode Notification frame serialization and deserialization
31 */
33{
34 public:
35 /**
36 * Constructor
37 */
40
41 private:
42 void DoRun() override;
43};
44
45/**
46 * \ingroup wifi-test
47 * \ingroup tests
48 *
49 * \brief Base class for EMLSR Operations tests
50 *
51 * This base class setups and configures one AP MLD, a variable number of non-AP MLDs with
52 * EMLSR activated and a variable number of non-AP MLD with EMLSR deactivated. Every MLD has
53 * three links, each operating on a distinct PHY band (2.4 GHz, 5 GHz and 6 GHz). Therefore,
54 * it is expected that three links are setup by the non-AP MLD(s). The values for the Padding
55 * Delay, the Transition Delay and the Transition Timeout are provided as argument to the
56 * constructor of this class, along with the IDs of the links on which EMLSR mode must be
57 * enabled for the non-AP MLDs (this information is used to set the EmlsrLinkSet attribute
58 * of the DefaultEmlsrManager installed on the non-AP MLDs).
59 */
61{
62 public:
63 /**
64 * Constructor
65 *
66 * \param name The name of the new TestCase created
67 */
68 EmlsrOperationsTestBase(const std::string& name);
69 ~EmlsrOperationsTestBase() override = default;
70
71 /// Enumeration for traffic directions
72 enum TrafficDirection : uint8_t
73 {
75 UPLINK
76 };
77
78 protected:
79 /**
80 * Callback invoked when a FEM passes PSDUs to the PHY.
81 *
82 * \param mac the MAC transmitting the PSDUs
83 * \param phyId the ID of the PHY transmitting the PSDUs
84 * \param psduMap the PSDU map
85 * \param txVector the TX vector
86 * \param txPowerW the tx power in Watts
87 */
88 virtual void Transmit(Ptr<WifiMac> mac,
89 uint8_t phyId,
90 WifiConstPsduMap psduMap,
91 WifiTxVector txVector,
92 double txPowerW);
93
94 /**
95 * \param dir the traffic direction (downlink/uplink)
96 * \param staId the index (starting at 0) of the non-AP MLD generating/receiving packets
97 * \param count the number of packets to generate
98 * \param pktSize the size of the packets to generate
99 * \return an application generating the given number packets of the given size from/to the
100 * AP MLD to/from the given non-AP MLD
101 */
103 std::size_t staId,
104 std::size_t count,
105 std::size_t pktSize) const;
106
107 /**
108 * Check whether QoS data unicast transmissions addressed to the given destination on the
109 * given link are blocked or unblocked for the given reason on the given device.
110 *
111 * \param mac the MAC of the given device
112 * \param dest the MAC address of the given destination
113 * \param linkId the ID of the given link
114 * \param reason the reason for blocking transmissions to test
115 * \param blocked whether transmissions are blocked for the given reason
116 * \param description text indicating when this check is performed
117 * \param testUnblockedForOtherReasons whether to test if transmissions are unblocked for
118 * all the reasons other than the one provided
119 */
121 Mac48Address dest,
122 uint8_t linkId,
124 bool blocked,
125 std::string description,
126 bool testUnblockedForOtherReasons = true);
127
128 void DoSetup() override;
129
130 /// Information about transmitted frames
132 {
133 Time startTx; ///< TX start time
134 WifiConstPsduMap psduMap; ///< transmitted PSDU map
135 WifiTxVector txVector; ///< TXVECTOR
136 uint8_t linkId; ///< link ID
137 uint8_t phyId; ///< ID of the transmitting PHY
138 };
139
140 uint8_t m_mainPhyId{0}; //!< ID of the main PHY
141 std::set<uint8_t> m_linksToEnableEmlsrOn; /**< IDs of the links on which EMLSR mode has to
142 be enabled */
143 std::size_t m_nEmlsrStations{1}; ///< number of stations to create that activate EMLSR
144 std::size_t m_nNonEmlsrStations{0}; /**< number of stations to create that do not
145 activate EMLSR */
146 Time m_transitionTimeout{MicroSeconds(128)}; ///< Transition Timeout advertised by the AP MLD
147 std::vector<Time> m_paddingDelay{
148 {MicroSeconds(32)}}; ///< Padding Delay advertised by the non-AP MLD
149 std::vector<Time> m_transitionDelay{
150 {MicroSeconds(16)}}; ///< Transition Delay advertised by the non-AP MLD
151 bool m_establishBaDl{false}; /**< whether BA needs to be established (for TID 0)
152 with the AP as originator */
153 bool m_establishBaUl{false}; /**< whether BA needs to be established (for TID 0)
154 with the AP as recipient */
155 std::vector<FrameInfo> m_txPsdus; ///< transmitted PSDUs
156 Ptr<ApWifiMac> m_apMac; ///< AP wifi MAC
157 std::vector<Ptr<StaWifiMac>> m_staMacs; ///< MACs of the non-AP MLDs
158 std::vector<PacketSocketAddress> m_dlSockets; ///< packet socket address for DL traffic
159 std::vector<PacketSocketAddress> m_ulSockets; ///< packet socket address for UL traffic
160 uint16_t m_lastAid{0}; ///< AID of last associated station
161 Time m_duration{0}; ///< simulation duration
162
163 private:
164 /**
165 * Set the SSID on the next station that needs to start the association procedure.
166 * This method is connected to the ApWifiMac's AssociatedSta trace source.
167 * Start generating traffic (if needed) when all stations are associated.
168 *
169 * \param aid the AID assigned to the previous associated STA
170 */
171 void SetSsid(uint16_t aid, Mac48Address /* addr */);
172
173 /**
174 * Start the generation of traffic (needs to be overridden)
175 */
176 virtual void StartTraffic()
177 {
178 }
179};
180
181/**
182 * \ingroup wifi-test
183 * \ingroup tests
184 *
185 * \brief Test the exchange of EML Operating Mode Notification frames.
186 *
187 * This test considers an AP MLD and a non-AP MLD with EMLSR activated. Upon association,
188 * the non-AP MLD sends an EML Operating Mode Notification frame, which is however corrupted
189 * by using a post reception error model (installed on the AP MLD). We keep corrupting the
190 * EML Notification frames transmitted by the non-AP MLD until the frame is dropped due to
191 * exceeded max retry limit. It is checked that:
192 *
193 * - the Association Request contains a Multi-Link Element including an EML Capabilities field
194 * that contains the expected values for Padding Delay and Transition Delay
195 * - the Association Response contains a Multi-Link Element including an EML Capabilities field
196 * that contains the expected value for Transition Timeout
197 * - all EML Notification frames contain the expected values for EMLSR Mode, EMLMR Mode and
198 * Link Bitmap fields and are transmitted on the link used for association
199 * - the correct EMLSR link set is stored by the EMLSR Manager, both when the transition
200 * timeout expires and when an EML Notification response is received from the AP MLD (thus,
201 * the correct EMLSR link set is stored after whichever of the two events occur first)
202 */
204{
205 public:
206 /**
207 * Constructor
208 *
209 * \param linksToEnableEmlsrOn IDs of links on which EMLSR mode should be enabled
210 * \param transitionTimeout the Transition Timeout advertised by the AP MLD
211 */
212 EmlOmnExchangeTest(const std::set<uint8_t>& linksToEnableEmlsrOn, Time transitionTimeout);
213 ~EmlOmnExchangeTest() override = default;
214
215 protected:
216 void DoSetup() override;
217 void DoRun() override;
218 void Transmit(Ptr<WifiMac> mac,
219 uint8_t phyId,
220 WifiConstPsduMap psduMap,
221 WifiTxVector txVector,
222 double txPowerW) override;
223
224 /**
225 * Callback invoked when the non-AP MLD receives the acknowledgment for a transmitted MPDU.
226 *
227 * \param mpdu the acknowledged MPDU
228 */
229 void TxOk(Ptr<const WifiMpdu> mpdu);
230 /**
231 * Callback invoked when the non-AP MLD drops the given MPDU for the given reason.
232 *
233 * \param reason the reason why the MPDU was dropped
234 * \param mpdu the dropped MPDU
235 */
237
238 /**
239 * Check the content of the EML Capabilities subfield of the Multi-Link Element included
240 * in the Association Request frame sent by the non-AP MLD.
241 *
242 * \param mpdu the MPDU containing the Association Request frame
243 * \param txVector the TXVECTOR used to transmit the frame
244 * \param linkId the ID of the link on which the frame was transmitted
245 */
247 const WifiTxVector& txVector,
248 uint8_t linkId);
249 /**
250 * Check the content of the EML Capabilities subfield of the Multi-Link Element included
251 * in the Association Response frame sent by the AP MLD to the EMLSR client.
252 *
253 * \param mpdu the MPDU containing the Association Response frame
254 * \param txVector the TXVECTOR used to transmit the frame
255 * \param linkId the ID of the link on which the frame was transmitted
256 */
258 const WifiTxVector& txVector,
259 uint8_t linkId);
260 /**
261 * Check the content of a received EML Operating Mode Notification frame.
262 *
263 * \param psdu the PSDU containing the EML Operating Mode Notification frame
264 * \param txVector the TXVECTOR used to transmit the frame
265 * \param linkId the ID of the link on which the frame was transmitted
266 */
268 const WifiTxVector& txVector,
269 uint8_t linkId);
270 /**
271 * Check that the EMLSR mode has been enabled on the expected EMLSR links.
272 */
273 void CheckEmlsrLinks();
274
275 private:
276 std::size_t m_checkEmlsrLinksCount; /**< counter for the number of times CheckEmlsrLinks
277 is called (should be two: when the transition
278 timeout expires and when the EML Notification
279 response from the AP MLD is received */
280 std::size_t m_emlNotificationDroppedCount; /**< counter for the number of times the EML
281 Notification frame sent by the non-AP MLD
282 has been dropped due to max retry limit */
283 Ptr<ListErrorModel> m_errorModel; ///< error rate model to corrupt packets at AP MLD
284 std::list<uint64_t> m_uidList; ///< list of UIDs of packets to corrupt
285};
286
287/**
288 * \ingroup wifi-test
289 * \ingroup tests
290 *
291 * \brief Test the transmission of DL frames to EMLSR clients.
292 *
293 * This test considers an AP MLD and a configurable number of non-AP MLDs that support EMLSR
294 * and a configurable number of non-AP MLDs that do not support EMLSR. All MLDs have three
295 * setup links, while the set of EMLSR links for the EMLSR clients is configurable.
296 * Block ack agreements (for TID 0, with the AP MLD as originator) are established with all
297 * the non-AP MLDs before that EMLSR clients send the EML Operating Mode Notification frame
298 * to enable the EMLSR mode on their EMLSR links.
299 *
300 * Before enabling EMLSR mode, it is checked that:
301 *
302 * - all EMLSR links (but the link used for ML setup) of the EMLSR clients are considered to
303 * be in power save mode and are blocked by the AP MLD; all the other links have transitioned
304 * to active mode and are not blocked
305 * - no MU-RTS Trigger Frame is sent as Initial control frame
306 * - In case of EMLSR clients having no link that is not an EMLSR link and is different than
307 * the link used for ML setup, the two A-MPDUs used to trigger BA establishment are
308 * transmitted one after another on the link used for ML setup. Otherwise, the two A-MPDUs
309 * are sent concurrently on two distinct links
310 *
311 * After enabling EMLSR mode, it is checked that:
312 *
313 * - all EMLSR links of the EMLSR clients are considered to be in active mode and are not
314 * blocked by the AP MLD
315 * - If all setup links are EMLSR links, the first two frame exchanges are both protected by
316 * MU-RTS TF and occur one after another. Otherwise, one frame exchange occurs on the
317 * non-EMLSR link and is not protected by MU-RTS TF; the other frame exchange occurs on an
318 * EMLSR link and is protected by MU-RTS TF
319 * - the AP MLD blocks transmission on all other EMLSR links when sending an ICF to an EMLSR client
320 * - After completing a frame exchange with an EMLSR client, the AP MLD can start another frame
321 * exchange with that EMLSR client within the same TXOP (after a SIFS) without sending an ICF
322 * - During the transition delay, all EMLSR links are not used for DL transmissions
323 * - The padding added to Initial Control frames is the largest among all the EMLSR clients
324 * solicited by the ICF
325 *
326 * After disabling EMLSR mode, it is checked that:
327 *
328 * - all EMLSR links (but the link used to exchange EML Notification frames) of the EMLSR clients
329 * are considered to be in power save mode and are blocked by the AP MLD
330 * - an MU-RTS Trigger Frame is sent by the AP MLD as ICF for sending the EML Notification
331 * response, unless the link used to exchange EML Notification frames is a non-EMLSR link
332 * - no MU-RTS Trigger Frame is used as ICF for QoS data frames
333 * - In case of EMLSR clients having no link that is not an EMLSR link and is different than
334 * the link used to exchange EML Notification frames, the two A-MPDUs are transmitted one
335 * after another on the link used to exchange EML Notification frames. Otherwise, the two
336 * A-MPDUs are sent concurrently on two distinct links
337 */
339{
340 public:
341 /**
342 * Parameters for the EMLSR DL TXOP test
343 */
344 struct Params
345 {
346 std::size_t nEmlsrStations; //!< number of non-AP MLDs that support EMLSR
347 std::size_t nNonEmlsrStations; //!< number of non-AP MLDs that do not support EMLSR
348 std::set<uint8_t>
349 linksToEnableEmlsrOn; //!< IDs of links on which EMLSR mode should be enabled
350 std::vector<Time> paddingDelay; //!< vector (whose size equals <i>nEmlsrStations</i>) of the
351 //!< padding delay values advertised by non-AP MLDs
352 std::vector<Time>
353 transitionDelay; //!< vector (whose size equals <i>nEmlsrStations</i>) of
354 //!< transition the delay values advertised by non-AP MLDs
355 Time transitionTimeout; //!< the Transition Timeout advertised by the AP MLD
356 };
357
358 /**
359 * Constructor
360 *
361 * \param params parameters for the EMLSR DL TXOP test
362 */
363 EmlsrDlTxopTest(const Params& params);
364 ~EmlsrDlTxopTest() override = default;
365
366 protected:
367 void DoSetup() override;
368 void DoRun() override;
369 void Transmit(Ptr<WifiMac> mac,
370 uint8_t phyId,
371 WifiConstPsduMap psduMap,
372 WifiTxVector txVector,
373 double txPowerW) override;
374
375 /**
376 * Check that the simulation produced the expected results.
377 */
378 void CheckResults();
379
380 /**
381 * Check that the AP MLD considers the correct Power Management mode for the links setup
382 * with the given non-AP MLD. This method is intended to be called shortly after ML setup.
383 *
384 * \param address a link address of the given non-AP MLD
385 */
386 void CheckPmModeAfterAssociation(const Mac48Address& address);
387
388 /**
389 * Check that appropriate actions are taken when the AP MLD transmits an EML Operating Mode
390 * Notification response frame to an EMLSR client on the given link.
391 *
392 * \param mpdu the MPDU carrying the EML Operating Mode Notification frame
393 * \param txVector the TXVECTOR used to send the PPDU
394 * \param linkId the ID of the given link
395 */
397 const WifiTxVector& txVector,
398 uint8_t linkId);
399
400 /**
401 * Check that appropriate actions are taken when an EMLSR client transmits an EML Operating
402 * Mode Notification frame to the AP MLD on the given link.
403 *
404 * \param mpdu the MPDU carrying the EML Operating Mode Notification frame
405 * \param txVector the TXVECTOR used to send the PPDU
406 * \param linkId the ID of the given link
407 */
409 const WifiTxVector& txVector,
410 uint8_t linkId);
411
412 /**
413 * Check that appropriate actions are taken by the AP MLD transmitting an initial
414 * Control frame to an EMLSR client on the given link.
415 *
416 * \param mpdu the MPDU carrying the MU-RTS TF
417 * \param txVector the TXVECTOR used to send the PPDU
418 * \param linkId the ID of the given link
419 */
421 const WifiTxVector& txVector,
422 uint8_t linkId);
423
424 /**
425 * Check that appropriate actions are taken by the AP MLD transmitting a PPDU containing
426 * QoS data frames to EMLSR clients on the given link.
427 *
428 * \param psduMap the PSDU(s) carrying QoS data frames
429 * \param txVector the TXVECTOR used to send the PPDU
430 * \param linkId the ID of the given link
431 */
432 void CheckQosFrames(const WifiConstPsduMap& psduMap,
433 const WifiTxVector& txVector,
434 uint8_t linkId);
435
436 /**
437 * Check that appropriate actions are taken by the AP MLD receiving a PPDU containing
438 * BlockAck frames from EMLSR clients on the given link.
439 *
440 * \param psduMap the PSDU carrying BlockAck frames
441 * \param txVector the TXVECTOR used to send the PPDU
442 * \param phyId the ID of the PHY transmitting the PSDU(s)
443 */
444 void CheckBlockAck(const WifiConstPsduMap& psduMap,
445 const WifiTxVector& txVector,
446 uint8_t phyId);
447
448 private:
449 void StartTraffic() override;
450
451 /**
452 * Enable EMLSR mode on the next EMLSR client
453 */
454 void EnableEmlsrMode();
455
456 std::set<uint8_t> m_emlsrLinks; /**< IDs of the links on which EMLSR mode has to be enabled */
457 Time m_emlsrEnabledTime; //!< when EMLSR mode has been enabled on all EMLSR clients
458 const Time m_fe2to3delay; /**< time interval between 2nd and 3rd frame exchange sequences
459 after the enablement of EMLSR mode */
460 std::size_t m_countQoSframes; //!< counter for QoS frames (transition delay test)
461 std::size_t m_countBlockAck; //!< counter for BlockAck frames (transition delay test)
462 Ptr<ListErrorModel> m_errorModel; ///< error rate model to corrupt BlockAck at AP MLD
463};
464
465/**
466 * \ingroup wifi-test
467 * \ingroup tests
468 *
469 * \brief Test the transmission of UL frames from EMLSR clients.
470 *
471 * This test considers an AP MLD and a non-AP MLD that support EMLSR. The non-AP MLD setups three
472 * links, while the set of EMLSR links is configurable. Block ack agreements (for TID 0) for both
473 * DL and UL directions are established after that the EML Operating Mode Notification frames are
474 * exchanged to enable the EMLSR mode on the EMLSR links. Aux PHYs on the EMLSR client do not
475 * switch link, hence the main PHY will switch link (if needed) when terminating a TXOP.
476 *
477 * It is checked that:
478 *
479 * - Initially, aux PHYs are configured so that they are unable to transmit frames. Before
480 * generating the packets for the first UL data frame, transmissions on the link where the
481 * main PHY is operating and on the non-EMLSR link (if any) are blocked. Thus, the first UL data
482 * frame is held until transmissions on the link where the main PHY is operating are unblocked.
483 * The first UL data frame is sent by the main PHY without RTS protection. When the data frame
484 * exchange terminates, the MediumSyncDelay timer is started on the other EMLSR links and the
485 * CCA ED threshold is set as expected
486 * - If there is a non-EMLSR link, another data frame can be sent concurrently (without protection)
487 * on the non-EMLSR link
488 * - When the first UL data frame is transmitted, we make the aux PHYs on the EMLSR client capable
489 * of transmitting, we block transmissions on the link where the main PHY is operating and
490 * generate new UL packets, which will then be transmitted on a link where an aux PHY is
491 * operating. Thus, the aux PHY transmits an RTS frame and the main PHY will take over and
492 * transmit the second UL data frame. We check that, while the link on which the main PHY was
493 * operating is blocked because another EMLSR link is being used, new backoff values for that
494 * link are generated if and only if the QosTxop::GenerateBackoffIfTxopWithoutTx attribute is
495 * true; otherwise, a new backoff value is generated when the link is unblocked.
496 * - When the exchange of the second UL data frame terminates, we make the aux PHY unable to
497 * transmit, block transmissions on the non-EMLSR link (if any) and generate some more UL
498 * packets, which will then be transmitted by the main PHY. However, a MediumSyncDelay timer
499 * is now running on the link where the main PHY is operating, hence transmissions are protected
500 * by an RTS frame. We install a post reception error model on the AP MLD so that all RTS frames
501 * sent by the EMLSR client are not received by the AP MLD. We check that the EMLSR client makes
502 * at most the configured max number of transmission attempts and that another UL data frame is
503 * sent once the MediumSyncDelay timer is expired. We also check that the TX width of the RTS
504 * frames and the UL data frame equal the channel width used by the main PHY.
505 * - We check that no issue arises in case an aux PHY sends an RTS frame but the CTS response is
506 * not transmitted successfully. Specifically, we check that the main PHY is completing the
507 * channel switch when the (unsuccessful) reception of the CTS ends and that a new RTS/CTS
508 * exchange is carried out to protect the transmission of the last data frame.
509 * - While the main PHY is operating on the same link as an aux PHY (which does not switch
510 * channel), the aux PHY is put in sleep mode as soon as the main PHY starts operating on the
511 * link, stays in sleep mode until the TXOP ends and is resumed from sleep mode right after the
512 * end of the DL/UL TXOP.
513 * - When an aux PHY that is not TX capable gains a TXOP, it checks whether the main PHY can switch
514 * to the non-primary link a start an UL TXOP. If the main PHY is switching, the aux PHY waits
515 * until the channel switch is completed and checks again; if the remaining backoff time on the
516 * primary link is greater than the channel switch delay, the main PHY is requested to switch to
517 * the non-primary link of the aux PHY. When the channel switch is completed, if the medium is
518 * idle on the non-primary link and the backoff is zero, the main PHY starts an UL TXOP after a
519 * PIFS period; otherwise, the main PHY starts an UL TXOP when the backoff timer counts down to
520 * zero. The QoS data frame sent by the main PHY is not protected by RTS and the bandwidth it
521 * occupies is not affected by possible limitations on the aux PHY TX bandwidth capabilities.
522 */
524{
525 public:
526 /**
527 * Parameters for the EMLSR UL TXOP test
528 */
529 struct Params
530 {
531 std::set<uint8_t>
532 linksToEnableEmlsrOn; //!< IDs of links on which EMLSR mode should be enabled
533 MHz_u channelWidth; //!< width of the channels used by MLDs
534 MHz_u auxPhyChannelWidth; //!< max width supported by aux PHYs
535 Time mediumSyncDuration; //!< duration of the MediumSyncDelay timer
536 uint8_t msdMaxNTxops; //!< Max number of TXOPs that an EMLSR client is allowed
537 //!< to attempt to initiate while the MediumSyncDelay
538 //!< timer is running (zero indicates no limit)
539 bool genBackoffAndUseAuxPhyCca; //!< this variable controls two boolean values that are
540 //!< either both set to true or both set to false;
541 //!< the first value controls whether the backoff should be
542 //!< invoked when the AC gains the right to start a TXOP
543 //!< but it does not transmit any frame, the second value
544 //!< controls whether CCA info from aux PHY is used when
545 //!< aux PHY is not TX capable
546 };
547
548 /**
549 * Constructor
550 *
551 * \param params parameters for the EMLSR UL TXOP test
552 */
553 EmlsrUlTxopTest(const Params& params);
554 ~EmlsrUlTxopTest() override = default;
555
556 protected:
557 void DoSetup() override;
558 void DoRun() override;
559 void Transmit(Ptr<WifiMac> mac,
560 uint8_t phyId,
561 WifiConstPsduMap psduMap,
562 WifiTxVector txVector,
563 double txPowerW) override;
564
565 /**
566 * Check that the simulation produced the expected results.
567 */
568 void CheckResults();
569
570 /**
571 * Check that appropriate actions are taken by the EMLSR client when transmitting an RTS
572 * frame on the given link.
573 *
574 * \param mpdu the MPDU carrying the RTS frame
575 * \param txVector the TXVECTOR used to send the PPDU
576 * \param linkId the ID of the given link
577 */
578 void CheckRtsFrames(Ptr<const WifiMpdu> mpdu, const WifiTxVector& txVector, uint8_t linkId);
579
580 /**
581 * Check that appropriate actions are taken by the AP MLD transmitting an initial
582 * Control frame to an EMLSR client on the given link.
583 *
584 * \param mpdu the MPDU carrying the MU-RTS TF
585 * \param txVector the TXVECTOR used to send the PPDU
586 * \param linkId the ID of the given link
587 */
589 const WifiTxVector& txVector,
590 uint8_t linkId);
591
592 /**
593 * Check that appropriate actions are taken by the EMLSR client when receiving a CTS
594 * frame on the given link.
595 *
596 * \param mpdu the MPDU carrying the CTS frame
597 * \param txVector the TXVECTOR used to send the PPDU
598 * \param linkId the ID of the given link
599 */
600 void CheckCtsFrames(Ptr<const WifiMpdu> mpdu, const WifiTxVector& txVector, uint8_t linkId);
601
602 /**
603 * Check that appropriate actions are taken when an MLD transmits a PPDU containing
604 * QoS data frames on the given link.
605 *
606 * \param psduMap the PSDU(s) carrying QoS data frames
607 * \param txVector the TXVECTOR used to send the PPDU
608 * \param linkId the ID of the given link
609 */
610 void CheckQosFrames(const WifiConstPsduMap& psduMap,
611 const WifiTxVector& txVector,
612 uint8_t linkId);
613
614 /**
615 * Check that appropriate actions are taken when an MLD transmits a PPDU containing
616 * BlockAck frames on the given link.
617 *
618 * \param psduMap the PSDU carrying BlockAck frames
619 * \param txVector the TXVECTOR used to send the PPDU
620 * \param linkId the ID of the given link
621 */
622 void CheckBlockAck(const WifiConstPsduMap& psduMap,
623 const WifiTxVector& txVector,
624 uint8_t linkId);
625
626 private:
627 void StartTraffic() override;
628
629 /**
630 * Callback invoked when a new backoff value is generated by the EMLSR client.
631 *
632 * \param backoff the generated backoff value
633 * \param linkId the ID of the link for which the backoff value has been generated
634 */
635 void BackoffGenerated(uint32_t backoff, uint8_t linkId);
636
637 std::set<uint8_t> m_emlsrLinks; /**< IDs of the links on which EMLSR mode has to be enabled */
638 MHz_u m_channelWidth; //!< width of the channels used by MLDs
639 MHz_u m_auxPhyChannelWidth; //!< max width supported by aux PHYs
640 Time m_mediumSyncDuration; //!< duration of the MediumSyncDelay timer
641 uint8_t m_msdMaxNTxops; //!< Max number of TXOPs that an EMLSR client is allowed
642 //!< to attempt to initiate while the MediumSyncDelay
643 //!< timer is running (zero indicates no limit)
644 std::optional<uint8_t> m_nonEmlsrLink; //!< ID of the non-EMLSR link (if any)
645 Time m_emlsrEnabledTime; //!< when EMLSR mode has been enabled on all EMLSR clients
646 Time m_firstUlPktsGenTime; //!< generation time of the first two UL packets
647 const Time m_unblockMainPhyLinkDelay; //!< delay between the time the first two UL packets are
648 //!< generated and the time transmissions are unblocked
649 //!< on the link where the main PHY is operating on
650 Time m_lastMsdExpiryTime; //!< expiry time of the last MediumSyncDelay timer
651 bool m_checkBackoffStarted; //!< whether we are checking the generated backoff values
652 std::optional<Time> m_backoffEndTime; //!< expected backoff end time on main PHY link
653 Ptr<ListErrorModel> m_errorModel; ///< error rate model to corrupt packets
654 std::size_t m_countQoSframes; //!< counter for QoS frames
655 std::size_t m_countBlockAck; //!< counter for BlockAck frames
656 std::size_t m_countRtsframes; //!< counter for RTS frames
657 bool m_genBackoffIfTxopWithoutTx; //!< whether the backoff should be invoked when the AC
658 //!< gains the right to start a TXOP but it does not
659 //!< transmit any frame
660 bool m_useAuxPhyCca; //!< whether CCA info from aux PHY is used when
661 //!< aux PHY is not TX capable
662 std::optional<bool> m_corruptCts; //!< whether the transmitted CTS must be corrupted
663 Time m_5thQosFrameTxTime; //!< start transmission time of the 5th QoS data frame
664};
665
666/**
667 * \ingroup wifi-test
668 * \ingroup tests
669 *
670 * \brief Test the switching of PHYs on EMLSR clients.
671 *
672 * An AP MLD and an EMLSR client setup 3 links, on which EMLSR mode is enabled. The AP MLD
673 * transmits 4 QoS data frames (one after another, each protected by ICF):
674 *
675 * - the first one on the link used for ML setup, hence no PHY switch occurs
676 * - the second one on another link, thus causing the main PHY to switch link
677 * - the third one on the remaining link, thus causing the main PHY to switch link again
678 * - the fourth one on the link used for ML setup
679 *
680 * Afterwards, the EMLSR client transmits 2 QoS data frames; the first one on the link used for
681 * ML setup (hence, no RTS is sent), the second one on another link.
682 */
684{
685 public:
686 /**
687 * Parameters for the EMLSR link switching test
688 */
689 struct Params
690 {
691 bool
692 switchAuxPhy; //!< whether AUX PHY should switch channel to operate on the link on which
693 //!< the Main PHY was operating before moving to the link of the Aux PHY
694 bool resetCamStateAndInterruptSwitch; //!< this variable controls two boolean values that
695 //!< are either both set to true or both set to false;
696 //!< the first value controls whether to reset the
697 //!< state of the ChannelAccessManager associated
698 //!< with the link on which the main PHY has just
699 //!< switched to, the second value controls whether
700 //!< a main PHY channel switch can be interrupted
701 MHz_u auxPhyMaxChWidth; //!< max channel width (MHz) supported by aux PHYs
702 };
703
704 /**
705 * Constructor
706 *
707 * \param params parameters for the EMLSR link switching test
708 */
709 EmlsrLinkSwitchTest(const Params& params);
710
711 ~EmlsrLinkSwitchTest() override = default;
712
713 protected:
714 void DoSetup() override;
715 void DoRun() override;
716 void Transmit(Ptr<WifiMac> mac,
717 uint8_t phyId,
718 WifiConstPsduMap psduMap,
719 WifiTxVector txVector,
720 double txPowerW) override;
721
722 /**
723 * Check that the simulation produced the expected results.
724 */
725 void CheckResults();
726
727 /**
728 * Check that the Main PHY (and possibly the Aux PHY) correctly switches channel when the
729 * reception of an ICF ends.
730 *
731 * \param psduMap the PSDU carrying the MU-RTS TF
732 * \param txVector the TXVECTOR used to send the PPDU
733 * \param linkId the ID of the given link
734 */
735 void CheckInitialControlFrame(const WifiConstPsduMap& psduMap,
736 const WifiTxVector& txVector,
737 uint8_t linkId);
738
739 /**
740 * Check that appropriate actions are taken by the AP MLD transmitting a PPDU containing
741 * QoS data frames to the EMLSR client on the given link.
742 *
743 * \param psduMap the PSDU(s) carrying QoS data frames
744 * \param txVector the TXVECTOR used to send the PPDU
745 * \param linkId the ID of the given link
746 */
747 void CheckQosFrames(const WifiConstPsduMap& psduMap,
748 const WifiTxVector& txVector,
749 uint8_t linkId);
750
751 /**
752 * Check that appropriate actions are taken by the EMLSR client transmitting a PPDU containing
753 * an RTS frame to the AP MLD on the given link.
754 *
755 * \param psduMap the PSDU carrying RTS frame
756 * \param txVector the TXVECTOR used to send the PPDU
757 * \param linkId the ID of the given link
758 */
759 void CheckRtsFrame(const WifiConstPsduMap& psduMap,
760 const WifiTxVector& txVector,
761 uint8_t linkId);
762
763 private:
764 bool m_switchAuxPhy; /**< whether AUX PHY should switch channel to operate on the link on which
765 the Main PHY was operating before moving to the link of Aux PHY */
766 bool
767 m_resetCamStateAndInterruptSwitch; /**< whether to reset the state of the
768 ChannelAccessManager associated with the link on which the main PHY
769 has just switched to and whether main PHY switch can be interrupted */
770 MHz_u m_auxPhyMaxChWidth; //!< max channel width (MHz) supported by aux PHYs
771 std::size_t m_countQoSframes; //!< counter for QoS data frames
772 std::size_t m_countIcfFrames; //!< counter for ICF frames
773 std::size_t m_countRtsFrames; //!< counter for RTS frames
774 std::size_t m_txPsdusPos; //!< position in the vector of TX PSDUs of the first ICF
775 Ptr<ListErrorModel> m_errorModel; ///< error rate model to corrupt packets at AP MLD
776};
777
778/**
779 * \ingroup wifi-test
780 * \ingroup tests
781 *
782 * \brief wifi EMLSR Test Suite
783 */
785{
786 public:
788};
789
790/**
791 * \ingroup wifi-test
792 * \ingroup tests
793 *
794 * \brief Test CCA busy notifications on EMLSR clients.
795 *
796 * SwitchAuxPhy is set to true, so that the aux PHY starts switching when the main PHY switch is
797 * completed.
798 *
799 * - Main PHY switches to a link on which an aux PHY is operating. Right after the start of the
800 * channel switch, the AP transmits a frame to another device on the aux PHY link. Verify that,
801 * once the main PHY is operating on the new link, the channel access manager on that link is
802 * notified of CCA busy until the end of the transmission
803 * - When the main PHY switch is completed, the aux PHY switches to a link on which no PHY is
804 * operating. Before the aux PHY starts switching, the AP starts transmitting a frame to another
805 * device on the link on which no PHY is operating. Verify that, once the aux PHY is operating
806 * on the new link, the channel access manager on that link is notified of CCA busy until the
807 * end of the transmission
808 */
810{
811 public:
812 /**
813 * Constructor
814 *
815 * \param auxPhyMaxChWidth max channel width (MHz) supported by aux PHYs
816 */
817 EmlsrCcaBusyTest(uint16_t auxPhyMaxChWidth);
818
819 ~EmlsrCcaBusyTest() override = default;
820
821 protected:
822 void DoSetup() override;
823 void DoRun() override;
824
825 private:
826 void StartTraffic() override;
827
828 /**
829 * Make the other MLD transmit a packet to the AP on the given link.
830 *
831 * \param linkId the ID of the given link
832 */
833 void TransmitPacketToAp(uint8_t linkId);
834
835 /**
836 * Perform checks after that the preamble of the first PPDU has been received.
837 */
838 void CheckPoint1();
839
840 /**
841 * Perform checks after that the main PHY completed the link switch.
842 */
843 void CheckPoint2();
844
845 /**
846 * Perform checks after that the aux PHY completed the link switch.
847 */
848 void CheckPoint3();
849
850 uint16_t m_auxPhyMaxChWidth; //!< max channel width (MHz) supported by aux PHYs
851 Time m_channelSwitchDelay; //!< the PHY channel switch delay
852 uint8_t m_currMainPhyLinkId; //!< the ID of the link the main PHY switches from
853 uint8_t m_nextMainPhyLinkId; //!< the ID of the link the main PHY switches to
854};
855
856#endif /* WIFI_EMLSR_TEST_H */
Test the exchange of EML Operating Mode Notification frames.
void CheckEmlCapabilitiesInAssocResp(Ptr< const WifiMpdu > mpdu, const WifiTxVector &txVector, uint8_t linkId)
Check the content of the EML Capabilities subfield of the Multi-Link Element included in the Associat...
void TxOk(Ptr< const WifiMpdu > mpdu)
Callback invoked when the non-AP MLD receives the acknowledgment for a transmitted MPDU.
std::list< uint64_t > m_uidList
list of UIDs of packets to corrupt
std::size_t m_checkEmlsrLinksCount
counter for the number of times CheckEmlsrLinks is called (should be two: when the transition timeout...
Ptr< ListErrorModel > m_errorModel
error rate model to corrupt packets at AP MLD
void DoSetup() override
Implementation to do any local setup required for this TestCase.
EmlOmnExchangeTest(const std::set< uint8_t > &linksToEnableEmlsrOn, Time transitionTimeout)
Constructor.
std::size_t m_emlNotificationDroppedCount
counter for the number of times the EML Notification frame sent by the non-AP MLD has been dropped du...
void CheckEmlsrLinks()
Check that the EMLSR mode has been enabled on the expected EMLSR links.
void CheckEmlCapabilitiesInAssocReq(Ptr< const WifiMpdu > mpdu, const WifiTxVector &txVector, uint8_t linkId)
Check the content of the EML Capabilities subfield of the Multi-Link Element included in the Associat...
~EmlOmnExchangeTest() override=default
void TxDropped(WifiMacDropReason reason, Ptr< const WifiMpdu > mpdu)
Callback invoked when the non-AP MLD drops the given MPDU for the given reason.
void CheckEmlNotification(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector, uint8_t linkId)
Check the content of a received EML Operating Mode Notification frame.
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 DoRun() override
Implementation to actually run this TestCase.
Test EML Operating Mode Notification frame serialization and deserialization.
void DoRun() override
Implementation to actually run this TestCase.
~EmlOperatingModeNotificationTest() override=default
Test CCA busy notifications on EMLSR clients.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
uint8_t m_nextMainPhyLinkId
the ID of the link the main PHY switches to
uint8_t m_currMainPhyLinkId
the ID of the link the main PHY switches from
void StartTraffic() override
Start the generation of traffic (needs to be overridden)
EmlsrCcaBusyTest(uint16_t auxPhyMaxChWidth)
Constructor.
~EmlsrCcaBusyTest() override=default
void TransmitPacketToAp(uint8_t linkId)
Make the other MLD transmit a packet to the AP on the given link.
uint16_t m_auxPhyMaxChWidth
max channel width (MHz) supported by aux PHYs
void DoRun() override
Implementation to actually run this TestCase.
Time m_channelSwitchDelay
the PHY channel switch delay
void CheckPoint1()
Perform checks after that the preamble of the first PPDU has been received.
void CheckPoint3()
Perform checks after that the aux PHY completed the link switch.
void CheckPoint2()
Perform checks after that the main PHY completed the link switch.
Test the transmission of DL frames to EMLSR clients.
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 EM...
const Time m_fe2to3delay
time interval between 2nd and 3rd frame exchange sequences after the enablement of EMLSR mode
void CheckResults()
Check that the simulation produced the expected results.
void CheckPmModeAfterAssociation(const Mac48Address &address)
Check that the AP MLD considers the correct Power Management mode for the links setup with the given ...
EmlsrDlTxopTest(const Params &params)
Constructor.
void StartTraffic() override
Start the generation of traffic (needs to be overridden)
Ptr< ListErrorModel > m_errorModel
error rate model to corrupt BlockAck at AP MLD
void CheckStaEmlNotificationFrame(Ptr< const WifiMpdu > mpdu, const WifiTxVector &txVector, uint8_t linkId)
Check that appropriate actions are taken when an EMLSR client transmits an EML Operating Mode Notific...
std::size_t m_countQoSframes
counter for QoS frames (transition delay test)
void CheckApEmlNotificationFrame(Ptr< const WifiMpdu > mpdu, const WifiTxVector &txVector, uint8_t linkId)
Check that appropriate actions are taken when the AP MLD transmits an EML Operating Mode Notification...
~EmlsrDlTxopTest() override=default
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.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
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...
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 EnableEmlsrMode()
Enable EMLSR mode on the next EMLSR client.
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 fr...
void DoRun() override
Implementation to actually run this TestCase.
std::size_t m_countBlockAck
counter for BlockAck frames (transition delay test)
Base class for EMLSR Operations tests.
std::size_t m_nNonEmlsrStations
number of stations to create that do not activate EMLSR
void SetSsid(uint16_t aid, Mac48Address)
Set the SSID on the next station that needs to start the association procedure.
bool m_establishBaDl
whether BA needs to be established (for TID 0) with the AP as originator
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...
std::size_t m_nEmlsrStations
number of stations to create that activate EMLSR
std::vector< PacketSocketAddress > m_dlSockets
packet socket address for DL traffic
std::vector< Time > m_paddingDelay
Padding Delay advertised by the non-AP MLD.
std::set< uint8_t > m_linksToEnableEmlsrOn
IDs of the links on which EMLSR mode has to be enabled.
Ptr< ApWifiMac > m_apMac
AP wifi MAC.
~EmlsrOperationsTestBase() override=default
TrafficDirection
Enumeration for traffic directions.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
uint8_t m_mainPhyId
ID of the main PHY.
Time m_duration
simulation duration
std::vector< FrameInfo > m_txPsdus
transmitted PSDUs
Ptr< PacketSocketClient > GetApplication(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.
bool m_establishBaUl
whether BA needs to be established (for TID 0) with the AP as recipient
uint16_t m_lastAid
AID of last associated station.
std::vector< Time > m_transitionDelay
Transition Delay advertised by the non-AP MLD.
Time m_transitionTimeout
Transition Timeout advertised by the AP MLD.
std::vector< PacketSocketAddress > m_ulSockets
packet socket address for UL traffic
std::vector< Ptr< StaWifiMac > > m_staMacs
MACs of the non-AP MLDs.
virtual void StartTraffic()
Start the generation of traffic (needs to be overridden)
EmlsrOperationsTestBase(const std::string &name)
Constructor.
Test the transmission of UL frames from EMLSR clients.
std::size_t m_countQoSframes
counter for QoS frames
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 EM...
Time m_emlsrEnabledTime
when EMLSR mode has been enabled on all EMLSR clients
const Time m_unblockMainPhyLinkDelay
delay between the time the first two UL packets are generated and the time transmissions are unblocke...
Ptr< ListErrorModel > m_errorModel
error rate model to corrupt packets
bool m_useAuxPhyCca
whether CCA info from aux PHY is used when aux PHY is not TX capable
Time m_5thQosFrameTxTime
start transmission time of the 5th QoS data frame
MHz_u m_auxPhyChannelWidth
max width supported by aux PHYs
void BackoffGenerated(uint32_t backoff, uint8_t linkId)
Callback invoked when a new backoff value is generated by the EMLSR client.
std::optional< uint8_t > m_nonEmlsrLink
ID of the non-EMLSR link (if any)
Time m_lastMsdExpiryTime
expiry time of the last MediumSyncDelay timer
void DoSetup() override
Implementation to do any local setup required for this TestCase.
std::size_t m_countRtsframes
counter for RTS frames
void CheckCtsFrames(Ptr< const WifiMpdu > mpdu, const WifiTxVector &txVector, uint8_t linkId)
Check that appropriate actions are taken by the EMLSR client when receiving a CTS frame on the given ...
void DoRun() override
Implementation to actually run this TestCase.
Time m_firstUlPktsGenTime
generation time of the first two UL packets
std::optional< bool > m_corruptCts
whether the transmitted CTS must be corrupted
~EmlsrUlTxopTest() override=default
void CheckBlockAck(const WifiConstPsduMap &psduMap, const WifiTxVector &txVector, uint8_t linkId)
Check that appropriate actions are taken when an MLD transmits a PPDU containing BlockAck frames on t...
void StartTraffic() override
Start the generation of traffic (needs to be overridden)
std::optional< Time > m_backoffEndTime
expected backoff end time on main PHY link
MHz_u m_channelWidth
width of the channels used by MLDs
std::set< uint8_t > m_emlsrLinks
IDs of the links on which EMLSR mode has to be enabled.
Time m_mediumSyncDuration
duration of the MediumSyncDelay timer
void CheckRtsFrames(Ptr< const WifiMpdu > mpdu, const WifiTxVector &txVector, uint8_t linkId)
Check that appropriate actions are taken by the EMLSR client when transmitting an RTS frame on the gi...
void CheckQosFrames(const WifiConstPsduMap &psduMap, const WifiTxVector &txVector, uint8_t linkId)
Check that appropriate actions are taken when an MLD transmits a PPDU containing QoS data frames on t...
bool m_genBackoffIfTxopWithoutTx
whether the backoff should be invoked when the AC gains the right to start a TXOP but it does not tra...
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.
bool m_checkBackoffStarted
whether we are checking the generated backoff values
std::size_t m_countBlockAck
counter for BlockAck frames
void CheckResults()
Check that the simulation produced the expected results.
uint8_t m_msdMaxNTxops
Max number of TXOPs that an EMLSR client is allowed to attempt to initiate while the MediumSyncDelay ...
EmlsrUlTxopTest(const Params &params)
Constructor.
wifi EMLSR Test Suite
Subclass of TestCase class adding the ability to test the serialization and deserialization of a Head...
an EUI-48 address
Smart pointer class similar to boost::intrusive_ptr.
encapsulates test code
Definition test.h:1050
A suite of tests to run.
Definition test.h:1267
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition nstime.h:1332
WifiMacDropReason
The reason why an MPDU was dropped.
Definition wifi-mac.h:70
WifiQueueBlockedReason
Enumeration of the reasons to block container queues.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
Parameters for the EMLSR DL TXOP test.
std::vector< Time > paddingDelay
vector (whose size equals nEmlsrStations) of the padding delay values advertised by non-AP MLDs
std::size_t nNonEmlsrStations
number of non-AP MLDs that do not support EMLSR
std::set< uint8_t > linksToEnableEmlsrOn
IDs of links on which EMLSR mode should be enabled.
Time transitionTimeout
the Transition Timeout advertised by the AP MLD
std::vector< Time > transitionDelay
vector (whose size equals nEmlsrStations) of transition the delay values advertised by non-AP MLDs
std::size_t nEmlsrStations
number of non-AP MLDs that support EMLSR
Information about transmitted frames.
WifiConstPsduMap psduMap
transmitted PSDU map
uint8_t phyId
ID of the transmitting PHY.
Parameters for the EMLSR UL TXOP test.
MHz_u auxPhyChannelWidth
max width supported by aux PHYs
uint8_t msdMaxNTxops
Max number of TXOPs that an EMLSR client is allowed to attempt to initiate while the MediumSyncDelay ...
Time mediumSyncDuration
duration of the MediumSyncDelay timer
std::set< uint8_t > linksToEnableEmlsrOn
IDs of links on which EMLSR mode should be enabled.
bool genBackoffAndUseAuxPhyCca
this variable controls two boolean values that are either both set to true or both set to false; the ...
MHz_u channelWidth
width of the channels used by MLDs
std::string dir
uint32_t pktSize
packet size used for the simulation (in bytes)