A Discrete-Event Network Simulator
API
aodv-regression.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2009 IITP RAS
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: Pavel Boyko <boyko@iitp.ru>
18 */
19
20#include "aodv-regression.h"
21
22#include "bug-772.h"
23
24#include "ns3/abort.h"
25#include "ns3/aodv-helper.h"
26#include "ns3/boolean.h"
27#include "ns3/config.h"
28#include "ns3/double.h"
29#include "ns3/icmpv4.h"
30#include "ns3/internet-stack-helper.h"
31#include "ns3/ipv4-address-helper.h"
32#include "ns3/mobility-helper.h"
33#include "ns3/mobility-model.h"
34#include "ns3/pcap-file.h"
35#include "ns3/pcap-test.h"
36#include "ns3/rng-seed-manager.h"
37#include "ns3/simulator.h"
38#include "ns3/string.h"
39#include "ns3/uinteger.h"
40#include "ns3/yans-wifi-helper.h"
41
42#include <sstream>
43
44using namespace ns3;
45
53{
54 public:
56 : TestSuite("routing-aodv-regression", SYSTEM)
57 {
58 SetDataDir(NS_TEST_SOURCEDIR);
59 // General RREQ-RREP-RRER test case
60 AddTestCase(new ChainRegressionTest("aodv-chain-regression-test"), TestCase::QUICK);
61 // \bugid{606} test case, should crash if bug is not fixed
62 AddTestCase(new ChainRegressionTest("bug-606-test", Seconds(10), 3, Seconds(1)),
63 TestCase::QUICK);
64 // \bugid{772} UDP test case
65 AddTestCase(new Bug772ChainTest("udp-chain-test", "ns3::UdpSocketFactory", Seconds(3), 10),
66 TestCase::QUICK);
67 }
69
77 Time t,
78 uint32_t size,
79 Time arpAliveTimeout)
80 : TestCase("AODV chain regression test"),
81 m_nodes(nullptr),
82 m_prefix(prefix),
83 m_time(t),
84 m_size(size),
85 m_step(120),
86 m_arpAliveTimeout(arpAliveTimeout),
87 m_seq(0)
88{
89}
90
92{
93 delete m_nodes;
94}
95
96void
98{
99 if (Simulator::Now() >= m_time)
100 {
101 return;
102 }
103
104 Ptr<Packet> p = Create<Packet>();
105 Icmpv4Echo echo;
107 m_seq++;
108 echo.SetIdentifier(0);
109
110 Ptr<Packet> dataPacket = Create<Packet>(56);
111 echo.SetData(dataPacket);
112 p->AddHeader(echo);
113 Icmpv4Header header;
114 header.SetType(Icmpv4Header::ICMPV4_ECHO);
115 header.SetCode(0);
116 if (Node::ChecksumEnabled())
117 {
118 header.EnableChecksum();
119 }
120 p->AddHeader(header);
121 m_socket->Send(p, 0);
122 Simulator::Schedule(Seconds(1), &ChainRegressionTest::SendPing, this);
123}
124
125void
127{
128 RngSeedManager::SetSeed(12345);
129 RngSeedManager::SetRun(7);
130 Config::SetDefault("ns3::ArpCache::AliveTimeout", TimeValue(m_arpAliveTimeout));
131
132 CreateNodes();
134
135 // At m_time / 3 move central node away and see what will happen
136 Ptr<Node> node = m_nodes->Get(m_size / 2);
138 Simulator::Schedule(Time(m_time / 3), &MobilityModel::SetPosition, mob, Vector(1e5, 1e5, 1e5));
139
140 Simulator::Stop(m_time);
141 Simulator::Run();
142 Simulator::Destroy();
143
144 CheckResults();
145
146 delete m_nodes, m_nodes = nullptr;
147}
148
149void
151{
155 mobility.SetPositionAllocator("ns3::GridPositionAllocator",
156 "MinX",
157 DoubleValue(0.0),
158 "MinY",
159 DoubleValue(0.0),
160 "DeltaX",
162 "DeltaY",
163 DoubleValue(0),
164 "GridWidth",
166 "LayoutType",
167 StringValue("RowFirst"));
168 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
169 mobility.Install(*m_nodes);
170}
171
172void
174{
175 // 1. Setup WiFi
176 int64_t streamsUsed = 0;
177 WifiMacHelper wifiMac;
178 wifiMac.SetType("ns3::AdhocWifiMac");
179 YansWifiPhyHelper wifiPhy;
181 YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default();
182 Ptr<YansWifiChannel> chan = wifiChannel.Create();
183 wifiPhy.SetChannel(chan);
184
185 // This test suite output was originally based on YansErrorRateModel
186 wifiPhy.SetErrorRateModel("ns3::YansErrorRateModel");
188 wifi.SetStandard(WIFI_STANDARD_80211a);
189 wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
190 "DataMode",
191 StringValue("OfdmRate6Mbps"),
192 "RtsCtsThreshold",
193 StringValue("2200"));
194 NetDeviceContainer devices = wifi.Install(wifiPhy, wifiMac, *m_nodes);
195
196 // Assign fixed stream numbers to wifi and channel random variables
197 streamsUsed += wifi.AssignStreams(devices, streamsUsed);
198 // Assign 6 streams per device
199 NS_TEST_ASSERT_MSG_EQ(streamsUsed, (devices.GetN() * 2), "Stream assignment mismatch");
200 streamsUsed += wifiChannel.AssignStreams(chan, streamsUsed);
201 // Assign 0 streams per channel for this configuration
202 NS_TEST_ASSERT_MSG_EQ(streamsUsed, (devices.GetN() * 2), "Stream assignment mismatch");
203
204 // 2. Setup TCP/IP & AODV
205 AodvHelper aodv; // Use default parameters here
206 InternetStackHelper internetStack;
207 internetStack.SetRoutingHelper(aodv);
208 internetStack.Install(*m_nodes);
209 streamsUsed += internetStack.AssignStreams(*m_nodes, streamsUsed);
210 // InternetStack uses m_size more streams
211 NS_TEST_ASSERT_MSG_EQ(streamsUsed, (devices.GetN() * 5) + m_size, "Stream assignment mismatch");
212 streamsUsed += aodv.AssignStreams(*m_nodes, streamsUsed);
213 // AODV uses m_size more streams
214 NS_TEST_ASSERT_MSG_EQ(streamsUsed,
215 ((devices.GetN() * 5) + (2 * m_size)),
216 "Stream assignment mismatch");
217
219 address.SetBase("10.1.1.0", "255.255.255.0");
221
222 // 3. Setup ping
223 m_socket =
224 Socket::CreateSocket(m_nodes->Get(0), TypeId::LookupByName("ns3::Ipv4RawSocketFactory"));
225 m_socket->SetAttribute("Protocol", UintegerValue(1)); // icmp
226 InetSocketAddress src = InetSocketAddress(Ipv4Address::GetAny(), 0);
227 m_socket->Bind(src);
228 InetSocketAddress dst = InetSocketAddress(interfaces.GetAddress(m_size - 1), 0);
229 m_socket->Connect(dst);
230
231 SendPing();
232
233 // 4. write PCAP
235}
236
237void
239{
240 for (uint32_t i = 0; i < m_size; ++i)
241 {
242 NS_PCAP_TEST_EXPECT_EQ(m_prefix << "-" << i << "-0.pcap");
243 }
244}
AODV regression test suite.
AODV deferred route lookup test case (see Bug 772)
Definition: bug-772.h:40
AODV chain regression test.
const uint32_t m_size
Chain size.
void CreateNodes()
Create test topology.
void DoRun() override
Go.
uint16_t m_seq
Sequence number.
void SendPing()
Send one ping.
const Time m_arpAliveTimeout
ARP alive timeout.
const double m_step
Chain step, meters.
~ChainRegressionTest() override
NodeContainer * m_nodes
void CheckResults()
Compare traces with reference ones.
const Time m_time
Total simulation time.
const std::string m_prefix
PCAP file names prefix.
Ptr< Socket > m_socket
Socket.
void CreateDevices()
Create devices, install TCP/IP stack and applications.
Helper class that adds AODV routing to nodes.
Definition: aodv-helper.h:36
int64_t AssignStreams(NodeContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
Definition: aodv-helper.cc:58
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:42
ICMP Echo header.
Definition: icmpv4.h:109
void SetIdentifier(uint16_t id)
Set the Echo identifier.
Definition: icmpv4.cc:150
void SetData(Ptr< const Packet > data)
Set the Echo data.
Definition: icmpv4.cc:164
void SetSequenceNumber(uint16_t seq)
Set the Echo sequence number.
Definition: icmpv4.cc:157
Base class for all the ICMP packet headers.
Definition: icmpv4.h:42
void SetCode(uint8_t code)
Set ICMP code.
Definition: icmpv4.cc:123
void SetType(uint8_t type)
Set ICMP type.
Definition: icmpv4.cc:116
void EnableChecksum()
Enables ICMP Checksum calculation.
Definition: icmpv4.cc:60
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
void SetRoutingHelper(const Ipv4RoutingHelper &routing)
int64_t AssignStreams(NodeContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
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.
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.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:258
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:471
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:268
void EnablePcapAll(std::string prefix, bool promiscuous=false)
Enable pcap output on each device (which is of the appropriate type) in the set of all nodes created ...
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
Hold variables of type string.
Definition: string.h:42
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
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:442
void SetDataDir(std::string directory)
Set the data directory where reference trace files can be found.
Definition: test.cc:482
A suite of tests to run.
Definition: test.h:1256
@ SYSTEM
This test suite implements a System Test.
Definition: test.h:1266
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
AttributeValue implementation for Time.
Definition: nstime.h:1425
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.
void SetType(std::string type, Args &&... args)
void DisablePreambleDetectionModel()
Disable the preamble detection model on all links.
Definition: wifi-helper.cc:178
void SetErrorRateModel(std::string type, Args &&... args)
Helper function used to set the error rate model.
Definition: wifi-helper.h:536
manage and create wifi channel objects for the YANS model.
int64_t AssignStreams(Ptr< YansWifiChannel > c, int64_t stream)
Assign a fixed random variable stream number to the random variables used by the channel.
Ptr< YansWifiChannel > Create() const
Make it easy to create and manage PHY objects for the YANS model.
void SetChannel(Ptr< YansWifiChannel > channel)
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_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:144
AodvRegressionTestSuite g_aodvRegressionTestSuite
the test suite
ChainRegressionTest(const char *const prefix, Time time=Seconds(10), uint32_t size=5, Time arpAliveTimeout=Seconds(120))
Create test case.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1338
@ WIFI_STANDARD_80211a
address
Definition: first.py:40
devices
Definition: first.py:35
interfaces
Definition: first.py:44
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
Definition: nstime.h:850
Every class exported by the ns3 library is enclosed in the ns3 namespace.
wifi
Definition: third.py:88
mobility
Definition: third.py:96
#define NS_PCAP_TEST_EXPECT_EQ(filename)
Test that a pair of reference/new pcap files are equal.
Definition: pcap-test.h:39