A Discrete-Event Network Simulator
API
wifi-aggregation-test.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2015
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
19 */
20
21#include "ns3/string.h"
22#include "ns3/test.h"
23#include "ns3/simulator.h"
24#include "ns3/wifi-mac-queue.h"
25#include "ns3/wifi-psdu.h"
26#include "ns3/sta-wifi-mac.h"
27#include "ns3/yans-wifi-phy.h"
28#include "ns3/mac-tx-middle.h"
29#include "ns3/ht-frame-exchange-manager.h"
30#include "ns3/msdu-aggregator.h"
31#include "ns3/mpdu-aggregator.h"
32#include "ns3/wifi-net-device.h"
33#include "ns3/ht-configuration.h"
34#include "ns3/vht-configuration.h"
35#include "ns3/he-configuration.h"
36#include "ns3/node-container.h"
37#include "ns3/yans-wifi-helper.h"
38#include "ns3/mobility-helper.h"
39#include "ns3/pointer.h"
40#include "ns3/packet-socket-server.h"
41#include "ns3/packet-socket-client.h"
42#include "ns3/packet-socket-helper.h"
43#include "ns3/wifi-default-protection-manager.h"
44#include "ns3/wifi-default-ack-manager.h"
45#include <iterator>
46#include <algorithm>
47
48using namespace ns3;
49
57{
58public:
60
61private:
69
70 void DoRun (void) override;
77};
78
80 : TestCase ("Check the correctness of MPDU aggregation operations"),
81 m_discarded (false)
82{
83}
84
85void
87{
88 m_discarded = true;
89}
90
91void
93{
94 /*
95 * Create device and attach HT configuration.
96 */
97 m_device = CreateObject<WifiNetDevice> ();
98 Ptr<HtConfiguration> htConfiguration = CreateObject<HtConfiguration> ();
99 m_device->SetHtConfiguration (htConfiguration);
100
101 /*
102 * Create and configure phy layer.
103 */
104 m_phy = CreateObject<YansWifiPhy> ();
108
109 /*
110 * Create and configure manager.
111 */
113 m_factory.SetTypeId ("ns3::ConstantRateWifiManager");
114 m_factory.Set ("DataMode", StringValue ("HtMcs7"));
118
119 /*
120 * Create and configure mac layer.
121 */
122 m_mac = CreateObjectWithAttributes<StaWifiMac> ("QosSupported", BooleanValue (true));
125 m_mac->SetAddress (Mac48Address ("00:00:00:00:00:01"));
128 Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
129 protectionManager->SetWifiMac (m_mac);
130 fem->SetProtectionManager (protectionManager);
131 Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
132 ackManager->SetWifiMac (m_mac);
133 fem->SetAckManager (ackManager);
137
138 /*
139 * Configure MPDU aggregation.
140 */
141 m_mac->SetAttribute ("BE_MaxAmpduSize", UintegerValue (65535));
142 HtCapabilities htCapabilities;
143 htCapabilities.SetMaxAmpduLength (65535);
144 m_manager->AddStationHtCapabilities (Mac48Address ("00:00:00:00:00:02"), htCapabilities);
145 m_manager->AddStationHtCapabilities (Mac48Address ("00:00:00:00:00:03"), htCapabilities);
146
147 /*
148 * Create a dummy packet of 1500 bytes and fill mac header fields.
149 */
150 Ptr<const Packet> pkt = Create<Packet> (1500);
151 Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
152 WifiMacHeader hdr;
153 hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:02"));
154 hdr.SetAddr2 (Mac48Address ("00:00:00:00:00:01"));
156 hdr.SetQosTid (0);
157 hdr.SetFragmentNumber (0);
158 hdr.SetNoMoreFragments ();
159 hdr.SetNoRetry ();
160
161 /*
162 * Establish agreement.
163 */
165 reqHdr.SetImmediateBlockAck ();
166 reqHdr.SetTid (0);
167 reqHdr.SetBufferSize (64);
168 reqHdr.SetTimeout (0);
169 reqHdr.SetStartingSequence (0);
170 m_mac->GetBEQueue ()->GetBaManager ()->CreateAgreement (&reqHdr, hdr.GetAddr1 ());
171
173 StatusCode code;
174 code.SetSuccess ();
175 respHdr.SetStatusCode (code);
176 respHdr.SetAmsduSupport (reqHdr.IsAmsduSupported ());
177 respHdr.SetImmediateBlockAck ();
178 respHdr.SetTid (reqHdr.GetTid ());
179 respHdr.SetBufferSize (64);
180 respHdr.SetTimeout (reqHdr.GetTimeout ());
181 m_mac->GetBEQueue ()->GetBaManager ()->UpdateAgreement (&respHdr, hdr.GetAddr1 (), 0);
182
183 //-----------------------------------------------------------------------------------------------------
184
185 /*
186 * Test behavior when no other packets are in the queue
187 */
188 Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (fem);
189 Ptr<MpduAggregator> mpduAggregator = htFem->GetMpduAggregator ();
190
191 m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt, hdr));
192
194 WifiTxParameters txParams;
195 txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
196 Ptr<WifiMacQueueItem> item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true);
197
198 auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min ());
199
200 NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), true, "a single packet should not result in an A-MPDU");
201
202 // the packet has not been "transmitted", release its sequence number
203 m_mac->m_txMiddle->SetSequenceNumberFor (&item->GetHeader ());
204
205 //-----------------------------------------------------------------------------------------------------
206
207 /*
208 * Test behavior when 2 more packets are in the queue
209 */
210 Ptr<const Packet> pkt1 = Create<Packet> (1500);
211 Ptr<const Packet> pkt2 = Create<Packet> (1500);
212 WifiMacHeader hdr1, hdr2;
213
214 hdr1.SetAddr1 (Mac48Address ("00:00:00:00:00:02"));
215 hdr1.SetAddr2 (Mac48Address ("00:00:00:00:00:01"));
217 hdr1.SetQosTid (0);
218
219 hdr2.SetAddr1 (Mac48Address ("00:00:00:00:00:02"));
220 hdr2.SetAddr2 (Mac48Address ("00:00:00:00:00:01"));
222 hdr2.SetQosTid (0);
223
224 m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt1, hdr1));
225 m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt2, hdr2));
226
227 item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true);
228 mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min ());
229
230 NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), false, "MPDU aggregation failed");
231
232 Ptr<WifiPsdu> psdu = Create<WifiPsdu> (mpduList);
233 htFem->DequeuePsdu (psdu);
234
235 NS_TEST_EXPECT_MSG_EQ (psdu->GetSize (), 4606, "A-MPDU size is not correct");
236 NS_TEST_EXPECT_MSG_EQ (mpduList.size (), 3, "A-MPDU should contain 3 MPDUs");
237 NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->GetWifiMacQueue ()->GetNPackets (), 0, "queue should be empty");
238
239 for (uint32_t i = 0; i < psdu->GetNMpdus (); i++)
240 {
241 NS_TEST_EXPECT_MSG_EQ (psdu->GetHeader (i).GetSequenceNumber (), i, "wrong sequence number");
242 }
243
244 //-----------------------------------------------------------------------------------------------------
245
246 /*
247 * Test behavior when the 802.11n station and another non-QoS station are associated to the AP.
248 * The AP sends an A-MPDU to the 802.11n station followed by the last retransmission of a non-QoS data frame to the non-QoS station.
249 * This is used to reproduce bug 2224.
250 */
251 pkt1 = Create<Packet> (1500);
252 pkt2 = Create<Packet> (1500);
253 hdr1.SetAddr1 (Mac48Address ("00:00:00:00:00:02"));
254 hdr1.SetAddr2 (Mac48Address ("00:00:00:00:00:01"));
256 hdr1.SetQosTid (0);
257 hdr1.SetSequenceNumber (3);
258 hdr2.SetAddr1 (Mac48Address ("00:00:00:00:00:03"));
259 hdr2.SetAddr2 (Mac48Address ("00:00:00:00:00:01"));
261 hdr2.SetQosTid (0);
262
263 Ptr<const Packet> pkt3 = Create<Packet> (1500);
264 WifiMacHeader hdr3;
265 hdr3.SetSequenceNumber (0);
266 hdr3.SetAddr1 (Mac48Address ("00:00:00:00:00:03"));
267 hdr3.SetAddr2 (Mac48Address ("00:00:00:00:00:01"));
269 hdr3.SetQosTid (0);
270
271 m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt1, hdr1));
272 m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt2, hdr2));
273 m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt3, hdr3));
274
275 peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
276 txParams.Clear ();
277 txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
278 item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true);
279
280 mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min ());
281
282 NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), true, "a single packet for this destination should not result in an A-MPDU");
283 // dequeue the MPDU
284 htFem->DequeueMpdu (item);
285
286 peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
287 txParams.Clear ();
288 txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
289 item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true);
290
291 mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min ());
292
293 NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), true, "no MPDU aggregation should be performed if there is no agreement");
294
295 m_manager->SetMaxSsrc (0); //set to 0 in order to fake that the maximum number of retries has been reached
297 htFem->m_dcf = m_mac->GetBEQueue ();
298 htFem->NormalAckTimeout (item, txParams.m_txVector);
299
300 NS_TEST_EXPECT_MSG_EQ (m_discarded, true, "packet should be discarded");
301 m_mac->GetBEQueue ()->GetWifiMacQueue ()->Flush ();
302
303 Simulator::Destroy ();
304
305 m_manager->Dispose ();
306 m_manager = 0;
307
308 m_device->Dispose ();
309 m_device = 0;
310
311 htConfiguration = 0;
312}
313
321{
322public:
324
325private:
326 void DoRun (void) override;
332};
333
335 : TestCase ("Check the correctness of two-level aggregation operations")
336{
337}
338
339void
341{
342 /*
343 * Create device and attach HT configuration.
344 */
345 m_device = CreateObject<WifiNetDevice> ();
347 Ptr<HtConfiguration> htConfiguration = CreateObject<HtConfiguration> ();
348 m_device->SetHtConfiguration (htConfiguration);
349
350 /*
351 * Create and configure phy layer.
352 */
353 m_phy = CreateObject<YansWifiPhy> ();
357
358 /*
359 * Create and configure manager.
360 */
362 m_factory.SetTypeId ("ns3::ConstantRateWifiManager");
363 m_factory.Set ("DataMode", StringValue ("HtMcs7"));
367
368 /*
369 * Create and configure mac layer.
370 */
371 m_mac = CreateObjectWithAttributes<StaWifiMac> ("QosSupported", BooleanValue (true));
374 m_mac->SetAddress (Mac48Address ("00:00:00:00:00:01"));
377 Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
378 protectionManager->SetWifiMac (m_mac);
379 fem->SetProtectionManager (protectionManager);
380 Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
381 ackManager->SetWifiMac (m_mac);
382 fem->SetAckManager (ackManager);
386
387 /*
388 * Configure aggregation.
389 */
390 m_mac->SetAttribute ("BE_MaxAmsduSize", UintegerValue (4095));
391 m_mac->SetAttribute ("BE_MaxAmpduSize", UintegerValue (65535));
392 HtCapabilities htCapabilities;
393 htCapabilities.SetMaxAmsduLength (7935);
394 htCapabilities.SetMaxAmpduLength (65535);
395 m_manager->AddStationHtCapabilities (Mac48Address ("00:00:00:00:00:02"), htCapabilities);
396
397 /*
398 * Create dummy packets of 1500 bytes and fill mac header fields that will be used for the tests.
399 */
400 Ptr<const Packet> pkt = Create<Packet> (1500);
401 WifiMacHeader hdr;
402 hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:02"));
403 hdr.SetAddr2 (Mac48Address ("00:00:00:00:00:01"));
405 hdr.SetQosTid (0);
406
407 //-----------------------------------------------------------------------------------------------------
408
409 /*
410 * Test MSDU and MPDU aggregation. Three MSDUs are in the queue and the maximum A-MSDU size
411 * is such that only two MSDUs can be aggregated. Therefore, the first MPDU we get contains
412 * an A-MSDU of 2 MSDUs.
413 */
414 Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (fem);
415 Ptr<MsduAggregator> msduAggregator = htFem->GetMsduAggregator ();
416 Ptr<MpduAggregator> mpduAggregator = htFem->GetMpduAggregator ();
417
418 m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (Create<Packet> (1500), hdr));
419 m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (Create<Packet> (1500), hdr));
420 m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (Create<Packet> (1500), hdr));
421
423 WifiTxParameters txParams;
424 txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
425 htFem->TryAddMpdu (peeked, txParams, Time::Min ());
426 Ptr<WifiMacQueueItem> item = msduAggregator->GetNextAmsdu (peeked, txParams, Time::Min ());
427
428 bool result = (item != 0);
429 NS_TEST_EXPECT_MSG_EQ (result, true, "aggregation failed");
430 NS_TEST_EXPECT_MSG_EQ (item->GetPacketSize (), 3030, "wrong packet size");
431
432 // dequeue the MSDUs
433 htFem->DequeueMpdu (item);
434
435 NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->GetWifiMacQueue ()->GetNPackets (), 1,
436 "Unexpected number of MSDUs left in the EDCA queue");
437
438 //-----------------------------------------------------------------------------------------------------
439
440 /*
441 * A-MSDU aggregation fails when there is just one MSDU in the queue.
442 */
443
444 peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
445 txParams.Clear ();
446 txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
447 htFem->TryAddMpdu (peeked, txParams, Time::Min ());
448 item = msduAggregator->GetNextAmsdu (peeked, txParams, Time::Min ());
449
450 NS_TEST_EXPECT_MSG_EQ ((item == 0), true, "A-MSDU aggregation did not fail");
451
452 htFem->DequeueMpdu (peeked);
453
454 NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->GetWifiMacQueue ()->GetNPackets (), 0, "queue should be empty");
455
456 //-----------------------------------------------------------------------------------------------------
457
458 /*
459 * Aggregation of MPDUs is stopped to prevent that the PPDU duration exceeds the TXOP limit.
460 * In this test, the VI AC is used, which has a default TXOP limit of 3008 microseconds.
461 */
462
463 // Establish agreement.
464 uint8_t tid = 5;
466 reqHdr.SetImmediateBlockAck ();
467 reqHdr.SetTid (tid);
468 reqHdr.SetBufferSize (64);
469 reqHdr.SetTimeout (0);
470 reqHdr.SetStartingSequence (0);
471 m_mac->GetVIQueue ()->GetBaManager ()->CreateAgreement (&reqHdr, hdr.GetAddr1 ());
472
474 StatusCode code;
475 code.SetSuccess ();
476 respHdr.SetStatusCode (code);
477 respHdr.SetAmsduSupport (reqHdr.IsAmsduSupported ());
478 respHdr.SetImmediateBlockAck ();
479 respHdr.SetTid (reqHdr.GetTid ());
480 respHdr.SetBufferSize (64);
481 respHdr.SetTimeout (reqHdr.GetTimeout ());
482 m_mac->GetVIQueue ()->GetBaManager ()->UpdateAgreement (&respHdr, hdr.GetAddr1 (), 0);
483
484 m_mac->SetAttribute ("VI_MaxAmsduSize", UintegerValue (3050)); // max 2 MSDUs per A-MSDU
485 m_mac->SetAttribute ("VI_MaxAmpduSize", UintegerValue (65535));
486 m_manager->SetAttribute ("DataMode", StringValue ("HtMcs2")); // 19.5Mbps
487
488 hdr.SetQosTid (tid);
489
490 // Add 10 MSDUs to the EDCA queue
491 for (uint8_t i = 0; i < 10; i++)
492 {
493 m_mac->GetVIQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (Create<Packet> (1300), hdr));
494 }
495
496 peeked = m_mac->GetVIQueue ()->PeekNextMpdu ();
497 txParams.Clear ();
498 txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
499 Time txopLimit = m_mac->GetVIQueue ()->GetTxopLimit (); // 3.008 ms
500
501 // Compute the first MPDU to be aggregated in an A-MPDU. It must contain an A-MSDU
502 // aggregating two MSDUs
503 item = m_mac->GetVIQueue ()->GetNextMpdu (peeked, txParams, txopLimit, true);
504
505 NS_TEST_EXPECT_MSG_EQ (std::distance (item->begin (), item->end ()), 2, "There must be 2 MSDUs in the A-MSDU");
506
507 auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, txopLimit);
508
509 // The maximum number of bytes that can be transmitted in a TXOP is (approximately, as we
510 // do not consider that the preamble is transmitted at a different rate):
511 // 19.5 Mbps * 3.008 ms = 7332 bytes
512 // Given that the max A-MSDU size is set to 3050, an A-MSDU will contain two MSDUs and have
513 // a size of 2 * 1300 (MSDU size) + 2 * 14 (A-MSDU subframe header size) + 2 (one padding field) = 2630 bytes
514 // Hence, we expect that the A-MPDU will consist of:
515 // - 2 MPDUs containing each an A-MSDU. The size of each MPDU is 2630 (A-MSDU) + 30 (header+trailer) = 2660
516 // - 1 MPDU containing a single MSDU. The size of such MPDU is 1300 (MSDU) + 30 (header+trailer) = 1330
517 // The size of the A-MPDU is 4 + 2660 + 4 + 2660 + 4 + 1330 = 6662
518 NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), false, "aggregation failed");
519 NS_TEST_EXPECT_MSG_EQ (mpduList.size (), 3, "Unexpected number of MPDUs in the A-MPDU");
520 NS_TEST_EXPECT_MSG_EQ (mpduList.at (0)->GetSize (), 2660, "Unexpected size of the first MPDU");
521 NS_TEST_EXPECT_MSG_EQ (mpduList.at (1)->GetSize (), 2660, "Unexpected size of the second MPDU");
522 NS_TEST_EXPECT_MSG_EQ (mpduList.at (2)->GetSize (), 1330, "Unexpected size of the first MPDU");
523
524 Ptr<WifiPsdu> psdu = Create<WifiPsdu> (mpduList);
525 htFem->DequeuePsdu (psdu);
526
527 NS_TEST_EXPECT_MSG_EQ (m_mac->GetVIQueue ()->GetWifiMacQueue ()->GetNPackets (), 5,
528 "Unexpected number of MSDUs left in the EDCA queue");
529
530 NS_TEST_EXPECT_MSG_EQ (psdu->GetSize (), 6662, "Unexpected size of the A-MPDU");
531
532 Simulator::Destroy ();
533
534 m_device->Dispose ();
535 m_device = 0;
536 htConfiguration = 0;
537}
538
546{
547public:
549
550private:
551 void DoRun (void) override;
557 void DoRunSubTest (uint16_t bufferSize);
563};
564
566 : TestCase ("Check the correctness of 802.11ax aggregation operations")
567{
568}
569
570void
572{
573 /*
574 * Create device and attach configurations.
575 */
576 m_device = CreateObject<WifiNetDevice> ();
577 Ptr<HtConfiguration> htConfiguration = CreateObject<HtConfiguration> ();
578 m_device->SetHtConfiguration (htConfiguration);
579 Ptr<VhtConfiguration> vhtConfiguration = CreateObject<VhtConfiguration> ();
580 m_device->SetVhtConfiguration (vhtConfiguration);
581 Ptr<HeConfiguration> heConfiguration = CreateObject<HeConfiguration> ();
582 m_device->SetHeConfiguration (heConfiguration);
583
584 /*
585 * Create and configure phy layer.
586 */
587 m_phy = CreateObject<YansWifiPhy> ();
591
592 /*
593 * Create and configure manager.
594 */
596 m_factory.SetTypeId ("ns3::ConstantRateWifiManager");
597 m_factory.Set ("DataMode", StringValue ("HeMcs11"));
601
602 /*
603 * Create and configure mac layer.
604 */
605 m_mac = CreateObjectWithAttributes<StaWifiMac> ("QosSupported", BooleanValue (true));
608 m_mac->SetAddress (Mac48Address ("00:00:00:00:00:01"));
611 Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
612 protectionManager->SetWifiMac (m_mac);
613 fem->SetProtectionManager (protectionManager);
614 Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
615 ackManager->SetWifiMac (m_mac);
616 fem->SetAckManager (ackManager);
620
621 /*
622 * Configure aggregation.
623 */
624 HeCapabilities heCapabilities;
625 m_manager->AddStationHeCapabilities (Mac48Address ("00:00:00:00:00:02"), heCapabilities);
626
627 /*
628 * Fill mac header fields.
629 */
630 WifiMacHeader hdr;
631 hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:02"));
632 hdr.SetAddr2 (Mac48Address ("00:00:00:00:00:01"));
634 hdr.SetQosTid (0);
635 uint16_t sequence = m_mac->m_txMiddle->PeekNextSequenceNumberFor (&hdr);
636 hdr.SetSequenceNumber (sequence);
637 hdr.SetFragmentNumber (0);
638 hdr.SetNoMoreFragments ();
639 hdr.SetNoRetry ();
640
641 /*
642 * Establish agreement.
643 */
645 reqHdr.SetImmediateBlockAck ();
646 reqHdr.SetTid (0);
647 reqHdr.SetBufferSize (bufferSize);
648 reqHdr.SetTimeout (0);
649 reqHdr.SetStartingSequence (0);
650 m_mac->GetBEQueue ()->GetBaManager ()->CreateAgreement (&reqHdr, hdr.GetAddr1 ());
651
653 StatusCode code;
654 code.SetSuccess ();
655 respHdr.SetStatusCode (code);
656 respHdr.SetAmsduSupport (reqHdr.IsAmsduSupported ());
657 respHdr.SetImmediateBlockAck ();
658 respHdr.SetTid (reqHdr.GetTid ());
659 respHdr.SetBufferSize (bufferSize);
660 respHdr.SetTimeout (reqHdr.GetTimeout ());
661 m_mac->GetBEQueue ()->GetBaManager ()->UpdateAgreement (&respHdr, hdr.GetAddr1 (), 0);
662
663 /*
664 * Test behavior when 300 packets are ready for transmission but negociated buffer size is 64
665 */
666 Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (fem);
667 Ptr<MpduAggregator> mpduAggregator = htFem->GetMpduAggregator ();
668
669 for (uint16_t i = 0; i < 300; i++)
670 {
671 Ptr<const Packet> pkt = Create<Packet> (100);
672 WifiMacHeader hdr;
673
674 hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:02"));
675 hdr.SetAddr2 (Mac48Address ("00:00:00:00:00:01"));
677 hdr.SetQosTid (0);
678
679 m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt, hdr));
680 }
681
683 WifiTxParameters txParams;
684 txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
685 Ptr<WifiMacQueueItem> item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true);
686
687 auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min ());
688 Ptr<WifiPsdu> psdu = Create<WifiPsdu> (mpduList);
689 htFem->DequeuePsdu (psdu);
690
691 NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), false, "MPDU aggregation failed");
692 NS_TEST_EXPECT_MSG_EQ (mpduList.size (), bufferSize, "A-MPDU should countain " << bufferSize << " MPDUs");
693 uint16_t expectedRemainingPacketsInQueue = 300 - bufferSize;
694 NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->GetWifiMacQueue ()->GetNPackets (), expectedRemainingPacketsInQueue, "queue should contain 300 - "<< bufferSize << " = "<< expectedRemainingPacketsInQueue << " packets");
695
696 Simulator::Destroy ();
697
698 m_manager->Dispose ();
699 m_manager = 0;
700
701 m_device->Dispose ();
702 m_device = 0;
703
704 htConfiguration = 0;
705 vhtConfiguration = 0;
706 heConfiguration = 0;
707}
708
709void
711{
712 DoRunSubTest (64);
713 DoRunSubTest (256);
714}
715
736{
737public:
739 virtual ~PreservePacketsInAmpdus ();
740
741 void DoRun (void) override;
742
743
744private:
745 std::list<Ptr<const Packet>> m_packetList;
746 std::vector<std::size_t> m_nMpdus;
747 std::vector<std::size_t> m_nMsdus;
748
760 void NotifyPsduForwardedDown (WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
766};
767
769 : TestCase ("Test case to check that the Wifi Mac forwards up the same packets received at sender side.")
770{
771}
772
774{
775}
776
777void
779{
780 m_packetList.push_back (packet);
781}
782
783void
785{
786 NS_TEST_EXPECT_MSG_EQ ((psduMap.size () == 1 && psduMap.begin ()->first == SU_STA_ID),
787 true, "No DL MU PPDU expected");
788
789 if (!psduMap[SU_STA_ID]->GetHeader (0).IsQosData ())
790 {
791 return;
792 }
793
794 m_nMpdus.push_back (psduMap[SU_STA_ID]->GetNMpdus ());
795
796 for (auto& mpdu : *PeekPointer (psduMap[SU_STA_ID]))
797 {
798 std::size_t dist = std::distance (mpdu->begin (), mpdu->end ());
799 // the list of aggregated MSDUs is empty if the MPDU includes a non-aggregated MSDU
800 m_nMsdus.push_back (dist > 0 ? dist : 1);
801 }
802}
803
804void
806{
807 auto it = std::find (m_packetList.begin (), m_packetList.end (), p);
808 NS_TEST_EXPECT_MSG_EQ ((it != m_packetList.end ()), true, "Packet being forwarded up not found");
809 m_packetList.erase (it);
810}
811
812void
814{
815 NodeContainer wifiStaNode;
816 wifiStaNode.Create (1);
817
819 wifiApNode.Create (1);
820
821 YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
823 phy.SetChannel (channel.Create ());
824
826 wifi.SetStandard (WIFI_STANDARD_80211n);
827 wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
828
830 Ssid ssid = Ssid ("ns-3-ssid");
831 mac.SetType ("ns3::StaWifiMac",
832 "BE_MaxAmsduSize", UintegerValue (4500),
833 "BE_MaxAmpduSize", UintegerValue (7500),
834 "Ssid", SsidValue (ssid),
835 /* setting blockack threshold for sta's BE queue */
836 "BE_BlockAckThreshold", UintegerValue (2),
837 "ActiveProbing", BooleanValue (false));
838
840 staDevices = wifi.Install (phy, mac, wifiStaNode);
841
842 mac.SetType ("ns3::ApWifiMac",
843 "Ssid", SsidValue (ssid),
844 "BeaconGeneration", BooleanValue (true));
845
847 apDevices = wifi.Install (phy, mac, wifiApNode);
848
850 Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
851
852 positionAlloc->Add (Vector (0.0, 0.0, 0.0));
853 positionAlloc->Add (Vector (1.0, 0.0, 0.0));
854 mobility.SetPositionAllocator (positionAlloc);
855
856 mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
857 mobility.Install (wifiApNode);
858 mobility.Install (wifiStaNode);
859
860 Ptr<WifiNetDevice> ap_device = DynamicCast<WifiNetDevice> (apDevices.Get (0));
861 Ptr<WifiNetDevice> sta_device = DynamicCast<WifiNetDevice> (staDevices.Get (0));
862
863 PacketSocketAddress socket;
864 socket.SetSingleDevice (sta_device->GetIfIndex ());
865 socket.SetPhysicalAddress (ap_device->GetAddress ());
866 socket.SetProtocol (1);
867
868 // install packet sockets on nodes.
869 PacketSocketHelper packetSocket;
870 packetSocket.Install (wifiStaNode);
871 packetSocket.Install (wifiApNode);
872
873 Ptr<PacketSocketClient> client = CreateObject<PacketSocketClient> ();
874 client->SetAttribute ("PacketSize", UintegerValue (1000));
875 client->SetAttribute ("MaxPackets", UintegerValue (8));
876 client->SetAttribute ("Interval", TimeValue (Seconds (1)));
877 client->SetRemote (socket);
878 wifiStaNode.Get (0)->AddApplication (client);
879 client->SetStartTime (Seconds (1));
880 client->SetStopTime (Seconds (3.0));
881 Simulator::Schedule (Seconds (1.5), &PacketSocketClient::SetAttribute, client,
882 "Interval", TimeValue (MicroSeconds (0)));
883
884 Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer> ();
885 server->SetLocal (socket);
886 wifiApNode.Get (0)->AddApplication (server);
887 server->SetStartTime (Seconds (0.0));
888 server->SetStopTime (Seconds (4.0));
889
890 sta_device->GetMac ()->TraceConnectWithoutContext ("MacTx",
892 sta_device->GetPhy ()->TraceConnectWithoutContext ("PhyTxPsduBegin",
894 ap_device->GetMac ()->TraceConnectWithoutContext ("MacRx",
896
897 Simulator::Stop (Seconds (5));
898 Simulator::Run ();
899
900 Simulator::Destroy ();
901
902 // Two packets are transmitted. The first one is an MPDU containing a single MSDU.
903 // The second one is an A-MPDU containing two MPDUs: the first MPDU contains 4 MSDUs
904 // and the second MPDU contains 3 MSDUs
905 NS_TEST_EXPECT_MSG_EQ (m_nMpdus.size (), 2, "Unexpected number of transmitted packets");
906 NS_TEST_EXPECT_MSG_EQ (m_nMsdus.size (), 3, "Unexpected number of transmitted MPDUs");
907 NS_TEST_EXPECT_MSG_EQ (m_nMpdus[0], 1, "Unexpected number of MPDUs in the first A-MPDU");
908 NS_TEST_EXPECT_MSG_EQ (m_nMsdus[0], 1, "Unexpected number of MSDUs in the first MPDU");
909 NS_TEST_EXPECT_MSG_EQ (m_nMpdus[1], 2, "Unexpected number of MPDUs in the second A-MPDU");
910 NS_TEST_EXPECT_MSG_EQ (m_nMsdus[1], 4, "Unexpected number of MSDUs in the second MPDU");
911 NS_TEST_EXPECT_MSG_EQ (m_nMsdus[2], 3, "Unexpected number of MSDUs in the third MPDU");
912 // All the packets must have been forwarded up at the receiver
913 NS_TEST_EXPECT_MSG_EQ (m_packetList.empty (), true, "Some packets have not been forwarded up");
914}
915
923{
924public:
926};
927
929 : TestSuite ("wifi-aggregation", UNIT)
930{
931 AddTestCase (new AmpduAggregationTest, TestCase::QUICK);
932 AddTestCase (new TwoLevelAggregationTest, TestCase::QUICK);
933 AddTestCase (new HeAggregationTest, TestCase::QUICK);
934 AddTestCase (new PreservePacketsInAmpdus, TestCase::QUICK);
935}
936
#define Min(a, b)
Ampdu Aggregation Test.
bool m_discarded
whether the packet should be discarded
Ptr< YansWifiPhy > m_phy
Phy.
void MpduDiscarded(WifiMacDropReason reason, Ptr< const WifiMacQueueItem > mpdu)
Fired when the MAC discards an MPDU.
ObjectFactory m_factory
factory
void DoRun(void) override
Implementation to actually run this TestCase.
Ptr< WifiRemoteStationManager > m_manager
remote station manager
Ptr< WifiNetDevice > m_device
WifiNetDevice.
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.
void DoRun(void) override
Implementation to actually run this TestCase.
ObjectFactory m_factory
factory
Ptr< WifiRemoteStationManager > m_manager
remote station manager
Ptr< YansWifiPhy > m_phy
Phy.
Test for A-MSDU and A-MPDU aggregation.
void DoRun(void) 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
Ptr< YansWifiPhy > m_phy
Phy.
ObjectFactory m_factory
factory
void DoRun(void) override
Implementation to actually run this TestCase.
Ptr< StaWifiMac > m_mac
Mac.
Ptr< WifiNetDevice > m_device
WifiNetDevice.
Wifi Aggregation Test Suite.
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:44
Implement the header for management frames of type Add Block Ack request.
Definition: mgt-headers.h:1018
uint16_t GetTimeout(void) const
Return the timeout.
void SetBufferSize(uint16_t size)
Set buffer size.
void SetImmediateBlockAck()
Enable immediate BlockAck.
bool IsAmsduSupported(void) const
Return whether A-MSDU capability is supported.
uint8_t GetTid(void) const
Return the Traffic ID (TID).
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:1150
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:159
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
Definition: object-base.cc:364
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:256
Instantiate subclasses of ns3::Object.
void Set(const std::string &name, const AttributeValue &value, Args &&... args)
Set an attribute to be set during construction.
Ptr< Object > Create(void) const
Create an Object instance of the configured TypeId.
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
void Dispose(void)
Dispose of this Object.
Definition: object.cc:214
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:74
Ptr< WifiMacQueueItem > GetNextMpdu(Ptr< const WifiMacQueueItem > peekedItem, WifiTxParameters &txParams, Time availableTime, bool initialFrame)
Prepare the frame to transmit starting from the MPDU that has been previously peeked by calling PeekN...
Definition: qos-txop.cc:443
Ptr< BlockAckManager > GetBaManager(void)
Get the Block Ack Manager associated with this QosTxop.
Definition: qos-txop.cc:243
Ptr< const WifiMacQueueItem > PeekNextMpdu(uint8_t tid=8, Mac48Address recipient=Mac48Address::GetBroadcast(), Ptr< const WifiMacQueueItem > item=nullptr)
Peek the next frame to transmit to the given receiver and of the given TID from the EDCA queue.
Definition: qos-txop.cc:357
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 SetWifiPhy(const Ptr< WifiPhy > phy) override
Status code for association response.
Definition: status-code.h:32
void SetSuccess(void)
Set success bit to 0 (success).
Definition: status-code.cc:30
Hold variables of type string.
Definition: string.h:41
encapsulates test code
Definition: test.h:994
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
A suite of tests to run.
Definition: test.h:1188
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
AttributeValue implementation for Time.
Definition: nstime.h:1308
Ptr< WifiMacQueue > GetWifiMacQueue() const
Return the packet queue associated with this Txop.
Definition: txop.cc:154
Time GetTxopLimit(void) const
Return the TXOP limit.
Definition: txop.cc:280
Hold an unsigned integer type.
Definition: uinteger.h:44
helps to create WifiNetDevice objects
Definition: wifi-helper.h:323
Implements the IEEE 802.11 MAC header.
void SetNoRetry(void)
Un-set the Retry bit in the Frame Control field.
void SetNoMoreFragments(void)
Un-set the More Fragment bit in the Frame Control Field.
uint16_t GetSequenceNumber(void) const
Return the sequence number of the header.
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.
Mac48Address GetAddr1(void) const
Return the address in the Address 1 field.
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.
create MAC layers for a ns3::WifiNetDevice.
Ptr< FrameExchangeManager > GetFrameExchangeManager(void) const
Get the Frame Exchange Manager.
Definition: wifi-mac.cc:744
virtual void SetAddress(Mac48Address address)
Definition: wifi-mac.cc:396
virtual void ConfigureStandard(WifiStandard standard)
Definition: wifi-mac.cc:650
Ptr< QosTxop > GetBEQueue(void) const
Accessor for the AC_BE channel access function.
Definition: wifi-mac.cc:485
Ptr< WifiRemoteStationManager > GetWifiRemoteStationManager(void) const
Definition: wifi-mac.cc:757
Ptr< QosTxop > GetVIQueue(void) const
Accessor for the AC_VI channel access function.
Definition: wifi-mac.cc:479
void SetWifiRemoteStationManager(Ptr< WifiRemoteStationManager > stationManager)
Definition: wifi-mac.cc:750
Ptr< MacTxMiddle > m_txMiddle
TX middle (aggregation etc.)
Definition: wifi-mac.h:520
void SetDevice(const Ptr< WifiNetDevice > device)
Sets the device this PHY is associated with.
Definition: wifi-mac.cc:384
void SetMac(const Ptr< WifiMac > mac)
void SetHeConfiguration(Ptr< HeConfiguration > heConfiguration)
void SetHtConfiguration(Ptr< HtConfiguration > htConfiguration)
Ptr< WifiMac > GetMac(void) const
Address GetAddress(void) const override
void SetVhtConfiguration(Ptr< VhtConfiguration > vhtConfiguration)
Ptr< WifiPhy > GetPhy(void) const
void SetRemoteStationManager(const Ptr< WifiRemoteStationManager > manager)
uint32_t GetIfIndex(void) const override
void SetStandard(WifiStandard standard)
Set the Wifi standard.
void SetPhy(const Ptr< WifiPhy > phy)
virtual void ConfigureStandard(WifiStandard standard)
Configure the PHY-level parameters for different Wi-Fi standard.
Definition: wifi-phy.cc:818
void SetDevice(const Ptr< WifiNetDevice > device)
Sets the device this PHY is associated with.
Definition: wifi-phy.cc:526
uint32_t GetSize(void) const
Return the size of the PSDU in bytes.
Definition: wifi-psdu.cc:260
const WifiMacHeader & GetHeader(std::size_t i) const
Get the header of the i-th MPDU.
Definition: wifi-psdu.cc:266
std::size_t GetNMpdus(void) const
Return the number of MPDUs constituting the PSDU.
Definition: wifi-psdu.cc:319
hold a list of per-remote-station state.
WifiTxVector GetDataTxVector(const WifiMacHeader &header)
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...
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,...
void Clear(void)
Reset the TX parameters.
WifiTxVector m_txVector
TXVECTOR of the frame being prepared.
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.
@ ASSOCIATED
Definition: lr-wpan-mac.h:152
#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:240
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1260
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
WifiMacDropReason
The reason why an MPDU was dropped.
Definition: wifi-mac.h:66
@ 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:415
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
@ WIFI_MAC_QOSDATA
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648
staDevices
Definition: third.py:102
ssid
Definition: third.py:97
channel
Definition: third.py:92
mac
Definition: third.py:96
wifi
Definition: third.py:99
apDevices
Definition: third.py:105
wifiApNode
Definition: third.py:90
mobility
Definition: third.py:107
phy
Definition: third.py:93
static WifiAggregationTestSuite g_wifiAggregationTestSuite
the test suite
#define SU_STA_ID
Definition: wifi-mode.h:32