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 
44 using namespace ns3;
45 
52 {
53  public:
55  : TestSuite("routing-aodv-regression", SYSTEM)
56  {
57  SetDataDir(NS_TEST_SOURCEDIR);
58  // General RREQ-RREP-RRER test case
59  AddTestCase(new ChainRegressionTest("aodv-chain-regression-test"), TestCase::QUICK);
60  // \bugid{606} test case, should crash if bug is not fixed
61  AddTestCase(new ChainRegressionTest("bug-606-test", Seconds(10), 3, Seconds(1)),
63  // \bugid{772} UDP test case
64  AddTestCase(new Bug772ChainTest("udp-chain-test", "ns3::UdpSocketFactory", Seconds(3), 10),
66  }
68 
75  Time t,
76  uint32_t size,
77  Time arpAliveTimeout)
78  : TestCase("AODV chain regression test"),
79  m_nodes(nullptr),
80  m_prefix(prefix),
81  m_time(t),
82  m_size(size),
83  m_step(120),
84  m_arpAliveTimeout(arpAliveTimeout),
85  m_seq(0)
86 {
87 }
88 
90 {
91  delete m_nodes;
92 }
93 
94 void
96 {
97  if (Simulator::Now() >= m_time)
98  {
99  return;
100  }
101 
102  Ptr<Packet> p = Create<Packet>();
103  Icmpv4Echo echo;
104  echo.SetSequenceNumber(m_seq);
105  m_seq++;
106  echo.SetIdentifier(0);
107 
108  Ptr<Packet> dataPacket = Create<Packet>(56);
109  echo.SetData(dataPacket);
110  p->AddHeader(echo);
111  Icmpv4Header header;
112  header.SetType(Icmpv4Header::ICMPV4_ECHO);
113  header.SetCode(0);
114  if (Node::ChecksumEnabled())
115  {
116  header.EnableChecksum();
117  }
118  p->AddHeader(header);
119  m_socket->Send(p, 0);
120  Simulator::Schedule(Seconds(1), &ChainRegressionTest::SendPing, this);
121 }
122 
123 void
125 {
126  RngSeedManager::SetSeed(12345);
127  RngSeedManager::SetRun(7);
128  Config::SetDefault("ns3::ArpCache::AliveTimeout", TimeValue(m_arpAliveTimeout));
129 
130  CreateNodes();
131  CreateDevices();
132 
133  // At m_time / 3 move central node away and see what will happen
134  Ptr<Node> node = m_nodes->Get(m_size / 2);
136  Simulator::Schedule(Time(m_time / 3), &MobilityModel::SetPosition, mob, Vector(1e5, 1e5, 1e5));
137 
138  Simulator::Stop(m_time);
139  Simulator::Run();
140  Simulator::Destroy();
141 
142  CheckResults();
143 
144  delete m_nodes, m_nodes = nullptr;
145 }
146 
147 void
149 {
150  m_nodes = new NodeContainer;
153  mobility.SetPositionAllocator("ns3::GridPositionAllocator",
154  "MinX",
155  DoubleValue(0.0),
156  "MinY",
157  DoubleValue(0.0),
158  "DeltaX",
160  "DeltaY",
161  DoubleValue(0),
162  "GridWidth",
164  "LayoutType",
165  StringValue("RowFirst"));
166  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
167  mobility.Install(*m_nodes);
168 }
169 
170 void
172 {
173  // 1. Setup WiFi
174  int64_t streamsUsed = 0;
175  WifiMacHelper wifiMac;
176  wifiMac.SetType("ns3::AdhocWifiMac");
177  YansWifiPhyHelper wifiPhy;
179  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default();
180  Ptr<YansWifiChannel> chan = wifiChannel.Create();
181  wifiPhy.SetChannel(chan);
182 
183  // This test suite output was originally based on YansErrorRateModel
184  wifiPhy.SetErrorRateModel("ns3::YansErrorRateModel");
186  wifi.SetStandard(WIFI_STANDARD_80211a);
187  wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
188  "DataMode",
189  StringValue("OfdmRate6Mbps"),
190  "RtsCtsThreshold",
191  StringValue("2200"));
192  NetDeviceContainer devices = wifi.Install(wifiPhy, wifiMac, *m_nodes);
193 
194  // Assign fixed stream numbers to wifi and channel random variables
195  streamsUsed += wifi.AssignStreams(devices, streamsUsed);
196  // Assign 6 streams per device
197  NS_TEST_ASSERT_MSG_EQ(streamsUsed, (devices.GetN() * 2), "Stream assignment mismatch");
198  streamsUsed += wifiChannel.AssignStreams(chan, streamsUsed);
199  // Assign 0 streams per channel for this configuration
200  NS_TEST_ASSERT_MSG_EQ(streamsUsed, (devices.GetN() * 2), "Stream assignment mismatch");
201 
202  // 2. Setup TCP/IP & AODV
203  AodvHelper aodv; // Use default parameters here
204  InternetStackHelper internetStack;
205  internetStack.SetRoutingHelper(aodv);
206  internetStack.Install(*m_nodes);
207  streamsUsed += internetStack.AssignStreams(*m_nodes, streamsUsed);
208  // InternetStack uses m_size more streams
209  NS_TEST_ASSERT_MSG_EQ(streamsUsed, (devices.GetN() * 5) + m_size, "Stream assignment mismatch");
210  streamsUsed += aodv.AssignStreams(*m_nodes, streamsUsed);
211  // AODV uses m_size more streams
212  NS_TEST_ASSERT_MSG_EQ(streamsUsed,
213  ((devices.GetN() * 5) + (2 * m_size)),
214  "Stream assignment mismatch");
215 
217  address.SetBase("10.1.1.0", "255.255.255.0");
219 
220  // 3. Setup ping
221  m_socket =
222  Socket::CreateSocket(m_nodes->Get(0), TypeId::LookupByName("ns3::Ipv4RawSocketFactory"));
223  m_socket->SetAttribute("Protocol", UintegerValue(1)); // icmp
224  InetSocketAddress src = InetSocketAddress(Ipv4Address::GetAny(), 0);
225  m_socket->Bind(src);
226  InetSocketAddress dst = InetSocketAddress(interfaces.GetAddress(m_size - 1), 0);
227  m_socket->Connect(dst);
228 
229  SendPing();
230 
231  // 4. write PCAP
233 }
234 
235 void
237 {
238  for (uint32_t i = 0; i < m_size; ++i)
239  {
240  NS_PCAP_TEST_EXPECT_EQ(m_prefix << "-" << i << "-0.pcap");
241  }
242 }
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.
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:204
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:56
encapsulates test code
Definition: test.h:1060
@ QUICK
Fast test.
Definition: test.h:1065
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:438
A suite of tests to run.
Definition: test.h:1256
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
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.
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:890
Time Now()
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:305
#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
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1326
@ WIFI_STANDARD_80211a
address
Definition: first.py:47
devices
Definition: first.py:42
interfaces
Definition: first.py:50
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
Definition: nstime.h:839
Every class exported by the ns3 library is enclosed in the ns3 namespace.
wifi
Definition: third.py:95
mobility
Definition: third.py:105
#define NS_PCAP_TEST_EXPECT_EQ(filename)
Test that a pair of reference/new pcap files are equal.
Definition: pcap-test.h:39
double m_time
Definition: qkd_etsi_014.cc:62