Bring tutorial third.cc and mpi third-distributed.cc into alignment.

This commit is contained in:
Peter D. Barnes, Jr.
2015-05-18 21:14:10 -07:00
parent 9ad27ed6ec
commit e9c14c2b54
2 changed files with 74 additions and 56 deletions

25
examples/tutorial/third.cc Normal file → Executable file
View File

@@ -44,19 +44,23 @@ main (int argc, char *argv[])
bool verbose = true;
uint32_t nCsma = 3;
uint32_t nWifi = 3;
bool tracing = false;
CommandLine cmd;
cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi);
cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);
cmd.AddValue ("tracing", "Enable pcap tracing", tracing);
cmd.Parse (argc,argv);
if (nWifi > 18)
// Check for valid number of csma or wifi nodes
// 250 should be enough, otherwise IP addresses
// soon become an issue
if (nWifi > 250 || nCsma > 250)
{
std::cout << "Number of wifi nodes " << nWifi <<
" specified exceeds the mobility bounding box" << std::endl;
exit (1);
std::cout << "Too many wifi or csma nodes, no more than 250 each." << std::endl;
return 1;
}
if (verbose)
@@ -169,9 +173,16 @@ main (int argc, char *argv[])
Simulator::Stop (Seconds (10.0));
pointToPoint.EnablePcapAll ("third");
phy.EnablePcap ("third", apDevices.Get (0));
csma.EnablePcap ("third", csmaDevices.Get (0), true);
if (tracing == true)
{
pointToPoint.EnablePcapAll ("third-distributed-wifi");
phy.EnablePcap ("third-distributed-wifi", apDevices.Get (0));
csma.EnablePcap ("third-distributed-wifi", csmaDevices.Get (0), true);
pointToPoint.EnablePcapAll ("third-distributed-csma");
phy.EnablePcap ("third-distributed-csma", apDevices.Get (0));
csma.EnablePcap ("third-distributed-csma", csmaDevices.Get (0), true);
}
Simulator::Run ();
Simulator::Destroy ();

105
src/mpi/examples/third-distributed.cc Normal file → Executable file
View File

