A Discrete-Event Network Simulator
API
aodv-regression.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 IITP RAS
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: Pavel Boyko <boyko@iitp.ru>
19  */
20 
21 #include "aodv-regression.h"
22 #include "bug-772.h"
23 
24 #include "ns3/simulator.h"
25 #include "ns3/mobility-helper.h"
26 #include "ns3/double.h"
27 #include "ns3/uinteger.h"
28 #include "ns3/string.h"
29 #include "ns3/boolean.h"
30 #include "ns3/yans-wifi-helper.h"
31 #include "ns3/internet-stack-helper.h"
32 #include "ns3/ipv4-address-helper.h"
33 #include "ns3/abort.h"
34 #include "ns3/mobility-model.h"
35 #include "ns3/pcap-file.h"
36 #include "ns3/aodv-helper.h"
37 #include "ns3/config.h"
38 #include "ns3/pcap-test.h"
39 #include "ns3/rng-seed-manager.h"
40 #include "ns3/icmpv4.h"
41 #include <sstream>
42 
43 using namespace ns3;
44 
52 {
53 public:
54  AodvRegressionTestSuite () : TestSuite ("routing-aodv-regression", SYSTEM)
55  {
56  SetDataDir (NS_TEST_SOURCEDIR);
57  // General RREQ-RREP-RRER test case
58  AddTestCase (new ChainRegressionTest ("aodv-chain-regression-test"), TestCase::QUICK);
59  // \bugid{606} test case, should crash if bug is not fixed
60  AddTestCase (new ChainRegressionTest ("bug-606-test", Seconds (10), 3, Seconds (1)), TestCase::QUICK);
61  // \bugid{772} UDP test case
62  AddTestCase (new Bug772ChainTest ("udp-chain-test", "ns3::UdpSocketFactory", Seconds (3), 10), TestCase::QUICK);
63  }
65 
66 
73 ChainRegressionTest::ChainRegressionTest (const char * const prefix, Time t, uint32_t size, Time arpAliveTimeout)
74  : TestCase ("AODV chain regression test"),
75  m_nodes (0),
76  m_prefix (prefix),
77  m_time (t),
78  m_size (size),
79  m_step (120),
80  m_arpAliveTimeout (arpAliveTimeout),
81  m_seq (0)
82 {
83 }
84 
86 {
87  delete m_nodes;
88 }
89 
90 void
92 {
93  if (Simulator::Now () >= m_time)
94  {
95  return;
96  }
97 
98  Ptr<Packet> p = Create<Packet> ();
99  Icmpv4Echo echo;
100  echo.SetSequenceNumber (m_seq);
101  m_seq++;
102  echo.SetIdentifier (0);
103 
104  Ptr<Packet> dataPacket = Create<Packet> (56);
105  echo.SetData (dataPacket);
106  p->AddHeader (echo);
107  Icmpv4Header header;
108  header.SetType (Icmpv4Header::ECHO);
109  header.SetCode (0);
110  if (Node::ChecksumEnabled ())
111  {
112  header.EnableChecksum ();
113  }
114  p->AddHeader (header);
115  m_socket->Send (p, 0);
116  Simulator::Schedule (Seconds (1), &ChainRegressionTest::SendPing, this);
117 }
118 
119 void
121 {
122  RngSeedManager::SetSeed (12345);
123  RngSeedManager::SetRun (7);
124  Config::SetDefault ("ns3::ArpCache::AliveTimeout", TimeValue (m_arpAliveTimeout));
125 
126  CreateNodes ();
127  CreateDevices ();
128 
129  // At m_time / 3 move central node away and see what will happen
130  Ptr<Node> node = m_nodes->Get (m_size / 2);
132  Simulator::Schedule (Time (m_time / 3), &MobilityModel::SetPosition, mob, Vector (1e5, 1e5, 1e5));
133 
134  Simulator::Stop (m_time);
135  Simulator::Run ();
136  Simulator::Destroy ();
137 
138  CheckResults ();
139 
140  delete m_nodes, m_nodes = 0;
141 }
142 
143 void
145 {
146  m_nodes = new NodeContainer;
147  m_nodes->Create (m_size);
149  mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
150  "MinX", DoubleValue (0.0),
151  "MinY", DoubleValue (0.0),
152  "DeltaX", DoubleValue (m_step),
153  "DeltaY", DoubleValue (0),
154  "GridWidth", UintegerValue (m_size),
155  "LayoutType", StringValue ("RowFirst"));
156  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
157  mobility.Install (*m_nodes);
158 }
159 
160 void
162 {
163  // 1. Setup WiFi
164  int64_t streamsUsed = 0;
165  WifiMacHelper wifiMac;
166  wifiMac.SetType ("ns3::AdhocWifiMac");
167  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
168  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
169  Ptr<YansWifiChannel> chan = wifiChannel.Create ();
170  wifiPhy.SetChannel (chan);
171  wifiPhy.Set ("TxGain", DoubleValue (1.0)); //this configuration should go away in future revision to the test
172  wifiPhy.Set ("RxGain", DoubleValue (1.0)); //this configuration should go away in future revision to the test
173  // This test suite output was originally based on YansErrorRateModel
174  wifiPhy.SetErrorRateModel ("ns3::YansErrorRateModel");
176  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", StringValue ("2200"));
177  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, *m_nodes);
178 
179  // Assign fixed stream numbers to wifi and channel random variables
180  streamsUsed += wifi.AssignStreams (devices, streamsUsed);
181  // Assign 6 streams per device
182  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6), "Stream assignment mismatch");
183  streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
184  // Assign 0 streams per channel for this configuration
185  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6), "Stream assignment mismatch");
186 
187  // 2. Setup TCP/IP & AODV
188  AodvHelper aodv; // Use default parameters here
189  InternetStackHelper internetStack;
190  internetStack.SetRoutingHelper (aodv);
191  internetStack.Install (*m_nodes);
192  streamsUsed += internetStack.AssignStreams (*m_nodes, streamsUsed);
193  // InternetStack uses m_size more streams
194  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 8) + m_size, "Stream assignment mismatch");
195  streamsUsed += aodv.AssignStreams (*m_nodes, streamsUsed);
196  // AODV uses m_size more streams
197  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 8) + (2 * m_size)), "Stream assignment mismatch");
198 
200  address.SetBase ("10.1.1.0", "255.255.255.0");
201  Ipv4InterfaceContainer interfaces = address.Assign (devices);
202 
203  // 3. Setup ping
204  m_socket = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName ("ns3::Ipv4RawSocketFactory"));
205  m_socket->SetAttribute ("Protocol", UintegerValue (1)); // icmp
206  InetSocketAddress src = InetSocketAddress (Ipv4Address::GetAny (), 0);
207  m_socket->Bind (src);
208  InetSocketAddress dst = InetSocketAddress (interfaces.GetAddress (m_size - 1), 0);
209  m_socket->Connect (dst);
210 
211  SendPing ();
212 
213  // 4. write PCAP
215 }
216 
217 void
219 {
220  for (uint32_t i = 0; i < m_size; ++i)
221  {
222  NS_PCAP_TEST_EXPECT_EQ (m_prefix << "-" << i << "-0.pcap");
223  }
224 }
void CreateNodes()
Create test topology.
void Set(std::string name, const AttributeValue &v)
Definition: wifi-helper.cc:132
void SetType(uint8_t type)
Set ICMP type.
Definition: icmpv4.cc:109
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
AODV chain regression test.
an Inet address class
tuple devices
Definition: first.py:32
holds a vector of std::pair of Ptr and interface index.
void CheckResults()
Compare traces with reference ones.
Ptr< YansWifiChannel > Create(void) const
void SetRemoteStationManager(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Definition: wifi-helper.cc:719
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:459
Hold variables of type string.
Definition: string.h:41
Make it easy to create and manage PHY objects for the yans model.
Fast test.
Definition: test.h:1160
const Time m_arpAliveTimeout
ARP alive timeout.
A suite of tests to run.
Definition: test.h:1342
aggregate IP/TCP/UDP functionality to existing Nodes.
encapsulates test code
Definition: test.h:1155
#define NS_PCAP_TEST_EXPECT_EQ(filename)
Test that a pair of reference/new pcap files are equal.
Definition: pcap-test.h:38
helps to create WifiNetDevice objects
Definition: wifi-helper.h:213
Base class for all the ICMP packet headers.
Definition: icmpv4.h:40
static void SetPosition(Ptr< Node > node, Vector position)
Definition: wifi-ap.cc:82
void SetCode(uint8_t code)
Set ICMP code.
Definition: icmpv4.cc:115
uint32_t GetN(void) const
Get the number of Ptr stored in this container.
AODV deferred route lookup test case (see Bug 772)
Definition: bug-772.h:40
Keep track of the current position and velocity of an object.
void SetChannel(Ptr< YansWifiChannel > channel)
const uint32_t m_size
Chain size.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
tuple mobility
Definition: third.py:101
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 ...
const double m_step
Chain step, meters.
AttributeValue implementation for Time.
Definition: nstime.h:1055
void EnableChecksum(void)
Enables ICMP Checksum calculation.
Definition: icmpv4.cc:57
Hold an unsigned integer type.
Definition: uinteger.h:44
#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:168
tuple interfaces
Definition: first.py:41
holds a vector of ns3::NetDevice pointers
Ptr< Socket > m_socket
Socket.
void SendPing()
Send one ping.
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer::Iterator first, NodeContainer::Iterator last) const
Definition: wifi-helper.cc:748
ChainRegressionTest(const char *const prefix, Time time=Seconds(10), uint32_t size=5, Time arpAliveTimeout=Seconds(120))
Create test case.
int64_t AssignStreams(NetDeviceContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used by the Phy and Mac aspects ...
Definition: wifi-helper.cc:849
uint16_t m_seq
Sequence number.
NodeContainer * m_nodes
AodvRegressionTestSuite g_aodvRegressionTestSuite
the test suite
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.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
ICMP Echo header.
Definition: icmpv4.h:107
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
manage and create wifi channel objects for the yans model.
create MAC layers for a ns3::WifiNetDevice.
void SetErrorRateModel(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Definition: wifi-helper.cc:138
virtual void SetType(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue(), std::string n10="", const AttributeValue &v10=EmptyAttributeValue())
Helper class used to assign positions and mobility models to nodes.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
int64_t AssignStreams(NodeContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:430
void SetSequenceNumber(uint16_t seq)
Set the Echo sequence number.
Definition: icmpv4.cc:146
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:993
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:782
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:57
AODV regression test suite.
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:365
tuple wifi
Definition: third.py:89
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Helper class that adds AODV routing to nodes.
Definition: aodv-helper.h:34
tuple address
Definition: first.py:37
void CreateDevices()
Create devices, install TCP/IP stack and applications.
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
This class can be used to hold variables of floating point type such as 'double' or 'float'...
Definition: double.h:41
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:185
const std::string m_prefix
PCAP file names prefix.
void SetRoutingHelper(const Ipv4RoutingHelper &routing)
const Time m_time
Total simulation time.
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:256
int64_t AssignStreams(Ptr< YansWifiChannel > c, int64_t stream)
Assign a fixed random variable stream number to the random variables used by the channel.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const