A Discrete-Event Network Simulator
API
brite-MPI-example.cc
Go to the documentation of this file.
1/*
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 USA
14 *
15 */
16
17#include "ns3/applications-module.h"
18#include "ns3/brite-module.h"
19#include "ns3/core-module.h"
20#include "ns3/internet-module.h"
21#include "ns3/mobility-module.h"
22#include "ns3/mpi-interface.h"
23#include "ns3/network-module.h"
24#include "ns3/nix-vector-helper.h"
25#include "ns3/point-to-point-module.h"
26
27#include <fstream>
28#include <iostream>
29#include <string>
30
31#ifdef NS3_MPI
32#include <mpi.h>
33#endif
34
35using namespace ns3;
36
37NS_LOG_COMPONENT_DEFINE("BriteMPITest");
38
39int
40main(int argc, char* argv[])
41{
42#ifdef NS3_MPI
43 // Distributed simulation setup
44 MpiInterface::Enable(&argc, &argv);
45 GlobalValue::Bind("SimulatorImplementationType", StringValue("ns3::DistributedSimulatorImpl"));
46
47 LogComponentEnable("BriteMPITest", LOG_LEVEL_ALL);
48 LogComponentEnable("TcpSocketBase", LOG_LEVEL_INFO);
49
50 uint32_t systemId = MpiInterface::GetSystemId();
51 uint32_t systemCount = MpiInterface::GetSize();
52
53 // Check for valid distributed parameters.
54 // For just this particular example, must have 2 and only 2 Logical Processors (LPs)
55 NS_ASSERT_MSG(systemCount == 2, "This demonstration requires 2 and only 2 logical processors.");
56
57 // BRITE needs a configuration file to build its graph. By default, this
58 // example will use the TD_ASBarabasi_RTWaxman.conf file. There are many others
59 // which can be found in the BRITE/conf_files directory
60 std::string confFile = "src/brite/examples/conf_files/TD_ASBarabasi_RTWaxman.conf";
61 bool tracing = false;
62 bool nix = false;
63
64 CommandLine cmd(__FILE__);
65 cmd.AddValue("confFile", "BRITE conf file", confFile);
66 cmd.AddValue("tracing", "Enable or disable ascii tracing", tracing);
67 cmd.AddValue("nix", "Enable or disable nix-vector routing", nix);
68
69 cmd.Parse(argc, argv);
70
71 // Invoke the BriteTopologyHelper and pass in a BRITE
72 // configuration file and a seed file. This will use
73 // BRITE to build a graph from which we can build the ns-3 topology
74 BriteTopologyHelper bth(confFile);
75
77
79
80 if (nix)
81 {
82 Ipv4NixVectorHelper nixRouting;
83 stack.SetRoutingHelper(nixRouting);
84 }
85
87 address.SetBase("10.0.0.0", "255.255.255.252");
88
89 // build topology as normal but also pass systemCount
90 bth.BuildBriteTopology(stack, systemCount);
91 bth.AssignIpv4Addresses(address);
92
93 NS_LOG_LOGIC("Number of AS created " << bth.GetNAs());
94
95 uint16_t port = 5001;
96
97 NodeContainer client;
98 NodeContainer server;
99
100 // For this example will use AS 0 and AS 1 which will be on separate systems
101 // due to the mod divide used to assign AS to system.
102
103 // GetSystemNumberForAs (uint32_t) can be used to determine which system an
104 // AS is assigned to
105 NS_LOG_LOGIC("AS 0 has been assigned to system " << bth.GetSystemNumberForAs(0));
106 NS_LOG_LOGIC("As 1 has been assigned to system " << bth.GetSystemNumberForAs(1));
107
108 // install client node on last leaf node of AS 0
109 client.Add(CreateObject<Node>(0));
110 stack.Install(client);
111 int numLeafNodesInAsZero = bth.GetNLeafNodesForAs(0);
112 client.Add(bth.GetLeafNodeForAs(0, numLeafNodesInAsZero - 1));
113
114 // install server node on last leaf node on AS 1
115 server.Add(CreateObject<Node>(1));
116 stack.Install(server);
117 int numLeafNodesInAsOne = bth.GetNLeafNodesForAs(1);
118 server.Add(bth.GetLeafNodeForAs(1, numLeafNodesInAsOne - 1));
119
120 p2p.SetDeviceAttribute("DataRate", StringValue("5Mbps"));
121 p2p.SetChannelAttribute("Delay", StringValue("2ms"));
122
123 NetDeviceContainer p2pClientDevices;
124 NetDeviceContainer p2pServerDevices;
125
126 p2pClientDevices = p2p.Install(client);
127 p2pServerDevices = p2p.Install(server);
128
129 address.SetBase("10.1.0.0", "255.255.0.0");
130 Ipv4InterfaceContainer clientInterfaces;
131 clientInterfaces = address.Assign(p2pClientDevices);
132
133 address.SetBase("10.2.0.0", "255.255.0.0");
134 Ipv4InterfaceContainer serverInterfaces;
135 serverInterfaces = address.Assign(p2pServerDevices);
136
137 if (!nix)
138 {
139 Ipv4GlobalRoutingHelper::PopulateRoutingTables();
140 }
141
142 // only has two systems in this example. Install applications only on nodes in my system
143
144 // Moved here to get totalRX at end
145 ApplicationContainer sinkApps;
146
147 if (systemId == 1)
148 {
149 Address sinkLocalAddress(InetSocketAddress(Ipv4Address::GetAny(), port));
150 PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", sinkLocalAddress);
151 sinkApps.Add(packetSinkHelper.Install(server.Get(0)));
152 sinkApps.Start(Seconds(0.0));
153 sinkApps.Stop(Seconds(10.0));
154 }
155
156 if (systemId == 0)
157 {
158 OnOffHelper clientHelper("ns3::TcpSocketFactory", Address());
159 clientHelper.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
160 clientHelper.SetAttribute("OffTime",
161 StringValue("ns3::ConstantRandomVariable[Constant=0]"));
162
164 AddressValue remoteAddress(InetSocketAddress(serverInterfaces.GetAddress(0), port));
165 clientHelper.SetAttribute("Remote", remoteAddress);
166 clientApps.Add(clientHelper.Install(client.Get(0)));
167 clientApps.Start(Seconds(1.0)); // Start 1 second after sink
168 clientApps.Stop(Seconds(9.0)); // Stop before the sink
169 }
170
171 if (!nix)
172 {
173 Ipv4GlobalRoutingHelper::PopulateRoutingTables();
174 }
175
176 if (tracing)
177 {
178 AsciiTraceHelper ascii;
179 p2p.EnableAsciiAll(ascii.CreateFileStream("briteLeaves.tr"));
180 }
181
182 // Run the simulator
183 Simulator::Stop(Seconds(200.0));
184 Simulator::Run();
185 Simulator::Destroy();
186
187 if (systemId == 1)
188 {
189 Ptr<PacketSink> sink1 = DynamicCast<PacketSink>(sinkApps.Get(0));
190 NS_LOG_DEBUG("Total Bytes Received: " << sink1->GetTotalRx());
191 }
192
193 MpiInterface::Disable();
194
195 return 0;
196
197#else
198 NS_FATAL_ERROR("Can't use distributed simulator without MPI compiled in");
199#endif
200}
a polymophic address class
Definition: address.h:92
AttributeValue implementation for Address.
holds a vector of ns3::Application pointers.
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter.
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
void EnableAsciiAll(std::string prefix)
Enable ascii trace output on each device (which is of the appropriate type) in the set of all nodes c...
Manage ASCII trace files for device models.
Definition: trace-helper.h:173
Ptr< OutputStreamWrapper > CreateFileStream(std::string filename, std::ios::openmode filemode=std::ios::out)
Create and initialize an output stream object we'll use to write the traced bits.
Interface with BRITE, the Boston university Representative Internet Topology gEnerator.
Parse command-line arguments.
Definition: command-line.h:232
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
holds a vector of ns3::NetDevice pointers
Helper class that adds Nix-vector routing to nodes.
keep track of a set of node pointers.
void Add(const NodeContainer &nc)
Append the contents of another NodeContainer to the end of this container.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:44
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
uint64_t GetTotalRx() const
Definition: packet-sink.cc:96
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
NetDeviceContainer Install(NodeContainer c)
Hold variables of type string.
Definition: string.h:42
uint16_t port
Definition: dsdv-manet.cc:45
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:86
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:160
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:268
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:282
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1338
address
Definition: first.py:40
clientApps
Definition: first.py:58
stack
Definition: first.py:37
Every class exported by the ns3 library is enclosed in the ns3 namespace.
@ LOG_LEVEL_ALL
Print everything.
Definition: log.h:116
@ LOG_LEVEL_INFO
LOG_INFO and above.
Definition: log.h:107
uint32_t GetSize(Ptr< const Packet > packet, const WifiMacHeader *hdr, bool isAmpdu)
Return the total size of the packet after WifiMacHeader and FCS trailer have been added.
Definition: wifi-utils.cc:132
void LogComponentEnable(const char *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:358
cmd
Definition: second.py:33
bool tracing
Flag to enable/disable generation of tracing files.