A Discrete-Event Network Simulator
API
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/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
38using namespace ns3;
39
40NS_LOG_COMPONENT_DEFINE ("BriteMPITest");
41
42int
43main (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 (__FILE__);
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
81
82
84
85 if (nix)
86 {
87 Ipv4NixVectorHelper nixRouting;
88 stack.SetRoutingHelper (nixRouting);
89 }
90
92 address.SetBase ("10.0.0.0", "255.255.255.252");
93
94 //build topology as normal but also pass systemCount
95 bth.BuildBriteTopology (stack, systemCount);
96 bth.AssignIpv4Addresses (address);
97
98 NS_LOG_LOGIC ("Number of AS created " << bth.GetNAs ());
99
100 uint16_t port = 5001;
101
102 NodeContainer client;
103 NodeContainer server;
104
105 //For this example will use AS 0 and AS 1 which will be on separate systems
106 //due to the mod divide used to assign AS to system.
107
108 //GetSystemNumberForAs (uint32_t) can be used to determine which system an
109 //AS is assigned to
110 NS_LOG_LOGIC ("AS 0 has been assigned to system " << bth.GetSystemNumberForAs (0));
111 NS_LOG_LOGIC ("As 1 has been assigned to system " << bth.GetSystemNumberForAs (1));
112
113 //install client node on last leaf node of AS 0
114 client.Add (CreateObject<Node> (0));
115 stack.Install (client);
116 int numLeafNodesInAsZero = bth.GetNLeafNodesForAs (0);
117 client.Add (bth.GetLeafNodeForAs (0, numLeafNodesInAsZero - 1));
118
119 //install server node on last leaf node on AS 1
120 server.Add (CreateObject<Node> (1));
121 stack.Install (server);
122 int numLeafNodesInAsOne = bth.GetNLeafNodesForAs (1);
123 server.Add (bth.GetLeafNodeForAs (1, numLeafNodesInAsOne - 1));
124
125 p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
126 p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));
127
128 NetDeviceContainer p2pClientDevices;
129 NetDeviceContainer p2pServerDevices;
130
131 p2pClientDevices = p2p.Install (client);
132 p2pServerDevices = p2p.Install (server);
133
134 address.SetBase ("10.1.0.0", "255.255.0.0");
135 Ipv4InterfaceContainer clientInterfaces;
136 clientInterfaces = address.Assign (p2pClientDevices);
137
138 address.SetBase ("10.2.0.0", "255.255.0.0");
139 Ipv4InterfaceContainer serverInterfaces;
140 serverInterfaces = address.Assign (p2pServerDevices);
141
142 if (!nix)
143 {
144 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
145 }
146
147 //only has two systems in this example. Install applications only on nodes in my system
148
149
150 //Moved here to get totalRX at end
151 ApplicationContainer sinkApps;
152
153 if (systemId == 1)
154 {
155
156 Address sinkLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
157 PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", sinkLocalAddress);
158 sinkApps.Add (packetSinkHelper.Install (server.Get (0)));
159 sinkApps.Start (Seconds (0.0));
160 sinkApps.Stop (Seconds (10.0));
161 }
162
163 if (systemId == 0)
164 {
165 OnOffHelper clientHelper ("ns3::TcpSocketFactory", Address ());
166 clientHelper.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
167 clientHelper.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
168
170 AddressValue remoteAddress (InetSocketAddress (serverInterfaces.GetAddress (0), port));
171 clientHelper.SetAttribute ("Remote", remoteAddress);
172 clientApps.Add (clientHelper.Install (client.Get (0)));
173 clientApps.Start (Seconds (1.0)); // Start 1 second after sink
174 clientApps.Stop (Seconds (9.0)); // Stop before the sink
175 }
176
177 if (!nix)
178 {
179 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
180 }
181
182 if (tracing)
183 {
184 AsciiTraceHelper ascii;
185 p2p.EnableAsciiAll (ascii.CreateFileStream ("briteLeaves.tr"));
186 }
187
188 // Run the simulator
189 Simulator::Stop (Seconds (200.0));
190 Simulator::Run ();
191 Simulator::Destroy ();
192
193 if (systemId == 1)
194 {
195 Ptr<PacketSink> sink1 = DynamicCast<PacketSink> (sinkApps.Get (0));
196 NS_LOG_DEBUG ("Total Bytes Received: " << sink1->GetTotalRx ());
197 }
198
199 MpiInterface::Disable ();
200
201 return 0;
202
203#else
204 NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
205#endif
206}
a polymophic address class
Definition: address.h:91
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:163
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:229
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(NodeContainer other)
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:43
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
uint64_t GetTotalRx() const
Definition: packet-sink.cc:93
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:41
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:88
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
address
Definition: first.py:44
clientApps
Definition: first.py:61
stack
Definition: first.py:41
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:129
void LogComponentEnable(char const *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:361
cmd
Definition: second.py:35
bool tracing
Flag to enable/disable generation of tracing files.
Definition: wifi-bianchi.cc:88