Add experience CCN 3. draft default tip
authorfrederic.urbani@inria.fr
Thu, 21 Mar 2013 18:02:13 +0100
changeset 396 3d711b9e43d6
parent 395 220efedec77c
Add experience CCN 3.
myscripts/ccn-exp3/dce-ccn-exp3.cc
myscripts/ccn-exp3/do_exp3.sh
myscripts/ccn-exp3/misc-tools.cc
myscripts/ccn-exp3/misc-tools.h
myscripts/ccn-exp3/wscript
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/myscripts/ccn-exp3/dce-ccn-exp3.cc	Thu Mar 21 18:02:13 2013 +0100
@@ -0,0 +1,528 @@
+#include <fstream>
+#include <vector>
+#include <math.h>
+#include "ns3/network-module.h"
+#include "ns3/core-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/dce-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/netanim-module.h"
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/log.h"
+#include "misc-tools.h"
+#include "ns3/ccn-client-helper.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("CcnExp3");
+
+std::vector<int> GetNodes;
+int middleNode = 0;
+bool onlySomeNodes = false;
+int ccnxVersion = 4;
+
+int linkLowBandwidth = 1; // value in Mbits of small links
+int linkHighBandwidth = 100; // value in Mbits of broadband links
+int lowLinksPercent = 10; // percentage of small links
+int nextAvailable = 0;  // available ID in the nodes list
+int taille = 6 * 1024; // File size
+bool ccnTest = 1;  // use ccn or tcp.
+std::string serverAddr; // Address of the root
+
+void SetPosition (Ptr<Node> n, int radius, int angle, int level)
+{
+  float x = level * radius;
+  float y = 0;
+
+  if (angle != 0)
+    {
+      x += (float) radius * cos ( (M_PI * (float) angle) / 180.0 );
+      y = (float) radius * sin ( (M_PI * (float) angle) / 180.0 );
+    }
+  setPos (n, x, y, 0);
+
+  if (!ccnTest) return;
+
+  CcnClientHelper dce;
+
+  dce.SetStackSize (1 << 20);
+
+  // Launch ccn daemon on node 0
+  dce.SetBinary ("ccnd");
+  dce.ResetArguments ();
+  dce.ResetEnvironment ();
+
+  // dce.AddEnvironment ("CCND_DEBUG", "-1"); // FULL TRACES
+  dce.AddEnvironment ("CCND_DEBUG", "0");
+  dce.AddEnvironment ("CCN_LOCAL_PORT", "9695");
+  dce.AddEnvironment ("CCND_AUTOREG", "");
+  dce.AddEnvironment ("CCND_LISTEN_ON", "");
+  dce.AddEnvironment ("CCND_MTU", "");
+  dce.AddEnvironment ("CCND_LOCAL_SOCKNAME", "");
+  dce.AddEnvironment ("CCND_DATA_PAUSE_MICROSEC", "");
+  dce.AddEnvironment ("CCND_KEYSTORE_DIRECTORY", "");
+
+  ApplicationContainer daemon = dce.Install (n);
+  daemon.Start (Seconds (0)) ;
+
+  // Stop ccnd before simu end.
+  dce.ResetArguments();
+  dce.ResetEnvironment();
+  dce.SetBinary ("ccndsmoketest");
+  dce.SetStdinFile ("");
+  dce.AddArgument ("kill");
+  ApplicationContainer apps = dce.Install (n);
+  apps.Start (Seconds (299.0));
+
+}
+
+void LinkNodes (Ptr<Node> left, int leftNum,  Ptr<Node> right, int level, int idx, bool doGet,
+    std::string dataRate, std::string delay)
+{
+  static int oct1 = 1;
+  static int oct2 = 1;
+  bool useTcp = 0;
+  NS_LOG_FUNCTION (idx);
+
+  PointToPointHelper pointToPoint;
+  pointToPoint.SetDeviceAttribute ("DataRate", StringValue (dataRate));
+  pointToPoint.SetChannelAttribute ("Delay", StringValue (delay));
+
+  NetDeviceContainer devices;
+  devices = pointToPoint.Install (left, right);
+
+  Ipv4AddressHelper address;
+  std::ostringstream oss;
+
+  if( oct1 == 254) {
+      oct2++;
+      oct1 = 1;
+  }
+  oss << "10."<<( oct2 ) << "."<<( oct1++ ) << ".0";
+
+  std::string network = oss.str ();
+
+  std::string base = "0.0.0.1";
+
+  address.SetBase (network.c_str (), "255.255.255.252", base.c_str () );
+
+  Ipv4InterfaceContainer interfaces = address.Assign (devices);
+
+  NS_LOG_INFO ("Level"<< level );
+  NS_LOG_INFO ("addr1: "<< interfaces.GetAddress (1) );
+  NS_LOG_INFO ("addr0: " << interfaces.GetAddress (0) );
+
+  NS_LOG_FUNCTION ( interfaces.GetAddress (1) << " <-- " << interfaces.GetAddress (0));
+
+  if (ccnTest)
+    {
+      CcnClientHelper dce;
+      ApplicationContainer config;
+
+      dce.SetStackSize (1 << 20);
+
+      dce.SetBinary ("ccndc");
+      dce.ResetArguments ();
+      dce.ResetEnvironment ();
+      dce.AddEnvironment ("HOME", "/root");
+      dce.AddArgument ("-v");
+      dce.AddArgument ("add");
+      dce.AddArgument ("/");
+      dce.AddArgument (useTcp ? "tcp" : "udp");
+      dce.AddArgument ( Ipv4AddressToString( interfaces.GetAddress (1)) );
+
+      config = dce.Install (left);
+      config.Start (Seconds (0.1));
+    }
+  if (doGet)
+    {
+      GetNodes.push_back (leftNum);
+    }
+  if ( 1 == level )
+    {
+      std::ostringstream oss;
+
+      oss << interfaces.GetAddress (1);
+      serverAddr = oss.str ();
+    }
+}
+
+/**
+ * Returns 100 or 1 for lowLinksPercent
+ */
+int linkBandwidth()
+{
+  int value = rand() % 100;
+  if(value < lowLinksPercent)
+    return linkLowBandwidth;
+  return linkHighBandwidth;
+}
+
+/**
+ * Recursive function to create a complete ternary tree
+ *
+ * nodes: list of nodes
+ * width: max level of the tree
+ * level: present level of the tree
+ * father: id of the previous node on the tree
+ * radius: To calculate the position
+ * power: To calculate the angle position
+ * i: index of which position on the ternary three the node is located
+ */
+void LinkTernaryThree(NodeContainer nodes, int width, int level, int father, int radius, int power, int i)
+{
+  int angle = 90 - ( i * 90 / power );
+  int band = linkBandwidth();
+  std::ostringstream o;
+  o << band << "Mbps";
+
+  if (level == width -1){
+      int myID_l = nextAvailable;
+      nextAvailable++;
+      SetPosition (nodes.Get (myID_l), radius,  angle, level);
+      LinkNodes (nodes.Get (myID_l), myID_l,
+          nodes.Get (father), level, myID_l, true, o.str(),"1ms");
+      return;
+  }
+  int myID = nextAvailable;
+  nextAvailable++;
+
+  for (int j = 0; j < 3; j++)
+    {
+      LinkTernaryThree(nodes, width, level+1, myID, radius, (power+(j*3)+level), j);
+    }
+  SetPosition (nodes.Get (myID), radius,  angle, level);
+
+  if(level!=0) // the first node
+    LinkNodes (nodes.Get (myID), myID, nodes.Get (father), level, myID, false, o.str(),"1ms");
+
+  return;
+}
+
+int less = 1;
+int other = 49;
+int more = 50;
+
+void InstallGetters (NodeContainer nodes )
+{
+  int getNumber = 0;
+  CcnClientHelper dce;
+
+  for (int n=0; n < GetNodes.size () ; n++)
+    {
+      int nodeNum = GetNodes [n];
+
+      if ((onlySomeNodes &&  (nodeNum == 13) || (nodeNum == 39))||(!onlySomeNodes))
+        {
+
+          getNumber++;
+
+          int percent = getNumber % 100;
+
+          dce.SetStackSize (1 << 20);
+          dce.ResetArguments();
+          dce.ResetEnvironment();
+
+          if (ccnTest)
+            {
+              if (taille > 0)
+                {
+                  dce.SetBinary ("lanceur");
+                }
+              else
+                {
+                  dce.AddEnvironment("HOME", "/root");
+                  dce.SetBinary ((ccnxVersion==4)?"ccnget":"ccnpeek");
+                  dce.SetStdinFile ("");
+                  dce.AddArgument ("-c");
+                  dce.AddArgument ("/A");
+                }
+            }
+          else
+            {
+              dce.SetBinary ("my-client");
+              dce.AddArgument (serverAddr.c_str());
+              dce.AddArgument ("5000");
+              std::ostringstream oss;
+              oss << (taille * 1024);
+              dce.AddArgument (oss.str());
+            }
+          ApplicationContainer get = dce.Install (nodes.Get (nodeNum));
+
+          get.Start (Seconds (1.0));
+        }
+    }
+}
+
+void
+CreateFiles (int taille)
+{
+  std::ofstream osf("/tmp/README", std::fstream::trunc);
+
+  osf << "The wanted data is here :)" ;
+
+  osf.close ();
+
+  FILE *f = fopen("/tmp/bigone","w");
+  char buffer[1024];
+
+  memset (buffer, 'A', sizeof (buffer));
+  for (int i = 0; i < taille ; i++)
+    {
+      fwrite (buffer, sizeof (buffer), 1 , f);
+    }
+  fclose (f);
+}
+// ===========================================================================
+//
+//
+// ===========================================================================
+int
+main (int argc, char *argv[])
+{
+  int width = 3;
+  int radius = 2000;
+  bool nn = false;
+  int seed = 10;
+  std::string packetSize = "1024";
+  std::string outputFileName;
+  std::string summaryFileName;
+  bool useKernel = true;
+
+ // GlobalValue::Bind ("SimulatorImplementationType", StringValue ("ns3::DceSimulatorImpl"));
+
+  CommandLine cmd;
+  cmd.AddValue ("kernel", "Use kernel linux IP stack.", useKernel);
+  cmd.AddValue ("width", "Topology width min 2, default 2.", width);
+  cmd.AddValue ("radius", "Radius default 2000.", radius);
+  cmd.AddValue ("NN", "Toggle, if true return the number of nodes for this parameters.", nn);
+  cmd.AddValue ("some", "Toggle, if true only some nodes do ccnget ", onlySomeNodes);
+  cmd.AddValue ("cv", "Ccnx version 4 for 0.4.x variantes and 5 for 0.5.x variantes, default: 4", ccnxVersion);
+  cmd.AddValue ("total", "Downloaded file size in Ko default 6144", taille);
+  cmd.AddValue ("size", "packet size for ccnsendchunks. default 1024.", packetSize);
+  cmd.AddValue ("ccnd", "if true use ccnd to exchange the file, else use ttcp.", ccnTest);
+  cmd.AddValue ("seed", "Random seed.", seed);
+  cmd.AddValue ("low", "Low Bandwidth  value in Mbits of small links. Default 1.", linkLowBandwidth);
+  cmd.AddValue ("high", "High Bandwidth  value in Mbits of small links. Default 100.", linkHighBandwidth);
+  cmd.AddValue ("part", "Percentage of small links. Default 10.", lowLinksPercent);
+  cmd.Parse (argc, argv);
+
+  srand ( seed );
+
+  NS_ASSERT_MSG (radius >= 2, "Radius must be greater or equal to 2.");
+  NS_ASSERT_MSG ( (4 == ccnxVersion) || (5 == ccnxVersion),
+      "Ccnx version must be equal to 4 or 5");
+
+  std::ostringstream oss;
+
+  int NodeNumber = 1;
+  int power = 0;
+  //  NodeNumber++;
+  for (int level = 0; level < width ; level++)
+    {
+      if (level == 1)
+        {
+          power = 3;
+        }
+      else
+        {
+          power = power * 3;
+        }
+      NodeNumber += power;
+    }
+  if (nn)
+    {
+      printf ("%d\n",NodeNumber);
+      exit (0);
+    }
+
+  oss << "Exp3-" << (ccnTest?"Ccn":"Tcp") << "-NN-" << NodeNumber << "-SZ-" << taille << "-Kb-Low-" << linkLowBandwidth
+      << "-High-" << linkHighBandwidth << "-Part-" << lowLinksPercent << "-Seed-" << seed ;
+  outputFileName = oss.str ();
+
+  std::ostringstream oss2;
+  oss2 << "Exp3-" << (ccnTest?"Ccn":"Tcp") << "-SZ-" << taille << "-Kb-Low-" << linkLowBandwidth
+      << "-High-" << linkHighBandwidth << "-Part-" << lowLinksPercent << "-Seed-" << seed ;
+
+  summaryFileName = oss2.str ();
+
+  NodeContainer nodes;
+  nodes.Create (NodeNumber);
+
+  DceManagerHelper dceManager;
+
+#ifdef KERNEL_STACK
+  if (useKernel)
+    {
+      dceManager.SetNetworkStack ("ns3::LinuxSocketFdFactory", "Library", StringValue ("liblinux.so"));
+      LinuxStackHelper stack;
+      stack.Install (nodes);
+    }
+  else
+#endif
+    {
+      InternetStackHelper stack;
+      stack.Install (nodes);
+    }
+
+  int NodeCursor = 0;
+  int PreviousCenter = -1;
+
+  power = 0;
+
+  LinkTernaryThree(nodes, width, 0, 0, radius, 1, 0);
+
+
+  //DceApplicationHelper dce;
+  CreateFiles (taille);
+
+  CcnClientHelper dce;
+
+  dce.SetStackSize (1 << 20);
+  dce.ResetArguments();
+  dce.ResetEnvironment();
+
+  if (ccnTest)
+    {
+      if (taille > 0)
+        {
+          // PUBLISH DATA FILE ON NODE 0
+          dce.ResetArguments();
+          dce.ResetEnvironment();
+          dce.SetBinary ("ccnsendchunks");
+          dce.AddEnvironment("HOME", "/root");
+          dce.SetStdinFile ("/tmp/bigone");
+          dce.AddFile ("/tmp/bigone", "/tmp/bigone");
+          dce.AddArgument ("-b");
+          dce.AddArgument (packetSize);
+          dce.AddArgument ("-x");
+          dce.AddArgument ("2000"); // 2147  is the max as visible in great ccnx source code !
+          dce.AddArgument ("ccnx:/DATAFILE");
+        }
+      else
+        {
+          dce.SetBinary ((ccnxVersion==4)?"ccnput":"ccnpoke");
+          dce.SetStdinFile ("/tmp/README");
+          dce.AddFile ("/tmp/README", "/tmp/README");
+
+          dce.AddArgument ("-x" );
+          dce.AddArgument ("300" );
+          dce.AddArgument ("/A");
+          dce.AddEnvironment("HOME", "/root");
+        }
+    }
+  else
+    {
+      std::ostringstream oss;
+
+      oss << (taille * 1024);
+      dce.ResetArguments();
+      dce.ResetEnvironment();
+      dce.SetBinary ("my-serveur");
+      dce.AddArgument ("5000");
+      dce.AddArgument (oss.str());
+    }
+
+  ApplicationContainer put = dce.Install (nodes.Get (0));
+  put.Start (Seconds ( 0.15 ));
+
+  InstallGetters ( nodes );
+  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+
+  dceManager.Install (nodes);
+  dceManager.SetAttribute ("MinimizeOpenFiles", BooleanValue (1) );
+
+  Simulator::Stop (Seconds (30000.0));
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+  std::string sumFn = summaryFileName + "-Max-Time.txt";
+  std::string sumFn2 = summaryFileName + "-Average-Time.txt";
+
+  if (ccnTest)
+    {
+      int nSuccess = 0;
+      long maxTime = 0;
+      int nFailures = 0;
+      std::string fn = outputFileName + ".time-per-node";
+      std::ofstream timepernode( fn.c_str (), std::fstream::trunc);
+      long totalTime = 0;
+
+
+      for (int n=0; n < GetNodes.size () ; n++)
+        {
+          int nodeNum = GetNodes [n];
+
+          int c=nodeNum;
+          {
+            int nodeId = c;
+            char filename[1024];
+            struct stat st;
+
+            sprintf (filename,"files-%d/var/log/SUCCESS.TXT", nodeId);
+
+            if ( 0 == stat (filename, &st) )
+              {
+                nSuccess++;
+                FILE *f = fopen (filename ,"r");
+                long duration = 0;
+                if (fscanf (f, "%ld", &duration) > 0)
+                  {
+                    timepernode << "Node " << nodeId << ' ' << duration << std::endl;
+
+                    totalTime += duration;
+                    if (duration > maxTime)
+                      {
+                        maxTime = duration;
+                      }
+                  }
+                fclose (f);
+              }
+            else
+              {
+                sprintf (filename,"files-%d/var/log/FAILURE.TXT", nodeId);
+
+                if ( 0 == stat (filename, &st) )
+                  {
+                    nFailures++;
+                  }
+              }
+          }
+        }
+      timepernode.close ();
+      NS_LOG_INFO  ("Synthese " << nSuccess << " %d OK, " << nSuccess << " KO, total duration " <<  maxTime);
+      FILE *f = fopen (sumFn.c_str (), "a+");
+      fprintf (f, "%d  %ld\n", nSuccess ,maxTime);
+      fclose (f);
+      if (0 != nSuccess)
+        {
+          f = fopen (sumFn2.c_str (), "a+");
+          fprintf (f, "%d  %ld # %s\n", nSuccess ,totalTime / nSuccess ,outputFileName.c_str ());
+          fclose (f);
+        }
+    }
+  else
+    {
+      char *filename = "files-0/var/log/duration.txt";
+      struct stat st;
+
+      if ( 0 == stat (filename, &st) )
+        {
+          FILE *f = fopen (filename ,"r");
+          long duration = 0;
+          if (fscanf (f, "%ld", &duration) > 0)
+            {
+              FILE *ff = fopen (sumFn.c_str (), "a+");
+              fprintf (ff, "%d  %ld\n", GetNodes.size (), duration);
+              fclose (ff);
+            }
+        }
+    }
+
+  return 0;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/myscripts/ccn-exp3/do_exp3.sh	Thu Mar 21 18:02:13 2013 +0100
@@ -0,0 +1,42 @@
+#!/bin/bash
+EXE=../build/myscripts/ccn-exp3/bin/dce-ccn-exp3
+START=$1
+STOP=$2
+INC=$3
+SEED=42
+if [ $# -ge 4 ]
+then
+  SIZ=$4
+else
+  SIZ=200
+fi
+PSIZE=2048
+function do_run 
+{
+   CCND=$1
+   W=$2
+   SIZE=$3
+   P=$4
+   SEED=$5
+   if [ $CCND -eq 0 ]
+   then 
+  	T=Tcp 
+   else
+    T=Ccn
+   fi
+   FILENAME=Exp3-$T-Node-Number-$NN-Size-Transfert-$SIZE-Kb
+   rm -rf files-*
+   /usr/bin/time -f '%e %M # Elapsed real time (in seconds) and Memory Max' $EXE --total=$SIZE --seed=$SEED --ccnd=$CCND --part=$P --width=$W 2>$FILENAME.simulation-time-and-memory
+   cat $FILENAME*	   
+}   
+for ((s=1;s<=32;s+=1))
+do
+for ((p=0;p<=20;p+=5))
+do
+for ((w=$START;w<=$STOP;w+=$INC))
+do
+	do_run 0 $w $SIZ $p $s 
+	do_run 1 $w $SIZ $p $s
+done 
+done
+done
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/myscripts/ccn-exp3/misc-tools.cc	Thu Mar 21 18:02:13 2013 +0100
@@ -0,0 +1,42 @@
+#include "misc-tools.h"
+#include "ns3/constant-position-mobility-model.h"
+//#include "ns3/applications-module.h"
+#include "ns3/dce-module.h"
+
+namespace ns3 {
+
+void setPos (Ptr<Node> n, int x, int y, int z)
+{
+  Ptr<ConstantPositionMobilityModel> loc = CreateObject<ConstantPositionMobilityModel> ();
+  n->AggregateObject (loc);
+  Vector locVec2 ( x, y, z);
+  loc->SetPosition (locVec2);
+}
+
+
+void RunIp (Ptr<Node> node, Time at, std::string str)
+{
+  DceApplicationHelper process;
+  ApplicationContainer apps;
+  process.SetBinary ("ip");
+  process.SetStackSize (1<<16);
+  process.ResetArguments();
+  process.ParseArguments(str.c_str ());
+  apps = process.Install (node);
+  apps.Start (at);
+}
+
+void AddAddress (Ptr<Node> node, Time at, const char *name, const char *address)
+{
+  std::ostringstream oss;
+  oss << "-f inet addr add " << address << " dev " << name;
+  RunIp (node, at, oss.str ());
+}
+
+std::string Ipv4AddressToString (Ipv4Address ad)
+{
+  std::ostringstream oss;
+  ad.Print (oss);
+  return oss.str ();
+}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/myscripts/ccn-exp3/misc-tools.h	Thu Mar 21 18:02:13 2013 +0100
@@ -0,0 +1,17 @@
+#ifndef MISC_TOOLS_H
+#define MISC_TOOLS_H
+#include "ns3/network-module.h"
+#include "ns3/core-module.h"
+
+namespace ns3 {
+
+  void setPos (Ptr<Node> n, int x, int y, int z);
+
+  void RunIp (Ptr<Node> node, Time at, std::string str);
+
+  void AddAddress (Ptr<Node> node, Time at, const char *name, const char *address);
+
+  std::string Ipv4AddressToString (Ipv4Address ad);
+}
+
+#endif // MISC_TOOLS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/myscripts/ccn-exp3/wscript	Thu Mar 21 18:02:13 2013 +0100
@@ -0,0 +1,15 @@
+## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+import ns3waf
+
+def configure(conf):
+    ns3waf.check_modules(conf, ['core', 'internet', 'point-to-point', 'netanim'], mandatory = True)
+
+def build(bld):
+    bld.build_a_script('dce', needed = ['core', 'internet', 'dce', 'point-to-point', 'netanim' ],
+				  target='bin/dce-ccn-exp3',
+				  source=['dce-ccn-exp3.cc', 'misc-tools.cc'],
+#				  linkflags=['-L/usr/local/lib'],
+#				  lib=['foolib']
+				  )
+