wifi: Add tests to verify correct behavior of Ideal rate manager when channel bonding is used

This commit is contained in:
Sébastien Deronne
2020-05-02 19:12:52 +02:00
committed by Sebastien Deronne
parent ef52f7c584
commit ec6307544d

View File

@@ -2480,6 +2480,166 @@ Issue169TestCase::DoRun (void)
Simulator::Destroy ();
}
//-----------------------------------------------------------------------------
/**
* Make sure that Ideal rate manager properly selects MCS based on the configured channel width.
*
* The scenario considers an access point and a fixed station.
* The station first sends a 80 MHz PPDU to the access point,
* for which Ideal rate manager should select VH-MCS 0 based
* on the distance (no interference generatd in this test). Then,
* the station sends a 20 MHz PPDU to the access point,
* which corresponds to a SNR 6 dB higher than previously, hence
* VHT-MCS 2 should be selected. Finally, the station sends a 40 MHz
* PPDU to the access point, which means corresponds to a SNR 3 dB
* lower than previously, hence VHT-MCS 1 should be selected.
*/
class IdealRateManagerChannelWidthTest : public TestCase
{
public:
IdealRateManagerChannelWidthTest ();
virtual ~IdealRateManagerChannelWidthTest ();
virtual void DoRun (void);
private:
/**
* Change the configured channel width for all nodes
* \param channelWidth the channel width (in MHz)
*/
void ChangeChannelWidth (uint16_t channelWidth);
/**
* Triggers the transmission of a 1000 Byte-long data packet from the source device
* \param sourceDevice pointer to the source NetDevice
* \param destination address of the destination device
*/
void SendPacket (Ptr<NetDevice> sourceDevice, Address& destination);
/**
* Callback that indicates a PSDU is being transmitted
* \param context the context
* \param psdu the PSDU to transmit
* \param txVector the TX vector
* \param txPowerW the TX power (W)
*/
void TxCallback (std::string context, Ptr<const WifiPsdu> psdu, WifiTxVector txVector, double txPowerW);
/**
* Check if the selected WifiMode is correct
* \param expectedMode the expected WifiMode
*/
void CheckLastSelectedMode (WifiMode expectedMode);
WifiMode m_txMode; ///< Store the last selected mode to send data packet
};
IdealRateManagerChannelWidthTest::IdealRateManagerChannelWidthTest ()
: TestCase ("Test case for use of channel bonding with Ideal rate manager")
{
}
IdealRateManagerChannelWidthTest::~IdealRateManagerChannelWidthTest ()
{
}
void
IdealRateManagerChannelWidthTest::ChangeChannelWidth (uint16_t channelWidth)
{
Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (channelWidth));
}
void
IdealRateManagerChannelWidthTest::SendPacket (Ptr<NetDevice> sourceDevice, Address& destination)
{
Ptr<Packet> packet = Create<Packet> (1000);
sourceDevice->Send (packet, destination, 0);
}
void
IdealRateManagerChannelWidthTest::TxCallback (std::string context, Ptr<const WifiPsdu> psdu, WifiTxVector txVector, double txPowerW)
{
if (psdu->GetSize () >= 1000)
{
m_txMode = txVector.GetMode ();
}
}
void
IdealRateManagerChannelWidthTest::CheckLastSelectedMode (WifiMode expectedMode)
{
NS_TEST_ASSERT_MSG_EQ (m_txMode, expectedMode, "Last selected WifiMode " << m_txMode << " does not match expected WifiMode " << expectedMode);
}
void
IdealRateManagerChannelWidthTest::DoRun (void)
{
RngSeedManager::SetSeed (1);
RngSeedManager::SetRun (1);
int64_t streamNumber = 100;
NodeContainer wifiApNode, wifiStaNode;
wifiApNode.Create (1);
wifiStaNode.Create (1);
YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
phy.SetChannel (channel.Create ());
WifiHelper wifi;
wifi.SetStandard (WIFI_PHY_STANDARD_80211ac);
wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
WifiMacHelper mac;
NetDeviceContainer apDevice;
mac.SetType ("ns3::ApWifiMac");
apDevice = wifi.Install (phy, mac, wifiApNode);
NetDeviceContainer staDevice;
mac.SetType ("ns3::StaWifiMac");
staDevice = wifi.Install (phy, mac, wifiStaNode);
// Assign fixed streams to random variables in use
wifi.AssignStreams (apDevice, streamNumber);
wifi.AssignStreams (staDevice, streamNumber);
MobilityHelper mobility;
Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
positionAlloc->Add (Vector (0.0, 0.0, 0.0));
positionAlloc->Add (Vector (50.0, 0.0, 0.0));
mobility.SetPositionAllocator (positionAlloc);
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
mobility.Install (wifiApNode);
mobility.Install (wifiStaNode);
Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyTxPsduBegin", MakeCallback (&IdealRateManagerChannelWidthTest::TxCallback, this));
//Set channel width to 80 MHz & send packet
Simulator::Schedule (Seconds (0.5), &IdealRateManagerChannelWidthTest::ChangeChannelWidth, this, 80);
Simulator::Schedule (Seconds (1.0), &IdealRateManagerChannelWidthTest::SendPacket, this, apDevice.Get (0), staDevice.Get (0)->GetAddress ());
//Selected rate should be VHT-MCS 0
Simulator::Schedule (Seconds (1.1), &IdealRateManagerChannelWidthTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs0 ());
//Set channel width to 20 MHz & send packet
Simulator::Schedule (Seconds (1.5), &IdealRateManagerChannelWidthTest::ChangeChannelWidth, this, 20);
Simulator::Schedule (Seconds (2.0), &IdealRateManagerChannelWidthTest::SendPacket, this, apDevice.Get (0), staDevice.Get (0)->GetAddress ());
//Selected rate should be VHT-MCS 2 since SNR should be 6 dB higher than previously
Simulator::Schedule (Seconds (2.1), &IdealRateManagerChannelWidthTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs2 ());
//Set channel width to 40 MHz & send packet
Simulator::Schedule (Seconds (2.5), &IdealRateManagerChannelWidthTest::ChangeChannelWidth, this, 40);
Simulator::Schedule (Seconds (3.0), &IdealRateManagerChannelWidthTest::SendPacket, this, apDevice.Get (0), staDevice.Get (0)->GetAddress ());
//Selected rate should be VHT-MCS 1 since SNR should be 3 dB lower than previously
Simulator::Schedule (Seconds (3.1), &IdealRateManagerChannelWidthTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs1 ());
Simulator::Stop (Seconds (3.2));
Simulator::Run ();
Simulator::Destroy ();
}
/**
* \ingroup wifi-test
* \ingroup tests
@@ -2509,6 +2669,7 @@ WifiTestSuite::WifiTestSuite ()
AddTestCase (new Bug2470TestCase, TestCase::QUICK); //Bug 2470
AddTestCase (new Issue40TestCase, TestCase::QUICK); //Issue #40
AddTestCase (new Issue169TestCase, TestCase::QUICK); //Issue #169
AddTestCase (new IdealRateManagerChannelWidthTest, TestCase::QUICK);
}
static WifiTestSuite g_wifiTestSuite; ///< the test suite