21 #include "ns3/string.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/interference-helper.h"
29 #include "ns3/mac-tx-middle.h"
30 #include "ns3/ht-frame-exchange-manager.h"
31 #include "ns3/msdu-aggregator.h"
32 #include "ns3/mpdu-aggregator.h"
33 #include "ns3/wifi-net-device.h"
34 #include "ns3/ht-configuration.h"
35 #include "ns3/vht-configuration.h"
36 #include "ns3/he-configuration.h"
37 #include "ns3/node-container.h"
38 #include "ns3/yans-wifi-helper.h"
39 #include "ns3/mobility-helper.h"
40 #include "ns3/pointer.h"
41 #include "ns3/packet-socket-server.h"
42 #include "ns3/packet-socket-client.h"
43 #include "ns3/packet-socket-helper.h"
44 #include "ns3/wifi-default-protection-manager.h"
45 #include "ns3/wifi-default-ack-manager.h"
71 void DoRun (
void)
override;
81 :
TestCase (
"Check the correctness of MPDU aggregation operations"),
98 m_device = CreateObject<WifiNetDevice> ();
105 m_phy = CreateObject<YansWifiPhy> ();
125 m_mac = CreateObjectWithAttributes<StaWifiMac> (
"QosSupported",
BooleanValue (
true));
132 protectionManager->SetWifiMac (
m_mac);
133 fem->SetProtectionManager (protectionManager);
135 ackManager->SetWifiMac (
m_mac);
136 fem->SetAckManager (ackManager);
154 Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
201 auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams,
Time::Min ());
231 mpduList = mpduAggregator->GetNextAmpdu (item, txParams,
Time::Min ());
236 htFem->DequeuePsdu (psdu);
242 for (uint32_t i = 0; i < psdu->
GetNMpdus (); i++)
254 pkt1 = Create<Packet> (1500);
255 pkt2 = Create<Packet> (1500);
283 mpduList = mpduAggregator->GetNextAmpdu (item, txParams,
Time::Min ());
285 NS_TEST_EXPECT_MSG_EQ (mpduList.empty (),
true,
"a single packet for this destination should not result in an A-MPDU");
287 htFem->DequeueMpdu (item);
294 mpduList = mpduAggregator->GetNextAmpdu (item, txParams,
Time::Min ());
296 NS_TEST_EXPECT_MSG_EQ (mpduList.empty (),
true,
"no MPDU aggregation should be performed if there is no agreement");
301 htFem->NormalAckTimeout (item, txParams.
m_txVector);
306 Simulator::Destroy ();
329 void DoRun (
void)
override;
338 :
TestCase (
"Check the correctness of two-level aggregation operations")
348 m_device = CreateObject<WifiNetDevice> ();
356 m_phy = CreateObject<YansWifiPhy> ();
376 m_mac = CreateObjectWithAttributes<StaWifiMac> (
"QosSupported",
BooleanValue (
true));
383 protectionManager->SetWifiMac (
m_mac);
384 fem->SetProtectionManager (protectionManager);
386 ackManager->SetWifiMac (
m_mac);
387 fem->SetAckManager (ackManager);
430 htFem->TryAddMpdu (peeked, txParams,
Time::Min ());
433 bool result = (item != 0);
438 htFem->DequeueMpdu (item);
441 "Unexpected number of MSDUs left in the EDCA queue");
452 htFem->TryAddMpdu (peeked, txParams,
Time::Min ());
453 item = msduAggregator->GetNextAmsdu (peeked, txParams,
Time::Min ());
457 htFem->DequeueMpdu (peeked);
496 for (uint8_t i = 0; i < 10; i++)
510 NS_TEST_EXPECT_MSG_EQ (std::distance (item->begin (), item->end ()), 2,
"There must be 2 MSDUs in the A-MSDU");
512 auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, txopLimit);
530 htFem->DequeuePsdu (psdu);
533 "Unexpected number of MSDUs left in the EDCA queue");
537 Simulator::Destroy ();
556 void DoRun (
void)
override;
571 :
TestCase (
"Check the correctness of 802.11ax aggregation operations")
581 m_device = CreateObject<WifiNetDevice> ();
592 m_phy = CreateObject<YansWifiPhy> ();
612 m_mac = CreateObjectWithAttributes<StaWifiMac> (
"QosSupported",
BooleanValue (
true));
619 protectionManager->SetWifiMac (
m_mac);
620 fem->SetProtectionManager (protectionManager);
622 ackManager->SetWifiMac (
m_mac);
623 fem->SetAckManager (ackManager);
642 uint16_t sequence =
m_mac->
m_txMiddle->PeekNextSequenceNumberFor (&hdr);
676 for (uint16_t i = 0; i < 300; i++)
694 auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams,
Time::Min ());
696 htFem->DequeuePsdu (psdu);
699 NS_TEST_EXPECT_MSG_EQ (mpduList.size (), bufferSize,
"A-MPDU should countain " << bufferSize <<
" MPDUs");
700 uint16_t expectedRemainingPacketsInQueue = 300 - bufferSize;
703 Simulator::Destroy ();
712 vhtConfiguration = 0;
748 void DoRun (
void)
override;
776 :
TestCase (
"Test case to check that the Wifi Mac forwards up the same packets received at sender side.")
794 true,
"No DL MU PPDU expected");
796 if (!psduMap[
SU_STA_ID]->GetHeader (0).IsQosData ())
805 std::size_t dist = std::distance (mpdu->begin (), mpdu->end ());
807 m_nMsdus.push_back (dist > 0 ? dist : 1);
834 wifi.SetRemoteStationManager (
"ns3::IdealWifiManager");
838 mac.SetType (
"ns3::StaWifiMac",
849 mac.SetType (
"ns3::ApWifiMac",
859 positionAlloc->Add (Vector (0.0, 0.0, 0.0));
860 positionAlloc->Add (Vector (1.0, 0.0, 0.0));
861 mobility.SetPositionAllocator (positionAlloc);
863 mobility.SetMobilityModel (
"ns3::ConstantPositionMobilityModel");
877 packetSocket.
Install (wifiStaNode);
884 client->SetRemote (socket);
886 client->SetStartTime (
Seconds (1));
887 client->SetStopTime (
Seconds (3.0));
888 Simulator::Schedule (
Seconds (1.5), &PacketSocketClient::SetAttribute, client,
892 server->SetLocal (socket);
894 server->SetStartTime (
Seconds (0.0));
895 server->SetStopTime (
Seconds (4.0));
897 sta_device->
GetMac ()->TraceConnectWithoutContext (
"MacTx",
901 ap_device->
GetMac ()->TraceConnectWithoutContext (
"MacRx",
907 Simulator::Destroy ();
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.
virtual ~PreservePacketsInAmpdus()
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.
PreservePacketsInAmpdus()
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.
TwoLevelAggregationTest()
Ptr< WifiNetDevice > m_device
WifiNetDevice.
Wifi Aggregation Test Suite.
WifiAggregationTestSuite()
AttributeValue implementation for Boolean.
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.
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.
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
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.
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.
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...
Ptr< BlockAckManager > GetBaManager(void)
Get the Block Ack Manager associated with this QosTxop.
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.
The IEEE 802.11 SSID Information Element.
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.
void SetSuccess(void)
Set success bit to 0 (success).
Hold variables of type string.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Simulation virtual time values and global simulation resolution.
AttributeValue implementation for Time.
Ptr< WifiMacQueue > GetWifiMacQueue() const
Return the packet queue associated with this Txop.
Time GetTxopLimit(void) const
Return the TXOP limit.
Hold an unsigned integer type.
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
Ptr< FrameExchangeManager > GetFrameExchangeManager(void) const
Get the Frame Exchange Manager.
virtual void SetAddress(Mac48Address address)
virtual void ConfigureStandard(WifiStandard standard)
Ptr< QosTxop > GetBEQueue(void) const
Accessor for the AC_BE channel access function.
Ptr< WifiRemoteStationManager > GetWifiRemoteStationManager(void) const
Ptr< QosTxop > GetVIQueue(void) const
Accessor for the AC_VI channel access function.
void SetWifiRemoteStationManager(Ptr< WifiRemoteStationManager > stationManager)
Ptr< MacTxMiddle > m_txMiddle
TX middle (aggregation etc.)
void SetDevice(const Ptr< WifiNetDevice > device)
Sets the device this PHY is associated with.
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.
void SetDevice(const Ptr< WifiNetDevice > device)
Sets the device this PHY is associated with.
uint32_t GetSize(void) const
Return the size of the PSDU in bytes.
const WifiMacHeader & GetHeader(std::size_t i) const
Get the header of the i-th MPDU.
std::size_t GetNMpdus(void) const
Return the number of MPDUs constituting the PSDU.
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.
void SetInterferenceHelper(const Ptr< InterferenceHelper > helper) override
Sets the interference helper.
#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 Seconds(double value)
Construct a Time in the indicated unit.
WifiMacDropReason
The reason why an MPDU was dropped.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
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...
U * PeekPointer(const Ptr< U > &p)
static WifiAggregationTestSuite g_wifiAggregationTestSuite
the test suite