bug 1343 (documentation): emu-udp-echo-client/server.cc missing, but referenced in HOWTOs

This commit is contained in:
Tom Henderson
2014-10-06 14:52:08 -07:00
parent 94cd3d8542
commit 0bb6e095b3

View File

@@ -62,6 +62,16 @@
// - Tracing of queues and packet receptions to file "udp-echo.tr"
// - pcap tracing on all devices
//
// Another mode of operation corresponds to the wiki HOWTO
// 'HOWTO use ns-3 scripts to drive real hardware'
//
// If the --client mode is specified, only one ns-3 node is created
// on the specified device name, assuming that a server node is
// on another virtual machine. The client node will use 10.1.1.2
//
// If the --server mode is specified, only one ns-3 node is created
// on the specified device name, assuming that a client node is
// on another virtual machine. The server node will use 10.1.1.1
#include <fstream>
#include "ns3/core-module.h"
@@ -78,14 +88,20 @@ main (int argc, char *argv[])
{
std::string deviceName ("eth1");
std::string encapMode ("Dix");
uint32_t nNodes = 4;
bool clientMode = false;
bool serverMode = false;
double stopTime = 10;
uint32_t nNodes = 2;
//
// Allow the user to override any of the defaults at run-time, via command-line
// arguments
//
CommandLine cmd;
cmd.AddValue ("client", "client mode", clientMode);
cmd.AddValue ("server", "server mode", serverMode);
cmd.AddValue ("deviceName", "device name", deviceName);
cmd.AddValue ("stopTime", "stop time (seconds)", stopTime);
cmd.AddValue ("encapsulationMode", "encapsulation mode of emu device (\"Dix\" [default] or \"Llc\")", encapMode);
cmd.AddValue ("nNodes", "number of nodes to create (>= 2)", nNodes);
@@ -95,6 +111,11 @@ main (int argc, char *argv[])
StringValue ("ns3::RealtimeSimulatorImpl"));
GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
if (clientMode && serverMode)
{
NS_FATAL_ERROR("Error, both client and server options cannot be enabled.");
}
//
// need at least two nodes
//
@@ -118,48 +139,99 @@ main (int argc, char *argv[])
emu.SetDeviceName (deviceName);
emu.SetAttribute ("EncapsulationMode", StringValue (encapMode));
NetDeviceContainer d = emu.Install (n);
//
// We've got the "hardware" in place. Now we need to add IP addresses.
//
NetDeviceContainer d;
Ipv4AddressHelper ipv4;
NS_LOG_INFO ("Assign IP Addresses.");
Ipv4InterfaceContainer i;
ApplicationContainer apps;
ipv4.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer i = ipv4.Assign (d);
if (clientMode)
{
d = emu.Install (n.Get (0));
// Note: incorrect MAC address assignments are one of the confounding
// aspects of network emulation experiments. Here, we assume that there
// will be a server mode taking the first MAC address, so we need to
// force the MAC address to be one higher (just like IP address below)
Ptr<FdNetDevice> dev = d.Get (0)->GetObject<FdNetDevice> ();
dev->SetAddress (Mac48Address ("00:00:00:00:00:02"));
NS_LOG_INFO ("Assign IP Addresses.");
ipv4.NewAddress (); // burn the 10.1.1.1 address so that 10.1.1.2 is next
i = ipv4.Assign (d);
}
else if (serverMode)
{
d = emu.Install (n.Get (0));
NS_LOG_INFO ("Assign IP Addresses.");
i = ipv4.Assign (d);
}
else
{
d = emu.Install (n);
NS_LOG_INFO ("Assign IP Addresses.");
i = ipv4.Assign (d);
}
if (serverMode)
{
//
// Create a UdpEchoServer application
//
NS_LOG_INFO ("Create Applications.");
UdpEchoServerHelper server (9);
apps = server.Install (n.Get (0));
apps.Start (Seconds (1.0));
apps.Stop (Seconds (stopTime));
}
else if (clientMode)
{
//
// Create a UdpEchoClient application to send UDP datagrams
//
uint32_t packetSize = 1024;
uint32_t maxPacketCount = 20;
Time interPacketInterval = Seconds (0.1);
UdpEchoClientHelper client (Ipv4Address ("10.1.1.1"), 9);
client.SetAttribute ("MaxPackets", UintegerValue (maxPacketCount));
client.SetAttribute ("Interval", TimeValue (interPacketInterval));
client.SetAttribute ("PacketSize", UintegerValue (packetSize));
apps = client.Install (n.Get (0));
apps.Start (Seconds (2.0));
apps.Stop (Seconds (stopTime));
}
else
{
//
// Create a UdpEchoServer application on node one.
//
NS_LOG_INFO ("Create Applications.");
UdpEchoServerHelper server (9);
apps = server.Install (n.Get (1));
apps.Start (Seconds (1.0));
apps.Stop (Seconds (stopTime));
//
// Create a UdpEchoClient application to send UDP datagrams from node zero to node one.
//
uint32_t packetSize = 1024;
uint32_t maxPacketCount = 20;
Time interPacketInterval = Seconds (0.1);
UdpEchoClientHelper client (i.GetAddress (1), 9);
client.SetAttribute ("MaxPackets", UintegerValue (maxPacketCount));
client.SetAttribute ("Interval", TimeValue (interPacketInterval));
client.SetAttribute ("PacketSize", UintegerValue (packetSize));
apps = client.Install (n.Get (0));
apps.Start (Seconds (2.0));
apps.Stop (Seconds (stopTime));
}
//
// Create a UdpEchoServer application on node one.
//
NS_LOG_INFO ("Create Applications.");
UdpEchoServerHelper server (9);
ApplicationContainer apps = server.Install (n.Get (1));
apps.Start (Seconds (1.0));
apps.Stop (Seconds (10.0));
//
// Create a UdpEchoClient application to send UDP datagrams from node zero to node one.
//
uint32_t packetSize = 1024;
uint32_t maxPacketCount = 20;
Time interPacketInterval = Seconds (0.1);
UdpEchoClientHelper client (i.GetAddress (1), 9);
client.SetAttribute ("MaxPackets", UintegerValue (maxPacketCount));
client.SetAttribute ("Interval", TimeValue (interPacketInterval));
client.SetAttribute ("PacketSize", UintegerValue (packetSize));
apps = client.Install (n.Get (0));
apps.Start (Seconds (2.0));
apps.Stop (Seconds (10.0));
std::ofstream ascii;
ascii.open ("emu-udp-echo.tr");
emu.EnablePcapAll ("emu-udp-echo", true);
emu.EnablePcapAll ("fd-emu-udp-echo", true);
emu.EnableAsciiAll ("fd-emu-udp-echo.tr");
//
// Now, do the actual simulation.
//
NS_LOG_INFO ("Run Simulation.");
Simulator::Stop (Seconds (12.0));
Simulator::Stop (Seconds (stopTime + 2));
Simulator::Run ();
Simulator::Destroy ();
NS_LOG_INFO ("Done.");