A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
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
52{
53 public:
55 : TestSuite("routing-aodv-regression", Type::SYSTEM)
56 {
57 SetDataDir(NS_TEST_SOURCEDIR);
58 // General RREQ-RREP-RRER test case
59 AddTestCase(new ChainRegressionTest("aodv-chain-regression-test"),
60 TestCase::Duration::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::Duration::QUICK);
64 // \bugid{772} UDP test case
65 AddTestCase(new Bug772ChainTest("udp-chain-test", "ns3::UdpSocketFactory", Seconds(3), 10),
66 TestCase::Duration::QUICK);
67 }
69
76 Time t,
77 uint32_t size,
78 Time arpAliveTimeout)
79 : TestCase("AODV chain regression test"),
80 m_nodes(nullptr),
81 m_prefix(prefix),
82 m_time(t),
83 m_size(size),
84 m_step(120),
85 m_arpAliveTimeout(arpAliveTimeout),
86 m_seq(0)
87{
88}
89
91{
92 delete m_nodes;
93}
94
95void
97{
98 if (Simulator::Now() >= m_time)
99 {
100 return;
101 }
102
103 Ptr<Packet> p = Create<Packet>();
104 Icmpv4Echo echo;
106 m_seq++;
107 echo.SetIdentifier(0);
108
109 Ptr<Packet> dataPacket = Create<Packet>(56);
110 echo.SetData(dataPacket);
111 p->AddHeader(echo);
112 Icmpv4Header header;
114 header.SetCode(0);
116 {
117 header.EnableChecksum();
118 }
119 p->AddHeader(header);
120 m_socket->Send(p, 0);
122}
123
124void
126{
129 Config::SetDefault("ns3::ArpCache::AliveTimeout", TimeValue(m_arpAliveTimeout));
130
131 CreateNodes();
133
134 // At m_time / 3 move central node away and see what will happen
135 Ptr<Node> node = m_nodes->Get(m_size / 2);
136 Ptr<MobilityModel> mob = node->GetObject<MobilityModel>();
137 Simulator::Schedule(Time(m_time / 3), &MobilityModel::SetPosition, mob, Vector(1e5, 1e5, 1e5));
138
142
143 CheckResults();
144
145 delete m_nodes, m_nodes = nullptr;
146}
147
148void
150{
153 MobilityHelper mobility;
154 mobility.SetPositionAllocator("ns3::GridPositionAllocator",
155 "MinX",
156 DoubleValue(0.0),
157 "MinY",
158 DoubleValue(0.0),
159 "DeltaX",
161 "DeltaY",
162 DoubleValue(0),
163 "GridWidth",
165 "LayoutType",
166 StringValue("RowFirst"));
167 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
168 mobility.Install(*m_nodes);
169}
170
171void
173{
174 // 1. Setup WiFi
175 int64_t streamsUsed = 0;
176 WifiMacHelper wifiMac;
177 wifiMac.SetType("ns3::AdhocWifiMac");
178 YansWifiPhyHelper wifiPhy;
181 Ptr<YansWifiChannel> chan = wifiChannel.Create();
182 wifiPhy.SetChannel(chan);
183
184 // This test suite output was originally based on YansErrorRateModel
185 wifiPhy.SetErrorRateModel("ns3::YansErrorRateModel");
186 WifiHelper wifi;
187 wifi.SetStandard(WIFI_STANDARD_80211a);
188 wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
189 "DataMode",
190 StringValue("OfdmRate6Mbps"),
191 "RtsCtsThreshold",
192 StringValue("2200"));
193 NetDeviceContainer devices = wifi.Install(wifiPhy, wifiMac, *m_nodes);
194
195 // Assign fixed stream numbers to wifi and channel random variables
196 streamsUsed += wifi.AssignStreams(devices, streamsUsed);
197 // Assign 6 streams per device
198 NS_TEST_ASSERT_MSG_EQ(streamsUsed, (devices.GetN() * 2), "Stream assignment mismatch");
199 streamsUsed += wifiChannel.AssignStreams(chan, streamsUsed);
200 // Assign 0 streams per channel for this configuration
201 NS_TEST_ASSERT_MSG_EQ(streamsUsed, (devices.GetN() * 2), "Stream assignment mismatch");
202
203 // 2. Setup TCP/IP & AODV
204 AodvHelper aodv; // Use default parameters here
205 InternetStackHelper internetStack;
206 internetStack.SetRoutingHelper(aodv);
207 internetStack.Install(*m_nodes);
208 streamsUsed += internetStack.AssignStreams(*m_nodes, streamsUsed);
209 // InternetStack uses m_size more streams
210 NS_TEST_ASSERT_MSG_EQ(streamsUsed, (devices.GetN() * 5) + m_size, "Stream assignment mismatch");
211 streamsUsed += aodv.AssignStreams(*m_nodes, streamsUsed);
212 // AODV uses m_size more streams
213 NS_TEST_ASSERT_MSG_EQ(streamsUsed,
214 ((devices.GetN() * 5) + (2 * m_size)),
215 "Stream assignment mismatch");
216
217 Ipv4AddressHelper address;
218 address.SetBase("10.1.1.0", "255.255.255.0");
219 Ipv4InterfaceContainer interfaces = address.Assign(devices);
220
221 // 3. Setup ping
222 m_socket =
223 Socket::CreateSocket(m_nodes->Get(0), TypeId::LookupByName("ns3::Ipv4RawSocketFactory"));
224 m_socket->SetAttribute("Protocol", UintegerValue(1)); // icmp
226 m_socket->Bind(src);
227 InetSocketAddress dst = InetSocketAddress(interfaces.GetAddress(m_size - 1), 0);
228 m_socket->Connect(dst);
229
230 SendPing();
231
232 // 4. write PCAP
234}
235
236void
238{
239 for (uint32_t i = 0; i < m_size; ++i)
240 {
241 NS_PCAP_TEST_EXPECT_EQ(m_prefix << "-" << i << "-0.pcap");
242 }
243}
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:110
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:43
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.
static Ipv4Address GetAny()
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.
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.
static bool ChecksumEnabled()
Definition: node.cc:285
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:211
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 ...
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
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
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.
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
This method wraps the creation of sockets that is performed on a given node by a SocketFactory specif...
Definition: socket.cc:72
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
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
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:438
void SetDataDir(std::string directory)
Set the data directory where reference trace files can be found.
Definition: test.cc:478
A suite of tests to run.
Definition: test.h:1268
Type
Type of test.
Definition: test.h:1275
static constexpr auto SYSTEM
Definition: test.h:1288
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
AttributeValue implementation for Time.
Definition: nstime.h:1413
static TypeId LookupByName(std::string name)
Get a TypeId by name.
Definition: type-id.cc:836
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.
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:550
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.
static YansWifiChannelHelper Default()
Create a channel helper in a default working state.
Ptr< YansWifiChannel > Create() const
Make it easy to create and manage PHY objects for the YANS model.
void SetChannel(Ptr< YansWifiChannel > channel)
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.
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:894
#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:145
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1326
@ WIFI_STANDARD_80211a
Every class exported by the ns3 library is enclosed in the ns3 namespace.
#define NS_PCAP_TEST_EXPECT_EQ(filename)
Test that a pair of reference/new pcap files are equal.
Definition: pcap-test.h:39