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
third-distributed.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
#include "ns3/core-module.h"
18
#include "ns3/network-module.h"
19
#include "ns3/wifi-module.h"
20
#include "ns3/mobility-module.h"
21
#include "ns3/mpi-interface.h"
22
#include "ns3/ipv4-global-routing-helper.h"
23
#include "ns3/udp-echo-helper.h"
24
#include "ns3/point-to-point-helper.h"
25
#include "ns3/csma-helper.h"
26
#include "ns3/internet-stack-helper.h"
27
#include "ns3/ipv4-address-helper.h"
28
#include "ns3/ipv4-interface-container.h"
29
30
#ifdef NS3_MPI
31
#include <mpi.h>
32
#endif
33
34
// Default Network Topology (same as third.cc from tutorial)
35
// Distributed simulation, split along the p2p link
36
// Number of wifi or csma nodes can be increased up to 250
37
//
38
// Wifi 10.1.3.0
39
// AP
40
// * * * *
41
// | | | | 10.1.1.0
42
// n5 n6 n7 n0 -------------- n1 n2 n3 n4
43
// point-to-point | | | |
44
// ================
45
// | LAN 10.1.2.0
46
// |
47
// Rank 0 | Rank 1
48
// -------------------------|----------------------------
49
50
using namespace
ns3;
51
52
NS_LOG_COMPONENT_DEFINE
(
"ThirdExampleDistributed"
);
53
54
int
55
main
(
int
argc,
char
*argv[])
56
{
57
#ifdef NS3_MPI
58
// Distributed simulation setup
59
MpiInterface::Enable
(&argc, &argv);
60
GlobalValue::Bind
(
"SimulatorImplementationType"
,
61
StringValue
(
"ns3::DistributedSimulatorImpl"
));
62
63
uint32_t systemId =
MpiInterface::GetSystemId
();
64
uint32_t systemCount =
MpiInterface::GetSize
();
65
66
// Check for valid distributed parameters.
67
// Must have 2 and only 2 Logical Processors (LPs)
68
if
(systemCount != 2)
69
{
70
std::cout <<
"This simulation requires 2 and only 2 logical processors."
<< std::endl;
71
return
1;
72
}
73
74
bool
verbose
=
true
;
75
uint32_t nCsma = 3;
76
uint32_t nWifi = 3;
77
bool
tracing =
false
;
78
79
CommandLine
cmd;
80
cmd.
AddValue
(
"nCsma"
,
"Number of \"extra\" CSMA nodes/devices"
, nCsma);
81
cmd.
AddValue
(
"nWifi"
,
"Number of wifi STA devices"
, nWifi);
82
cmd.
AddValue
(
"verbose"
,
"Tell echo applications to log if true"
, verbose);
83
cmd.
AddValue
(
"tracing"
,
"Enable pcap tracing"
, tracing);
84
cmd.
Parse
(argc,argv);
85
86
// Check for valid number of csma or wifi nodes
87
// 250 should be enough, otherwise IP addresses
88
// soon become an issue
89
if
(nWifi > 250 || nCsma > 250)
90
{
91
std::cout <<
"Too many wifi or csma nodes, max 200 each."
<< std::endl;
92
return
1;
93
}
94
95
if
(verbose)
96
{
97
LogComponentEnable
(
"UdpEchoClientApplication"
,
LOG_LEVEL_INFO
);
98
LogComponentEnable
(
"UdpEchoServerApplication"
,
LOG_LEVEL_INFO
);
99
}
100
101
NodeContainer
p2pNodes;
102
Ptr<Node>
p2pNode1 = CreateObject<Node> (0);
// Create node with rank 0
103
Ptr<Node>
p2pNode2 = CreateObject<Node> (1);
// Create node with rank 1
104
p2pNodes.
Add
(p2pNode1);
105
p2pNodes.
Add
(p2pNode2);
106
107
PointToPointHelper
pointToPoint;
108
pointToPoint.
SetDeviceAttribute
(
"DataRate"
,
StringValue
(
"5Mbps"
));
109
pointToPoint.
SetChannelAttribute
(
"Delay"
,
StringValue
(
"2ms"
));
110
111
NetDeviceContainer
p2pDevices;
112
p2pDevices = pointToPoint.
Install
(p2pNodes);
113
114
NodeContainer
csmaNodes;
115
csmaNodes.
Add
(p2pNodes.
Get
(1));
116
csmaNodes.
Create
(nCsma, 1);
// Create csma nodes with rank 1
117
118
CsmaHelper
csma;
119
csma.
SetChannelAttribute
(
"DataRate"
,
StringValue
(
"100Mbps"
));
120
csma.
SetChannelAttribute
(
"Delay"
,
TimeValue
(
NanoSeconds
(6560)));
121
122
NetDeviceContainer
csmaDevices;
123
csmaDevices = csma.
Install
(csmaNodes);
124
125
NodeContainer
wifiStaNodes;
126
wifiStaNodes.
Create
(nWifi, 0);
// Create wifi nodes with rank 0
127
NodeContainer
wifiApNode = p2pNodes.
Get
(0);
128
129
YansWifiChannelHelper
channel =
YansWifiChannelHelper::Default
();
130
YansWifiPhyHelper
phy =
YansWifiPhyHelper::Default
();
131
phy.
SetChannel
(channel.
Create
());
132
133
WifiHelper
wifi =
WifiHelper::Default
();
134
wifi.
SetRemoteStationManager
(
"ns3::AarfWifiManager"
);
135
136
NqosWifiMacHelper
mac =
NqosWifiMacHelper::Default
();
137
138
Ssid
ssid =
Ssid
(
"ns-3-ssid"
);
139
mac.
SetType
(
"ns3::StaWifiMac"
,
140
"Ssid"
,
SsidValue
(ssid),
141
"ActiveProbing"
,
BooleanValue
(
false
));
142
143
NetDeviceContainer
staDevices;
144
staDevices = wifi.
Install
(phy, mac, wifiStaNodes);
145
146
mac.
SetType
(
"ns3::ApWifiMac"
,
147
"Ssid"
,
SsidValue
(ssid));
148
149
NetDeviceContainer
apDevices;
150
apDevices = wifi.
Install
(phy, mac, wifiApNode);
151
152
MobilityHelper
mobility;
153
154
mobility.
SetPositionAllocator
(
"ns3::GridPositionAllocator"
,
155
"MinX"
,
DoubleValue
(0.0),
156
"MinY"
,
DoubleValue
(0.0),
157
"DeltaX"
,
DoubleValue
(5.0),
158
"DeltaY"
,
DoubleValue
(5.0),
159
"GridWidth"
,
UintegerValue
(10),
160
"LayoutType"
,
StringValue
(
"RowFirst"
));
161
162
mobility.
SetMobilityModel
(
"ns3::RandomWalk2dMobilityModel"
,
163
"Bounds"
,
RectangleValue
(
Rectangle
(-250, 250, -250, 250)));
164
mobility.
Install
(wifiStaNodes);
165
166
mobility.
SetMobilityModel
(
"ns3::ConstantPositionMobilityModel"
);
167
mobility.
Install
(wifiApNode);
168
169
InternetStackHelper
stack;
170
stack.
Install
(csmaNodes);
171
stack.
Install
(wifiApNode);
172
stack.
Install
(wifiStaNodes);
173
174
Ipv4AddressHelper
address;
175
176
address.
SetBase
(
"10.1.1.0"
,
"255.255.255.0"
);
177
Ipv4InterfaceContainer
p2pInterfaces;
178
p2pInterfaces = address.
Assign
(p2pDevices);
179
180
address.
SetBase
(
"10.1.2.0"
,
"255.255.255.0"
);
181
Ipv4InterfaceContainer
csmaInterfaces;
182
csmaInterfaces = address.
Assign
(csmaDevices);
183
184
address.
SetBase
(
"10.1.3.0"
,
"255.255.255.0"
);
185
address.
Assign
(staDevices);
186
address.
Assign
(apDevices);
187
188
// If this simulator has system id 1, then
189
// it should contain the server application,
190
// since it is on one of the csma nodes
191
if
(systemId == 1)
192
{
193
UdpEchoServerHelper
echoServer (9);
194
ApplicationContainer
serverApps = echoServer.
Install
(csmaNodes.
Get
(nCsma));
195
serverApps.
Start
(
Seconds
(1.0));
196
serverApps.
Stop
(
Seconds
(10.0));
197
}
198
199
// If the simulator has system id 0, then
200
// it should contain the client application,
201
// since it is on one of the wifi nodes
202
if
(systemId == 0)
203
{
204
UdpEchoClientHelper
echoClient (csmaInterfaces.
GetAddress
(nCsma), 9);
205
echoClient.
SetAttribute
(
"MaxPackets"
,
UintegerValue
(1));
206
echoClient.SetAttribute (
"Interval"
,
TimeValue
(
Seconds
(1.)));
207
echoClient.SetAttribute (
"PacketSize"
,
UintegerValue
(1024));
208
209
ApplicationContainer
clientApps =
210
echoClient.Install (wifiStaNodes.
Get
(nWifi - 1));
211
clientApps.
Start
(
Seconds
(2.0));
212
clientApps.
Stop
(
Seconds
(10.0));
213
}
214
215
Ipv4GlobalRoutingHelper::PopulateRoutingTables
();
216
217
Simulator::Stop
(
Seconds
(10.0));
218
219
if
(tracing ==
true
)
220
{
221
// Depending on the system Id (rank), the pcap information
222
// traced will be different. For example, the ethernet pcap
223
// will be empty for rank0, since these nodes are placed on
224
// on rank 1. All ethernet traffic will take place on rank 1.
225
// Similar differences are seen in the p2p and wirless pcaps.
226
if
(systemId == 0)
227
{
228
pointToPoint.
EnablePcapAll
(
"third-distributed-rank0"
);
229
phy.
EnablePcap
(
"third-distributed-rank0"
, apDevices.
Get
(0));
230
csma.
EnablePcap
(
"third-distributed-rank0"
, csmaDevices.
Get
(0),
true
);
231
}
232
else
233
{
234
pointToPoint.
EnablePcapAll
(
"third-distributed-rank1"
);
235
phy.
EnablePcap
(
"third-distributed-rank1"
, apDevices.
Get
(0));
236
csma.
EnablePcap
(
"third-distributed-rank1"
, csmaDevices.
Get
(0),
true
);
237
}
238
}
239
240
Simulator::Run
();
241
Simulator::Destroy
();
242
// Exit the MPI execution environment
243
MpiInterface::Disable
();
244
return
0;
245
246
#else
247
NS_FATAL_ERROR
(
"Can't use distributed simulator without MPI compiled in"
);
248
#endif
249
}
src
mpi
examples
third-distributed.cc
Generated on Tue Nov 13 2012 10:32:19 for ns-3 by
1.8.1.2