A Discrete-Event Network Simulator
API
wifi-issue-211-test-suite.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020
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  * Authors: Stefano Avallone <stavallo@unina.it>
18  * Rémy Grünblatt <remy@grunblatt.org>
19  */
20 
21 #include "ns3/ap-wifi-mac.h"
22 #include "ns3/boolean.h"
23 #include "ns3/config.h"
24 #include "ns3/internet-stack-helper.h"
25 #include "ns3/ipv4-address-helper.h"
26 #include "ns3/mobility-helper.h"
27 #include "ns3/multi-model-spectrum-channel.h"
28 #include "ns3/packet.h"
29 #include "ns3/qos-utils.h"
30 #include "ns3/queue-size.h"
31 #include "ns3/rng-seed-manager.h"
32 #include "ns3/spectrum-wifi-helper.h"
33 #include "ns3/string.h"
34 #include "ns3/test.h"
35 #include "ns3/udp-client-server-helper.h"
36 #include "ns3/wifi-net-device.h"
37 
38 using namespace ns3;
39 
57 class Issue211Test : public TestCase
58 {
59  public:
63  Issue211Test();
64  ~Issue211Test() override;
65 
66  void DoRun() override;
67 
68  private:
73  void CalcThroughput(Ptr<UdpServer> server);
74 
75  std::vector<double> m_tputValues;
76  uint64_t m_lastRxBytes;
78  uint32_t m_payloadSize;
79 };
80 
82  : TestCase("Test case for resuming data transmission when the recipient moves back"),
83  m_lastRxBytes(0),
84  m_lastCheckPointTime(Seconds(0)),
85  m_payloadSize(2000)
86 {
87 }
88 
90 {
91 }
92 
93 void
95 {
96  uint64_t rxBytes = m_payloadSize * server->GetReceived();
97  double tput = (rxBytes - m_lastRxBytes) * 8. /
98  (Simulator::Now() - m_lastCheckPointTime).ToDouble(Time::US); // Mb/s
99  m_tputValues.push_back(tput);
100  m_lastRxBytes = rxBytes;
102 }
103 
104 void
106 {
107  Time simulationTime(Seconds(6.0));
108  Time moveAwayTime(Seconds(2.0));
109  Time moveBackTime(Seconds(4.0));
110 
111  RngSeedManager::SetSeed(1);
112  RngSeedManager::SetRun(40);
113  int64_t streamNumber = 100;
114 
116  wifiApNode.Create(1);
117 
118  NodeContainer wifiStaNode;
119  wifiStaNode.Create(1);
120 
121  Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
122  Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel>();
123  spectrumChannel->AddPropagationLossModel(lossModel);
125  CreateObject<ConstantSpeedPropagationDelayModel>();
126  spectrumChannel->SetPropagationDelayModel(delayModel);
127 
129  phy.SetChannel(spectrumChannel);
130 
132  wifi.SetStandard(WIFI_STANDARD_80211n);
133  wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
134  "DataMode",
135  StringValue("HtMcs0"),
136  "ControlMode",
137  StringValue("HtMcs0"));
138 
139  Config::SetDefault("ns3::WifiMacQueue::MaxSize", QueueSizeValue(QueueSize("50p")));
140 
142  mac.SetType("ns3::StaWifiMac", "Ssid", SsidValue(Ssid("issue211-test")));
143 
144  NetDeviceContainer staDevices = wifi.Install(phy, mac, wifiStaNode);
145 
146  mac.SetType("ns3::ApWifiMac",
147  "Ssid",
148  SsidValue(Ssid("issue211-test")),
149  "EnableBeaconJitter",
150  BooleanValue(false));
151 
153 
154  // Assign fixed streams to random variables in use
155  wifi.AssignStreams(apDevices, streamNumber);
156 
158  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
159 
160  positionAlloc->Add(Vector(0.0, 0.0, 0.0));
161  positionAlloc->Add(Vector(5.0, 0.0, 0.0));
162  mobility.SetPositionAllocator(positionAlloc);
163 
164  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
165  mobility.Install(wifiApNode);
166  mobility.Install(wifiStaNode);
167 
168  /* Internet stack*/
170  stack.Install(wifiApNode);
171  stack.Install(wifiStaNode);
172 
174  address.SetBase("192.168.1.0", "255.255.255.0");
175  Ipv4InterfaceContainer staNodeInterface;
176  Ipv4InterfaceContainer apNodeInterface;
177 
178  staNodeInterface = address.Assign(staDevices.Get(0));
179  apNodeInterface = address.Assign(apDevices.Get(0));
180 
181  ApplicationContainer serverApp;
182  Time warmup(Seconds(1.0)); // to account for association
183 
184  uint16_t port = 9;
185  UdpServerHelper server(port);
186  serverApp = server.Install(wifiStaNode.Get(0));
187  serverApp.Start(Seconds(0.0));
188  serverApp.Stop(warmup + simulationTime);
189 
190  UdpClientHelper client(staNodeInterface.GetAddress(0), port);
191  client.SetAttribute("MaxPackets", UintegerValue(4294967295U));
192  client.SetAttribute("Interval", TimeValue(MilliSeconds(1)));
193  client.SetAttribute("PacketSize", UintegerValue(m_payloadSize)); // 16 Mb/s
194  ApplicationContainer clientApp = client.Install(wifiApNode.Get(0));
195  clientApp.Start(warmup);
196  clientApp.Stop(warmup + simulationTime);
197 
198  Ptr<MobilityModel> staMobility = wifiStaNode.Get(0)->GetObject<MobilityModel>();
199 
200  // First check-point: station moves away
201  Simulator::Schedule(warmup + moveAwayTime,
202  &MobilityModel::SetPosition,
203  staMobility,
204  Vector(10000.0, 0.0, 0.0));
205  Simulator::Schedule(warmup + moveAwayTime + MilliSeconds(10),
207  this,
208  DynamicCast<UdpServer>(serverApp.Get(0)));
209 
210  // Second check-point: station moves back
211  Simulator::Schedule(warmup + moveBackTime,
212  &MobilityModel::SetPosition,
213  staMobility,
214  Vector(5.0, 0.0, 0.0));
215  Simulator::Schedule(warmup + moveBackTime,
217  this,
218  DynamicCast<UdpServer>(serverApp.Get(0)));
219 
220  // Last check-point: simulation finish time
221  Simulator::Schedule(warmup + simulationTime,
223  this,
224  DynamicCast<UdpServer>(serverApp.Get(0)));
225 
226  Simulator::Stop(warmup + simulationTime);
227  Simulator::Run();
228 
229  NS_TEST_EXPECT_MSG_EQ(m_tputValues.size(), 3, "Unexpected number of throughput values");
231  0,
232  "Throughput must be non null before station moves away");
233  NS_TEST_EXPECT_MSG_EQ(m_tputValues[1], 0, "Throughput must be null while the station is away");
235  0,
236  "Throughput must be non null when the station is back");
237 
238  // Print throughput values when the test is run through test-runner
239  for (const auto& t : m_tputValues)
240  {
241  std::cout << "Throughput = " << t << " Mb/s" << std::endl;
242  }
243 
244  Simulator::Destroy();
245 }
246 
254 {
255  public:
257 };
258 
260  : TestSuite("wifi-issue-211", UNIT)
261 {
262  AddTestCase(new Issue211Test, TestCase::QUICK);
263 }
264 
Test for issue 211 (https://gitlab.com/nsnam/ns-3-dev/-/issues/211)
std::vector< double > m_tputValues
throughput in sub-intervals
Time m_lastCheckPointTime
time of last check-point
Issue211Test()
Constructor.
uint32_t m_payloadSize
payload size in bytes
void DoRun() override
Implementation to actually run this TestCase.
uint64_t m_lastRxBytes
RX bytes at last check-point.
void CalcThroughput(Ptr< UdpServer > server)
Compute the average throughput since the last check-point.
Block Ack Test Suite.
holds a vector of ns3::Application pointers.
void Start(Time start) const
Start all of the Applications in this container at the start time given as a parameter.
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
void Stop(Time stop) const
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
Helper class used to assign positions and mobility models to nodes.
Keep track of the current position and velocity of an object.
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.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:471
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
Class for representing queue sizes.
Definition: queue-size.h:96
AttributeValue implementation for QueueSize.
Make it easy to create and manage PHY objects for the spectrum model.
The IEEE 802.11 SSID Information Element.
Definition: ssid.h:36
AttributeValue implementation for Ssid.
Hold variables of type string.
Definition: string.h:56
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:1423
Create a client application which sends UDP packets carrying a 32bit sequence number and a 64 bit tim...
void SetAttribute(std::string name, const AttributeValue &value)
Record an attribute to be set in each Application after it is is created.
ApplicationContainer Install(NodeContainer c)
Create a server application which waits for input UDP packets and uses the information carried into t...
ApplicationContainer Install(NodeContainer c)
Create one UDP server application on each of the Nodes in the NodeContainer.
Hold an unsigned integer type.
Definition: uinteger.h:45
helps to create WifiNetDevice objects
Definition: wifi-helper.h:325
create MAC layers for a ns3::WifiNetDevice.
uint16_t port
Definition: dsdv-manet.cc:45
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:891
Time Now()
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:296
#define NS_TEST_EXPECT_MSG_GT(actual, limit, msg)
Test that an actual value is greater than a limit and report if not.
Definition: test.h:956
#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 Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1336
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1348
@ WIFI_STANDARD_80211n
address
Definition: first.py:40
stack
Definition: first.py:37
Every class exported by the ns3 library is enclosed in the ns3 namespace.
staDevices
Definition: third.py:91
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 Issue211TestSuite g_issue211TestSuite
the test suite