A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
third-distributed.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 #include "ns3/core-module.h"
18 #include "ns3/network-module.h"
19 #include "ns3/wifi-module.h"
20 #include "ns3/mobility-module.h"
21 #include "ns3/mpi-interface.h"
22 #include "ns3/ipv4-global-routing-helper.h"
23 #include "ns3/udp-echo-helper.h"
24 #include "ns3/point-to-point-helper.h"
25 #include "ns3/csma-helper.h"
26 #include "ns3/internet-stack-helper.h"
27 #include "ns3/ipv4-address-helper.h"
28 #include "ns3/ipv4-interface-container.h"
29 
30 #ifdef NS3_MPI
31 #include <mpi.h>
32 #endif
33 
34 // Default Network Topology (same as third.cc from tutorial)
35 // Distributed simulation, split along the p2p link
36 // Number of wifi or csma nodes can be increased up to 250
37 //
38 // Wifi 10.1.3.0
39 // AP
40 // * * * *
41 // | | | | 10.1.1.0
42 // n5 n6 n7 n0 -------------- n1 n2 n3 n4
43 // point-to-point | | | |
44 // ================
45 // | LAN 10.1.2.0
46 // |
47 // Rank 0 | Rank 1
48 // -------------------------|----------------------------
49 
50 using namespace ns3;
51 
52 NS_LOG_COMPONENT_DEFINE ("ThirdExampleDistributed");
53 
54 int
55 main (int argc, char *argv[])
56 {
57 #ifdef NS3_MPI
58  // Distributed simulation setup
59  MpiInterface::Enable (&argc, &argv);
60  GlobalValue::Bind ("SimulatorImplementationType",
61  StringValue ("ns3::DistributedSimulatorImpl"));
62 
63  uint32_t systemId = MpiInterface::GetSystemId ();
64  uint32_t systemCount = MpiInterface::GetSize ();
65 
66  // Check for valid distributed parameters.
67  // Must have 2 and only 2 Logical Processors (LPs)
68  if (systemCount != 2)
69  {
70  std::cout << "This simulation requires 2 and only 2 logical processors." << std::endl;
71  return 1;
72  }
73 
74  bool verbose = true;
75  uint32_t nCsma = 3;
76  uint32_t nWifi = 3;
77  bool tracing = false;
78 
79  CommandLine cmd;
80  cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
81  cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi);
82  cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);
83  cmd.AddValue ("tracing", "Enable pcap tracing", tracing);
84  cmd.Parse (argc,argv);
85 
86  // Check for valid number of csma or wifi nodes
87  // 250 should be enough, otherwise IP addresses
88  // soon become an issue
89  if (nWifi > 250 || nCsma > 250)
90  {
91  std::cout << "Too many wifi or csma nodes, max 200 each." << std::endl;
92  return 1;
93  }
94 
95  if (verbose)
96  {
97  LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
98  LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
99  }
100 
101  NodeContainer p2pNodes;
102  Ptr<Node> p2pNode1 = CreateObject<Node> (0); // Create node with rank 0
103  Ptr<Node> p2pNode2 = CreateObject<Node> (1); // Create node with rank 1
104  p2pNodes.Add (p2pNode1);
105  p2pNodes.Add (p2pNode2);
106 
108  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
109  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
110 
111  NetDeviceContainer p2pDevices;
112  p2pDevices = pointToPoint.Install (p2pNodes);
113 
114  NodeContainer csmaNodes;
115  csmaNodes.Add (p2pNodes.Get (1));
116  csmaNodes.Create (nCsma, 1); // Create csma nodes with rank 1
117 
118  CsmaHelper csma;
119  csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));
120  csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));
121 
122  NetDeviceContainer csmaDevices;
123  csmaDevices = csma.Install (csmaNodes);
124 
125  NodeContainer wifiStaNodes;
126  wifiStaNodes.Create (nWifi, 0); // Create wifi nodes with rank 0
127  NodeContainer wifiApNode = p2pNodes.Get (0);
128 
131  phy.SetChannel (channel.Create ());
132 
134  wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
135 
137 
138  Ssid ssid = Ssid ("ns-3-ssid");
139  mac.SetType ("ns3::StaWifiMac",
140  "Ssid", SsidValue (ssid),
141  "ActiveProbing", BooleanValue (false));
142 
143  NetDeviceContainer staDevices;
144  staDevices = wifi.Install (phy, mac, wifiStaNodes);
145 
146  mac.SetType ("ns3::ApWifiMac",
147  "Ssid", SsidValue (ssid));
148 
149  NetDeviceContainer apDevices;
150  apDevices = wifi.Install (phy, mac, wifiApNode);
151 
152  MobilityHelper mobility;
153 
154  mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
155  "MinX", DoubleValue (0.0),
156  "MinY", DoubleValue (0.0),
157  "DeltaX", DoubleValue (5.0),
158  "DeltaY", DoubleValue (5.0),
159  "GridWidth", UintegerValue (10),
160  "LayoutType", StringValue ("RowFirst"));
161 
162  mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
163  "Bounds", RectangleValue (Rectangle (-250, 250, -250, 250)));
164  mobility.Install (wifiStaNodes);
165 
166  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
167  mobility.Install (wifiApNode);
168 
170  stack.Install (csmaNodes);
171  stack.Install (wifiApNode);
172  stack.Install (wifiStaNodes);
173 
175 
176  address.SetBase ("10.1.1.0", "255.255.255.0");
177  Ipv4InterfaceContainer p2pInterfaces;
178  p2pInterfaces = address.Assign (p2pDevices);
179 
180  address.SetBase ("10.1.2.0", "255.255.255.0");
181  Ipv4InterfaceContainer csmaInterfaces;
182  csmaInterfaces = address.Assign (csmaDevices);
183 
184  address.SetBase ("10.1.3.0", "255.255.255.0");
185  address.Assign (staDevices);
186  address.Assign (apDevices);
187 
188  // If this simulator has system id 1, then
189  // it should contain the server application,
190  // since it is on one of the csma nodes
191  if (systemId == 1)
192  {
194  ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));
195  serverApps.Start (Seconds (1.0));
196  serverApps.Stop (Seconds (10.0));
197  }
198 
199  // If the simulator has system id 0, then
200  // it should contain the client application,
201  // since it is on one of the wifi nodes
202  if (systemId == 0)
203  {
204  UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);
205  echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
206  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
207  echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
208 
210  echoClient.Install (wifiStaNodes.Get (nWifi - 1));
211  clientApps.Start (Seconds (2.0));
212  clientApps.Stop (Seconds (10.0));
213  }
214 
216 
217  Simulator::Stop (Seconds (10.0));
218 
219  if (tracing == true)
220  {
221  // Depending on the system Id (rank), the pcap information
222  // traced will be different. For example, the ethernet pcap
223  // will be empty for rank0, since these nodes are placed on
224  // on rank 1. All ethernet traffic will take place on rank 1.
225  // Similar differences are seen in the p2p and wirless pcaps.
226  if (systemId == 0)
227  {
228  pointToPoint.EnablePcapAll ("third-distributed-rank0");
229  phy.EnablePcap ("third-distributed-rank0", apDevices.Get (0));
230  csma.EnablePcap ("third-distributed-rank0", csmaDevices.Get (0), true);
231  }
232  else
233  {
234  pointToPoint.EnablePcapAll ("third-distributed-rank1");
235  phy.EnablePcap ("third-distributed-rank1", apDevices.Get (0));
236  csma.EnablePcap ("third-distributed-rank1", csmaDevices.Get (0), true);
237  }
238  }
239 
240  Simulator::Run ();
242  // Exit the MPI execution environment
244  return 0;
245 
246 #else
247  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
248 #endif
249 }
holds a vector of ns3::Application pointers.
tuple pointToPoint
Definition: first.py:28
void SetChannelAttribute(std::string n1, const AttributeValue &v1)
Definition: csma-helper.cc:69
Hold a bool native type.
Definition: boolean.h:38
holds a vector of std::pair of Ptr and interface index.
Ptr< YansWifiChannel > Create(void) const
void SetRemoteStationManager(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Definition: wifi-helper.cc:69
static void PopulateRoutingTables(void)
Build a routing database and initialize the routing tables of the nodes in the simulation. Makes all nodes in the simulation into routers.
hold variables of type string
Definition: string.h:19
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
Make it easy to create and manage PHY objects for the yans model.
static YansWifiChannelHelper Default(void)
NetDeviceContainer Install(NodeContainer c)
void SetType(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
tuple echoServer
Definition: first.py:42
create an application which sends a udp packet and waits for an echo of this packet ...
static void Run(void)
Definition: simulator.cc:157
aggregate IP/TCP/UDP functionality to existing Nodes.
NetDeviceContainer Install(Ptr< Node > node) const
Definition: csma-helper.cc:215
static void Disable()
Build a set of PointToPointNetDevice objects.
static YansWifiPhyHelper Default(void)
void SetDeviceAttribute(std::string name, const AttributeValue &value)
helps to create WifiNetDevice objects
Definition: wifi-helper.h:88
#define NS_FATAL_ERROR(msg)
fatal error handling
Definition: fatal-error.h:72
NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer c) const
Definition: wifi-helper.cc:98
tuple clientApps
Definition: first.py:53
ApplicationContainer Install(Ptr< Node > node) const
hold objects of type ns3::Rectangle
void SetChannel(Ptr< YansWifiChannel > channel)
Create a server application which waits for input udp packets and sends them back to the original sen...
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
void EnablePcapAll(std::string prefix, bool promiscuous=false)
Enable pcap output on each device (which is of the appropriate type) in the set of all nodes created ...
hold objects of type ns3::Time
Definition: nstime.h:828
static void Enable(int *pargc, char ***pargv)
Hold an unsigned integer type.
Definition: uinteger.h:46
holds a vector of ns3::NetDevice pointers
static NqosWifiMacHelper Default(void)
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...
create non QoS-enabled MAC layers for a ns3::WifiNetDevice.
Parse command-line arguments.
Definition: command-line.h:152
int main(int argc, char *argv[])
static void Destroy(void)
Definition: simulator.cc:121
tuple echoClient
Definition: first.py:48
tuple serverApps
Definition: first.py:44
keep track of a set of node pointers.
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
void Install(std::string nodeName) const
manage and create wifi channel objects for the yans model.
tuple stack
Definition: first.py:34
Definition: ssid.h:35
build a set of CsmaNetDevice objects
Definition: csma-helper.h:46
void SetChannelAttribute(std::string name, const AttributeValue &value)
Helper class used to assign positions and mobility models to nodes.
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.
NS_LOG_COMPONENT_DEFINE("PacketLossCounter")
static uint32_t GetSystemId()
void AddValue(const std::string &name, const std::string &help, T &value)
Definition: command-line.h:408
static void Stop(void)
Definition: simulator.cc:165
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
hold objects of type ns3::Ssid
void Parse(int argc, char *argv[])
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
tuple address
Definition: first.py:37
void EnablePcap(std::string prefix, Ptr< NetDevice > nd, bool promiscuous=false, bool explicitFilename=false)
Enable pcap output the indicated net device.
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Hold an floating point type.
Definition: double.h:41
a 2d rectangle
Definition: rectangle.h:33
static uint32_t GetSize()
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
bool verbose
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
static WifiHelper Default(void)
Definition: wifi-helper.cc:61