A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
bug780-test.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /* This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License version 2 as
4  * published by the Free Software Foundation;
5  *
6  * This program is distributed in the hope that it will be useful,
7  * but WITHOUT ANY WARRANTY; without even the implied warranty of
8  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9  * GNU General Public License for more details.
10  *
11  * You should have received a copy of the GNU General Public License
12  * along with this program; if not, write to the Free Software
13  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
14  * USA
15  *
16  */
17 
18 #include <fstream>
19 #include <iostream>
20 
21 #include "ns3/test.h"
22 #include "ns3/olsr-helper.h"
23 #include "ns3/ipv4-list-routing-helper.h"
24 #include "ns3/wifi-helper.h"
25 #include "ns3/yans-wifi-helper.h"
26 #include "ns3/nqos-wifi-mac-helper.h"
27 #include "ns3/constant-velocity-mobility-model.h"
28 #include "ns3/mobility-helper.h"
29 #include "ns3/olsr-routing-protocol.h"
30 #include "ns3/internet-stack-helper.h"
31 #include "ns3/log.h"
32 #include "ns3/config.h"
33 #include "ns3/double.h"
34 #include "ns3/string.h"
35 #include "ns3/boolean.h"
36 #include "ns3/ipv4-address-helper.h"
37 #include "ns3/ipv4-interface-container.h"
38 #include "ns3/internet-stack-helper.h"
39 #include "ns3/v4ping-helper.h"
40 #include "ns3/pcap-file.h"
41 #include "ns3/pcap-test.h"
42 #include "ns3/rng-seed-manager.h"
43 
44 #include "bug780-test.h"
45 
46 namespace ns3
47 {
48 namespace olsr
49 {
50 
51 const char * const Bug780Test::PREFIX = "bug780";
52 
53 static void
55 {
58  mobility->SetVelocity (vel);
59 }
60 
61 
63  TestCase ("Test OLSR bug 780"),
64  m_time (Seconds (200.0))
65 {
66 }
67 
69 {
70 }
71 
72 void
74 {
76  RngSeedManager::SetRun (12345);
77  CreateNodes ();
78 
80  Simulator::Run ();
82 
83  CheckResults ();
84 }
85 
86 void
88 {
89  int nWifis = 3;
90  double SimTime = 200.0;
91  std::string phyMode ("DsssRate1Mbps");
92  int64_t streamsUsed = 0;
93 
94  //sending one packets per sec
95  // Fix non-unicast data rate to be the same as that of unicast
96  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold",
97  StringValue ("400"));
98 
99  NodeContainer adhocNodes;
100  adhocNodes.Create (nWifis);
101 
102  WifiHelper wifi;
104  YansWifiChannelHelper wifiChannel;
105  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
106  wifiChannel.AddPropagationLoss ("ns3::FriisPropagationLossModel");
107  Ptr<YansWifiChannel> chan = wifiChannel.Create ();
108  wifiPhy.SetChannel (chan);
109 
110  // Add a non-QoS upper mac, and disable rate control
113  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
114  "DataMode",StringValue (phyMode),
115  "ControlMode",StringValue (phyMode));
116 
117  //set the tx range to 300
118  wifiPhy.Set ("TxPowerStart",DoubleValue (-0.1615));
119  wifiPhy.Set ("TxPowerEnd", DoubleValue (-0.1615));
120 
121  // Set it to adhoc mode
122  wifiMac.SetType ("ns3::AdhocWifiMac");
123  NetDeviceContainer adhocDevices = wifi.Install (wifiPhy, wifiMac, adhocNodes);
124 
125  // Assign fixed stream numbers to wifi and channel random variables
126  streamsUsed += wifi.AssignStreams (adhocDevices, streamsUsed);
127  // Assign 6 streams per Wifi device
128  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (adhocDevices.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, (adhocDevices.GetN () * 6), "Stream assignment mismatch");
132 
133  OlsrHelper olsr;
134 
135  InternetStackHelper internet;
136  internet.SetRoutingHelper (olsr);
137  internet.Install (adhocNodes);
138  streamsUsed += olsr.AssignStreams (adhocNodes, 0);
139  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((adhocDevices.GetN () * 6) + nWifis), "Should have assigned 3 streams");
140 
141  Ipv4AddressHelper addressAdhoc;
142  addressAdhoc.SetBase ("10.1.1.0", "255.255.255.0");
143  Ipv4InterfaceContainer adhocInterfaces;
144  adhocInterfaces = addressAdhoc.Assign (adhocDevices);
145 
146  MobilityHelper mobilityAdhoc;
147 
148  Ptr<ListPositionAllocator> positionAlloc_Adhoc =
149  CreateObject<ListPositionAllocator>();
150  double distance = 0.0;
151  for (uint32_t i = 0; i <= adhocNodes.GetN (); i++)
152  {
153  positionAlloc_Adhoc->Add (Vector (distance,0.0,0.0));
154  distance += 250.0;
155  }
156 
157  mobilityAdhoc.SetMobilityModel ("ns3::ConstantVelocityMobilityModel");
158  mobilityAdhoc.SetPositionAllocator (positionAlloc_Adhoc);
159  mobilityAdhoc.Install (adhocNodes);
160 
161  //At 50 sec node 3 moves towards node 2
162  Simulator::Schedule (Seconds (50.0), &SetVelocity, adhocNodes.Get (2),Vector (-5.0,0.0,0.0));
163  //AT 100 sec set node 3 with zero velocity
164  Simulator::Schedule (Seconds (100.0), &SetVelocity, adhocNodes.Get (2),Vector (0.0,0.0,0.0));
165  //Move node2 away from node 3
166  Simulator::Schedule (Seconds (100.0), &SetVelocity, adhocNodes.Get (1),Vector (5.0,0.0,0.0));
167  //AT 150 sec set node 2 with zero velocity
168  Simulator::Schedule (Seconds (150.0), &SetVelocity, adhocNodes.Get (1), Vector (0.0,0.0,0.0));
169 
170 
171  // Ping 10.1.1.1 -> 10.1.1.2
172  V4PingHelper ping (adhocInterfaces.GetAddress (1));
173  ping.SetAttribute ("Verbose", BooleanValue (true));
174 
175  ApplicationContainer p = ping.Install (adhocNodes.Get (0));
176  p.Start (Seconds (50));
177  p.Stop (Seconds (SimTime) - Seconds (0.001));
178 
179  // pcap
181 }
182 
183 void
185 {
186  for (uint32_t i = 0; i < 2; ++i)
187  {
188  NS_PCAP_TEST_EXPECT_EQ (PREFIX << "-" << i << "-0.pcap");
189  }
190 }
191 
192 } // namespace olsr
193 } // namespace ns3
194