A Discrete-Event Network Simulator
API
wifi-issue-211-test-suite.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2020
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Authors: Stefano Avallone <stavallo@unina.it>
19  * Rémy Grünblatt <remy@grunblatt.org>
20  */
21 
22 #include "ns3/test.h"
23 #include "ns3/string.h"
24 #include "ns3/qos-utils.h"
25 #include "ns3/packet.h"
26 #include "ns3/wifi-net-device.h"
27 #include "ns3/ap-wifi-mac.h"
28 #include "ns3/mobility-helper.h"
29 #include "ns3/spectrum-wifi-helper.h"
30 #include "ns3/multi-model-spectrum-channel.h"
31 #include "ns3/udp-client-server-helper.h"
32 #include "ns3/internet-stack-helper.h"
33 #include "ns3/ipv4-address-helper.h"
34 #include "ns3/rng-seed-manager.h"
35 #include "ns3/config.h"
36 #include "ns3/queue-size.h"
37 
38 using namespace ns3;
39 
40 
58 class Issue211Test : public TestCase
59 {
60 public:
64  Issue211Test ();
65  virtual ~Issue211Test ();
66 
67  virtual void DoRun (void);
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. / (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);
124  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
125  spectrumChannel->SetPropagationDelayModel (delayModel);
126 
127  SpectrumWifiPhyHelper phy = SpectrumWifiPhyHelper::Default ();
128  phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
129  phy.SetChannel (spectrumChannel);
130 
132  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
133  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
134  "DataMode", StringValue ("HtMcs0"),
135  "ControlMode", StringValue ("HtMcs0"));
136 
137  Config::SetDefault ("ns3::WifiMacQueue::MaxSize", QueueSizeValue (QueueSize ("50p")));
138 
140  mac.SetType ("ns3::StaWifiMac",
141  "Ssid", SsidValue (Ssid ("issue211-test")));
142 
143  NetDeviceContainer staDevices = wifi.Install (phy, mac, wifiStaNode);
144 
145  mac.SetType ("ns3::ApWifiMac",
146  "Ssid", SsidValue (Ssid ("issue211-test")),
147  "EnableBeaconJitter", BooleanValue (false));
148 
150 
151  // Assign fixed streams to random variables in use
152  wifi.AssignStreams (apDevices, streamNumber);
153 
155  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
156 
157  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
158  positionAlloc->Add (Vector (5.0, 0.0, 0.0));
159  mobility.SetPositionAllocator (positionAlloc);
160 
161  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
162  mobility.Install (wifiApNode);
163  mobility.Install (wifiStaNode);
164 
165  /* Internet stack*/
167  stack.Install (wifiApNode);
168  stack.Install (wifiStaNode);
169 
171  address.SetBase ("192.168.1.0", "255.255.255.0");
172  Ipv4InterfaceContainer staNodeInterface;
173  Ipv4InterfaceContainer apNodeInterface;
174 
175  staNodeInterface = address.Assign (staDevices.Get (0));
176  apNodeInterface = address.Assign (apDevices.Get (0));
177 
178  ApplicationContainer serverApp;
179  Time warmup (Seconds (1.0)); // to account for association
180 
181  uint16_t port = 9;
182  UdpServerHelper server (port);
183  serverApp = server.Install (wifiStaNode.Get (0));
184  serverApp.Start (Seconds (0.0));
185  serverApp.Stop (warmup + simulationTime);
186 
187  UdpClientHelper client (staNodeInterface.GetAddress (0), port);
188  client.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
189  client.SetAttribute ("Interval", TimeValue (MilliSeconds (1)));
190  client.SetAttribute ("PacketSize", UintegerValue (m_payloadSize)); // 16 Mb/s
191  ApplicationContainer clientApp = client.Install (wifiApNode.Get (0));
192  clientApp.Start (warmup);
193  clientApp.Stop (warmup + simulationTime);
194 
195  Ptr<MobilityModel> staMobility = wifiStaNode.Get (0)->GetObject<MobilityModel> ();
196 
197  // First check-point: station moves away
198  Simulator::Schedule (warmup + moveAwayTime, &MobilityModel::SetPosition, staMobility,
199  Vector (10000.0, 0.0, 0.0));
200  Simulator::Schedule (warmup + moveAwayTime + MilliSeconds (10), &Issue211Test::CalcThroughput, this,
201  DynamicCast<UdpServer> (serverApp.Get (0)));
202 
203  // Second check-point: station moves back
204  Simulator::Schedule (warmup + moveBackTime, &MobilityModel::SetPosition, staMobility,
205  Vector (5.0, 0.0, 0.0));
206  Simulator::Schedule (warmup + moveBackTime, &Issue211Test::CalcThroughput, this,
207  DynamicCast<UdpServer> (serverApp.Get (0)));
208 
209  // Last check-point: simulation finish time
210  Simulator::Schedule (warmup + simulationTime, &Issue211Test::CalcThroughput, this,
211  DynamicCast<UdpServer> (serverApp.Get (0)));
212 
213  Simulator::Stop (warmup + simulationTime);
214  Simulator::Run ();
215 
216  NS_TEST_EXPECT_MSG_EQ (m_tputValues.size (), 3, "Unexpected number of throughput values");
217  NS_TEST_EXPECT_MSG_GT (m_tputValues[0], 0, "Throughput must be non null before station moves away");
218  NS_TEST_EXPECT_MSG_EQ (m_tputValues[1], 0,"Throughput must be null while the station is away");
219  NS_TEST_EXPECT_MSG_GT (m_tputValues[2], 0, "Throughput must be non null when the station is back");
220 
221  // Print throughput values when the test is run through test-runner
222  for (const auto& t : m_tputValues)
223  {
224  std::cout << "Throughput = " << t << " Mb/s" << std::endl;
225  }
226 
227  Simulator::Destroy ();
228 }
229 
237 {
238 public:
240 };
241 
243  : TestSuite ("wifi-issue-211", UNIT)
244 {
245  AddTestCase (new Issue211Test, TestCase::QUICK);
246 }
247 
holds a vector of ns3::Application pointers.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
uint32_t m_payloadSize
payload size in bytes
AttributeValue implementation for Boolean.
Definition: boolean.h:36
Class for representing queue sizes.
Definition: queue-size.h:94
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Hold variables of type string.
Definition: string.h:41
std::vector< double > m_tputValues
throughput in sub-intervals
A suite of tests to run.
Definition: test.h:1343
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1286
aggregate IP/TCP/UDP functionality to existing Nodes.
#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:283
staDevices
Definition: third.py:103
encapsulates test code
Definition: test.h:1153
void AddPropagationLossModel(Ptr< PropagationLossModel > loss)
Add the single-frequency propagation loss model to be used.
Block Ack Test Suite.
uint64_t GetReceived(void) const
Returns the number of received packets.
Definition: udp-server.cc:106
helps to create WifiNetDevice objects
Definition: wifi-helper.h:318
stack
Definition: first.py:41
static void SetPosition(Ptr< Node > node, Vector position)
Definition: wifi-ap.cc:89
uint16_t port
Definition: dsdv-manet.cc:45
mobility
Definition: third.py:108
phy
Definition: third.py:93
Keep track of the current position and velocity of an object.
Test for issue 211 (https://gitlab.com/nsnam/ns-3-dev/-/issues/211)
Create a client application which sends UDP packets carrying a 32bit sequence number and a 64 bit tim...
AttributeValue implementation for Time.
Definition: nstime.h:1342
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
uint64_t m_lastRxBytes
RX bytes at last check-point.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
Hold an unsigned integer type.
Definition: uinteger.h:44
Time m_lastCheckPointTime
time of last check-point
holds a vector of ns3::NetDevice pointers
mac
Definition: third.py:99
virtual void DoRun(void)
Implementation to actually run this TestCase.
Create a server application which waits for input UDP packets and uses the information carried into t...
wifiApNode
Definition: third.py:90
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
void SetAttribute(std::string name, const AttributeValue &value)
Record an attribute to be set in each Application after it is is created.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
address
Definition: first.py:44
void CalcThroughput(Ptr< UdpServer > server)
Compute the average throughput since the last check-point.
create MAC layers for a ns3::WifiNetDevice.
#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:1088
The IEEE 802.11 SSID Information Element.
Definition: ssid.h:35
wifi
Definition: third.py:96
Helper class used to assign positions and mobility models to nodes.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter...
ApplicationContainer Install(NodeContainer c)
Create one UDP server application on each of the Nodes in the NodeContainer.
void SetPropagationDelayModel(Ptr< PropagationDelayModel > delay)
Set the propagation delay model to be used.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1278
AttributeValue implementation for Ssid.
Definition: ssid.h:105
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:849
void Add(Vector v)
Add a position to the list of positions.
static Issue211TestSuite g_issue211TestSuite
the test suite
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
apDevices
Definition: third.py:106
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Issue211Test()
Constructor.
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
Make it easy to create and manage PHY objects for the spectrum model.