A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
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
39using namespace ns3;
40
58class Issue211Test : public TestCase
59{
60 public:
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;
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
94void
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
105void
107{
108 Time simulationTime(Seconds(6.0));
109 Time moveAwayTime(Seconds(2.0));
110 Time moveBackTime(Seconds(4.0));
111
114 int64_t streamNumber = 100;
115
116 NodeContainer wifiApNode;
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
132 WifiHelper wifi;
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
142 WifiMacHelper mac;
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
153 NetDeviceContainer apDevices = wifi.Install(phy, mac, wifiApNode);
154
155 // Assign fixed streams to random variables in use
156 wifi.AssignStreams(apDevices, streamNumber);
157
158 MobilityHelper mobility;
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
174 Ipv4AddressHelper address;
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;
186 UdpServerHelper server(port);
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,
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,
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);
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
246}
247
255{
256 public:
258};
259
261 : TestSuite("wifi-issue-211", Type::UNIT)
262{
263 AddTestCase(new Issue211Test, TestCase::Duration::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.
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.
void SetPosition(const Vector &position)
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:522
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
Class for representing queue sizes.
Definition: queue-size.h:96
AttributeValue implementation for QueueSize.
Definition: queue-size.h:221
static void SetRun(uint64_t run)
Set the run number of simulation.
static void SetSeed(uint32_t seed)
Set the seed.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:571
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:142
static Time Now()
Return the current simulation virtual time.
Definition: simulator.cc:208
static void Run()
Run the simulation.
Definition: simulator.cc:178
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:186
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.
Definition: ssid.h:96
Hold variables of type string.
Definition: string.h:56
encapsulates test code
Definition: test.h:1061
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
A suite of tests to run.
Definition: test.h:1268
Type
Type of test.
Definition: test.h:1275
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
@ US
microsecond
Definition: nstime.h:118
AttributeValue implementation for Time.
Definition: nstime.h:1413
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:894
#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:957
#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:252
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
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static Issue211TestSuite g_issue211TestSuite
the test suite