--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fd-net-device/examples/fd-emu-onoff.cc Wed Mar 27 02:14:57 2013 +0100
@@ -0,0 +1,196 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of Washington, 2012 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Alina Quereilhac <alina.quereilhac@inria.fr>
+ *
+ */
+
+// +----------------------+ +-----------------------+
+// | client machine | | server machine |
+// +----------------------+ +-----------------------+
+// | node 0 | | node 1 |
+// | +----------------+ | | +----------------+ |
+// | | ns-3 TCP | | | | ns-3 TCP | |
+// | +----------------+ | | +----------------+ |
+// | | 10.1.1.1 | | | | 10.1.1.2 | |
+// | +----------------+ | | +----------------+ |
+// | | fd-net-device | | | | fd-net-device | |
+// | +----------------+ | | +----------------+ |
+// | | raw socket | | | | raw socket | |
+// | +----------------+ | | +----------------+ |
+// | | eth0 | | | | eth0 | |
+// +-------+------+-------+ +--------+------+-------+
+//
+// 10.1.1.11 10.1.1.12
+//
+// | |
+// +----------------------------+
+//
+// This example is aimed at meassuring the thoughput of the FdNetDevice
+// when using the EmuFdNetDeviceHelper. This is achieved by saturating
+// the channel with TCP traffic. Then the thoughput can be obtained from
+// the generated .pcap files.
+//
+// To run this example you will need two computers (client & server).
+// Steps to run the experiment:
+//
+// 1 - Connect the 2 computers with an Ethernet cable
+// 2 - Set the IP addresses on both Ethernet devices
+//
+// client machine: $ sudo ip addr add dev eth0 10.1.1.11/24
+// server machine: $ sudo ip addr add dev eth0 10.1.1.12/24
+//
+// 3 - Set both Ethernet devices to promiscuous mode
+//
+// both machines: $ sudo ip link set eth0 promisc on
+//
+// 4 - Give root suid to the raw socket creator binary
+//
+// both machines: $ sudo chown root.root build/src/fd-net-device/ns3-dev-raw-sock-creator
+// both machines: $ sudo chmod 4755 build/src/fd-net-device/ns3-dev-raw-sock-creator
+//
+// 5 - Run the server side:
+//
+// server machine: $ ./waf --run="fd-emu-onoff --serverMode=1"
+//
+// 6 - Run the client side:
+//
+// client machine: $ ./waf --run="fd-emu-onoff"
+//
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <string>
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/config-store-module.h"
+#include "ns3/fd-net-device-module.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("EmuFdNetDeviceSaturationExample");
+
+int
+main (int argc, char *argv[])
+{
+ uint16_t sinkPort = 8000;
+ uint32_t packetSize = 10000; // bytes
+ std::string dataRate("1000Mb/s");
+ bool serverMode = false;
+
+ std::string deviceName ("eth0");
+ std::string client ("10.1.1.1");
+ std::string server ("10.1.1.2");
+ std::string netmask ("255.255.255.0");
+ std::string macClient ("00:00:00:00:00:01");
+ std::string macServer ("00:00:00:00:00:02");
+
+ CommandLine cmd;
+ cmd.AddValue ("deviceName", "Device name", deviceName);
+ cmd.AddValue ("client", "Local IP address (dotted decimal only please)", client);
+ cmd.AddValue ("server", "Remote IP address (dotted decimal only please)", server);
+ cmd.AddValue ("localmask", "Local mask address (dotted decimal only please)", netmask);
+ cmd.AddValue ("serverMode", "1:true, 0:false, default client", serverMode);
+ cmd.AddValue ("mac-client", "Mac Address for Server Client : 00:00:00:00:00:01", macClient);
+ cmd.AddValue ("mac-server", "Mac Address for Server Default : 00:00:00:00:00:02", macServer);
+ cmd.AddValue ("data-rate", "Data rate defaults to 1000Mb/s", dataRate);
+ cmd.Parse (argc, argv);
+
+ Ipv4Address remoteIp;
+ Ipv4Address localIp;
+ Mac48AddressValue localMac;
+
+ if (serverMode)
+ {
+ remoteIp = Ipv4Address (client.c_str ());
+ localIp = Ipv4Address (server.c_str ());
+ localMac = Mac48AddressValue (macServer.c_str ());
+ }
+ else
+ {
+ remoteIp = Ipv4Address (server.c_str ());
+ localIp = Ipv4Address (client.c_str ());
+ localMac = Mac48AddressValue (macClient.c_str ());
+ }
+
+ Ipv4Mask localMask (netmask.c_str ());
+
+ GlobalValue::Bind ("SimulatorImplementationType", StringValue ("ns3::RealtimeSimulatorImpl"));
+
+ GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
+
+ NS_LOG_INFO ("Create Node");
+ Ptr<Node> node = CreateObject<Node> ();
+
+ NS_LOG_INFO ("Create Device");
+ EmuFdNetDeviceHelper emu;
+ emu.SetDeviceName (deviceName);
+ NetDeviceContainer devices = emu.Install (node);
+ Ptr<NetDevice> device = devices.Get (0);
+ device->SetAttribute ("Address", localMac);
+
+ NS_LOG_INFO ("Add Internet Stack");
+ InternetStackHelper internetStackHelper;
+ internetStackHelper.SetIpv4StackInstall(true);
+ internetStackHelper.Install (node);
+
+ NS_LOG_INFO ("Create IPv4 Interface");
+ Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
+ uint32_t interface = ipv4->AddInterface (device);
+ Ipv4InterfaceAddress address = Ipv4InterfaceAddress (localIp, localMask);
+ ipv4->AddAddress (interface, address);
+ ipv4->SetMetric (interface, 1);
+ ipv4->SetUp (interface);
+
+ if(serverMode)
+ {
+ Address sinkLocalAddress (InetSocketAddress (localIp, sinkPort));
+ PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory", sinkLocalAddress);
+ ApplicationContainer sinkApp = sinkHelper.Install (node);
+ sinkApp.Start (Seconds (1.0));
+ sinkApp.Stop (Seconds (60.0));
+
+ emu.EnablePcap ("fd-server", device);
+ }
+ else
+ {
+ AddressValue remoteAddress (InetSocketAddress (remoteIp, sinkPort));
+ OnOffHelper onoff ("ns3::TcpSocketFactory", Address ());
+ onoff.SetAttribute ("Remote", remoteAddress);
+ onoff.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
+ onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
+ onoff.SetAttribute ("DataRate", DataRateValue (dataRate));
+ onoff.SetAttribute ("PacketSize", UintegerValue (packetSize));
+
+ ApplicationContainer clientApps = onoff.Install (node);
+ clientApps.Start (Seconds (4.0));
+ clientApps.Stop (Seconds (58.0));
+
+ emu.EnablePcap ("fd-client", device);
+ }
+
+ Simulator::Stop (Seconds (61.0));
+ Simulator::Run ();
+ Simulator::Destroy ();
+
+ return 0;
+}
+