A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
topology-example-sim.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License version 2 as
5  * published by the Free Software Foundation;
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15  *
16  * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
17  * Author: Valerio Sartini <valesar@gmail.com>
18  *
19  * This program conducts a simple experiment: It builds up a topology based on
20  * either Inet or Orbis trace files. A random node is then chosen, and all the
21  * other nodes will send a packet to it. The TTL is measured and reported as an histogram.
22  *
23  */
24 
25 #include <ctime>
26 
27 #include <sstream>
28 
29 #include "ns3/core-module.h"
30 #include "ns3/network-module.h"
31 #include "ns3/internet-module.h"
32 #include "ns3/point-to-point-module.h"
33 #include "ns3/applications-module.h"
34 #include "ns3/ipv4-static-routing-helper.h"
35 #include "ns3/ipv4-list-routing-helper.h"
36 #include "ns3/ipv4-nix-vector-helper.h"
37 
38 #include "ns3/topology-read-module.h"
39 #include <list>
40 
41 using namespace ns3;
42 
43 NS_LOG_COMPONENT_DEFINE ("TopologyCreationExperiment");
44 
45 
46 static std::list<unsigned int> data;
47 
48 static void SinkRx (Ptr<const Packet> p, const Address &ad)
49 {
50  Ipv4Header ipv4;
51  p->PeekHeader (ipv4);
52  std::cout << "TTL: " << (unsigned)ipv4.GetTtl () << std::endl;
53 }
54 
55 
56 // ----------------------------------------------------------------------
57 // -- main
58 // ----------------------------------------------
59 int main (int argc, char *argv[])
60 {
61 
62  std::string format ("Inet");
63  std::string input ("src/topology-read/examples/Inet_small_toposample.txt");
64 
65  // Set up command line parameters used to control the experiment.
66  CommandLine cmd;
67  cmd.AddValue ("format", "Format to use for data input [Orbis|Inet|Rocketfuel].",
68  format);
69  cmd.AddValue ("input", "Name of the input file.",
70  input);
71  cmd.Parse (argc, argv);
72 
73 
74  // ------------------------------------------------------------
75  // -- Read topology data.
76  // --------------------------------------------
77 
78  // Pick a topology reader based in the requested format.
79  TopologyReaderHelper topoHelp;
80  topoHelp.SetFileName (input);
81  topoHelp.SetFileType (format);
82  Ptr<TopologyReader> inFile = topoHelp.GetTopologyReader ();
83 
84  NodeContainer nodes;
85 
86  if (inFile != 0)
87  {
88  nodes = inFile->Read ();
89  }
90 
91  if (inFile->LinksSize () == 0)
92  {
93  NS_LOG_ERROR ("Problems reading the topology file. Failing.");
94  return -1;
95  }
96 
97  // ------------------------------------------------------------
98  // -- Create nodes and network stacks
99  // --------------------------------------------
100  NS_LOG_INFO ("creating internet stack");
101  InternetStackHelper stack;
102 
103  // Setup NixVector Routing
104  Ipv4NixVectorHelper nixRouting;
105  Ipv4StaticRoutingHelper staticRouting;
106 
107  Ipv4ListRoutingHelper listRH;
108  listRH.Add (staticRouting, 0);
109  listRH.Add (nixRouting, 10);
110 
111  stack.SetRoutingHelper (listRH); // has effect on the next Install ()
112  stack.Install (nodes);
113 
114  NS_LOG_INFO ("creating ip4 addresses");
115  Ipv4AddressHelper address;
116  address.SetBase ("10.0.0.0", "255.255.255.252");
117 
118  int totlinks = inFile->LinksSize ();
119 
120  NS_LOG_INFO ("creating node containers");
121  NodeContainer* nc = new NodeContainer[totlinks];
123  int i = 0;
124  for ( iter = inFile->LinksBegin (); iter != inFile->LinksEnd (); iter++, i++ )
125  {
126  nc[i] = NodeContainer (iter->GetFromNode (), iter->GetToNode ());
127  }
128 
129  NS_LOG_INFO ("creating net device containers");
130  NetDeviceContainer* ndc = new NetDeviceContainer[totlinks];
131  PointToPointHelper p2p;
132  for (int i = 0; i < totlinks; i++)
133  {
134  // p2p.SetChannelAttribute ("Delay", TimeValue(MilliSeconds(weight[i])));
135  p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));
136  p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
137  ndc[i] = p2p.Install (nc[i]);
138  }
139 
140  // it crates little subnets, one for each couple of nodes.
141  NS_LOG_INFO ("creating ipv4 interfaces");
142  Ipv4InterfaceContainer* ipic = new Ipv4InterfaceContainer[totlinks];
143  for (int i = 0; i < totlinks; i++)
144  {
145  ipic[i] = address.Assign (ndc[i]);
146  address.NewNetwork ();
147  }
148 
149 
150  uint32_t totalNodes = nodes.GetN ();
151  Ptr<UniformRandomVariable> unifRandom = CreateObject<UniformRandomVariable> ();
152  unifRandom->SetAttribute ("Min", DoubleValue (0));
153  unifRandom->SetAttribute ("Max", DoubleValue (totalNodes - 1));
154 
155  unsigned int randomServerNumber = unifRandom->GetInteger (0, totalNodes - 1);
156 
157  Ptr<Node> randomServerNode = nodes.Get (randomServerNumber);
158  Ptr<Ipv4> ipv4Server = randomServerNode->GetObject<Ipv4> ();
159  Ipv4InterfaceAddress iaddrServer = ipv4Server->GetAddress (1,0);
160  Ipv4Address ipv4AddrServer = iaddrServer.GetLocal ();
161 
162  // ------------------------------------------------------------
163  // -- Send around packets to check the ttl
164  // --------------------------------------------
165  Config::SetDefault ("ns3::Ipv4RawSocketImpl::Protocol", StringValue ("2"));
166  InetSocketAddress dst = InetSocketAddress ( ipv4AddrServer );
167 
168  OnOffHelper onoff = OnOffHelper ("ns3::Ipv4RawSocketFactory", dst);
169  onoff.SetConstantRate (DataRate (15000));
170  onoff.SetAttribute ("PacketSize", UintegerValue (1200));
171 
172  NodeContainer clientNodes;
173  for ( unsigned int i = 0; i < nodes.GetN (); i++ )
174  {
175  if (i != randomServerNumber )
176  {
177  Ptr<Node> clientNode = nodes.Get (i);
178  clientNodes.Add (clientNode);
179  }
180  }
181 
182  ApplicationContainer apps = onoff.Install (clientNodes);
183  apps.Start (Seconds (1.0));
184  apps.Stop (Seconds (2.0));
185 
186  PacketSinkHelper sink = PacketSinkHelper ("ns3::Ipv4RawSocketFactory", dst);
187  apps = sink.Install (randomServerNode);
188  apps.Start (Seconds (0.0));
189  apps.Stop (Seconds (3.0));
190 
191  // we trap the packet sink receiver to extract the TTL.
192  Config::ConnectWithoutContext ("/NodeList/*/ApplicationList/*/$ns3::PacketSink/Rx",
193  MakeCallback (&SinkRx));
194 
195  // ------------------------------------------------------------
196  // -- Run the simulation
197  // --------------------------------------------
198  NS_LOG_INFO ("Run Simulation.");
199  Simulator::Run ();
201 
202  delete[] ipic;
203  delete[] ndc;
204  delete[] nc;
205 
206  NS_LOG_INFO ("Done.");
207 
208  return 0;
209 
210  // end main
211 }