9#include "ns3/attribute-container.h"
10#include "ns3/config.h"
11#include "ns3/eht-configuration.h"
12#include "ns3/fcfs-wifi-queue-scheduler.h"
13#include "ns3/he-configuration.h"
14#include "ns3/ht-configuration.h"
15#include "ns3/ht-frame-exchange-manager.h"
16#include "ns3/interference-helper.h"
17#include "ns3/mac-tx-middle.h"
18#include "ns3/mgt-action-headers.h"
19#include "ns3/mobility-helper.h"
20#include "ns3/mpdu-aggregator.h"
21#include "ns3/msdu-aggregator.h"
22#include "ns3/multi-link-element.h"
23#include "ns3/node-container.h"
24#include "ns3/packet-socket-client.h"
25#include "ns3/packet-socket-helper.h"
26#include "ns3/packet-socket-server.h"
27#include "ns3/pointer.h"
28#include "ns3/simulator.h"
29#include "ns3/sta-wifi-mac.h"
30#include "ns3/string.h"
32#include "ns3/vht-configuration.h"
33#include "ns3/wifi-default-ack-manager.h"
34#include "ns3/wifi-default-protection-manager.h"
35#include "ns3/wifi-mac-queue.h"
36#include "ns3/wifi-net-device.h"
37#include "ns3/wifi-psdu.h"
38#include "ns3/yans-wifi-helper.h"
39#include "ns3/yans-wifi-phy.h"
141 void DoRun()
override;
154 .dataMode =
"HtMcs7",
157 .maxAmpduSize = 65535,
184 m_device->SetHtConfiguration(htConfiguration);
188 m_device->SetVhtConfiguration(vhtConfiguration);
190 m_device->SetHeConfiguration(heConfiguration);
195 m_device->SetEhtConfiguration(ehtConfiguration);
201 for (uint8_t i = 0; i <
m_params.nLinks; i++)
205 m_phys.back()->SetInterferenceHelper(interferenceHelper);
215 m_factory.SetTypeId(
"ns3::ConstantRateWifiManager");
217 for (uint8_t i = 0; i <
m_params.nLinks; i++)
240 for (uint8_t i = 0; i <
m_params.nLinks; i++)
247 std::vector<Ptr<ChannelAccessManager>> caManagers;
248 caManagers.reserve(
m_params.nLinks);
249 for (uint8_t i = 0; i <
m_params.nLinks; i++)
253 m_mac->SetChannelAccessManagers(caManagers);
256 std::vector<Ptr<FrameExchangeManager>> feManagers;
257 for (uint8_t i = 0; i <
m_params.nLinks; i++)
260 feManagers.emplace_back(fem);
262 protectionManager->SetWifiMac(
m_mac);
263 fem->SetProtectionManager(protectionManager);
265 ackManager->SetWifiMac(
m_mac);
266 fem->SetAckManager(ackManager);
269 fem->SetAddress(
m_mac->GetAddress());
271 m_mac->SetFrameExchangeManagers(feManagers);
276 for (
const auto& [
id, link] :
m_mac->GetLinks())
296 auto mleCommonInfo2 = std::make_shared<CommonInfoBasicMle>();
297 mleCommonInfo2->m_mldMacAddress =
Mac48Address(
"00:00:00:00:00:02");
298 for (uint8_t i = 0; i <
m_params.nLinks; i++)
303 m_managers.at(i)->AddStationMleCommonInfo(mleCommonInfo2->m_mldMacAddress,
307 auto mleCommonInfo3 = std::make_shared<CommonInfoBasicMle>();
308 mleCommonInfo3->m_mldMacAddress =
Mac48Address(
"00:00:00:00:00:03");
309 for (uint8_t i = 0; i <
m_params.nLinks; i++)
311 m_managers.at(i)->AddStationMleCommonInfo(mleCommonInfo3->m_mldMacAddress,
316 for (uint8_t i = 0; i <
m_params.nLinks; i++)
360 return m_mac->GetBEQueue();
366 std::list<Ptr<const WifiMpdu>> mpdus(mpduList.cbegin(), mpduList.cend());
367 m_mac->GetTxopQueue(
AC_BE)->DequeueIfQueued(mpdus);
379 GetBeQueue()->GetBaManager()->CreateOriginatorAgreement(reqHdr, recipient);
390 GetBeQueue()->GetBaManager()->UpdateOriginatorAgreement(respHdr, recipient, 0);
396 for (std::size_t i = 0; i < count; i++)
413 const auto expectedMaxPsduLength =
maxPsduLengths.at(phy->GetStandard());
414 const auto mc = phy->GetMaxModulationClassSupported();
417 expectedMaxPsduLength,
418 "Unexpected aPSDUMaxLength");
420 const auto maxAmpduSize = std::min(
m_params.maxAmpduSize, expectedMaxPsduLength);
421 const auto recipient =
Mac48Address(
"00:00:00:00:00:02");
423 auto isWithinAmpduSizeLimit = fem->IsWithinAmpduSizeLimit(maxAmpduSize, recipient, 0, mc);
426 "A-MPDU size limit check failed when the size is smaller than the limit");
428 isWithinAmpduSizeLimit = fem->IsWithinAmpduSizeLimit(maxAmpduSize + 1, recipient, 0, mc);
431 "A-MPDU size limit check failed when the size is larger than the limit");
443 auto mpduAggregator = htFem->GetMpduAggregator();
455 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
456 phy->GetChannelWidth());
459 auto mpduList = mpduAggregator->GetNextAmpdu(item, txParams,
Time::Min());
464 m_mac->m_txMiddle->SetSequenceNumberFor(&item->GetHeader());
465 item->UnassignSeqNo();
475 mpduList = mpduAggregator->GetNextAmpdu(item, txParams,
Time::Min());
486 "queue should be empty");
488 for (
uint32_t i = 0; i < psdu->GetNMpdus(); i++)
506 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
507 phy->GetChannelWidth());
510 mpduList = mpduAggregator->GetNextAmpdu(item, txParams,
Time::Min());
514 "a single packet for this destination should not result in an A-MPDU");
521 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
522 phy->GetChannelWidth());
525 mpduList = mpduAggregator->GetNextAmpdu(item, txParams,
Time::Min());
529 "no MPDU aggregation should be performed if there is no agreement");
531 m_mac->SetFrameRetryLimit(1);
532 m_mac->TraceConnectWithoutContext(
"DroppedMpdu",
535 htFem->NormalAckTimeout(item, txParams.
m_txVector);
568 void DoRun()
override;
575 .dataMode =
"HtMcs2",
577 .maxAmsduSize = 3050,
578 .maxAmpduSize = 65535,
602 auto msduAggregator = htFem->GetMsduAggregator();
603 auto mpduAggregator = htFem->GetMpduAggregator();
610 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
611 phy->GetChannelWidth());
612 htFem->TryAddMpdu(peeked, txParams,
Time::Min());
613 auto item = msduAggregator->GetNextAmsdu(peeked, txParams,
Time::Min());
624 "Unexpected number of MSDUs left in the EDCA queue");
635 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
636 phy->GetChannelWidth());
637 htFem->TryAddMpdu(peeked, txParams,
Time::Min());
638 item = msduAggregator->GetNextAmsdu(peeked, txParams,
Time::Min());
646 "queue should be empty");
661 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
662 phy->GetChannelWidth());
670 "There must be 2 MSDUs in the A-MSDU");
672 auto mpduList = mpduAggregator->GetNextAmpdu(item, txParams,
m_params.txopLimit);
689 "Expecting the first MPDU to contain an A-MSDU");
693 "Expecting the second MPDU to contain an A-MSDU");
697 "Expecting the third MPDU not to contain an A-MSDU");
705 "Unexpected number of items left in the EDCA queue");
711 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
712 phy->GetChannelWidth());
720 "There must be 2 MSDUs in the A-MSDU");
722 auto mpduList2 = mpduAggregator->GetNextAmpdu(item, txParams,
m_params.txopLimit);
728 "Unexpected number of items left in the EDCA queue");
731 mpduList.at(0)->UnassignSeqNo();
732 mpduList.at(1)->UnassignSeqNo();
733 mpduList.at(2)->UnassignSeqNo();
734 mpduList2.at(0)->UnassignSeqNo();
735 mpduList2.at(1)->UnassignSeqNo();
736 mpduList2.at(2)->UnassignSeqNo();
745 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
746 phy->GetChannelWidth());
748 htFem->TryAddMpdu(peeked, txParams,
Time::Min());
749 item = msduAggregator->GetNextAmsdu(peeked, txParams,
Time::Min());
759 "Unexpected number of items left in the EDCA queue");
764 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
765 phy->GetChannelWidth());
769 "Expecting the peeked MPDU not to contain an A-MSDU");
776 "Expecting the returned MPDU not to contain an A-MSDU");
797 void DoRun()
override;
802 "Check the correctness of 802.11ax aggregation operations, buffer size=" +
803 std::to_string(bufferSize),
806 .dataMode =
"HeMcs11",
807 .bufferSize = bufferSize,
809 .maxAmpduSize = 6500631,
820 const std::size_t numPackets = 300;
826 auto mpduAggregator = htFem->GetMpduAggregator();
833 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
834 phy->GetChannelWidth());
837 auto mpduList = mpduAggregator->GetNextAmpdu(item, txParams,
Time::Min());
843 "A-MPDU contains an unexpected number of MPDUs");
844 uint16_t expectedRemainingPacketsInQueue = numPackets -
m_params.bufferSize;
846 expectedRemainingPacketsInQueue,
847 "Queue contains an unexpected number of MPDUs");
869 void DoRun()
override;
874 "Check the correctness of 802.11be aggregation operations, buffer size=" +
875 std::to_string(bufferSize) +
", max A-MPDU size=" +
std::to_string(maxAmpduSize),
878 .dataMode =
"EhtMcs13",
879 .bufferSize = bufferSize,
881 .maxAmpduSize = maxAmpduSize,
897 const std::size_t numPackets = 1200;
899 const auto maxNMpdus = std::min<std::size_t>(
m_params.maxAmpduSize / 136,
m_params.bufferSize);
901 for (uint8_t linkId = 0; linkId <
m_params.nLinks; linkId++)
903 auto phy =
m_phys.at(linkId);
904 auto fem =
m_mac->GetFrameExchangeManager(linkId);
906 auto mpduAggregator = htFem->GetMpduAggregator();
907 std::vector<Ptr<WifiMpdu>> mpduList;
911 auto peeked =
GetBeQueue()->PeekNextMpdu(linkId);
916 m_mac->GetWifiRemoteStationManager()->GetDataTxVector(peeked->GetHeader(),
917 phy->GetChannelWidth());
920 mpduList = mpduAggregator->GetNextAmpdu(item, txParams,
Time::Min());
924 uint16_t expectedRemainingPacketsInQueue;
926 if (
m_params.bufferSize > maxNMpdus)
937 "A-MPDU contains an unexpected number of MPDUs");
938 expectedRemainingPacketsInQueue = numPackets - maxNMpdus;
940 expectedRemainingPacketsInQueue,
941 "Queue contains an unexpected number of MPDUs");
948 "A-MPDU contains an unexpected number of MPDUs");
949 expectedRemainingPacketsInQueue = numPackets -
m_params.bufferSize;
951 expectedRemainingPacketsInQueue,
952 "Queue contains an unexpected number of MPDUs");
968 "A-MPDU contains an unexpected number of MPDUs");
969 expectedRemainingPacketsInQueue = numPackets -
m_params.bufferSize;
971 expectedRemainingPacketsInQueue,
972 "Queue contains an unexpected number of MPDUs");
977 expectedRemainingPacketsInQueue = numPackets -
m_params.bufferSize;
979 expectedRemainingPacketsInQueue,
980 "Queue contains an unexpected number of MPDUs");
1022 void DoRun()
override;
1029 std::vector<Ptr<WifiMpdu>>::const_iterator
1065 :
TestCase(
"Test case to check that the Wifi Mac forwards up the same packets received at "
1088 "No DL MU PPDU expected");
1097 "Missing MAC header notification: m_txPsdu was not reset");
1103 if (!psduMap[
SU_STA_ID]->GetHeader(0).IsQosData())
1112 std::size_t dist = std::distance(mpdu->begin(), mpdu->end());
1114 m_nMsdus.push_back(dist > 0 ? dist : 1);
1126 "Notified of MAC header RX end while no PSDU is being transmitted");
1129 auto expectedHdr = (*m_expectedMpdu)->GetHeader();
1131 auto macHdr = mac->GetFrameExchangeManager()->GetReceivedMacHdr();
1134 "Expected the FEM to store the MAC header being received");
1136 expectedHdr.GetSequenceNumber(),
1137 "Wrong sequence number in the MAC header stored by the FEM");
1140 if (expectedHdr.IsQosData())
1150 auto macHeader = mac->GetFrameExchangeManager()->GetReceivedMacHdr();
1153 "Expected the FEM to store no MAC header");
1175 wifiApNode.Create(1);
1179 phy.SetChannel(channel.Create());
1183 wifi.SetRemoteStationManager(
"ns3::IdealWifiManager");
1187 mac.SetType(
"ns3::StaWifiMac",
1195 "BE_BlockAckThreshold",
1201 staDevices = wifi.Install(phy, mac, wifiStaNode);
1206 apDevices = wifi.Install(phy, mac, wifiApNode);
1211 positionAlloc->Add(Vector(0.0, 0.0, 0.0));
1212 positionAlloc->Add(Vector(1.0, 0.0, 0.0));
1213 mobility.SetPositionAllocator(positionAlloc);
1215 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
1216 mobility.Install(wifiApNode);
1217 mobility.Install(wifiStaNode);
1229 packetSocket.
Install(wifiStaNode);
1230 packetSocket.
Install(wifiApNode);
1236 client->SetRemote(socket);
1238 client->SetStartTime(
Seconds(1));
1239 client->SetStopTime(
Seconds(3));
1247 server->SetLocal(socket);
1248 wifiApNode.Get(0)->AddApplication(server);
1249 server->SetStartTime(
Seconds(0));
1250 server->SetStopTime(
Seconds(4));
1252 sta_device->GetMac()->TraceConnectWithoutContext(
1255 sta_device->GetPhy()->TraceConnectWithoutContext(
1258 ap_device->GetPhy()->TraceConnectWithoutContext(
1259 "PhyRxMacHeaderEnd",
1261 .Bind(ap_device->GetMac()));
1262 ap_device->GetMac()->TraceConnectWithoutContext(
1285 "Unexpected number of MAC headers notified to the FEM");
bool m_discarded
whether the packet should be discarded
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
Ptr< QosTxop > GetBeQueue() const
void DoSetup() override
Implementation to do any local setup required for this TestCase.
ObjectFactory m_factory
factory
Params m_params
test parameters
void CheckMaxPsduSize(Ptr< WifiPhy > phy, Ptr< HtFrameExchangeManager > fem)
Check the maximum PSDU size.
void EnqueuePkts(std::size_t count, uint32_t size, const Mac48Address &dest)
Enqueue the given number of packets addressed to the given station and of the given size.
std::vector< Ptr< WifiRemoteStationManager > > m_managers
remote station managers
void DoRun() override
Implementation to actually run this TestCase.
Ptr< WifiNetDevice > m_device
WifiNetDevice.
void DequeueMpdus(const std::vector< Ptr< WifiMpdu > > &mpduList)
Dequeue a PSDU.
void EstablishAgreement(const Mac48Address &recipient)
Establish a BlockAck agreement.
void MpduDiscarded(WifiMacDropReason reason, Ptr< const WifiMpdu > mpdu)
Fired when the MAC discards an MPDU.
std::vector< Ptr< WifiPhy > > m_phys
Phys.
Ptr< StaWifiMac > m_mac
Mac.
802.11be aggregation test which permits up to 1024 MPDUs in A-MPDU according to the negotiated buffer...
void DoRun() override
Implementation to actually run this TestCase.
EhtAggregationTest(uint16_t bufferSize, uint32_t maxAmpduSize)
Constructor.
802.11ax aggregation test which permits 64 or 256 MPDUs in A-MPDU according to the negotiated buffer ...
HeAggregationTest(uint16_t bufferSize)
Constructor.
void DoRun() override
Implementation to actually run this TestCase.
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.
void NotifyMacHeaderEndRx(Ptr< WifiMac > mac, const WifiMacHeader &macHdr, const WifiTxVector &txVector, Time psduDuration)
Callback invoked when the reception of the MAC header of an MPDU is completed.
std::list< Ptr< const Packet > > m_packetList
List of packets passed to the MAC.
~PreservePacketsInAmpdus() override
PreservePacketsInAmpdus(bool notifyMacHdrRxEnd)
Constructor.
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.
std::vector< Ptr< WifiMpdu > >::const_iterator m_expectedMpdu
next MPDU expected to be received
std::size_t m_nMacHdrs
Number of notified MAC headers in QoS data frames.
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.
bool m_notifyMacHdrRxEnd
whether notification of MAC header reception end is enabled
Ptr< const WifiPsdu > m_txPsdu
PSDU being transmitted.
Two Level Aggregation Test.
void DoRun() override
Implementation to actually run this TestCase.
TwoLevelAggregationTest()
Wifi Aggregation Test Suite.
WifiAggregationTestSuite()
A container for one type of attribute.
AttributeValue implementation for Boolean.
The IEEE 802.11be EHT Capabilities.
void SetMaxMpduLength(uint16_t length)
Set the maximum MPDU length.
void SetMaxAmpduLength(uint32_t maxAmpduLength)
Set the maximum A-MPDU length.
FrameExchangeManager is a base class handling the basic frame exchange sequences for non-QoS stations...
The IEEE 802.11ax HE Capabilities.
void SetMaxAmpduLength(uint32_t maxAmpduLength)
Set the maximum AMPDU length.
void SetChannelWidthSet(uint8_t channelWidthSet)
Set channel width set.
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.
static Mac48Address GetBroadcast()
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.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Instantiate subclasses of ns3::Object.
Ptr< Object > Create() 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.
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.
AttributeValue implementation for Pointer.
Smart pointer class similar to boost::intrusive_ptr.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static void Run()
Run the simulation.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
The IEEE 802.11 SSID Information Element.
AttributeValue implementation for Ssid.
Status code for association response.
void SetSuccess()
Set success bit to 0 (success).
Hold variables of type string.
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
TestCase(const TestCase &)=delete
TestSuite(std::string name, Type type=Type::UNIT)
Construct a new test suite.
Simulation virtual time values and global simulation resolution.
static Time Min()
Minimum representable Time Not to be confused with Min(Time,Time).
AttributeValue implementation for Time.
Hold an unsigned integer type.
The IEEE 802.11ac VHT Capabilities.
void SetMaxMpduLength(uint16_t length)
Set the maximum MPDU length.
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
hold a list of per-remote-station state.
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.
static YansWifiChannelHelper Default()
Create a channel helper in a default working state.
Make it easy to create and manage PHY objects for the YANS model.
void SetDefault(std::string name, const AttributeValue &value)
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Ptr< T > CreateObjectWithAttributes(Args... args)
Allocate an Object on the heap and initialize with a set of attributes.
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
#define NS_TEST_EXPECT_MSG_NE(actual, limit, msg)
Test that an actual and expected (limit) value are not equal and report if not.
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
WifiStandard
Identifies the IEEE 802.11 specifications that a Wifi device can be configured to use.
WifiMacDropReason
The reason why an MPDU was dropped.
const std::map< WifiStandard, uint32_t > maxPsduLengths
Map standard to aPSDUMaxLength.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
U * PeekPointer(const Ptr< U > &p)
static constexpr uint32_t WIFI_PSDU_MAX_LENGTH_HE
The value for aPSDUMaxLength in Table 27-54 (HE PHY characteristics) of 802.11ax-2021.
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...
static constexpr uint32_t WIFI_PSDU_MAX_LENGTH_HT
The value for aPSDUMaxLength in Table 19-25 (HT PHY characteristics) of 802.11-2020.
std::string GetFrameExchangeManagerTypeIdName(WifiStandard standard, bool qosSupported)
Get the TypeId name for the FrameExchangeManager corresponding to the given standard.
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
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...
static constexpr uint32_t WIFI_PSDU_MAX_LENGTH_VHT
The value for aPSDUMaxLength in Table 21-28 (VHT PHY characteristics) of 802.11-2020.
static constexpr uint32_t WIFI_PSDU_MAX_LENGTH_EHT
The value for aPSDUMaxLength in Table 36-70 (EHT PHY characteristics) of 802.11be D7....
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
static constexpr uint16_t SU_STA_ID
STA_ID to identify a single user (SU).
uint8_t nLinks
number of links (>1 only for EHT)
uint32_t maxAmpduSize
maximum A-MPDU size (bytes)
uint16_t bufferSize
the size (in number of MPDUs) of the BlockAck buffer
WifiStandard standard
the standard of the device
uint16_t maxAmsduSize
maximum A-MSDU size (bytes)
std::string dataMode
data mode
Time txopLimit
TXOP limit duration.
Structure holding information specific to a single link.
std::optional< Mac48Address > bssid
BSSID of the AP to associate with over this link.
static WifiAggregationTestSuite g_wifiAggregationTestSuite
the test suite