A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Portuguese
Docs ▼
Wiki
Manual
Models
Develop ▼
API
Bugs
API
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
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];
122
TopologyReader::ConstLinksIterator
iter;
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
();
200
Simulator::Destroy
();
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
}
src
topology-read
examples
topology-example-sim.cc
Generated on Tue May 14 2013 11:08:33 for ns-3 by
1.8.1.2