A Discrete-Event Network Simulator
API
simple-distributed-empty-node.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright 2013. Lawrence Livermore National Security, LLC.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Steven Smith <smith84@llnl.gov>
19  */
20 
67 #include "mpi-test-fixtures.h"
68 
69 #include "ns3/core-module.h"
70 #include "ns3/network-module.h"
71 #include "ns3/mpi-interface.h"
72 #include "ns3/ipv4-global-routing-helper.h"
73 #include "ns3/point-to-point-helper.h"
74 #include "ns3/internet-stack-helper.h"
75 #include "ns3/nix-vector-helper.h"
76 #include "ns3/ipv4-address-helper.h"
77 #include "ns3/on-off-helper.h"
78 #include "ns3/packet-sink-helper.h"
79 #include "mpi.h"
80 
81 using namespace ns3;
82 
83 NS_LOG_COMPONENT_DEFINE ("SimpleDistributedEmptyNode");
84 
85 int
86 main (int argc, char *argv[])
87 {
88  bool nix = true;
89  bool nullmsg = false;
90  bool tracing = false;
91  bool testing = false;
92  bool verbose = false;
93 
94  // Parse command line
95  CommandLine cmd (__FILE__);
96  cmd.AddValue ("nix", "Enable the use of nix-vector or global routing", nix);
97  cmd.AddValue ("nullmsg", "Enable the use of null-message synchronization", nullmsg);
98  cmd.AddValue ("tracing", "Enable pcap tracing", tracing);
99  cmd.AddValue ("verbose", "verbose output", verbose);
100  cmd.AddValue ("test", "Enable regression test output", testing);
101  cmd.Parse (argc, argv);
102 
103  // Distributed simulation setup; by default use granted time window algorithm.
104  if(nullmsg)
105  {
106  GlobalValue::Bind ("SimulatorImplementationType",
107  StringValue ("ns3::NullMessageSimulatorImpl"));
108  }
109  else
110  {
111  GlobalValue::Bind ("SimulatorImplementationType",
112  StringValue ("ns3::DistributedSimulatorImpl"));
113  }
114 
115  MpiInterface::Enable (&argc, &argv);
116 
117  SinkTracer::Init ();
118 
119  if (verbose)
120  {
122  }
123 
124  uint32_t systemId = MpiInterface::GetSystemId ();
125  uint32_t systemCount = MpiInterface::GetSize ();
126 
127  uint32_t rightHalfSystemId = 777;
128 
129  // Check for valid distributed parameters.
130  // Must have 2 or 3 tasks.
131  if (systemCount == 2)
132  {
133  rightHalfSystemId = 0;
134  }
135  else if (systemCount == 3)
136  {
137  rightHalfSystemId = 1;
138  }
139  else
140  {
141  std::cout << "This simulation requires 2 or 3 logical processors." << std::endl;
142  return 1;
143  }
144 
145  // Some default values
146  Config::SetDefault ("ns3::OnOffApplication::PacketSize", UintegerValue (512));
147  Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue ("1Mbps"));
148  Config::SetDefault ("ns3::OnOffApplication::MaxBytes", UintegerValue (512));
149 
150  // Create leaf nodes on left with system id 0
151  NodeContainer leftLeafNodes;
152  leftLeafNodes.Create (4, 0);
153 
154  // Create router nodes. Left router with system id 0, right router
155  // with system id dependent on number of processors using
156  // rightHalfSystemId
157  NodeContainer routerNodes;
158  Ptr<Node> routerNode1 = CreateObject<Node> (0);
159  Ptr<Node> routerNode2 = CreateObject<Node> (rightHalfSystemId);
160  routerNodes.Add (routerNode1);
161  routerNodes.Add (routerNode2);
162 
163  // Create leaf nodes on left with system id rightHalfSystemId
164  NodeContainer rightLeafNodes;
165  rightLeafNodes.Create (4, rightHalfSystemId);
166 
167  PointToPointHelper routerLink;
168  routerLink.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
169  routerLink.SetChannelAttribute ("Delay", StringValue ("5ms"));
170 
171  PointToPointHelper leafLink;
172  leafLink.SetDeviceAttribute ("DataRate", StringValue ("1Mbps"));
173  leafLink.SetChannelAttribute ("Delay", StringValue ("2ms"));
174 
175  // Add link connecting routers
176  NetDeviceContainer routerDevices;
177  routerDevices = routerLink.Install (routerNodes);
178 
179  // Add links for left side leaf nodes to left router
180  NetDeviceContainer leftRouterDevices;
181  NetDeviceContainer leftLeafDevices;
182  for (uint32_t i = 0; i < 4; ++i)
183  {
184  NetDeviceContainer temp = leafLink.Install (leftLeafNodes.Get (i), routerNodes.Get (0));
185  leftLeafDevices.Add (temp.Get (0));
186  leftRouterDevices.Add (temp.Get (1));
187  }
188 
189  // Add links for right side leaf nodes to right router
190  NetDeviceContainer rightRouterDevices;
191  NetDeviceContainer rightLeafDevices;
192  for (uint32_t i = 0; i < 4; ++i)
193  {
194  NetDeviceContainer temp = leafLink.Install (rightLeafNodes.Get (i), routerNodes.Get (1));
195  rightLeafDevices.Add (temp.Get (0));
196  rightRouterDevices.Add (temp.Get (1));
197  }
198 
200  if (nix)
201  {
202  Ipv4NixVectorHelper nixRouting;
203  stack.SetRoutingHelper (nixRouting); // has effect on the next Install ()
204  }
205 
206  stack.InstallAll ();
207 
208  Ipv4InterfaceContainer routerInterfaces;
209  Ipv4InterfaceContainer leftLeafInterfaces;
210  Ipv4InterfaceContainer leftRouterInterfaces;
211  Ipv4InterfaceContainer rightLeafInterfaces;
212  Ipv4InterfaceContainer rightRouterInterfaces;
213 
214  Ipv4AddressHelper leftAddress;
215  leftAddress.SetBase ("10.1.1.0", "255.255.255.0");
216 
217  Ipv4AddressHelper routerAddress;
218  routerAddress.SetBase ("10.2.1.0", "255.255.255.0");
219 
220  Ipv4AddressHelper rightAddress;
221  rightAddress.SetBase ("10.3.1.0", "255.255.255.0");
222 
223  // Router-to-Router interfaces
224  routerInterfaces = routerAddress.Assign (routerDevices);
225 
226  // Left interfaces
227  for (uint32_t i = 0; i < 4; ++i)
228  {
229  NetDeviceContainer ndc;
230  ndc.Add (leftLeafDevices.Get (i));
231  ndc.Add (leftRouterDevices.Get (i));
232  Ipv4InterfaceContainer ifc = leftAddress.Assign (ndc);
233  leftLeafInterfaces.Add (ifc.Get (0));
234  leftRouterInterfaces.Add (ifc.Get (1));
235  leftAddress.NewNetwork ();
236  }
237 
238  // Right interfaces
239  for (uint32_t i = 0; i < 4; ++i)
240  {
241  NetDeviceContainer ndc;
242  ndc.Add (rightLeafDevices.Get (i));
243  ndc.Add (rightRouterDevices.Get (i));
244  Ipv4InterfaceContainer ifc = rightAddress.Assign (ndc);
245  rightLeafInterfaces.Add (ifc.Get (0));
246  rightRouterInterfaces.Add (ifc.Get (1));
247  rightAddress.NewNetwork ();
248  }
249 
250  if (!nix)
251  {
253  }
254 
255  if (tracing == true)
256  {
257  if (systemId == 0)
258  {
259  routerLink.EnablePcap("router-left", routerDevices, true);
260  leafLink.EnablePcap("leaf-left", leftLeafDevices, true);
261  }
262 
263  if (systemId == rightHalfSystemId)
264  {
265  routerLink.EnablePcap("router-right", routerDevices, true);
266  leafLink.EnablePcap("leaf-right", rightLeafDevices, true);
267  }
268  }
269 
270  // Create a packet sink on the right leafs to receive packets from left leafs
271  uint16_t port = 50000;
272  if (systemId == rightHalfSystemId)
273  {
274  Address sinkLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
275  PacketSinkHelper sinkHelper ("ns3::UdpSocketFactory", sinkLocalAddress);
276  ApplicationContainer sinkApp;
277  for (uint32_t i = 0; i < 4; ++i)
278  {
279  sinkApp.Add (sinkHelper.Install (rightLeafNodes.Get (i)));
280  if (testing)
281  {
282  sinkApp.Get (i)->TraceConnectWithoutContext ("RxWithAddresses", MakeCallback (&SinkTracer::SinkTrace));
283  }
284  }
285  sinkApp.Start (Seconds (1.0));
286  sinkApp.Stop (Seconds (5));
287  }
288 
289  // Create the OnOff applications to send
290  if (systemId == 0)
291  {
292  OnOffHelper clientHelper ("ns3::UdpSocketFactory", Address ());
293  clientHelper.SetAttribute
294  ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
295  clientHelper.SetAttribute
296  ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
297 
299  for (uint32_t i = 0; i < 4; ++i)
300  {
301  AddressValue remoteAddress
302  (InetSocketAddress (rightLeafInterfaces.GetAddress (i), port));
303  clientHelper.SetAttribute ("Remote", remoteAddress);
304  clientApps.Add (clientHelper.Install (leftLeafNodes.Get (i)));
305  }
306  clientApps.Start (Seconds (1.0));
307  clientApps.Stop (Seconds (5));
308  }
309 
310  Simulator::Stop (Seconds (5));
311  Simulator::Run ();
313 
314  if (testing)
315  {
316  SinkTracer::Verify (4);
317  }
318 
319  // Exit the MPI execution environment
321  return 0;
322 }
ns3::NetDeviceContainer
holds a vector of ns3::NetDevice pointers
Definition: net-device-container.h:42
NS_LOG_COMPONENT_DEFINE
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
ns3::InetSocketAddress
an Inet address class
Definition: inet-socket-address.h:41
ns3::ApplicationContainer::Get
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
Definition: application-container.cc:62
ns3::CommandLine
Parse command-line arguments.
Definition: command-line.h:228
ns3::LOG_LEVEL_INFO
@ LOG_LEVEL_INFO
LOG_INFO and above.
Definition: log.h:107
ns3::PcapHelperForDevice::EnablePcap
void EnablePcap(std::string prefix, Ptr< NetDevice > nd, bool promiscuous=false, bool explicitFilename=false)
Enable pcap output the indicated net device.
Definition: trace-helper.cc:401
ns3::Ipv4AddressHelper::NewNetwork
Ipv4Address NewNetwork(void)
Increment the network number and reset the IP address counter to the base value provided in the SetBa...
Definition: ipv4-address-helper.cc:126
tracing
bool tracing
Flag to enable/disable generation of tracing files.
Definition: wifi-bianchi.cc:85
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::ApplicationContainer::Stop
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
Definition: application-container.cc:107
ns3::Ipv4AddressHelper
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
Definition: ipv4-address-helper.h:48
ns3::PointToPointHelper::SetDeviceAttribute
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
Definition: point-to-point-helper.cc:69
ns3::PointToPointHelper::SetChannelAttribute
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
Definition: point-to-point-helper.cc:75
ns3::LOG_PREFIX_NODE
@ LOG_PREFIX_NODE
Prefix all trace prints with simulation node.
Definition: log.h:120
ns3::AddressValue
AttributeValue implementation for Address.
Definition: address.h:278
ns3::MpiInterface::Disable
static void Disable()
Clean up the ns-3 parallel communications interface.
Definition: mpi-interface.cc:146
ns3::LogComponentEnable
void LogComponentEnable(char const *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:361
ns3::PointToPointHelper::Install
NetDeviceContainer Install(NodeContainer c)
Definition: point-to-point-helper.cc:222
ns3::NodeContainer::Create
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Definition: node-container.cc:98
ns3::SinkTracer::Verify
static void Verify(unsigned long expectedCount)
Verify the sink trace count observed matches the expected count.
Definition: mpi-test-fixtures.cc:58
ns3::ApplicationContainer::Add
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container.
Definition: application-container.cc:67
ns3::NodeContainer::Add
void Add(NodeContainer other)
Append the contents of another NodeContainer to the end of this container.
Definition: node-container.cc:114
ns3::Ipv4AddressHelper::SetBase
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Definition: ipv4-address-helper.cc:64
ns3::Ptr< Node >
ns3::NixVectorHelper
Helper class that adds Nix-vector routing to nodes.
Definition: nix-vector-helper.h:51
ns3::Ipv4GlobalRoutingHelper::PopulateRoutingTables
static void PopulateRoutingTables(void)
Build a routing database and initialize the routing tables of the nodes in the simulation.
Definition: ipv4-global-routing-helper.cc:61
first.stack
stack
Definition: first.py:41
ns3::Simulator::Stop
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:180
mpi-test-fixtures.h
Common methods for MPI examples.
ns3::Address
a polymophic address class
Definition: address.h:91
ns3::OnOffHelper
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:43
ns3::MpiInterface::Enable
static void Enable(int *pargc, char ***pargv)
Setup the parallel communication interface.
Definition: mpi-interface.cc:115
ns3::Ipv4InterfaceContainer
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Definition: ipv4-interface-container.h:55
ns3::NodeContainer::Get
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Definition: node-container.cc:93
verbose
bool verbose
Definition: openflow-switch.cc:50
second.cmd
cmd
Definition: second.py:35
ns3::Ipv4InterfaceContainer::Get
std::pair< Ptr< Ipv4 >, uint32_t > Get(uint32_t i) const
Get the std::pair of an Ptr<Ipv4> and interface stored at the location specified by the index.
Definition: ipv4-interface-container.cc:90
ns3::MakeCallback
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1642
ns3::Simulator::Run
static void Run(void)
Run the simulation.
Definition: simulator.cc:172
ns3::StringValue
Hold variables of type string.
Definition: string.h:41
ns3::GlobalValue::Bind
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...
Definition: global-value.cc:155
ns3::PacketSinkHelper
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
Definition: packet-sink-helper.h:36
ns3::SinkTracer::SinkTrace
static void SinkTrace(const ns3::Ptr< const ns3::Packet > packet, const ns3::Address &srcAddress, const ns3::Address &destAddress)
PacketSink receive trace callback.
Definition: mpi-test-fixtures.cc:50
ns3::SinkTracer::Init
static void Init(void)
PacketSink receive trace callback.
Definition: mpi-test-fixtures.cc:40
ns3::LOG_PREFIX_TIME
@ LOG_PREFIX_TIME
Prefix all trace prints with simulation time.
Definition: log.h:119
first.clientApps
clientApps
Definition: first.py:61
ns3::Ipv4Address::GetAny
static Ipv4Address GetAny(void)
Definition: ipv4-address.cc:395
ns3::ApplicationContainer::Start
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter.
Definition: application-container.cc:87
ns3::Seconds
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1289
ns3::Ipv4InterfaceContainer::Add
void Add(const Ipv4InterfaceContainer &other)
Concatenate the entries in the other container with ours.
Definition: ipv4-interface-container.cc:32
ns3::Ipv4AddressHelper::Assign
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Definition: ipv4-address-helper.cc:135
ns3::Simulator::Destroy
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:136
ns3::LogLevel
LogLevel
Logging severity classes and levels.
Definition: log.h:94
ns3::ApplicationContainer
holds a vector of ns3::Application pointers.
Definition: application-container.h:43
ns3::PointToPointHelper
Build a set of PointToPointNetDevice objects.
Definition: point-to-point-helper.h:45
ns3::NodeContainer
keep track of a set of node pointers.
Definition: node-container.h:39
ns3::Ipv4InterfaceContainer::GetAddress
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
Definition: ipv4-interface-container.cc:59
ns3::UintegerValue
Hold an unsigned integer type.
Definition: uinteger.h:44
ns3::Config::SetDefault
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:849
ns3::ObjectBase::TraceConnectWithoutContext
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
Definition: object-base.cc:293
ns3::InternetStackHelper
aggregate IP/TCP/UDP functionality to existing Nodes.
Definition: internet-stack-helper.h:88
ns3::NetDeviceContainer::Get
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
Definition: net-device-container.cc:62
ns3::MpiInterface::GetSystemId
static uint32_t GetSystemId()
Get the id number of this rank.
Definition: mpi-interface.cc:50
ns3::NetDeviceContainer::Add
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
Definition: net-device-container.cc:67
ns3::MpiInterface::GetSize
static uint32_t GetSize()
Get the number of ranks used by ns-3.
Definition: mpi-interface.cc:59
port
uint16_t port
Definition: dsdv-manet.cc:45