A Discrete-Event Network Simulator
API
wifi-aggregation-test.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
18 */
19
20#include "ns3/fcfs-wifi-queue-scheduler.h"
21#include "ns3/he-configuration.h"
22#include "ns3/ht-configuration.h"
23#include "ns3/ht-frame-exchange-manager.h"
24#include "ns3/interference-helper.h"
25#include "ns3/mac-tx-middle.h"
26#include "ns3/mobility-helper.h"
27#include "ns3/mpdu-aggregator.h"
28#include "ns3/msdu-aggregator.h"
29#include "ns3/node-container.h"
30#include "ns3/packet-socket-client.h"
31#include "ns3/packet-socket-helper.h"
32#include "ns3/packet-socket-server.h"
33#include "ns3/pointer.h"
34#include "ns3/simulator.h"
35#include "ns3/sta-wifi-mac.h"
36#include "ns3/string.h"
37#include "ns3/test.h"
38#include "ns3/vht-configuration.h"
39#include "ns3/wifi-default-ack-manager.h"
40#include "ns3/wifi-default-protection-manager.h"
41#include "ns3/wifi-mac-queue.h"
42#include "ns3/wifi-net-device.h"
43#include "ns3/wifi-psdu.h"
44#include "ns3/yans-wifi-helper.h"
45#include "ns3/yans-wifi-phy.h"
46#include <ns3/attribute-container.h>
47
48#include <algorithm>
49#include <iterator>
50
51using namespace ns3;
52
60{
61 public:
63
64 private:
72
73 void DoRun() override;
80};
81
83 : TestCase("Check the correctness of MPDU aggregation operations"),
84 m_discarded(false)
85{
86}
87
88void
90{
91 m_discarded = true;
92}
93
94void
96{
97 /*
98 * Create device and attach HT configuration.
99 */
100 m_device = CreateObject<WifiNetDevice>();
101 Ptr<HtConfiguration> htConfiguration = CreateObject<HtConfiguration>();
102 m_device->SetHtConfiguration(htConfiguration);
103
104 /*
105 * Create and configure phy layer.
106 */
107 m_phy = CreateObject<YansWifiPhy>();
108 Ptr<InterferenceHelper> interferenceHelper = CreateObject<InterferenceHelper>();
109 m_phy->SetInterferenceHelper(interferenceHelper);
113
114 /*
115 * Create and configure manager.
116 */
118 m_factory.SetTypeId("ns3::ConstantRateWifiManager");
119 m_factory.Set("DataMode", StringValue("HtMcs7"));
123
124 /*
125 * Create and configure mac layer.
126 */
127 m_mac = CreateObjectWithAttributes<StaWifiMac>("QosSupported", BooleanValue(true));
130 m_mac->SetAddress(Mac48Address("00:00:00:00:00:01"));
134 Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager>();
135 protectionManager->SetWifiMac(m_mac);
136 fem->SetProtectionManager(protectionManager);
137 Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager>();
138 ackManager->SetWifiMac(m_mac);
139 fem->SetAckManager(ackManager);
142 m_mac->SetMacQueueScheduler(CreateObject<FcfsWifiQueueScheduler>());
143
144 /*
145 * Configure MPDU aggregation.
146 */
147 m_mac->SetAttribute("BE_MaxAmpduSize", UintegerValue(65535));
148 HtCapabilities htCapabilities;
149 htCapabilities.SetMaxAmpduLength(65535);
150 m_manager->AddStationHtCapabilities(Mac48Address("00:00:00:00:00:02"), htCapabilities);
151 m_manager->AddStationHtCapabilities(Mac48Address("00:00:00:00:00:03"), htCapabilities);
152
153 /*
154 * Create a dummy packet of 1500 bytes and fill mac header fields.
155 */
156 Ptr<const Packet> pkt = Create<Packet>(1500);
157 Ptr<Packet> currentAggregatedPacket = Create<Packet>();
158 WifiMacHeader hdr;
159 hdr.SetAddr1(Mac48Address("00:00:00:00:00:02"));
160 hdr.SetAddr2(Mac48Address("00:00:00:00:00:01"));
162 hdr.SetQosTid(0);
163 hdr.SetFragmentNumber(0);
164 hdr.SetNoMoreFragments();
165 hdr.SetNoRetry();
166
167 /*
168 * Establish agreement.
169 */
171 reqHdr.SetImmediateBlockAck();
172 reqHdr.SetTid(0);
173 reqHdr.SetBufferSize(64);
174 reqHdr.SetTimeout(0);
175 reqHdr.SetStartingSequence(0);
176 m_mac->GetBEQueue()->GetBaManager()->CreateAgreement(&reqHdr, hdr.GetAddr1());
177
179 StatusCode code;
180 code.SetSuccess();
181 respHdr.SetStatusCode(code);
182 respHdr.SetAmsduSupport(reqHdr.IsAmsduSupported());
183 respHdr.SetImmediateBlockAck();
184 respHdr.SetTid(reqHdr.GetTid());
185 respHdr.SetBufferSize(64);
186 respHdr.SetTimeout(reqHdr.GetTimeout());
187 m_mac->GetBEQueue()->GetBaManager()->UpdateAgreement(&respHdr, hdr.GetAddr1(), 0);
188
189 //-----------------------------------------------------------------------------------------------------
190
191 /*
192 * Test behavior when no other packets are in the queue
193 */
194 Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager>(fem);
195 Ptr<MpduAggregator> mpduAggregator = htFem->GetMpduAggregator();
196
197 m_mac->GetBEQueue()->GetWifiMacQueue()->Enqueue(Create<WifiMpdu>(pkt, hdr));
198
200 WifiTxParameters txParams;
201 txParams.m_txVector =
202 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
204 Ptr<WifiMpdu> item =
205 m_mac->GetBEQueue()->GetNextMpdu(SINGLE_LINK_OP_ID, peeked, txParams, Time::Min(), true);
206
207 auto mpduList = mpduAggregator->GetNextAmpdu(item, txParams, Time::Min());
208
209 NS_TEST_EXPECT_MSG_EQ(mpduList.empty(), true, "a single packet should not result in an A-MPDU");
210
211 // the packet has not been "transmitted", release its sequence number
212 m_mac->m_txMiddle->SetSequenceNumberFor(&item->GetHeader());
213
214 //-----------------------------------------------------------------------------------------------------
215
216 /*
217 * Test behavior when 2 more packets are in the queue
218 */
219 Ptr<const Packet> pkt1 = Create<Packet>(1500);
220 Ptr<const Packet> pkt2 = Create<Packet>(1500);
221 WifiMacHeader hdr1;
222 WifiMacHeader hdr2;
223
224 hdr1.SetAddr1(Mac48Address("00:00:00:00:00:02"));
225 hdr1.SetAddr2(Mac48Address("00:00:00:00:00:01"));
227 hdr1.SetQosTid(0);
228
229 hdr2.SetAddr1(Mac48Address("00:00:00:00:00:02"));
230 hdr2.SetAddr2(Mac48Address("00:00:00:00:00:01"));
232 hdr2.SetQosTid(0);
233
234 m_mac->GetBEQueue()->GetWifiMacQueue()->Enqueue(Create<WifiMpdu>(pkt1, hdr1));
235 m_mac->GetBEQueue()->GetWifiMacQueue()->Enqueue(Create<WifiMpdu>(pkt2, hdr2));
236
237 item = m_mac->GetBEQueue()->GetNextMpdu(SINGLE_LINK_OP_ID, peeked, txParams, Time::Min(), true);
238 mpduList = mpduAggregator->GetNextAmpdu(item, txParams, Time::Min());
239
240 NS_TEST_EXPECT_MSG_EQ(mpduList.empty(), false, "MPDU aggregation failed");
241
242 Ptr<WifiPsdu> psdu = Create<WifiPsdu>(mpduList);
243 htFem->DequeuePsdu(psdu);
244
245 NS_TEST_EXPECT_MSG_EQ(psdu->GetSize(), 4606, "A-MPDU size is not correct");
246 NS_TEST_EXPECT_MSG_EQ(mpduList.size(), 3, "A-MPDU should contain 3 MPDUs");
248 0,
249 "queue should be empty");
250
251 for (uint32_t i = 0; i < psdu->GetNMpdus(); i++)
252 {
253 NS_TEST_EXPECT_MSG_EQ(psdu->GetHeader(i).GetSequenceNumber(), i, "wrong sequence number");
254 }
255
256 //-----------------------------------------------------------------------------------------------------
257
258 /*
259 * Test behavior when the 802.11n station and another non-QoS station are associated to the AP.
260 * The AP sends an A-MPDU to the 802.11n station followed by the last retransmission of a
261 * non-QoS data frame to the non-QoS station. This is used to reproduce bug 2224.
262 */
263 pkt1 = Create<Packet>(1500);
264 pkt2 = Create<Packet>(1500);
265 hdr1.SetAddr1(Mac48Address("00:00:00:00:00:02"));
266 hdr1.SetAddr2(Mac48Address("00:00:00:00:00:01"));
268 hdr1.SetQosTid(0);
269 hdr1.SetSequenceNumber(3);
270 hdr2.SetAddr1(Mac48Address("00:00:00:00:00:03"));
271 hdr2.SetAddr2(Mac48Address("00:00:00:00:00:01"));
273 hdr2.SetQosTid(0);
274
275 Ptr<const Packet> pkt3 = Create<Packet>(1500);
276 WifiMacHeader hdr3;
277 hdr3.SetSequenceNumber(0);
278 hdr3.SetAddr1(Mac48Address("00:00:00:00:00:03"));
279 hdr3.SetAddr2(Mac48Address("00:00:00:00:00:01"));
281 hdr3.SetQosTid(0);
282
283 m_mac->GetBEQueue()->GetWifiMacQueue()->Enqueue(Create<WifiMpdu>(pkt1, hdr1));
284 m_mac->GetBEQueue()->GetWifiMacQueue()->Enqueue(Create<WifiMpdu>(pkt2, hdr2));
285 m_mac->GetBEQueue()->GetWifiMacQueue()->Enqueue(Create<WifiMpdu>(pkt3, hdr3));
286
288 txParams.Clear();
289 txParams.m_txVector =
290 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
292 item = m_mac->GetBEQueue()->GetNextMpdu(SINGLE_LINK_OP_ID, peeked, txParams, Time::Min(), true);
293
294 mpduList = mpduAggregator->GetNextAmpdu(item, txParams, Time::Min());
295
296 NS_TEST_EXPECT_MSG_EQ(mpduList.empty(),
297 true,
298 "a single packet for this destination should not result in an A-MPDU");
299 // dequeue the MPDU
300 htFem->DequeueMpdu(item);
301
303 txParams.Clear();
304 txParams.m_txVector =
305 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
307 item = m_mac->GetBEQueue()->GetNextMpdu(SINGLE_LINK_OP_ID, peeked, txParams, Time::Min(), true);
308
309 mpduList = mpduAggregator->GetNextAmpdu(item, txParams, Time::Min());
310
311 NS_TEST_EXPECT_MSG_EQ(mpduList.empty(),
312 true,
313 "no MPDU aggregation should be performed if there is no agreement");
314
316 0); // set to 0 in order to fake that the maximum number of retries has been reached
317 m_mac->TraceConnectWithoutContext("DroppedMpdu",
319 htFem->m_dcf = m_mac->GetBEQueue();
320 htFem->NormalAckTimeout(item, txParams.m_txVector);
321
322 NS_TEST_EXPECT_MSG_EQ(m_discarded, true, "packet should be discarded");
323 m_mac->GetBEQueue()->GetWifiMacQueue()->Flush();
324
325 Simulator::Destroy();
326
328 m_manager = nullptr;
329
330 m_device->Dispose();
331 m_device = nullptr;
332
333 htConfiguration = nullptr;
334}
335
343{
344 public:
346
347 private:
348 void DoRun() override;
354};
355
357 : TestCase("Check the correctness of two-level aggregation operations")
358{
359}
360
361void
363{
364 /*
365 * Create device and attach HT configuration.
366 */
367 m_device = CreateObject<WifiNetDevice>();
369 Ptr<HtConfiguration> htConfiguration = CreateObject<HtConfiguration>();
370 m_device->SetHtConfiguration(htConfiguration);
371
372 /*
373 * Create and configure phy layer.
374 */
375 m_phy = CreateObject<YansWifiPhy>();
376 Ptr<InterferenceHelper> interferenceHelper = CreateObject<InterferenceHelper>();
377 m_phy->SetInterferenceHelper(interferenceHelper);
381
382 /*
383 * Create and configure manager.
384 */
386 m_factory.SetTypeId("ns3::ConstantRateWifiManager");
387 m_factory.Set("DataMode", StringValue("HtMcs7"));
391
392 /*
393 * Create and configure mac layer.
394 */
395 m_mac = CreateObjectWithAttributes<StaWifiMac>("QosSupported", BooleanValue(true));
398 m_mac->SetAddress(Mac48Address("00:00:00:00:00:01"));
402 Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager>();
403 protectionManager->SetWifiMac(m_mac);
404 fem->SetProtectionManager(protectionManager);
405 Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager>();
406 ackManager->SetWifiMac(m_mac);
407 fem->SetAckManager(ackManager);
410 m_mac->SetMacQueueScheduler(CreateObject<FcfsWifiQueueScheduler>());
411
412 /*
413 * Configure aggregation.
414 */
415 m_mac->SetAttribute("BE_MaxAmsduSize", UintegerValue(4095));
416 m_mac->SetAttribute("BE_MaxAmpduSize", UintegerValue(65535));
417 HtCapabilities htCapabilities;
418 htCapabilities.SetMaxAmsduLength(7935);
419 htCapabilities.SetMaxAmpduLength(65535);
420 m_manager->AddStationHtCapabilities(Mac48Address("00:00:00:00:00:02"), htCapabilities);
421
422 /*
423 * Create dummy packets of 1500 bytes and fill mac header fields that will be used for the
424 * tests.
425 */
426 Ptr<const Packet> pkt = Create<Packet>(1500);
427 WifiMacHeader hdr;
428 hdr.SetAddr1(Mac48Address("00:00:00:00:00:02"));
429 hdr.SetAddr2(Mac48Address("00:00:00:00:00:01"));
431 hdr.SetQosTid(0);
432
433 //-----------------------------------------------------------------------------------------------------
434
435 /*
436 * Test MSDU and MPDU aggregation. Three MSDUs are in the queue and the maximum A-MSDU size
437 * is such that only two MSDUs can be aggregated. Therefore, the first MPDU we get contains
438 * an A-MSDU of 2 MSDUs.
439 */
440 Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager>(fem);
441 Ptr<MsduAggregator> msduAggregator = htFem->GetMsduAggregator();
442 Ptr<MpduAggregator> mpduAggregator = htFem->GetMpduAggregator();
443
444 m_mac->GetBEQueue()->GetWifiMacQueue()->Enqueue(Create<WifiMpdu>(Create<Packet>(1500), hdr));
445 m_mac->GetBEQueue()->GetWifiMacQueue()->Enqueue(Create<WifiMpdu>(Create<Packet>(1500), hdr));
446 m_mac->GetBEQueue()->GetWifiMacQueue()->Enqueue(Create<WifiMpdu>(Create<Packet>(1500), hdr));
447
449 WifiTxParameters txParams;
450 txParams.m_txVector =
451 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
453 htFem->TryAddMpdu(peeked, txParams, Time::Min());
454 Ptr<WifiMpdu> item = msduAggregator->GetNextAmsdu(peeked, txParams, Time::Min());
455
456 bool result{item};
457 NS_TEST_EXPECT_MSG_EQ(result, true, "aggregation failed");
458 NS_TEST_EXPECT_MSG_EQ(item->GetPacketSize(), 3030, "wrong packet size");
459
460 // dequeue the MSDUs
461 htFem->DequeueMpdu(item);
462
464 1,
465 "Unexpected number of MSDUs left in the EDCA queue");
466
467 //-----------------------------------------------------------------------------------------------------
468
469 /*
470 * A-MSDU aggregation fails when there is just one MSDU in the queue.
471 */
472
474 txParams.Clear();
475 txParams.m_txVector =
476 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
478 htFem->TryAddMpdu(peeked, txParams, Time::Min());
479 item = msduAggregator->GetNextAmsdu(peeked, txParams, Time::Min());
480
481 NS_TEST_EXPECT_MSG_EQ(item, nullptr, "A-MSDU aggregation did not fail");
482
483 htFem->DequeueMpdu(peeked);
484
486 0,
487 "queue should be empty");
488
489 //-----------------------------------------------------------------------------------------------------
490
491 /*
492 * Aggregation of MPDUs is stopped to prevent that the PPDU duration exceeds the TXOP limit.
493 * In this test, the VI AC is used, which has a default TXOP limit of 3008 microseconds.
494 */
495
496 // Establish agreement.
497 uint8_t tid = 5;
499 reqHdr.SetImmediateBlockAck();
500 reqHdr.SetTid(tid);
501 reqHdr.SetBufferSize(64);
502 reqHdr.SetTimeout(0);
503 reqHdr.SetStartingSequence(0);
504 m_mac->GetVIQueue()->GetBaManager()->CreateAgreement(&reqHdr, hdr.GetAddr1());
505
507 StatusCode code;
508 code.SetSuccess();
509 respHdr.SetStatusCode(code);
510 respHdr.SetAmsduSupport(reqHdr.IsAmsduSupported());
511 respHdr.SetImmediateBlockAck();
512 respHdr.SetTid(reqHdr.GetTid());
513 respHdr.SetBufferSize(64);
514 respHdr.SetTimeout(reqHdr.GetTimeout());
515 m_mac->GetVIQueue()->GetBaManager()->UpdateAgreement(&respHdr, hdr.GetAddr1(), 0);
516
517 m_mac->SetAttribute("VI_MaxAmsduSize", UintegerValue(3050)); // max 2 MSDUs per A-MSDU
518 m_mac->SetAttribute("VI_MaxAmpduSize", UintegerValue(65535));
520 "TxopLimits",
521 AttributeContainerValue<TimeValue>(std::vector<Time>{MicroSeconds(3008)}));
522 m_manager->SetAttribute("DataMode", StringValue("HtMcs2")); // 19.5Mbps
523
524 hdr.SetQosTid(tid);
525
526 // Add 10 MSDUs to the EDCA queue
527 for (uint8_t i = 0; i < 10; i++)
528 {
529 m_mac->GetVIQueue()->GetWifiMacQueue()->Enqueue(
530 Create<WifiMpdu>(Create<Packet>(1300), hdr));
531 }
532
534 txParams.Clear();
535 txParams.m_txVector =
536 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
538 Time txopLimit = m_mac->GetVIQueue()->GetTxopLimit(); // 3.008 ms
539
540 // Compute the first MPDU to be aggregated in an A-MPDU. It must contain an A-MSDU
541 // aggregating two MSDUs
542 item = m_mac->GetVIQueue()->GetNextMpdu(SINGLE_LINK_OP_ID, peeked, txParams, txopLimit, true);
543
544 NS_TEST_EXPECT_MSG_EQ(std::distance(item->begin(), item->end()),
545 2,
546 "There must be 2 MSDUs in the A-MSDU");
547
548 auto mpduList = mpduAggregator->GetNextAmpdu(item, txParams, txopLimit);
549
550 // The maximum number of bytes that can be transmitted in a TXOP is (approximately, as we
551 // do not consider that the preamble is transmitted at a different rate):
552 // 19.5 Mbps * 3.008 ms = 7332 bytes
553 // Given that the max A-MSDU size is set to 3050, an A-MSDU will contain two MSDUs and have
554 // a size of 2 * 1300 (MSDU size) + 2 * 14 (A-MSDU subframe header size) + 2 (one padding field)
555 // = 2630 bytes Hence, we expect that the A-MPDU will consist of:
556 // - 2 MPDUs containing each an A-MSDU. The size of each MPDU is 2630 (A-MSDU) + 30
557 // (header+trailer) = 2660
558 // - 1 MPDU containing a single MSDU. The size of such MPDU is 1300 (MSDU) + 30 (header+trailer)
559 // = 1330 The size of the A-MPDU is 4 + 2660 + 4 + 2660 + 4 + 1330 = 6662
560 NS_TEST_EXPECT_MSG_EQ(mpduList.empty(), false, "aggregation failed");
561 NS_TEST_EXPECT_MSG_EQ(mpduList.size(), 3, "Unexpected number of MPDUs in the A-MPDU");
562 NS_TEST_EXPECT_MSG_EQ(mpduList.at(0)->GetSize(), 2660, "Unexpected size of the first MPDU");
563 NS_TEST_EXPECT_MSG_EQ(mpduList.at(1)->GetSize(), 2660, "Unexpected size of the second MPDU");
564 NS_TEST_EXPECT_MSG_EQ(mpduList.at(2)->GetSize(), 1330, "Unexpected size of the first MPDU");
565
566 Ptr<WifiPsdu> psdu = Create<WifiPsdu>(mpduList);
567 htFem->DequeuePsdu(psdu);
568
570 5,
571 "Unexpected number of MSDUs left in the EDCA queue");
572
573 NS_TEST_EXPECT_MSG_EQ(psdu->GetSize(), 6662, "Unexpected size of the A-MPDU");
574
575 Simulator::Destroy();
576
577 m_device->Dispose();
578 m_device = nullptr;
579 htConfiguration = nullptr;
580}
581
590{
591 public:
593
594 private:
595 void DoRun() override;
601 void DoRunSubTest(uint16_t bufferSize);
607};
608
610 : TestCase("Check the correctness of 802.11ax aggregation operations")
611{
612}
613
614void
616{
617 /*
618 * Create device and attach configurations.
619 */
620 m_device = CreateObject<WifiNetDevice>();
621 Ptr<HtConfiguration> htConfiguration = CreateObject<HtConfiguration>();
622 m_device->SetHtConfiguration(htConfiguration);
623 Ptr<VhtConfiguration> vhtConfiguration = CreateObject<VhtConfiguration>();
624 m_device->SetVhtConfiguration(vhtConfiguration);
625 Ptr<HeConfiguration> heConfiguration = CreateObject<HeConfiguration>();
626 m_device->SetHeConfiguration(heConfiguration);
627
628 /*
629 * Create and configure phy layer.
630 */
631 m_phy = CreateObject<YansWifiPhy>();
632 Ptr<InterferenceHelper> interferenceHelper = CreateObject<InterferenceHelper>();
633 m_phy->SetInterferenceHelper(interferenceHelper);
637
638 /*
639 * Create and configure manager.
640 */
642 m_factory.SetTypeId("ns3::ConstantRateWifiManager");
643 m_factory.Set("DataMode", StringValue("HeMcs11"));
647
648 /*
649 * Create and configure mac layer.
650 */
651 m_mac = CreateObjectWithAttributes<StaWifiMac>("QosSupported", BooleanValue(true));
654 m_mac->SetAddress(Mac48Address("00:00:00:00:00:01"));
658 Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager>();
659 protectionManager->SetWifiMac(m_mac);
660 fem->SetProtectionManager(protectionManager);
661 Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager>();
662 ackManager->SetWifiMac(m_mac);
663 fem->SetAckManager(ackManager);
666 m_mac->SetMacQueueScheduler(CreateObject<FcfsWifiQueueScheduler>());
667
668 /*
669 * Configure aggregation.
670 */
671 HeCapabilities heCapabilities;
672 m_manager->AddStationHeCapabilities(Mac48Address("00:00:00:00:00:02"), heCapabilities);
673
674 /*
675 * Fill mac header fields.
676 */
677 WifiMacHeader hdr;
678 hdr.SetAddr1(Mac48Address("00:00:00:00:00:02"));
679 hdr.SetAddr2(Mac48Address("00:00:00:00:00:01"));
681 hdr.SetQosTid(0);
682 uint16_t sequence = m_mac->m_txMiddle->PeekNextSequenceNumberFor(&hdr);
683 hdr.SetSequenceNumber(sequence);
684 hdr.SetFragmentNumber(0);
685 hdr.SetNoMoreFragments();
686 hdr.SetNoRetry();
687
688 /*
689 * Establish agreement.
690 */
692 reqHdr.SetImmediateBlockAck();
693 reqHdr.SetTid(0);
694 reqHdr.SetBufferSize(bufferSize);
695 reqHdr.SetTimeout(0);
696 reqHdr.SetStartingSequence(0);
697 m_mac->GetBEQueue()->GetBaManager()->CreateAgreement(&reqHdr, hdr.GetAddr1());
698
700 StatusCode code;
701 code.SetSuccess();
702 respHdr.SetStatusCode(code);
703 respHdr.SetAmsduSupport(reqHdr.IsAmsduSupported());
704 respHdr.SetImmediateBlockAck();
705 respHdr.SetTid(reqHdr.GetTid());
706 respHdr.SetBufferSize(bufferSize);
707 respHdr.SetTimeout(reqHdr.GetTimeout());
708 m_mac->GetBEQueue()->GetBaManager()->UpdateAgreement(&respHdr, hdr.GetAddr1(), 0);
709
710 /*
711 * Test behavior when 300 packets are ready for transmission but negociated buffer size is 64
712 */
713 Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager>(fem);
714 Ptr<MpduAggregator> mpduAggregator = htFem->GetMpduAggregator();
715
716 for (uint16_t i = 0; i < 300; i++)
717 {
718 Ptr<const Packet> pkt = Create<Packet>(100);
719 WifiMacHeader hdr;
720
721 hdr.SetAddr1(Mac48Address("00:00:00:00:00:02"));
722 hdr.SetAddr2(Mac48Address("00:00:00:00:00:01"));
724 hdr.SetQosTid(0);
725
726 m_mac->GetBEQueue()->GetWifiMacQueue()->Enqueue(Create<WifiMpdu>(pkt, hdr));
727 }
728
730 WifiTxParameters txParams;
731 txParams.m_txVector =
732 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
734 Ptr<WifiMpdu> item =
735 m_mac->GetBEQueue()->GetNextMpdu(SINGLE_LINK_OP_ID, peeked, txParams, Time::Min(), true);
736
737 auto mpduList = mpduAggregator->GetNextAmpdu(item, txParams, Time::Min());
738 Ptr<WifiPsdu> psdu = Create<WifiPsdu>(mpduList);
739 htFem->DequeuePsdu(psdu);
740
741 NS_TEST_EXPECT_MSG_EQ(mpduList.empty(), false, "MPDU aggregation failed");
742 NS_TEST_EXPECT_MSG_EQ(mpduList.size(),
743 bufferSize,
744 "A-MPDU should countain " << bufferSize << " MPDUs");
745 uint16_t expectedRemainingPacketsInQueue = 300 - bufferSize;
747 expectedRemainingPacketsInQueue,
748 "queue should contain 300 - " << bufferSize << " = "
749 << expectedRemainingPacketsInQueue
750 << " packets");
751
752 Simulator::Destroy();
753
755 m_manager = nullptr;
756
757 m_device->Dispose();
758 m_device = nullptr;
759
760 htConfiguration = nullptr;
761 vhtConfiguration = nullptr;
762 heConfiguration = nullptr;
763}
764
765void
767{
768 DoRunSubTest(64);
769 DoRunSubTest(256);
770}
771
792{
793 public:
795 ~PreservePacketsInAmpdus() override;
796
797 void DoRun() override;
798
799 private:
800 std::list<Ptr<const Packet>> m_packetList;
801 std::vector<std::size_t> m_nMpdus;
802 std::vector<std::size_t> m_nMsdus;
803
815 void NotifyPsduForwardedDown(WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
821};
822
824 : TestCase("Test case to check that the Wifi Mac forwards up the same packets received at "
825 "sender side.")
826{
827}
828
830{
831}
832
833void
835{
836 m_packetList.push_back(packet);
837}
838
839void
841 WifiTxVector txVector,
842 double txPowerW)
843{
844 NS_TEST_EXPECT_MSG_EQ((psduMap.size() == 1 && psduMap.begin()->first == SU_STA_ID),
845 true,
846 "No DL MU PPDU expected");
847
848 if (!psduMap[SU_STA_ID]->GetHeader(0).IsQosData())
849 {
850 return;
851 }
852
853 m_nMpdus.push_back(psduMap[SU_STA_ID]->GetNMpdus());
854
855 for (auto& mpdu : *PeekPointer(psduMap[SU_STA_ID]))
856 {
857 std::size_t dist = std::distance(mpdu->begin(), mpdu->end());
858 // the list of aggregated MSDUs is empty if the MPDU includes a non-aggregated MSDU
859 m_nMsdus.push_back(dist > 0 ? dist : 1);
860 }
861}
862
863void
865{
866 auto it = std::find(m_packetList.begin(), m_packetList.end(), p);
867 NS_TEST_EXPECT_MSG_EQ((it != m_packetList.end()), true, "Packet being forwarded up not found");
868 m_packetList.erase(it);
869}
870
871void
873{
874 NodeContainer wifiStaNode;
875 wifiStaNode.Create(1);
876
878 wifiApNode.Create(1);
879
880 YansWifiChannelHelper channel = YansWifiChannelHelper::Default();
882 phy.SetChannel(channel.Create());
883
885 wifi.SetStandard(WIFI_STANDARD_80211n);
886 wifi.SetRemoteStationManager("ns3::IdealWifiManager");
887
889 Ssid ssid = Ssid("ns-3-ssid");
890 mac.SetType("ns3::StaWifiMac",
891 "BE_MaxAmsduSize",
892 UintegerValue(4500),
893 "BE_MaxAmpduSize",
894 UintegerValue(7500),
895 "Ssid",
897 /* setting blockack threshold for sta's BE queue */
898 "BE_BlockAckThreshold",
899 UintegerValue(2),
900 "ActiveProbing",
901 BooleanValue(false));
902
904 staDevices = wifi.Install(phy, mac, wifiStaNode);
905
906 mac.SetType("ns3::ApWifiMac", "Ssid", SsidValue(ssid), "BeaconGeneration", BooleanValue(true));
907
909 apDevices = wifi.Install(phy, mac, wifiApNode);
910
912 Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
913
914 positionAlloc->Add(Vector(0.0, 0.0, 0.0));
915 positionAlloc->Add(Vector(1.0, 0.0, 0.0));
916 mobility.SetPositionAllocator(positionAlloc);
917
918 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
919 mobility.Install(wifiApNode);
920 mobility.Install(wifiStaNode);
921
922 Ptr<WifiNetDevice> ap_device = DynamicCast<WifiNetDevice>(apDevices.Get(0));
923 Ptr<WifiNetDevice> sta_device = DynamicCast<WifiNetDevice>(staDevices.Get(0));
924
925 PacketSocketAddress socket;
926 socket.SetSingleDevice(sta_device->GetIfIndex());
927 socket.SetPhysicalAddress(ap_device->GetAddress());
928 socket.SetProtocol(1);
929
930 // install packet sockets on nodes.
931 PacketSocketHelper packetSocket;
932 packetSocket.Install(wifiStaNode);
933 packetSocket.Install(wifiApNode);
934
935 Ptr<PacketSocketClient> client = CreateObject<PacketSocketClient>();
936 client->SetAttribute("PacketSize", UintegerValue(1000));
937 client->SetAttribute("MaxPackets", UintegerValue(8));
938 client->SetAttribute("Interval", TimeValue(Seconds(1)));
939 client->SetRemote(socket);
940 wifiStaNode.Get(0)->AddApplication(client);
941 client->SetStartTime(Seconds(1));
942 client->SetStopTime(Seconds(3.0));
943 Simulator::Schedule(Seconds(1.5),
944 &PacketSocketClient::SetAttribute,
945 client,
946 "Interval",
948
949 Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer>();
950 server->SetLocal(socket);
951 wifiApNode.Get(0)->AddApplication(server);
952 server->SetStartTime(Seconds(0.0));
953 server->SetStopTime(Seconds(4.0));
954
955 sta_device->GetMac()->TraceConnectWithoutContext(
956 "MacTx",
958 sta_device->GetPhy()->TraceConnectWithoutContext(
959 "PhyTxPsduBegin",
961 ap_device->GetMac()->TraceConnectWithoutContext(
962 "MacRx",
964
965 Simulator::Stop(Seconds(5));
966 Simulator::Run();
967
968 Simulator::Destroy();
969
970 // Two packets are transmitted. The first one is an MPDU containing a single MSDU.
971 // The second one is an A-MPDU containing two MPDUs: the first MPDU contains 4 MSDUs
972 // and the second MPDU contains 3 MSDUs
973 NS_TEST_EXPECT_MSG_EQ(m_nMpdus.size(), 2, "Unexpected number of transmitted packets");
974 NS_TEST_EXPECT_MSG_EQ(m_nMsdus.size(), 3, "Unexpected number of transmitted MPDUs");
975 NS_TEST_EXPECT_MSG_EQ(m_nMpdus[0], 1, "Unexpected number of MPDUs in the first A-MPDU");
976 NS_TEST_EXPECT_MSG_EQ(m_nMsdus[0], 1, "Unexpected number of MSDUs in the first MPDU");
977 NS_TEST_EXPECT_MSG_EQ(m_nMpdus[1], 2, "Unexpected number of MPDUs in the second A-MPDU");
978 NS_TEST_EXPECT_MSG_EQ(m_nMsdus[1], 4, "Unexpected number of MSDUs in the second MPDU");
979 NS_TEST_EXPECT_MSG_EQ(m_nMsdus[2], 3, "Unexpected number of MSDUs in the third MPDU");
980 // All the packets must have been forwarded up at the receiver
981 NS_TEST_EXPECT_MSG_EQ(m_packetList.empty(), true, "Some packets have not been forwarded up");
982}
983
991{
992 public:
994};
995
997 : TestSuite("wifi-aggregation", UNIT)
998{
999 AddTestCase(new AmpduAggregationTest, TestCase::QUICK);
1000 AddTestCase(new TwoLevelAggregationTest, TestCase::QUICK);
1001 AddTestCase(new HeAggregationTest, TestCase::QUICK);
1002 AddTestCase(new PreservePacketsInAmpdus, TestCase::QUICK);
1003}
1004
#define Min(a, b)
Ampdu Aggregation Test.
bool m_discarded
whether the packet should be discarded
Ptr< YansWifiPhy > m_phy
Phy.
ObjectFactory m_factory
factory
Ptr< WifiRemoteStationManager > m_manager
remote station manager
void DoRun() override
Implementation to actually run this TestCase.
Ptr< WifiNetDevice > m_device
WifiNetDevice.
void MpduDiscarded(WifiMacDropReason reason, Ptr< const WifiMpdu > mpdu)
Fired when the MAC discards an MPDU.
Ptr< StaWifiMac > m_mac
Mac.
802.11ax aggregation test which permits 64 or 256 MPDUs in A-MPDU according to the negociated buffer ...
void DoRunSubTest(uint16_t bufferSize)
Run test for a given buffer size.
Ptr< StaWifiMac > m_mac
Mac.
Ptr< WifiNetDevice > m_device
WifiNetDevice.
ObjectFactory m_factory
factory
void DoRun() override
Implementation to actually run this TestCase.
Ptr< WifiRemoteStationManager > m_manager
remote station manager
Ptr< YansWifiPhy > m_phy
Phy.
Test for A-MSDU and A-MPDU aggregation.
void DoRun() override
Implementation to actually run this TestCase.
void NotifyPsduForwardedDown(WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW)
Callback invoked when the sender MAC passes a PSDU(s) to the PHY.
std::list< Ptr< const Packet > > m_packetList
List of packets passed to the MAC.
std::vector< std::size_t > m_nMsdus
Number of MSDUs in MPDUs passed to the PHY.
std::vector< std::size_t > m_nMpdus
Number of MPDUs in PSDUs passed to the PHY.
void NotifyMacForwardUp(Ptr< const Packet > p)
Callback invoked when the receiver MAC forwards a packet up to the upper layer.
void NotifyMacTransmit(Ptr< const Packet > packet)
Callback invoked when an MSDU is passed to the MAC.
Two Level Aggregation Test.
Ptr< WifiRemoteStationManager > m_manager
remote station manager
void DoRun() override
Implementation to actually run this TestCase.
Ptr< YansWifiPhy > m_phy
Phy.
ObjectFactory m_factory
factory
Ptr< StaWifiMac > m_mac
Mac.
Ptr< WifiNetDevice > m_device
WifiNetDevice.
Wifi Aggregation Test Suite.
A container for one type of attribute.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
The IEEE 802.11ax HE Capabilities.
The HT Capabilities Information Element.
void SetMaxAmsduLength(uint16_t maxAmsduLength)
Set the maximum AMSDU length.
void SetMaxAmpduLength(uint32_t maxAmpduLength)
Set the maximum AMPDU length.
an EUI-48 address
Definition: mac48-address.h:46
Implement the header for management frames of type Add Block Ack request.
Definition: mgt-headers.h:1476
void SetBufferSize(uint16_t size)
Set buffer size.
void SetImmediateBlockAck()
Enable immediate BlockAck.
uint16_t GetTimeout() const
Return the timeout.
uint8_t GetTid() const
Return the Traffic ID (TID).
bool IsAmsduSupported() const
Return whether A-MSDU capability is supported.
void SetTimeout(uint16_t timeout)
Set timeout.
void SetTid(uint8_t tid)
Set Traffic ID (TID).
void SetStartingSequence(uint16_t seq)
Set the starting sequence number.
Implement the header for management frames of type Add Block Ack response.
Definition: mgt-headers.h:1607
void SetTid(uint8_t tid)
Set Traffic ID (TID).
void SetTimeout(uint16_t timeout)
Set timeout.
void SetBufferSize(uint16_t size)
Set buffer size.
void SetStatusCode(StatusCode code)
Set the status code.
void SetAmsduSupport(bool supported)
Enable or disable A-MSDU support.
void SetImmediateBlockAck()
Enable immediate BlockAck.
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
uint32_t AddApplication(Ptr< Application > application)
Associate an Application to this Node.
Definition: node.cc:169
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
Definition: object-base.cc:369
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:258
Instantiate subclasses of ns3::Object.
Ptr< Object > Create() const
Create an Object instance of the configured TypeId.
void Set(const std::string &name, const AttributeValue &value, Args &&... args)
Set an attribute to be set during construction.
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
void Dispose()
Dispose of this Object.
Definition: object.cc:219
an address for a packet socket
void SetProtocol(uint16_t protocol)
Set the protocol.
void SetPhysicalAddress(const Address address)
Set the destination address.
void SetSingleDevice(uint32_t device)
Set the address to match only a specified NetDevice.
Give ns3::PacketSocket powers to ns3::Node.
void Install(Ptr< Node > node) const
Aggregate an instance of a ns3::PacketSocketFactory onto the provided node.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
Ptr< BlockAckManager > GetBaManager()
Get the Block Ack Manager associated with this QosTxop.
Definition: qos-txop.cc:255
Ptr< WifiMpdu > PeekNextMpdu(uint8_t linkId, uint8_t tid=8, Mac48Address recipient=Mac48Address::GetBroadcast(), Ptr< WifiMpdu > item=nullptr)
Peek the next frame to transmit on the given link to the given receiver and of the given TID from the...
Definition: qos-txop.cc:368
Ptr< WifiMpdu > GetNextMpdu(uint8_t linkId, Ptr< WifiMpdu > peekedItem, WifiTxParameters &txParams, Time availableTime, bool initialFrame)
Prepare the frame to transmit on the given link starting from the MPDU that has been previously peeke...
Definition: qos-txop.cc:454
The IEEE 802.11 SSID Information Element.
Definition: ssid.h:36
AttributeValue implementation for Ssid.
void SetState(MacState value)
Set the current MAC state.
void SetWifiPhys(const std::vector< Ptr< WifiPhy > > &phys) override
Status code for association response.
Definition: status-code.h:32
void SetSuccess()
Set success bit to 0 (success).
Definition: status-code.cc:30
Hold variables of type string.
Definition: string.h:42
encapsulates test code
Definition: test.h:1060
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:305
A suite of tests to run.
Definition: test.h:1256
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
AttributeValue implementation for Time.
Definition: nstime.h:1425
Time GetTxopLimit() const
Return the TXOP limit.
Definition: txop.cc:473
Ptr< WifiMacQueue > GetWifiMacQueue() const
Return the packet queue associated with this Txop.
Definition: txop.cc:220
Hold an unsigned integer type.
Definition: uinteger.h:45
helps to create WifiNetDevice objects
Definition: wifi-helper.h:325
Implements the IEEE 802.11 MAC header.
Mac48Address GetAddr1() const
Return the address in the Address 1 field.
uint16_t GetSequenceNumber() const
Return the sequence number of the header.
void SetNoMoreFragments()
Un-set the More Fragment bit in the Frame Control Field.
void SetSequenceNumber(uint16_t seq)
Set the sequence number of the header.
void SetAddr1(Mac48Address address)
Fill the Address 1 field with the given address.
void SetType(WifiMacType type, bool resetToDsFromDs=true)
Set Type/Subtype values with the correct values depending on the given type.
void SetQosTid(uint8_t tid)
Set the TID for the QoS header.
void SetAddr2(Mac48Address address)
Fill the Address 2 field with the given address.
void SetFragmentNumber(uint8_t frag)
Set the fragment number of the header.
void SetNoRetry()
Un-set the Retry bit in the Frame Control field.
create MAC layers for a ns3::WifiNetDevice.
Ptr< FrameExchangeManager > GetFrameExchangeManager(uint8_t linkId=SINGLE_LINK_OP_ID) const
Get the Frame Exchange Manager associated with the given link.
Definition: wifi-mac.cc:835
Ptr< QosTxop > GetBEQueue() const
Accessor for the AC_BE channel access function.
Definition: wifi-mac.cc:523
virtual void SetMacQueueScheduler(Ptr< WifiMacQueueScheduler > scheduler)
Set the wifi MAC queue scheduler.
Definition: wifi-mac.cc:542
virtual void SetAddress(Mac48Address address)
Definition: wifi-mac.cc:435
virtual void ConfigureStandard(WifiStandard standard)
Definition: wifi-mac.cc:723
void SetWifiRemoteStationManager(Ptr< WifiRemoteStationManager > stationManager)
Definition: wifi-mac.cc:847
Ptr< MacTxMiddle > m_txMiddle
TX middle (aggregation etc.)
Definition: wifi-mac.h:639
Ptr< QosTxop > GetVIQueue() const
Accessor for the AC_VI channel access function.
Definition: wifi-mac.cc:517
Ptr< WifiRemoteStationManager > GetWifiRemoteStationManager(uint8_t linkId=0) const
Definition: wifi-mac.cc:881
void SetDevice(const Ptr< WifiNetDevice > device)
Sets the device this PHY is associated with.
Definition: wifi-mac.cc:423
void SetMac(const Ptr< WifiMac > mac)
void SetHeConfiguration(Ptr< HeConfiguration > heConfiguration)
void SetHtConfiguration(Ptr< HtConfiguration > htConfiguration)
Ptr< WifiMac > GetMac() const
void SetVhtConfiguration(Ptr< VhtConfiguration > vhtConfiguration)
void SetRemoteStationManager(const Ptr< WifiRemoteStationManager > manager)
void SetStandard(WifiStandard standard)
Set the Wifi standard.
Ptr< WifiPhy > GetPhy() const
uint32_t GetIfIndex() const override
void SetPhy(const Ptr< WifiPhy > phy)
Address GetAddress() const override
uint16_t GetChannelWidth() const
Definition: wifi-phy.cc:980
virtual void ConfigureStandard(WifiStandard standard)
Configure the PHY-level parameters for different Wi-Fi standard.
Definition: wifi-phy.cc:895
void SetDevice(const Ptr< WifiNetDevice > device)
Sets the device this PHY is associated with.
Definition: wifi-phy.cc:575
const WifiMacHeader & GetHeader(std::size_t i) const
Get the header of the i-th MPDU.
Definition: wifi-psdu.cc:269
uint32_t GetSize() const
Return the size of the PSDU in bytes.
Definition: wifi-psdu.cc:263
std::size_t GetNMpdus() const
Return the number of MPDUs constituting the PSDU.
Definition: wifi-psdu.cc:317
hold a list of per-remote-station state.
void AddStationHeCapabilities(Mac48Address from, HeCapabilities heCapabilities)
Records HE capabilities of the remote station.
void SetMaxSsrc(uint32_t maxSsrc)
Sets the maximum STA short retry count (SSRC).
virtual void SetupPhy(const Ptr< WifiPhy > phy)
Set up PHY associated with this device since it is the object that knows the full set of transmit rat...
WifiTxVector GetDataTxVector(const WifiMacHeader &header, uint16_t allowedWidth)
void AddStationHtCapabilities(Mac48Address from, HtCapabilities htCapabilities)
Records HT capabilities of the remote station.
This class stores the TX parameters (TX vector, protection mechanism, acknowledgment mechanism,...
WifiTxVector m_txVector
TXVECTOR of the frame being prepared.
void Clear()
Reset the TX parameters.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
manage and create wifi channel objects for the YANS model.
Make it easy to create and manage PHY objects for the YANS model.
void SetInterferenceHelper(const Ptr< InterferenceHelper > helper) override
Sets the interference helper.
@ ASSOCIATED
Definition: lr-wpan-mac.h:167
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Definition: test.h:251
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1362
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1338
WifiMacDropReason
The reason why an MPDU was dropped.
Definition: wifi-mac.h:73
@ WIFI_STANDARD_80211n
@ WIFI_STANDARD_80211ax
Every class exported by the ns3 library is enclosed in the ns3 namespace.
U * PeekPointer(const Ptr< U > &p)
Definition: ptr.h:488
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:691
static constexpr uint8_t SINGLE_LINK_OP_ID
Link ID for single link operations (helps tracking places where correct link ID is to be used to supp...
Definition: wifi-utils.h:140
@ WIFI_MAC_QOSDATA
staDevices
Definition: third.py:91
ssid
Definition: third.py:86
channel
Definition: third.py:81
mac
Definition: third.py:85
wifi
Definition: third.py:88
apDevices
Definition: third.py:94
wifiApNode
Definition: third.py:79
mobility
Definition: third.py:96
phy
Definition: third.py:82
static WifiAggregationTestSuite g_wifiAggregationTestSuite
the test suite
#define SU_STA_ID
Definition: wifi-mode.h:34