@@ -15,26 +15,23 @@
*/
#include "ns3/core-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/network-module.h"
#include "ns3/applications-module.h"
#include "ns3/wifi-module.h"
#include "ns3/mobility-module.h"
#include "ns3/mpi-interface.h"
#include "ns3/ipv4-global-routing-helper.h"
#include "ns3/udp-echo-helper.h"
#include "ns3/point-to-point-helper.h"
#include "ns3/csma-helper.h"
#include "ns3/internet-stack-helper.h"
#include "ns3/ipv4-address-helper.h"
#include "ns3/ipv4-interface-container.h"
#include "ns3/csma-module.h"
#include "ns3/internet-module.h"
#ifdef NS3_MPI
#include <mpi.h>
#endif
#include "ns3/mpi-module.h"
// Default Network Topology (same as third.cc from tutorial)
// Default Network Topology
// (same as third.cc from tutorial)
// Distributed simulation, split along the p2p link
// Number of wifi or csma nodes can be increased up to 250
//
// |
// Rank 0 | Rank 1
// -------------------------|----------------------------
// Wifi 10.1.3.0
// AP
// * * * *
@@ -42,10 +39,7 @@
// n5 n6 n7 n0 -------------- n1 n2 n3 n4
// point-to-point | | | |
// ================
// | LAN 10.1.2.0
// |
// Rank 0 | Rank 1
// -------------------------|----------------------------
// LAN 10.1.2.0
using namespace ns3;
@@ -54,20 +48,19 @@ NS_LOG_COMPONENT_DEFINE ("ThirdExampleDistributed");
int
main (int argc, char *argv[])
{
#ifdef NS3_MPI
bool verbose = true;
uint32_t nCsma = 3;
uint32_t nWifi = 3;
bool nullmsg = false;
bool tracing = false;
bool nullmsg = false;
CommandLine cmd;
cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi);
cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);
cmd.AddValue ("nullmsg", "Enable the use of null-message synchronization", nullmsg);
cmd.AddValue ("tracing", "Enable pcap tracing", tracing);
cmd.AddValue ("nullmsg", "Enable the use of null-message synchronization", nullmsg);
cmd.Parse (argc,argv);
// Check for valid number of csma or wifi nodes
@@ -75,7 +68,7 @@ main (int argc, char *argv[])
// soon become an issue
if (nWifi > 250 || nCsma > 250)
{
std::cout << "Too many wifi or csma nodes, max 200 each." << std::endl;
std::cout << "Too many wifi or csma nodes, no more than 250 each." << std::endl;
return 1;
}
@@ -85,6 +78,12 @@ main (int argc, char *argv[])
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
}
// Sequential fallback values
uint32_t systemId = 0;
uint32_t systemCount = 1;
#ifdef NS3_MPI
// Distributed simulation setup; by default use granted time window algorithm.
if(nullmsg)
{
@@ -99,8 +98,8 @@ main (int argc, char *argv[])
MpiInterface::Enable (&argc, &argv);
uint32_t systemId = MpiInterface::GetSystemId ();
uint32_t systemCount = MpiInterface::GetSize ();
systemId = MpiInterface::GetSystemId ();
systemCount = MpiInterface::GetSize ();
// Check for valid distributed parameters.
// Must have 2 and only 2 Logical Processors (LPs)
@@ -110,10 +109,17 @@ main (int argc, char *argv[])
return 1;
}
#endif // NS3_MPI
// System id of Wifi side
uint32_t systemWifi = 0;
// System id of CSMA side
uint32_t systemCsma = systemCount - 1;
NodeContainer p2pNodes;
Ptr<Node> p2pNode1 = CreateObject<Node> (0); // Create node with rank 0
Ptr<Node> p2pNode2 = CreateObject<Node> (1); // Create node with rank 1
Ptr<Node> p2pNode1 = CreateObject<Node> (systemWifi); // Create node with rank 0
Ptr<Node> p2pNode2 = CreateObject<Node> (systemCsma); // Create node with rank 1
p2pNodes.Add (p2pNode1);
p2pNodes.Add (p2pNode2);
@@ -126,7 +132,7 @@ main (int argc, char *argv[])
NodeContainer csmaNodes;
csmaNodes.Add (p2pNodes.Get (1));
csmaNodes.Create (nCsma, 1); // Create csma nodes with rank 1
csmaNodes.Create (nCsma, systemCsma); // Create csma nodes with rank 1
CsmaHelper csma;
csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));
@@ -136,7 +142,7 @@ main (int argc, char *argv[])
csmaDevices = csma.Install (csmaNodes);
NodeContainer wifiStaNodes;
wifiStaNodes.Create (nWifi, 0); // Create wifi nodes with rank 0
wifiStaNodes.Create (nWifi, systemWifi); // Create wifi nodes with rank 0
NodeContainer wifiApNode = p2pNodes.Get (0);
YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
@@ -168,12 +174,12 @@ main (int argc, char *argv[])
"MinX", DoubleValue (0.0),
"MinY", DoubleValue (0.0),
"DeltaX", DoubleValue (5.0),
"DeltaY", DoubleValue (5.0),
"GridWidth", UintegerValue (10),
"DeltaY", DoubleValue (10.0),
"GridWidth", UintegerValue (3),
"LayoutType", StringValue ("RowFirst"));
mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
"Bounds", RectangleValue (Rectangle (-250, 250, -250, 250)));
"Bounds", RectangleValue (Rectangle (-50, 50, -50, 50)));
mobility.Install (wifiStaNodes);
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
@@ -198,25 +204,26 @@ main (int argc, char *argv[])
address.Assign (staDevices);
address.Assign (apDevices);
// If this simulator has system id 1, then
// If this rank is systemCsma,
// it should contain the server application,
// since it is on one of the csma nodes
if (systemId == 1)
if (systemId == systemCsma)
{
UdpEchoServerHelper echoServer (9);
ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
}
// If the simulator has system id 0, then
// If this rank is systemWifi
// it should contain the client application,
// since it is on one of the wifi nodes
if (systemId == 0)
if (systemId == systemWifi)
{
UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
ApplicationContainer clientApps =
@@ -235,28 +242,28 @@ main (int argc, char *argv[])
// traced will be different. For example, the ethernet pcap
// will be empty for rank0, since these nodes are placed on
// on rank 1. All ethernet traffic will take place on rank 1.
// Similar differences are seen in the p2p and wirless pcaps.
if (systemId == 0)
// Similar differences are seen in the p2p and wireless pcaps.
if (systemId == systemWifi)
{
pointToPoint.EnablePcapAll ("third-distributed-rank0");
phy.EnablePcap ("third-distributed-rank0", apDevices.Get (0));
csma.EnablePcap ("third-distributed-rank0", csmaDevices.Get (0), true);
pointToPoint.EnablePcapAll ("third-distributed-wifi");
phy.EnablePcap ("third-distributed-wifi", apDevices.Get (0));
csma.EnablePcap ("third-distributed-wifi", csmaDevices.Get (0), true);
}
else
else // systemCsma
{
pointToPoint.EnablePcapAll ("third-distributed-rank1");
phy.EnablePcap ("third-distributed-rank1", apDevices.Get (0));
csma.EnablePcap ("third-distributed-rank1", csmaDevices.Get (0), true);
pointToPoint.EnablePcapAll ("third-distributed-csma");
phy.EnablePcap ("third-distributed-csma", apDevices.Get (0));
csma.EnablePcap ("third-distributed-csma", csmaDevices.Get (0), true);
}
}
Simulator::Run ();
Simulator::Destroy ();
#ifdef NS3_MPI
// Exit the MPI execution environment
MpiInterface::Disable ();
return 0;
#else
NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
#endif
return 0;
}