examples/tcp/tcp-nsc-comparison.cc
changeset 10403 798e90c6c12f
parent 9273 537e3d356935
child 11146 27cbf395bc8d
--- a/examples/tcp/tcp-nsc-comparison.cc	Wed Nov 13 16:49:02 2013 -0500
+++ b/examples/tcp/tcp-nsc-comparison.cc	Thu Nov 14 09:22:14 2013 -0800
@@ -1,180 +1,180 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2012 NICT
- *
- * 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: Hajime Tazaki <tazaki@nict.go.jp>
- *
- * This code is a modified version of the code used for the the experiments in the paper
- * "DCE Cradle: Simulate Network Protocols with Real Stacks for Better Realism"
- * by Hajime Tazaki, Frederic Urbani and Thierry Turlett presented at WNS3 2013
- *
- */
-
-#include "ns3/log.h"
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/internet-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/applications-module.h"
-#include "ns3/flow-monitor-module.h"
-
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("TcpNscComparison");
-
-std::string m_stack = "nsc-linux";
-std::string sock_factory;
-int m_seed = 1;
-double startTime = 4.0;
-double stopTime = 20.0;
-uint32_t m_nNodes = 2;
-bool enablePcap = false;
-
-int
-main (int argc, char *argv[])
-{
-
-  //ensure the ns3 TCP default values match what nsc is using
-  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1448));
-  Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1));
-
-  CommandLine cmd;
-  cmd.AddValue ("stack", "choose network stack", m_stack);
-  cmd.AddValue ("seed", "randomize seed", m_seed);
-  cmd.AddValue ("nNodes", "the number of nodes in left side", m_nNodes);
-  cmd.AddValue ("stopTime", "duration", stopTime);
-  cmd.AddValue ("enablePcap", "pcap", enablePcap);
-  cmd.Parse (argc, argv);
-
-  SeedManager::SetSeed (m_seed);
-
-  NodeContainer lefts, routers, rights, nodes;
-  lefts.Create (m_nNodes);
-  routers.Create (2);
-  rights.Create (m_nNodes);
-  nodes = NodeContainer (lefts, routers, rights);
-
-  InternetStackHelper internetStack;
-
-  GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
-  if (m_stack == "ns3")
-    {
-      sock_factory = "ns3::TcpSocketFactory";
-      internetStack.Install (nodes);
-    }
-  else if (m_stack == "nsc-linux")
-    {
-      internetStack.Install (routers);
-      sock_factory = "ns3::TcpSocketFactory";
-      internetStack.SetTcp ("ns3::NscTcpL4Protocol",
-                            "Library", StringValue ("liblinux2.6.26.so"));
-      internetStack.Install (lefts);
-      internetStack.Install (rights);
-
-      //these are not implemented in ns3 tcp so disable for comparison
-      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_sack", StringValue ("0"));
-      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_timestamps", StringValue ("0"));
-      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_window_scaling", StringValue ("0"));
-    }
-
-  PointToPointHelper pointToPoint;
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("1ns"));
-
-  Ipv4AddressHelper address;
-  Ipv4InterfaceContainer interfaces;
-
-  NetDeviceContainer dev0, dev1, dev2;
-  for (uint32_t i = 0; i < m_nNodes; i++)
-    {
-      std::ostringstream oss;
-      oss << "10.0." << i << ".0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      dev0 = pointToPoint.Install (NodeContainer (lefts.Get (i), routers.Get (0)));
-      address.Assign (dev0);
-    }
-
-  // bottle neck link
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("2Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("100ms"));
-  dev1 = pointToPoint.Install (NodeContainer (routers.Get (0), routers.Get (1)));
-
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("1ns"));
-  // for right links
-  for (uint32_t i = 0; i < m_nNodes; i++)
-    {
-      std::ostringstream oss;
-      oss << "10.2." << i << ".0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      dev2 = pointToPoint.Install (NodeContainer (routers.Get (1), rights.Get (i)));
-      address.Assign (dev2);
-    }
-
-  // bottle neck link
-  Ptr<RateErrorModel> em1 =
-    CreateObjectWithAttributes<RateErrorModel> (
-      "ErrorRate", DoubleValue (0.05),
-      "ErrorUnit", EnumValue (RateErrorModel::ERROR_UNIT_PACKET)
-      );
-  dev1.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (em1));
-
-  address.SetBase ("10.1.0.0", "255.255.255.0");
-  address.Assign (dev1);
-  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
-
-  ApplicationContainer apps;
-
-  OnOffHelper onoff = OnOffHelper (sock_factory,
-                                   InetSocketAddress (Ipv4Address ("10.2.0.2"), 2000));
-  onoff.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
-  onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
-
-  // Flow 1 - n
-  for (uint32_t i = 0; i < m_nNodes; i++)
-    {
-      std::ostringstream oss;
-      oss << "10.2." << i << ".2";
-      onoff.SetAttribute ("Remote", AddressValue (InetSocketAddress (Ipv4Address (oss.str ().c_str ()), 2000)));
-      onoff.SetAttribute ("PacketSize", StringValue ("1024"));
-      onoff.SetAttribute ("DataRate", StringValue ("1Mbps"));
-      onoff.SetAttribute ("StartTime", TimeValue (Seconds (startTime)));
-      apps = onoff.Install (lefts.Get (i));
-    }
-
-  PacketSinkHelper sink = PacketSinkHelper (sock_factory,
-                                            InetSocketAddress (Ipv4Address::GetAny (), 2000));
-  apps = sink.Install (rights);
-  apps.Start (Seconds (3.9999));
-
-  pointToPoint.EnablePcapAll ("nsc.pcap");
-
-  Simulator::Stop (Seconds (stopTime));
-  Simulator::Run ();
-
-  Ptr<PacketSink> pktsink;
-  std::cout << "Total ";
-  for (uint32_t i = 0; i < m_nNodes; i++)
-    {
-      pktsink = apps.Get (i)->GetObject<PacketSink> ();
-      std::cout << "Rx(" << i << ") = " << pktsink->GetTotalRx () <<
-      " bytes (" << pktsink->GetTotalRx () * 8 / (stopTime - startTime) << " bps), ";
-    }
-  std::cout << std::endl;
-
-  Simulator::Destroy ();
-  return 0;
-}
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 NICT
+ *
+ * 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: Hajime Tazaki <tazaki@nict.go.jp>
+ *
+ * This code is a modified version of the code used for the the experiments in the paper
+ * "DCE Cradle: Simulate Network Protocols with Real Stacks for Better Realism"
+ * by Hajime Tazaki, Frederic Urbani and Thierry Turlett presented at WNS3 2013
+ *
+ */
+
+#include "ns3/log.h"
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/flow-monitor-module.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("TcpNscComparison");
+
+std::string m_stack = "nsc-linux";
+std::string sock_factory;
+int m_seed = 1;
+double startTime = 4.0;
+double stopTime = 20.0;
+uint32_t m_nNodes = 2;
+bool enablePcap = false;
+
+int
+main (int argc, char *argv[])
+{
+
+  //ensure the ns3 TCP default values match what nsc is using
+  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1448));
+  Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1));
+
+  CommandLine cmd;
+  cmd.AddValue ("stack", "choose network stack", m_stack);
+  cmd.AddValue ("seed", "randomize seed", m_seed);
+  cmd.AddValue ("nNodes", "the number of nodes in left side", m_nNodes);
+  cmd.AddValue ("stopTime", "duration", stopTime);
+  cmd.AddValue ("enablePcap", "pcap", enablePcap);
+  cmd.Parse (argc, argv);
+
+  SeedManager::SetSeed (m_seed);
+
+  NodeContainer lefts, routers, rights, nodes;
+  lefts.Create (m_nNodes);
+  routers.Create (2);
+  rights.Create (m_nNodes);
+  nodes = NodeContainer (lefts, routers, rights);
+
+  InternetStackHelper internetStack;
+
+  GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
+  if (m_stack == "ns3")
+    {
+      sock_factory = "ns3::TcpSocketFactory";
+      internetStack.Install (nodes);
+    }
+  else if (m_stack == "nsc-linux")
+    {
+      internetStack.Install (routers);
+      sock_factory = "ns3::TcpSocketFactory";
+      internetStack.SetTcp ("ns3::NscTcpL4Protocol",
+                            "Library", StringValue ("liblinux2.6.26.so"));
+      internetStack.Install (lefts);
+      internetStack.Install (rights);
+
+      //these are not implemented in ns3 tcp so disable for comparison
+      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_sack", StringValue ("0"));
+      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_timestamps", StringValue ("0"));
+      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_window_scaling", StringValue ("0"));
+    }
+
+  PointToPointHelper pointToPoint;
+  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
+  pointToPoint.SetChannelAttribute ("Delay", StringValue ("1ns"));
+
+  Ipv4AddressHelper address;
+  Ipv4InterfaceContainer interfaces;
+
+  NetDeviceContainer dev0, dev1, dev2;
+  for (uint32_t i = 0; i < m_nNodes; i++)
+    {
+      std::ostringstream oss;
+      oss << "10.0." << i << ".0";
+      address.SetBase (oss.str ().c_str (), "255.255.255.0");
+      dev0 = pointToPoint.Install (NodeContainer (lefts.Get (i), routers.Get (0)));
+      address.Assign (dev0);
+    }
+
+  // bottle neck link
+  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("2Mbps"));
+  pointToPoint.SetChannelAttribute ("Delay", StringValue ("100ms"));
+  dev1 = pointToPoint.Install (NodeContainer (routers.Get (0), routers.Get (1)));
+
+  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
+  pointToPoint.SetChannelAttribute ("Delay", StringValue ("1ns"));
+  // for right links
+  for (uint32_t i = 0; i < m_nNodes; i++)
+    {
+      std::ostringstream oss;
+      oss << "10.2." << i << ".0";
+      address.SetBase (oss.str ().c_str (), "255.255.255.0");
+      dev2 = pointToPoint.Install (NodeContainer (routers.Get (1), rights.Get (i)));
+      address.Assign (dev2);
+    }
+
+  // bottle neck link
+  Ptr<RateErrorModel> em1 =
+    CreateObjectWithAttributes<RateErrorModel> (
+      "ErrorRate", DoubleValue (0.05),
+      "ErrorUnit", EnumValue (RateErrorModel::ERROR_UNIT_PACKET)
+      );
+  dev1.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (em1));
+
+  address.SetBase ("10.1.0.0", "255.255.255.0");
+  address.Assign (dev1);
+  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+
+  ApplicationContainer apps;
+
+  OnOffHelper onoff = OnOffHelper (sock_factory,
+                                   InetSocketAddress (Ipv4Address ("10.2.0.2"), 2000));
+  onoff.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
+  onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
+
+  // Flow 1 - n
+  for (uint32_t i = 0; i < m_nNodes; i++)
+    {
+      std::ostringstream oss;
+      oss << "10.2." << i << ".2";
+      onoff.SetAttribute ("Remote", AddressValue (InetSocketAddress (Ipv4Address (oss.str ().c_str ()), 2000)));
+      onoff.SetAttribute ("PacketSize", StringValue ("1024"));
+      onoff.SetAttribute ("DataRate", StringValue ("1Mbps"));
+      onoff.SetAttribute ("StartTime", TimeValue (Seconds (startTime)));
+      apps = onoff.Install (lefts.Get (i));
+    }
+
+  PacketSinkHelper sink = PacketSinkHelper (sock_factory,
+                                            InetSocketAddress (Ipv4Address::GetAny (), 2000));
+  apps = sink.Install (rights);
+  apps.Start (Seconds (3.9999));
+
+  pointToPoint.EnablePcapAll ("nsc.pcap");
+
+  Simulator::Stop (Seconds (stopTime));
+  Simulator::Run ();
+
+  Ptr<PacketSink> pktsink;
+  std::cout << "Total ";
+  for (uint32_t i = 0; i < m_nNodes; i++)
+    {
+      pktsink = apps.Get (i)->GetObject<PacketSink> ();
+      std::cout << "Rx(" << i << ") = " << pktsink->GetTotalRx () <<
+      " bytes (" << pktsink->GetTotalRx () * 8 / (stopTime - startTime) << " bps), ";
+    }
+  std::cout << std::endl;
+
+  Simulator::Destroy ();
+  return 0;
+}