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/udp-server.h"
37 #include "ns3/wifi-net-device.h"
38 
39 using namespace ns3;
40 
58 class Issue211Test : public TestCase
59 {
60  public:
64  Issue211Test();
65  ~Issue211Test() override;
66 
67  void DoRun() override;
68 
69  private:
74  void CalcThroughput(Ptr<UdpServer> server);
75 
76  std::vector<double> m_tputValues;
77  uint64_t m_lastRxBytes;
79  uint32_t m_payloadSize;
80 };
81 
83  : TestCase("Test case for resuming data transmission when the recipient moves back"),
84  m_lastRxBytes(0),
85  m_lastCheckPointTime(Seconds(0)),
86  m_payloadSize(2000)
87 {
88 }
89 
91 {
92 }
93 
94 void
96 {
97  uint64_t rxBytes = m_payloadSize * server->GetReceived();
98  double tput = (rxBytes - m_lastRxBytes) * 8. /
99  (Simulator::Now() - m_lastCheckPointTime).ToDouble(Time::US); // Mb/s
100  m_tputValues.push_back(tput);
101  m_lastRxBytes = rxBytes;
103 }
104 
105 void
107 {
108  Time simulationTime(Seconds(6.0));
109  Time moveAwayTime(Seconds(2.0));
110  Time moveBackTime(Seconds(4.0));
111 
112  RngSeedManager::SetSeed(1);
113  RngSeedManager::SetRun(40);
114  int64_t streamNumber = 100;
115 
117  wifiApNode.Create(1);
118 
119  NodeContainer wifiStaNode;
120  wifiStaNode.Create(1);
121 
122  Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
123  Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel>();
124  spectrumChannel->AddPropagationLossModel(lossModel);
126  CreateObject<ConstantSpeedPropagationDelayModel>();
127  spectrumChannel->SetPropagationDelayModel(delayModel);
128 
130  phy.SetChannel(spectrumChannel);
131 
133  wifi.SetStandard(WIFI_STANDARD_80211n);
134  wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
135  "DataMode",
136  StringValue("HtMcs0"),
137  "ControlMode",
138  StringValue("HtMcs0"));
139 
140  Config::SetDefault("ns3::WifiMacQueue::MaxSize", QueueSizeValue(QueueSize("50p")));
141 
143  mac.SetType("ns3::StaWifiMac", "Ssid", SsidValue(Ssid("issue211-test")));
144 
145  NetDeviceContainer staDevices = wifi.Install(phy, mac, wifiStaNode);
146 
147  mac.SetType("ns3::ApWifiMac",
148  "Ssid",
149  SsidValue(Ssid("issue211-test")),
150  "EnableBeaconJitter",
151  BooleanValue(false));
152 
154 
155  // Assign fixed streams to random variables in use
156  wifi.AssignStreams(apDevices, streamNumber);
157 
159  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
160 
161  positionAlloc->Add(Vector(0.0, 0.0, 0.0));
162  positionAlloc->Add(Vector(5.0, 0.0, 0.0));
163  mobility.SetPositionAllocator(positionAlloc);
164 
165  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
166  mobility.Install(wifiApNode);
167  mobility.Install(wifiStaNode);
168 
169  /* Internet stack*/
171  stack.Install(wifiApNode);
172  stack.Install(wifiStaNode);
173 
175  address.SetBase("192.168.1.0", "255.255.255.0");
176  Ipv4InterfaceContainer staNodeInterface;
177  Ipv4InterfaceContainer apNodeInterface;
178 
179  staNodeInterface = address.Assign(staDevices.Get(0));
180  apNodeInterface = address.Assign(apDevices.Get(0));
181 
182  ApplicationContainer serverApp;
183  Time warmup(Seconds(1.0)); // to account for association
184 
185  uint16_t port = 9;
187  serverApp = server.Install(wifiStaNode.Get(0));
188  serverApp.Start(Seconds(0.0));
189  serverApp.Stop(warmup + simulationTime);
190 
191  UdpClientHelper client(staNodeInterface.GetAddress(0), port);
192  client.SetAttribute("MaxPackets", UintegerValue(4294967295U));
193  client.SetAttribute("Interval", TimeValue(MilliSeconds(1)));
194  client.SetAttribute("PacketSize", UintegerValue(m_payloadSize)); // 16 Mb/s
195  ApplicationContainer clientApp = client.Install(wifiApNode.Get(0));
196  clientApp.Start(warmup);
197  clientApp.Stop(warmup + simulationTime);
198 
199  Ptr<MobilityModel> staMobility = wifiStaNode.Get(0)->GetObject<MobilityModel>();
200 
201  // First check-point: station moves away
202  Simulator::Schedule(warmup + moveAwayTime,
203  &MobilityModel::SetPosition,
204  staMobility,
205  Vector(10000.0, 0.0, 0.0));
206  Simulator::Schedule(warmup + moveAwayTime + MilliSeconds(10),
208  this,
209  DynamicCast<UdpServer>(serverApp.Get(0)));
210 
211  // Second check-point: station moves back
212  Simulator::Schedule(warmup + moveBackTime,
213  &MobilityModel::SetPosition,
214  staMobility,
215  Vector(5.0, 0.0, 0.0));
216  Simulator::Schedule(warmup + moveBackTime,
218  this,
219  DynamicCast<UdpServer>(serverApp.Get(0)));
220 
221  // Last check-point: simulation finish time
222  Simulator::Schedule(warmup + simulationTime,
224  this,
225  DynamicCast<UdpServer>(serverApp.Get(0)));
226 
227  Simulator::Stop(warmup + simulationTime);
228  Simulator::Run();
229 
230  NS_TEST_EXPECT_MSG_EQ(m_tputValues.size(), 3, "Unexpected number of throughput values");
232  0,
233  "Throughput must be non null before station moves away");
234  NS_TEST_EXPECT_MSG_EQ(m_tputValues[1], 0, "Throughput must be null while the station is away");
236  0,
237  "Throughput must be non null when the station is back");
238 
239  // Print throughput values when the test is run through test-runner
240  for (const auto& t : m_tputValues)
241  {
242  std::cout << "Throughput = " << t << " Mb/s" << std::endl;
243  }
244 
245  Simulator::Destroy();
246 }
247 
255 {
256  public:
258 };
259 
261  : TestSuite("wifi-issue-211", UNIT)
262 {
263  AddTestCase(new Issue211Test, TestCase::QUICK);
264 }
265 
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.
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:77
Class for representing queue sizes.
Definition: queue-size.h:96
Make it easy to create and manage PHY objects for the spectrum model.
The IEEE 802.11 SSID Information Element.
Definition: ssid.h:36
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:301
A suite of tests to run.
Definition: test.h:1256
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
Create a client application which sends UDP packets carrying a 32bit sequence number and a 64 bit tim...
Create a server application which waits for input UDP packets and uses the information carried into t...
Hold an unsigned integer type.
Definition: uinteger.h:45
helps to create WifiNetDevice objects
Definition: wifi-helper.h:324
create MAC layers for a ns3::WifiNetDevice.
uint16_t port
Definition: dsdv-manet.cc:44
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:890
Time Now()
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:305
#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:1326
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1338
@ WIFI_STANDARD_80211n
address
Definition: first.py:47
stack
Definition: first.py:44
Every class exported by the ns3 library is enclosed in the ns3 namespace.
staDevices
Definition: third.py:100
mac
Definition: third.py:92
wifi
Definition: third.py:95
apDevices
Definition: third.py:103
wifiApNode
Definition: third.py:86
mobility
Definition: third.py:105
phy
Definition: third.py:89
static Issue211TestSuite g_issue211TestSuite
the test suite