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
brite-MPI-example.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
*/
17
18
#include <string>
19
#include "ns3/core-module.h"
20
#include "ns3/mpi-interface.h"
21
#include "ns3/network-module.h"
22
#include "ns3/internet-module.h"
23
#include "ns3/point-to-point-module.h"
24
#include "ns3/mobility-module.h"
25
#include "ns3/applications-module.h"
26
#include "ns3/brite-module.h"
27
#include "ns3/ipv4-nix-vector-helper.h"
28
29
30
31
#include <iostream>
32
#include <fstream>
33
34
#ifdef NS3_MPI
35
#include <mpi.h>
36
#endif
37
38
using namespace
ns3;
39
40
NS_LOG_COMPONENT_DEFINE
(
"BriteMPITest"
);
41
42
int
43
main
(
int
argc,
char
*argv[])
44
{
45
#ifdef NS3_MPI
46
// Distributed simulation setup
47
MpiInterface::Enable
(&argc, &argv);
48
GlobalValue::Bind
(
"SimulatorImplementationType"
,
49
StringValue
(
"ns3::DistributedSimulatorImpl"
));
50
51
LogComponentEnable
(
"BriteMPITest"
,
LOG_LEVEL_ALL
);
52
LogComponentEnable
(
"TcpSocketBase"
,
LOG_LEVEL_INFO
);
53
54
uint32_t systemId =
MpiInterface::GetSystemId
();
55
uint32_t systemCount =
MpiInterface::GetSize
();
56
57
// Check for valid distributed parameters.
58
// For just this particular example, must have 2 and only 2 Logical Processors (LPs)
59
NS_ASSERT_MSG
(systemCount == 2,
"This demonstration requires 2 and only 2 logical processors."
);
60
61
// BRITE needs a configuration file to build its graph. By default, this
62
// example will use the TD_ASBarabasi_RTWaxman.conf file. There are many others
63
// which can be found in the BRITE/conf_files directory
64
std::string confFile =
"src/brite/examples/conf_files/TD_ASBarabasi_RTWaxman.conf"
;
65
bool
tracing =
false
;
66
bool
nix =
false
;
67
68
CommandLine
cmd;
69
cmd.
AddValue
(
"confFile"
,
"BRITE conf file"
, confFile);
70
cmd.
AddValue
(
"tracing"
,
"Enable or disable ascii tracing"
, tracing);
71
cmd.
AddValue
(
"nix"
,
"Enable or disable nix-vector routing"
, nix);
72
73
cmd.
Parse
(argc,argv);
74
75
// Invoke the BriteTopologyHelper and pass in a BRITE
76
// configuration file and a seed file. This will use
77
// BRITE to build a graph from which we can build the ns-3 topology
78
BriteTopologyHelper
bth (confFile);
79
80
PointToPointHelper
p2p;
81
82
Ipv4StaticRoutingHelper
staticRouting;
83
Ipv4GlobalRoutingHelper
globalRouting;
84
Ipv4ListRoutingHelper
listRouting;
85
Ipv4NixVectorHelper
nixRouting;
86
87
InternetStackHelper
stack;
88
89
if
(nix)
90
{
91
listRouting.
Add
(staticRouting, 0);
92
listRouting.
Add
(nixRouting, 10);
93
}
94
else
95
{
96
listRouting.
Add
(staticRouting, 0);
97
listRouting.
Add
(globalRouting, 10);
98
}
99
100
stack.
SetRoutingHelper
(listRouting);
101
102
Ipv4AddressHelper
address;
103
address.
SetBase
(
"10.0.0.0"
,
"255.255.255.252"
);
104
105
//build topology as normal but also pass systemCount
106
bth.
BuildBriteTopology
(stack, systemCount);
107
bth.
AssignIpv4Addresses
(address);
108
109
NS_LOG_LOGIC
(
"Number of AS created "
<< bth.
GetNAs
());
110
111
uint16_t
port
= 5001;
112
113
NodeContainer
client;
114
NodeContainer
server;
115
116
//For this example will use AS 0 and AS 1 which will be on seperate systems
117
//due to the mod divide used to assign AS to system.
118
119
//GetSystemNumberForAs (uint32_t) can be used to determine which system an
120
//AS is assigned to
121
NS_LOG_LOGIC
(
"AS 0 has been assigned to system "
<< bth.
GetSystemNumberForAs
(0));
122
NS_LOG_LOGIC
(
"As 1 has been assigned to system "
<< bth.
GetSystemNumberForAs
(1));
123
124
//install client node on last leaf node of AS 0
125
client.
Add
(CreateObject<Node> (0));
126
stack.
Install
(client);
127
int
numLeafNodesInAsZero = bth.
GetNLeafNodesForAs
(0);
128
client.
Add
(bth.
GetLeafNodeForAs
(0, numLeafNodesInAsZero - 1));
129
130
//install server node on last leaf node on AS 1
131
server.
Add
(CreateObject<Node> (1));
132
stack.
Install
(server);
133
int
numLeafNodesInAsOne = bth.
GetNLeafNodesForAs
(1);
134
server.
Add
(bth.
GetLeafNodeForAs
(1, numLeafNodesInAsOne - 1));
135
136
p2p.
SetDeviceAttribute
(
"DataRate"
,
StringValue
(
"5Mbps"
));
137
p2p.
SetChannelAttribute
(
"Delay"
,
StringValue
(
"2ms"
));
138
139
NetDeviceContainer
p2pClientDevices;
140
NetDeviceContainer
p2pServerDevices;
141
142
p2pClientDevices = p2p.
Install
(client);
143
p2pServerDevices = p2p.
Install
(server);
144
145
address.
SetBase
(
"10.1.0.0"
,
"255.255.0.0"
);
146
Ipv4InterfaceContainer
clientInterfaces;
147
clientInterfaces = address.
Assign
(p2pClientDevices);
148
149
address.
SetBase
(
"10.2.0.0"
,
"255.255.0.0"
);
150
Ipv4InterfaceContainer
serverInterfaces;
151
serverInterfaces = address.
Assign
(p2pServerDevices);
152
153
if
(!nix)
154
{
155
Ipv4GlobalRoutingHelper::PopulateRoutingTables
();
156
}
157
158
//only has two systems in this example. Install applications only on nodes in my system
159
160
161
//Moved here to get totalRX at end
162
ApplicationContainer
sinkApps;
163
164
if
(systemId == 1)
165
{
166
167
Address
sinkLocalAddress (
InetSocketAddress
(
Ipv4Address::GetAny
(), port));
168
PacketSinkHelper
packetSinkHelper (
"ns3::TcpSocketFactory"
, sinkLocalAddress);
169
sinkApps.
Add
(packetSinkHelper.
Install
(server.
Get
(0)));
170
sinkApps.
Start
(
Seconds
(0.0));
171
sinkApps.
Stop
(
Seconds
(10.0));
172
}
173
174
if
(systemId == 0)
175
{
176
OnOffHelper
clientHelper (
"ns3::TcpSocketFactory"
,
Address
());
177
clientHelper.
SetAttribute
(
"OnTime"
,
StringValue
(
"ns3::ConstantRandomVariable[Constant=1]"
));
178
clientHelper.
SetAttribute
(
"OffTime"
,
StringValue
(
"ns3::ConstantRandomVariable[Constant=0]"
));
179
180
ApplicationContainer
clientApps;
181
AddressValue
remoteAddress (
InetSocketAddress
(serverInterfaces.
GetAddress
(0),
port
));
182
clientHelper.
SetAttribute
(
"Remote"
, remoteAddress);
183
clientApps.
Add
(clientHelper.
Install
(client.
Get
(0)));
184
clientApps.
Start
(
Seconds
(1.0));
// Start 1 second after sink
185
clientApps.
Stop
(
Seconds
(9.0));
// Stop before the sink
186
}
187
188
if
(!nix)
189
{
190
Ipv4GlobalRoutingHelper::PopulateRoutingTables
();
191
}
192
193
if
(tracing)
194
{
195
AsciiTraceHelper
ascii;
196
p2p.
EnableAsciiAll
(ascii.
CreateFileStream
(
"briteLeaves.tr"
));
197
}
198
199
// Run the simulator
200
Simulator::Stop
(
Seconds
(200.0));
201
Simulator::Run
();
202
Simulator::Destroy
();
203
204
if
(systemId == 1)
205
{
206
Ptr<PacketSink>
sink1 = DynamicCast<PacketSink> (sinkApps.
Get
(0));
207
NS_LOG_DEBUG
(
"Total Bytes Received: "
<< sink1->
GetTotalRx
());
208
}
209
210
MpiInterface::Disable
();
211
212
return
0;
213
214
#else
215
NS_FATAL_ERROR
(
"Can't use distributed simulator without MPI compiled in"
);
216
#endif
217
}
src
brite
examples
brite-MPI-example.cc
Generated on Tue May 14 2013 11:08:16 for ns-3 by
1.8.1.2