A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
brite-MPI-example.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012 The Georgia Institute of Technology
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Brian Swenson <bswenson3@gatech.edu>
7 */
8
9#include "Brite.h"
10
11#include "ns3/applications-module.h"
12#include "ns3/brite-module.h"
13#include "ns3/core-module.h"
14#include "ns3/internet-module.h"
15#include "ns3/mobility-module.h"
16#include "ns3/mpi-interface.h"
17#include "ns3/network-module.h"
18#include "ns3/nix-vector-helper.h"
19#include "ns3/point-to-point-module.h"
20
21#include <fstream>
22#include <iostream>
23#include <string>
24
25#ifdef NS3_MPI
26#include <mpi.h>
27#endif
28
29using namespace ns3;
30
31NS_LOG_COMPONENT_DEFINE("BriteMPITest");
32
33int
34main(int argc, char* argv[])
35{
36#ifdef NS3_MPI
37 // Distributed simulation setup
38 MpiInterface::Enable(&argc, &argv);
39 GlobalValue::Bind("SimulatorImplementationType", StringValue("ns3::DistributedSimulatorImpl"));
40
41 LogComponentEnable("BriteMPITest", LOG_LEVEL_ALL);
42 LogComponentEnable("TcpSocketBase", LOG_LEVEL_INFO);
43
45 uint32_t systemCount = MpiInterface::GetSize();
46
47 // Check for valid distributed parameters.
48 // For just this particular example, must have 2 and only 2 Logical Processors (LPs)
49 NS_ASSERT_MSG(systemCount == 2, "This demonstration requires 2 and only 2 logical processors.");
50
51 // BRITE needs a configuration file to build its graph. By default, this
52 // example will use the TD_ASBarabasi_RTWaxman.conf file. There are many others
53 // which can be found in the BRITE/conf_files directory
54 std::string confFile = "src/brite/examples/conf_files/TD_ASBarabasi_RTWaxman.conf";
55 bool tracing = false;
56 bool nix = false;
57
58 CommandLine cmd(__FILE__);
59 cmd.AddValue("confFile", "BRITE conf file", confFile);
60 cmd.AddValue("tracing", "Enable or disable ascii tracing", tracing);
61 cmd.AddValue("nix", "Enable or disable nix-vector routing", nix);
62
63 cmd.Parse(argc, argv);
64
65 // Invoke the BriteTopologyHelper and pass in a BRITE
66 // configuration file and a seed file. This will use
67 // BRITE to build a graph from which we can build the ns-3 topology
68 BriteTopologyHelper bth(confFile);
69
71
73
74 if (nix)
75 {
77 stack.SetRoutingHelper(nixRouting);
78 }
79
81 address.SetBase("10.0.0.0", "255.255.255.252");
82
83 // build topology as normal but also pass systemCount
84 bth.BuildBriteTopology(stack, systemCount);
85 bth.AssignIpv4Addresses(address);
86
87 NS_LOG_LOGIC("Number of AS created " << bth.GetNAs());
88
89 uint16_t port = 5001;
90
93
94 // For this example will use AS 0 and AS 1 which will be on separate systems
95 // due to the mod divide used to assign AS to system.
96
97 // GetSystemNumberForAs (uint32_t) can be used to determine which system an
98 // AS is assigned to
99 NS_LOG_LOGIC("AS 0 has been assigned to system " << bth.GetSystemNumberForAs(0));
100 NS_LOG_LOGIC("As 1 has been assigned to system " << bth.GetSystemNumberForAs(1));
101
102 // install client node on last leaf node of AS 0
104 stack.Install(client);
105 int numLeafNodesInAsZero = bth.GetNLeafNodesForAs(0);
106 client.Add(bth.GetLeafNodeForAs(0, numLeafNodesInAsZero - 1));
107
108 // install server node on last leaf node on AS 1
110 stack.Install(server);
111 int numLeafNodesInAsOne = bth.GetNLeafNodesForAs(1);
112 server.Add(bth.GetLeafNodeForAs(1, numLeafNodesInAsOne - 1));
113
114 p2p.SetDeviceAttribute("DataRate", StringValue("5Mbps"));
115 p2p.SetChannelAttribute("Delay", StringValue("2ms"));
116
119
120 p2pClientDevices = p2p.Install(client);
121 p2pServerDevices = p2p.Install(server);
122
123 address.SetBase("10.1.0.0", "255.255.0.0");
125 clientInterfaces = address.Assign(p2pClientDevices);
126
127 address.SetBase("10.2.0.0", "255.255.0.0");
129 serverInterfaces = address.Assign(p2pServerDevices);
130
131 if (!nix)
132 {
134 }
135
136 // only has two systems in this example. Install applications only on nodes in my system
137
138 // Moved here to get totalRX at end
139 ApplicationContainer sinkApps;
140
141 if (systemId == 1)
142 {
144 PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", sinkLocalAddress);
145 sinkApps.Add(packetSinkHelper.Install(server.Get(0)));
146 sinkApps.Start(Seconds(0.0));
147 sinkApps.Stop(Seconds(10.0));
148 }
149
150 if (systemId == 0)
151 {
152 OnOffHelper clientHelper("ns3::TcpSocketFactory", Address());
153 clientHelper.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
154 clientHelper.SetAttribute("OffTime",
155 StringValue("ns3::ConstantRandomVariable[Constant=0]"));
156
159 clientHelper.SetAttribute("Remote", remoteAddress);
160 clientApps.Add(clientHelper.Install(client.Get(0)));
161 clientApps.Start(Seconds(1.0)); // Start 1 second after sink
162 clientApps.Stop(Seconds(9.0)); // Stop before the sink
163 }
164
165 if (!nix)
166 {
168 }
169
170 if (tracing)
171 {
172 AsciiTraceHelper ascii;
173 p2p.EnableAsciiAll(ascii.CreateFileStream("briteLeaves.tr"));
174 }
175
176 // Run the simulator
177 Simulator::Stop(Seconds(200.0));
180
181 if (systemId == 1)
182 {
183 Ptr<PacketSink> sink1 = DynamicCast<PacketSink>(sinkApps.Get(0));
184 NS_LOG_DEBUG("Total Bytes Received: " << sink1->GetTotalRx());
185 }
186
188
189 return 0;
190
191#else
192 NS_FATAL_ERROR("Can't use distributed simulator without MPI compiled in");
193#endif
194}
a polymophic address class
Definition address.h:90
holds a vector of ns3::Application pointers.
void Start(Time start) const
Start all of the Applications in this container at the start time given as a parameter.
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
void Stop(Time stop) const
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container.
Manage ASCII trace files for device models.
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.
static void Bind(std::string name, const AttributeValue &value)
Iterate over the set of GlobalValues until a matching name is found and then set its value with Globa...
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.
static Ipv4Address GetAny()
static void PopulateRoutingTables()
Build a routing database and initialize the routing tables of the nodes in the simulation.
holds a vector of std::pair of Ptr<Ipv4> and interface index.
static uint32_t GetSystemId()
Get the id number of this rank.
static uint32_t GetSize()
Get the number of ranks used by ns-3.
static void Disable()
Clean up the ns-3 parallel communications interface.
static void Enable(int *pargc, char ***pargv)
Setup the parallel communication interface.
holds a vector of ns3::NetDevice pointers
Helper class that adds Nix-vector routing to nodes.
keep track of a set of node pointers.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
Build a set of PointToPointNetDevice objects.
Smart pointer class similar to boost::intrusive_ptr.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:131
static void Run()
Run the simulation.
Definition simulator.cc:167
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition simulator.cc:175
Hold variables of type string.
Definition string.h:45
uint16_t port
Definition dsdv-manet.cc:33
#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:75
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition log.h:257
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition log.h:271
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:619
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1308
address
Definition first.py:36
clientApps
Definition first.py:53
stack
Definition first.py:33
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void LogComponentEnable(const std::string &name, LogLevel level)
Enable the logging output associated with that log component.
Definition log.cc:291
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
Definition ptr.h:580
@ LOG_LEVEL_ALL
Print everything.
Definition log.h:105
@ LOG_LEVEL_INFO
LOG_INFO and above.
Definition log.h:93
bool tracing
Flag to enable/disable generation of tracing files.