A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 #include "loopback.h"
24 
25 #include "ns3/mesh-helper.h"
26 #include "ns3/simulator.h"
27 #include "ns3/mobility-helper.h"
28 #include "ns3/double.h"
29 #include "ns3/uinteger.h"
30 #include "ns3/string.h"
31 #include "ns3/boolean.h"
32 #include "ns3/yans-wifi-helper.h"
33 #include "ns3/internet-stack-helper.h"
34 #include "ns3/ipv4-address-helper.h"
35 #include "ns3/abort.h"
36 #include "ns3/udp-echo-helper.h"
37 #include "ns3/mobility-model.h"
38 #include "ns3/pcap-file.h"
39 #include "ns3/aodv-helper.h"
40 #include "ns3/v4ping-helper.h"
41 #include "ns3/nqos-wifi-mac-helper.h"
42 #include "ns3/config.h"
43 #include "ns3/pcap-test.h"
44 #include "ns3/rng-seed-manager.h"
45 #include <sstream>
46 
47 namespace ns3 {
48 namespace aodv {
49 //-----------------------------------------------------------------------------
50 // Test suite
51 //-----------------------------------------------------------------------------
53 {
54 public:
55  AodvRegressionTestSuite () : 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);
62  AddTestCase (new ChainRegressionTest ("bug-606-test", Seconds (10), 3, Seconds (1)), TestCase::QUICK);
65  AddTestCase (new Bug772ChainTest ("udp-chain-test", "ns3::UdpSocketFactory", Seconds (3), 10), TestCase::QUICK);
68  AddTestCase (new Bug772ChainTest ("tcp-chain-test", "ns3::TcpSocketFactory", Seconds (3), 10), TestCase::QUICK);
69  // Ping loopback test case
71  }
73 
74 
75 //-----------------------------------------------------------------------------
76 // ChainRegressionTest
77 //-----------------------------------------------------------------------------
78 ChainRegressionTest::ChainRegressionTest (const char * const prefix, Time t, uint32_t size, Time arpAliveTimeout) :
79  TestCase ("AODV chain regression test"),
80  m_nodes (0),
81  m_prefix (prefix),
82  m_time (t),
83  m_size (size),
84  m_step (120),
85  m_arpAliveTimeout (arpAliveTimeout)
86 {
87 }
88 
90 {
91  delete m_nodes;
92 }
93 
94 void
96 {
99  Config::SetDefault ("ns3::ArpCache::AliveTimeout", TimeValue (m_arpAliveTimeout));
100 
101  CreateNodes ();
102  CreateDevices ();
103 
104  // At m_time / 3 move central node away and see what will happen
105  Ptr<Node> node = m_nodes->Get (m_size / 2);
107  Simulator::Schedule (Time (m_time / 3), &MobilityModel::SetPosition, mob, Vector (1e5, 1e5, 1e5));
108 
110  Simulator::Run ();
112 
113  CheckResults ();
114 
115  delete m_nodes, m_nodes = 0;
116 }
117 
118 void
120 {
121  m_nodes = new NodeContainer;
122  m_nodes->Create (m_size);
123  MobilityHelper mobility;
124  mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
125  "MinX", DoubleValue (0.0),
126  "MinY", DoubleValue (0.0),
127  "DeltaX", DoubleValue (m_step),
128  "DeltaY", DoubleValue (0),
129  "GridWidth", UintegerValue (m_size),
130  "LayoutType", StringValue ("RowFirst"));
131  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
132  mobility.Install (*m_nodes);
133 }
134 
135 void
137 {
138  // 1. Setup WiFi
139  int64_t streamsUsed = 0;
141  wifiMac.SetType ("ns3::AdhocWifiMac");
144  Ptr<YansWifiChannel> chan = wifiChannel.Create ();
145  wifiPhy.SetChannel (chan);
146  // This test suite output was originally based on YansErrorRateModel
147  wifiPhy.SetErrorRateModel ("ns3::YansErrorRateModel");
149  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", StringValue ("2200"));
150  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, *m_nodes);
151 
152  // Assign fixed stream numbers to wifi and channel random variables
153  streamsUsed += wifi.AssignStreams (devices, streamsUsed);
154  // Assign 6 streams per device
155  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6), "Stream assignment mismatch");
156  streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
157  // Assign 0 streams per channel for this configuration
158  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6), "Stream assignment mismatch");
159 
160  // 2. Setup TCP/IP & AODV
161  AodvHelper aodv; // Use default parameters here
162  InternetStackHelper internetStack;
163  internetStack.SetRoutingHelper (aodv);
164  internetStack.Install (*m_nodes);
165  streamsUsed += internetStack.AssignStreams (*m_nodes, streamsUsed);
166  // InternetStack uses m_size more streams
167  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 8) + m_size, "Stream assignment mismatch");
168  streamsUsed += aodv.AssignStreams (*m_nodes, streamsUsed);
169  // AODV uses m_size more streams
170  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 8) + (2*m_size)), "Stream assignment mismatch");
171 
173  address.SetBase ("10.1.1.0", "255.255.255.0");
174  Ipv4InterfaceContainer interfaces = address.Assign (devices);
175 
176  // 3. Setup ping
177  V4PingHelper ping (interfaces.GetAddress (m_size - 1));
178  ping.SetAttribute ("Verbose", BooleanValue (false)); // don't need verbose ping in regression test
179  ApplicationContainer p = ping.Install (m_nodes->Get (0));
180  p.Start (Seconds (0));
181  p.Stop (m_time);
182 
183  // 4. write PCAP
185 }
186 
187 void
189 {
190  for (uint32_t i = 0; i < m_size; ++i)
191  {
192  NS_PCAP_TEST_EXPECT_EQ (m_prefix << "-" << i << "-0.pcap");
193  }
194 }
195 
196 }
197 }