A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
bug-772.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 "bug-772.h"
22 
23 #include "ns3/mesh-helper.h"
24 #include "ns3/simulator.h"
25 #include "ns3/random-variable-stream.h"
26 #include "ns3/rng-seed-manager.h"
27 #include "ns3/string.h"
28 #include "ns3/mobility-helper.h"
29 #include "ns3/double.h"
30 #include "ns3/uinteger.h"
31 #include "ns3/string.h"
32 #include "ns3/boolean.h"
33 #include "ns3/yans-wifi-helper.h"
34 #include "ns3/internet-stack-helper.h"
35 #include "ns3/ipv4-address-helper.h"
36 #include "ns3/abort.h"
37 #include "ns3/udp-echo-helper.h"
38 #include "ns3/mobility-model.h"
39 #include "ns3/pcap-file.h"
40 #include "ns3/aodv-helper.h"
41 #include "ns3/v4ping-helper.h"
42 #include "ns3/nqos-wifi-mac-helper.h"
43 #include "ns3/config.h"
44 #include "ns3/on-off-helper.h"
45 #include "ns3/inet-socket-address.h"
46 #include "ns3/data-rate.h"
47 #include "ns3/packet-sink-helper.h"
48 #include "ns3/pcap-test.h"
49 #include <sstream>
50 
51 namespace ns3 {
52 namespace aodv {
53 
54 //-----------------------------------------------------------------------------
55 // UdpChainTest
56 //-----------------------------------------------------------------------------
57 Bug772ChainTest::Bug772ChainTest (const char * const prefix, const char * const proto, Time t, uint32_t size) :
58  TestCase ("Bug 772 UDP and TCP chain regression test"),
59  m_nodes (0),
60  m_prefix (prefix),
61  m_proto (proto),
62  m_time (t),
63  m_size (size),
64  m_step (120)
65 {
66 }
67 
69 {
70  delete m_nodes;
71 }
72 
73 void
75 {
78 
79  CreateNodes ();
80  CreateDevices ();
81 
83  Simulator::Run ();
85 
86  CheckResults ();
87 
88  delete m_nodes, m_nodes = 0;
89 }
90 
91 void
93 {
94  m_nodes = new NodeContainer;
96  MobilityHelper mobility;
97  mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
98  "MinX", DoubleValue (0.0),
99  "MinY", DoubleValue (0.0),
100  "DeltaX", DoubleValue (m_step),
101  "DeltaY", DoubleValue (0),
102  "GridWidth", UintegerValue (m_size),
103  "LayoutType", StringValue ("RowFirst"));
104  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
105  mobility.Install (*m_nodes);
106 }
107 
108 void
110 {
111  int64_t streamsUsed = 0;
112  // 1. Setup WiFi
114  wifiMac.SetType ("ns3::AdhocWifiMac");
116  // This test suite output was originally based on YansErrorRateModel
117  wifiPhy.SetErrorRateModel ("ns3::YansErrorRateModel");
119  Ptr<YansWifiChannel> chan = wifiChannel.Create ();
120  wifiPhy.SetChannel (chan);
122  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", StringValue ("2200"));
123  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, *m_nodes);
124 
125  // Assign fixed stream numbers to wifi and channel random variables
126  streamsUsed += wifi.AssignStreams (devices, streamsUsed);
127  // Assign 6 streams per device
128  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6), "Stream assignment mismatch");
129  streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
130  // Assign 0 streams per channel for this configuration
131  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6), "Stream assignment mismatch");
132 
133  // 2. Setup TCP/IP & AODV
134  AodvHelper aodv; // Use default parameters here
135  InternetStackHelper internetStack;
136  internetStack.SetRoutingHelper (aodv);
137  internetStack.Install (*m_nodes);
138  streamsUsed += aodv.AssignStreams (*m_nodes, streamsUsed);
139  // Expect to use m_size more streams for AODV
140  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 6) + m_size), "Stream assignment mismatch");
141  Ipv4AddressHelper address;
142  address.SetBase ("10.1.1.0", "255.255.255.0");
143  Ipv4InterfaceContainer interfaces = address.Assign (devices);
144 
145  // 3. Setup UDP source and sink
146  uint16_t port = 9; // Discard port (RFC 863)
147  OnOffHelper onoff (m_proto, Address (InetSocketAddress (interfaces.GetAddress (m_size-1), port)));
148  onoff.SetConstantRate (DataRate (64000));
149  onoff.SetAttribute ("PacketSize", UintegerValue (1200));
150  ApplicationContainer app = onoff.Install (m_nodes->Get (0));
151  app.Start (Seconds (1.0));
152  app.Stop (m_time);
154  app = sink.Install (m_nodes->Get (m_size - 1));
155  app.Start (Seconds (0.0));
156 
157  // 4. write PCAP on the first and last nodes only
158  wifiPhy.EnablePcap (CreateTempDirFilename (m_prefix), devices.Get (0));
159  wifiPhy.EnablePcap (CreateTempDirFilename (m_prefix), devices.Get (m_size-1));
160 }
161 
162 void
164 {
165  for (uint32_t i = 0; i < m_size; i += (m_size - 1) /*first and last nodes only*/)
166  {
167  NS_PCAP_TEST_EXPECT_EQ(m_prefix << "-" << i << "-0.pcap");
168  }
169 }
170 
171 }
172 }