A Discrete-Event Network Simulator
API
 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 
81 
82  Ipv4StaticRoutingHelper staticRouting;
83  Ipv4GlobalRoutingHelper globalRouting;
84  Ipv4ListRoutingHelper listRouting;
85  Ipv4NixVectorHelper nixRouting;
86 
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 
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  {
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 
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  {
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 ();
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 
211 
212  return 0;
213 
214 #else
215  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
216 #endif
217 }
holds a vector of ns3::Application pointers.
Manage ASCII trace files for device models.
Definition: trace-helper.h:128
an Inet address class
static Ipv4Address GetAny(void)
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
uint32_t GetNLeafNodesForAs(uint32_t asNum)
Returns the number of router leaf nodes for a given AS.
NS_LOG_COMPONENT_DEFINE("GrantedTimeWindowMpiInterface")
holds a vector of std::pair of Ptr and interface index.
static void PopulateRoutingTables(void)
Build a routing database and initialize the routing tables of the nodes in the simulation.
hold variables of type string
Definition: string.h:19
NetDeviceContainer Install(NodeContainer c)
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container. ...
static void Run(void)
Run the simulation until one of:
Definition: simulator.cc:157
uint32_t GetNAs(void) const
Returns the number of AS created in the topology.
Helper class that adds Nix-vector routing to nodes.
aggregate IP/TCP/UDP functionality to existing Nodes.
Interface with BRITE, the Boston university Representative Internet Topology gEnerator.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes...
static void Disable()
Terminates the parallel environment.
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. ...
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.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:42
#define NS_FATAL_ERROR(msg)
fatal error handling
Definition: fatal-error.h:72
uint16_t port
Definition: dsdv-manet.cc:44
a polymophic address class
Definition: address.h:86
tuple clientApps
Definition: first.py:53
static void Enable(int *pargc, char ***pargv)
Sets up parallel communication interface.
void AssignIpv4Addresses(Ipv4AddressHelper &address)
holds a vector of ns3::NetDevice pointers
static void Bind(std::string name, const AttributeValue &value)
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
Parse command-line arguments.
Definition: command-line.h:152
#define NS_LOG_LOGIC(msg)
Definition: log.h:368
static void Destroy(void)
Every event scheduled by the Simulator::insertAtDestroy method is invoked.
Definition: simulator.cc:121
keep track of a set of node pointers.
Ptr< Application > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
void Add(const Ipv4RoutingHelper &routing, int16_t priority)
uint32_t GetTotalRx() const
Definition: packet-sink.cc:74
tuple stack
Definition: first.py:34
int main(int argc, char *argv[])
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
#define NS_ASSERT_MSG(condition, message)
Definition: assert.h:86
hold objects of type ns3::Address
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter...
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
void Add(NodeContainer other)
Append the contents of another NodeContainer to the end of this container.
uint32_t GetSystemNumberForAs(uint32_t asNum) const
Returns the system number for the MPI instance that this AS is assigned to.
static uint32_t GetSystemId()
Helper class that adds ns3::Ipv4StaticRouting objects.
void AddValue(const std::string &name, const std::string &help, T &value)
Add a program argument, assigning to POD.
Definition: command-line.h:408
static void Stop(void)
If an event invokes this method, it will be the last event scheduled by the Simulator::run method bef...
Definition: simulator.cc:165
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
#define NS_LOG_DEBUG(msg)
Definition: log.h:289
Helper class that adds ns3::Ipv4GlobalRouting objects.
Helper class that adds ns3::Ipv4ListRouting objects.
ApplicationContainer Install(NodeContainer c) const
Install an ns3::PacketSinkApplication on each node of the input container configured with all the att...
void Parse(int argc, char *argv[])
Parse the program arguments.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
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...
tuple address
Definition: first.py:37
Ptr< Node > GetLeafNodeForAs(uint32_t asNum, uint32_t leafNum)
Returns a given router leaf node from a given AS.
ApplicationContainer Install(NodeContainer c) const
Install an ns3::OnOffApplication on each node of the input container configured with all the attribut...
static uint32_t GetSize()
void SetRoutingHelper(const Ipv4RoutingHelper &routing)
void BuildBriteTopology(InternetStackHelper &stack)
Create NS3 topology using information generated from BRITE.
void SetAttribute(std::string name, const AttributeValue &value)
Helper function used to set the underlying application attributes.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
void LogComponentEnable(char const *name, enum LogLevel level)
Definition: log.cc:311
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const