add function conv param string
[oweals/gnunet.git] / src / ats-tests / ats-testing-log.c
index 17b3ab450eff1951f355e58be7ab8edb09f28507..2442a8249ad5ca59e491d5d2c6d3342603940a75 100644 (file)
@@ -1,6 +1,6 @@
 /*
  This file is part of GNUnet.
- (C) 2010-2013 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2010-2013 GNUnet e.V.
 
  GNUnet is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
  You should have received a copy of the GNU General Public License
  along with GNUnet; see the file COPYING.  If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
  */
 /**
  * @file ats-tests/ats-testing-log.c
@@ -121,25 +121,22 @@ struct PartnerLoggingTimestep
 
   /* Current ATS properties */
 
-  uint32_t ats_distance;
+  unsigned int ats_distance;
 
-  uint32_t ats_delay;
+  struct GNUNET_TIME_Relative ats_delay;
 
   uint32_t bandwidth_in;
 
   uint32_t bandwidth_out;
 
-  uint32_t ats_utilization_up;
+  uint32_t ats_utilization_out;
 
-  uint32_t ats_utilization_down;
+  uint32_t ats_utilization_in;
 
-  uint32_t ats_network_type;
+  enum GNUNET_ATS_Network_Type ats_network_type;
 
-  uint32_t ats_cost_wan;
-
-  uint32_t ats_cost_lan;
-
-  uint32_t ats_cost_wlan;
+  double pref_bandwidth;
+  double pref_delay;
 };
 
 
@@ -230,14 +227,16 @@ struct LoggingHandle
   /**
    * Logging task
    */
-  GNUNET_SCHEDULER_TaskIdentifier log_task;
+  struct GNUNET_SCHEDULER_Task *log_task;
 
   /**
    * Reference to perf_ats' masters
    */
-  int num_peers;
+  int num_masters;
+  int num_slaves;
   int running;
-  char *name;
+  int verbose;
+  const char *name;
   struct GNUNET_TIME_Relative frequency;
 
   /**
@@ -249,15 +248,17 @@ struct LoggingHandle
 
 
 static void
-write_throughput_gnuplot_script (char * fn, struct LoggingPeer *lp)
+write_throughput_gnuplot_script (char * fn, struct LoggingPeer *lp, char **fs, int slaves)
 {
   struct GNUNET_DISK_FileHandle *f;
   char * gfn;
   char *data;
   int c_s;
-  int peer_index;
 
   GNUNET_asprintf (&gfn, "gnuplot_throughput_%s",fn);
+  fprintf (stderr, "Writing throughput plot for master %u and %u slaves to `%s'\n",
+      lp->peer->no, slaves, gfn);
+
   f = GNUNET_DISK_file_open (gfn,
       GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE,
       GNUNET_DISK_PERM_USER_EXEC | GNUNET_DISK_PERM_USER_READ |
@@ -270,41 +271,37 @@ write_throughput_gnuplot_script (char * fn, struct LoggingPeer *lp)
   }
 
   /* Write header */
-
   if (GNUNET_SYSERR == GNUNET_DISK_file_write(f, THROUGHPUT_TEMPLATE,
       strlen(THROUGHPUT_TEMPLATE)))
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
         "Cannot write data to plot file `%s'\n", gfn);
 
   /* Write master data */
-  peer_index = LOG_ITEMS_TIME;
   GNUNET_asprintf (&data,
       "plot '%s' using 2:%u with lines title 'Master %u send total', \\\n" \
       "'%s' using 2:%u with lines title 'Master %u receive total', \\\n",
-      fn, peer_index + LOG_ITEM_THROUGHPUT_SENT, lp->peer->no,
-      fn, peer_index + LOG_ITEM_THROUGHPUT_RECV, lp->peer->no);
+      fn, LOG_ITEMS_TIME + LOG_ITEM_THROUGHPUT_SENT, lp->peer->no,
+      fn, LOG_ITEMS_TIME + LOG_ITEM_THROUGHPUT_RECV, lp->peer->no);
   if (GNUNET_SYSERR == GNUNET_DISK_file_write(f, data, strlen(data)))
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot write data to plot file `%s'\n", gfn);
   GNUNET_free (data);
 
-  peer_index = LOG_ITEMS_TIME + LOG_ITEMS_PER_PEER ;
-  for (c_s = 0; c_s < lp->peer->num_partners; c_s++)
+  for (c_s = 0; c_s < slaves; c_s++)
   {
     GNUNET_asprintf (&data, "'%s' using 2:%u with lines title 'Master %u - Slave %u send', \\\n" \
         "'%s' using 2:%u with lines title 'Master %u - Slave %u receive'%s\n",
-        fn,
-        peer_index + LOG_ITEM_THROUGHPUT_SENT,
+        fs[c_s],
+        LOG_ITEMS_TIME + LOG_ITEM_THROUGHPUT_SENT,
         lp->peer->no,
         lp->peer->partners[c_s].dest->no,
-        fn,
-        peer_index + LOG_ITEM_THROUGHPUT_RECV,
+        fs[c_s],
+        LOG_ITEMS_TIME + LOG_ITEM_THROUGHPUT_RECV,
         lp->peer->no,
         lp->peer->partners[c_s].dest->no,
         (c_s < lp->peer->num_partners -1) ? ", \\" : "\n pause -1");
     if (GNUNET_SYSERR == GNUNET_DISK_file_write(f, data, strlen(data)))
         GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot write data to plot file `%s'\n", gfn);
     GNUNET_free (data);
-    peer_index += LOG_ITEMS_PER_PEER;
   }
 
   if (GNUNET_SYSERR == GNUNET_DISK_file_close(f))
@@ -313,21 +310,22 @@ write_throughput_gnuplot_script (char * fn, struct LoggingPeer *lp)
   else
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
         "Data successfully written to plot file `%s'\n", gfn);
-
   GNUNET_free (gfn);
 }
 
 
 static void
-write_rtt_gnuplot_script (char * fn, struct LoggingPeer *lp)
+write_rtt_gnuplot_script (char * fn, struct LoggingPeer *lp, char **fs, int slaves)
 {
   struct GNUNET_DISK_FileHandle *f;
   char * gfn;
   char *data;
   int c_s;
-  int index;
 
   GNUNET_asprintf (&gfn, "gnuplot_rtt_%s",fn);
+  fprintf (stderr, "Writing rtt plot for master %u to `%s'\n",
+      lp->peer->no, gfn);
+
   f = GNUNET_DISK_file_open (gfn,
       GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE,
       GNUNET_DISK_PERM_USER_EXEC | GNUNET_DISK_PERM_USER_READ |
@@ -340,21 +338,21 @@ write_rtt_gnuplot_script (char * fn, struct LoggingPeer *lp)
   }
 
   /* Write header */
-
   if (GNUNET_SYSERR == GNUNET_DISK_file_write(f, RTT_TEMPLATE, strlen(RTT_TEMPLATE)))
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot write data to plot file `%s'\n", gfn);
 
-  index = LOG_ITEMS_TIME + LOG_ITEMS_PER_PEER;
-  for (c_s = 0; c_s < lp->peer->num_partners; c_s++)
+  for (c_s = 0; c_s < slaves; c_s++)
   {
     GNUNET_asprintf (&data, "%s'%s' using 2:%u with lines title 'Master %u - Slave %u '%s\n",
         (0 == c_s) ? "plot " :"",
-        fn, index + LOG_ITEM_APP_RTT, lp->peer->no, lp->peer->partners[c_s].dest->no,
+        fs[c_s],
+        LOG_ITEMS_TIME + LOG_ITEM_APP_RTT,
+        lp->peer->no,
+        lp->peer->partners[c_s].dest->no,
         (c_s < lp->peer->num_partners -1) ? ", \\" : "\n pause -1");
     if (GNUNET_SYSERR == GNUNET_DISK_file_write(f, data, strlen(data)))
         GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot write data to plot file `%s'\n", gfn);
     GNUNET_free (data);
-    index += LOG_ITEMS_PER_PEER;
   }
 
   if (GNUNET_SYSERR == GNUNET_DISK_file_close(f))
@@ -365,15 +363,17 @@ write_rtt_gnuplot_script (char * fn, struct LoggingPeer *lp)
 }
 
 static void
-write_bw_gnuplot_script (char * fn, struct LoggingPeer *lp)
+write_bw_gnuplot_script (char * fn, struct LoggingPeer *lp, char **fs, int slaves)
 {
   struct GNUNET_DISK_FileHandle *f;
   char * gfn;
   char *data;
   int c_s;
-  int index;
 
   GNUNET_asprintf (&gfn, "gnuplot_bw_%s",fn);
+  fprintf (stderr, "Writing bandwidth plot for master %u to `%s'\n",
+      lp->peer->no, gfn);
+
   f = GNUNET_DISK_file_open (gfn,
       GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE,
       GNUNET_DISK_PERM_USER_EXEC | GNUNET_DISK_PERM_USER_READ |
@@ -386,26 +386,27 @@ write_bw_gnuplot_script (char * fn, struct LoggingPeer *lp)
   }
 
   /* Write header */
-
   if (GNUNET_SYSERR == GNUNET_DISK_file_write(f, BW_TEMPLATE, strlen(BW_TEMPLATE)))
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
         "Cannot write data to plot file `%s'\n", gfn);
 
-  index = LOG_ITEMS_TIME + LOG_ITEMS_PER_PEER;
-  for (c_s = 0; c_s < lp->peer->num_partners; c_s++)
+  for (c_s = 0; c_s < slaves; c_s++)
   {
     GNUNET_asprintf (&data, "%s"\
         "'%s' using 2:%u with lines title 'BW out master %u - Slave %u ', \\\n" \
         "'%s' using 2:%u with lines title 'BW in master %u - Slave %u '"\
         "%s\n",
         (0 == c_s) ? "plot " :"",
-        fn, index + LOG_ITEM_ATS_BW_OUT, lp->peer->no, lp->peer->partners[c_s].dest->no,
-        fn, index + LOG_ITEM_ATS_BW_IN, lp->peer->no, lp->peer->partners[c_s].dest->no,
+        fs[c_s],
+        LOG_ITEMS_TIME + LOG_ITEM_ATS_BW_OUT,
+        lp->peer->no, c_s,
+        fs[c_s],
+        LOG_ITEMS_TIME + LOG_ITEM_ATS_BW_IN,
+        lp->peer->no, c_s,
         (c_s < lp->peer->num_partners -1) ? ", \\" : "\n pause -1");
     if (GNUNET_SYSERR == GNUNET_DISK_file_write(f, data, strlen(data)))
         GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot write data to plot file `%s'\n", gfn);
     GNUNET_free (data);
-    index += LOG_ITEMS_PER_PEER;
   }
 
   if (GNUNET_SYSERR == GNUNET_DISK_file_close(f))
@@ -417,55 +418,103 @@ write_bw_gnuplot_script (char * fn, struct LoggingPeer *lp)
 
 
 void
-GNUNET_ATS_TEST_logging_write_to_file (struct LoggingHandle *l, char *test_name)
+GNUNET_ATS_TEST_logging_write_to_file (struct LoggingHandle *l,
+                                       const char *experiment_name,
+                                       int plots)
 {
-  struct GNUNET_DISK_FileHandle *f;
-
-  char * filename;
+  struct GNUNET_DISK_FileHandle *f[l->num_slaves];
+  struct GNUNET_DISK_FileHandle *f_m;
+  const char *tmp_exp_name;
+  char *filename_master;
+  char *filename_slaves[l->num_slaves];
   char *data;
-  char *slave_string;
-  char *slave_string_tmp;
   struct PeerLoggingTimestep *cur_lt;
   struct PartnerLoggingTimestep *plt;
   struct GNUNET_TIME_Absolute timestamp;
   int c_m;
   int c_s;
 
+
   timestamp = GNUNET_TIME_absolute_get();
 
-  for (c_m = 0; c_m < l->num_peers; c_m++)
+  tmp_exp_name = experiment_name;
+  for (c_m = 0; c_m < l->num_masters; c_m++)
   {
-    GNUNET_asprintf (&filename, "%s_%llu_master_%u_%s_%s.data", test_name,
-        timestamp.abs_value_us,
-        l->lp[c_m].peer->no, GNUNET_i2s(&l->lp[c_m].peer->id), l->name);
-
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Writing master %u to file `%s'\n",
-        c_m, filename);
+    GNUNET_asprintf (&filename_master, "%s_%llu_master%u_%s",
+        experiment_name, timestamp.abs_value_us, c_m, l->name);
+    fprintf (stderr, "Writing data for master %u to file `%s'\n",
+        c_m,filename_master);
 
-    f = GNUNET_DISK_file_open (filename,
+    f_m = GNUNET_DISK_file_open (filename_master,
         GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE,
         GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE);
-    if (NULL == f)
+    if (NULL == f_m)
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot open log file `%s'\n", filename);
-      GNUNET_free (filename);
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot open log file `%s'\n", filename_master);
+      GNUNET_free (filename_master);
       return;
     }
 
-    GNUNET_asprintf (&data, "# master peers: %u ; slave peers: %u ; experiment : %s\n",
-        l->num_peers, l->lp[c_m].peer->num_partners, test_name);
-    if (GNUNET_SYSERR == GNUNET_DISK_file_write(f, data, strlen(data)))
+    GNUNET_asprintf (&data, "# master %u; experiment : %s\n"
+        "timestamp; timestamp delta; #messages sent; #bytes sent; #throughput sent; #messages received; #bytes received; #throughput received; \n" ,
+        c_m,  experiment_name);
+    if (GNUNET_SYSERR == GNUNET_DISK_file_write(f_m, data, strlen(data)))
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-          "Cannot write data to log file `%s'\n", filename);
+          "Cannot write data to log file `%s'\n",filename_master);
     GNUNET_free (data);
 
+    for (c_s = 0; c_s < l->lp[c_m].peer->num_partners; c_s++)
+    {
+      GNUNET_asprintf (&filename_slaves[c_s], "%s_%llu_master%u_slave_%u_%s",
+          tmp_exp_name, timestamp.abs_value_us, c_m, c_s, l->name);
+
+      fprintf (stderr, "Writing data for master %u slave %u to file `%s'\n",
+          c_m, c_s, filename_slaves[c_s]);
+
+      f[c_s] = GNUNET_DISK_file_open (filename_slaves[c_s],
+          GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE,
+          GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE);
+      if (NULL == f[c_s])
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot open log file `%s'\n", filename_slaves[c_s]);
+        GNUNET_free (filename_slaves[c_s]);
+        GNUNET_break (GNUNET_OK == GNUNET_DISK_file_close(f_m));
+        GNUNET_free (filename_master);
+        return;
+      }
+
+      /* Header */
+      GNUNET_asprintf (&data, "# master %u; slave %u ; experiment : %s\n"
+          "timestamp; timestamp delta; #messages sent; #bytes sent; #throughput sent; #messages received; #bytes received; #throughput received; " \
+          "rtt; bw in; bw out; ats_cost_lan; ats_cost_wlan; ats_delay; ats_distance; ats_network_type; ats_utilization_up ;ats_utilization_down;" \
+          "pref bandwidth; pref delay\n",
+          c_m, c_s, experiment_name);
+      if (GNUNET_SYSERR == GNUNET_DISK_file_write(f[c_s], data, strlen(data)))
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+            "Cannot write data to log file `%s'\n",filename_slaves[c_s]);
+      GNUNET_free (data);
+    }
+
     for (cur_lt = l->lp[c_m].head; NULL != cur_lt; cur_lt = cur_lt->next)
     {
-       GNUNET_log(GNUNET_ERROR_TYPE_INFO,
-          "Master [%u]: timestamp %llu %llu ; %u %u %u ; %u %u %u\n",
-          l->lp[c_m].peer->no,
-          cur_lt->timestamp,
-          GNUNET_TIME_absolute_get_difference(l->lp[c_m].start,
+      if (l->verbose)
+        fprintf (stderr,
+           "Master [%u]: timestamp %llu %llu ; %u %u %u ; %u %u %u\n",
+           l->lp[c_m].peer->no,
+           (long long unsigned int) cur_lt->timestamp.abs_value_us,
+           (long long unsigned int) GNUNET_TIME_absolute_get_difference(l->lp[c_m].start,
+               cur_lt->timestamp).rel_value_us / 1000,
+           cur_lt->total_messages_sent,
+           cur_lt->total_bytes_sent,
+           cur_lt->total_throughput_send,
+           cur_lt->total_messages_received,
+           cur_lt->total_bytes_received,
+           cur_lt->total_throughput_recv);
+
+      /* Assembling master string */
+      GNUNET_asprintf (&data, "%llu;%llu;%u;%u;%u;%u;%u;%u;\n",
+          (long long unsigned int) cur_lt->timestamp.abs_value_us,
+          (long long unsigned int) GNUNET_TIME_absolute_get_difference(l->lp[c_m].start,
               cur_lt->timestamp).rel_value_us / 1000,
           cur_lt->total_messages_sent,
           cur_lt->total_bytes_sent,
@@ -474,91 +523,101 @@ GNUNET_ATS_TEST_logging_write_to_file (struct LoggingHandle *l, char *test_name)
           cur_lt->total_bytes_received,
           cur_lt->total_throughput_recv);
 
-      slave_string = GNUNET_strdup (";");
+      if (GNUNET_SYSERR == GNUNET_DISK_file_write(f_m, data, strlen(data)))
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+            "Cannot write data to master file %u\n", c_m);
+      GNUNET_free (data);
+
+
       for (c_s = 0; c_s < l->lp[c_m].peer->num_partners; c_s++)
       {
         plt = &cur_lt->slaves_log[c_s];
         /* Log partners */
 
         /* Assembling slave string */
-        GNUNET_log(GNUNET_ERROR_TYPE_INFO,
-            "\t Slave [%u]: %u %u %u ; %u %u %u rtt %u delay %u bw_in %u bw_out %u \n",
-            plt->slave->no,
+        GNUNET_asprintf(&data,
+            "%llu;%llu;%u;%u;%u;%u;%u;%u;%.3f;%u;%u;%u;%u;%u;%u;%u;%.3f;%.3f\n",
+            (long long unsigned int) cur_lt->timestamp.abs_value_us,
+            (long long unsigned int) GNUNET_TIME_absolute_get_difference(l->lp[c_m].start,
+                cur_lt->timestamp).rel_value_us / 1000,
             plt->total_messages_sent,
             plt->total_bytes_sent,
             plt->throughput_sent,
             plt->total_messages_received,
             plt->total_bytes_received,
             plt->throughput_recv,
-            plt->app_rtt,
-            plt->ats_delay,
-            plt->bandwidth_in,
-            plt->bandwidth_out);
-
-        GNUNET_asprintf(&slave_string_tmp,
-            "%s%u;%u;%u;%u;%u;%u;%.3f;%u;%u;%u;%u;%u;%u;%u;%u;%u;%u;",
-            slave_string,
-            plt->total_messages_sent,
-            plt->total_bytes_sent,
-            plt->throughput_sent,
-            plt->total_messages_received,
-            plt->total_bytes_received,
-            plt->throughput_sent,
             (double) plt->app_rtt / 1000,
             plt->bandwidth_in,
             plt->bandwidth_out,
-            plt->ats_cost_lan,
-            plt->ats_cost_wan,
-            plt->ats_cost_wlan,
             plt->ats_delay,
             plt->ats_distance,
             plt->ats_network_type,
-            plt->ats_utilization_up,
-            plt->ats_utilization_down);
-        GNUNET_free (slave_string);
-        slave_string = slave_string_tmp;
+            plt->ats_utilization_out,
+            plt->ats_utilization_in,
+            plt->pref_bandwidth,
+            plt->pref_delay);
+
+        if (l->verbose)
+          fprintf (stderr,
+              "\t Slave [%u]: %u %u %u ; %u %u %u rtt %u delay %llu bw_in %u bw_out %u \n",
+              plt->slave->no,
+              plt->total_messages_sent,
+              plt->total_bytes_sent,
+              plt->throughput_sent,
+              plt->total_messages_received,
+              plt->total_bytes_received,
+              plt->throughput_recv,
+              plt->app_rtt,
+              (long long unsigned int) plt->ats_delay.rel_value_us,
+              plt->bandwidth_in,
+              plt->bandwidth_out);
+
+        if (GNUNET_SYSERR == GNUNET_DISK_file_write(f[c_s], data, strlen(data)))
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+              "Cannot write data to log file `%s'\n", filename_slaves[c_s]);
+        GNUNET_free (data);
+
       }
-      /* Assembling master string */
-      GNUNET_asprintf (&data, "%llu;%llu;%u;%u;%u;%u;%u;%u;;;;;;;;;;;%s\n",
-          cur_lt->timestamp,
-          GNUNET_TIME_absolute_get_difference(l->lp[c_m].start,
-              cur_lt->timestamp).rel_value_us / 1000,
-          cur_lt->total_messages_sent,
-          cur_lt->total_bytes_sent,
-          cur_lt->total_throughput_send,
-          cur_lt->total_messages_received,
-          cur_lt->total_bytes_received,
-          cur_lt->total_throughput_recv,
-          slave_string);
-      GNUNET_free (slave_string);
+    }
 
-      if (GNUNET_SYSERR == GNUNET_DISK_file_write(f, data, strlen(data)))
+    for (c_s = 0; c_s < l->lp[c_m].peer->num_partners; c_s++)
+    {
+      if (GNUNET_SYSERR == GNUNET_DISK_file_close(f[c_s]))
+      {
         GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-            "Cannot write data to log file `%s'\n", filename);
-      GNUNET_free (data);
+            "Cannot close log file for master[%u] slave[%u]\n", c_m, c_s);
+        continue;
+      }
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+          "Data file successfully written to log file for `%s'\n",
+          filename_slaves[c_s]);
     }
-    if (GNUNET_SYSERR == GNUNET_DISK_file_close(f))
+
+    if (GNUNET_SYSERR == GNUNET_DISK_file_close(f_m))
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-          "Cannot close log file `%s'\n", filename);
-      GNUNET_free (filename);
+      GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
+                                "close",
+                                filename_master);
+      GNUNET_free (filename_master);
       return;
     }
-
-    write_throughput_gnuplot_script (filename, l->lp);
-    write_rtt_gnuplot_script (filename, l->lp);
-    write_bw_gnuplot_script (filename, l->lp);
-
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-        "Data file successfully written to log file `%s'\n", filename);
-    GNUNET_free (filename);
+        "Data file successfully written to log file for master `%s'\n", filename_master);
+
+    if (GNUNET_YES == plots)
+    {
+      write_throughput_gnuplot_script (filename_master, &l->lp[c_m], filename_slaves, l->num_slaves);
+      write_rtt_gnuplot_script (filename_master, &l->lp[c_m], filename_slaves, l->num_slaves);
+      write_bw_gnuplot_script (filename_master, &l->lp[c_m], filename_slaves, l->num_slaves);
+    }
   }
+  GNUNET_free (filename_master);
 }
 
 /**
  * Log all data now
  *
- * @param llogging handle to use
+ * @param l logging handle to use
  */
 void
 GNUNET_ATS_TEST_logging_now (struct LoggingHandle *l)
@@ -578,7 +637,7 @@ GNUNET_ATS_TEST_logging_now (struct LoggingHandle *l)
   if (GNUNET_YES != l->running)
     return;
 
-  for (c_m = 0; c_m < l->num_peers; c_m++)
+  for (c_m = 0; c_m < l->num_masters; c_m++)
   {
     bp = &l->lp[c_m];
     mlt = GNUNET_new (struct PeerLoggingTimestep);
@@ -606,20 +665,30 @@ GNUNET_ATS_TEST_logging_now (struct LoggingHandle *l)
      }
 
      /* Multiplication factor for throughput calculation */
-     mult = (1.0 * 1000 * 1000) / (delta.rel_value_us);
+     mult = (double) GNUNET_TIME_UNIT_SECONDS.rel_value_us / (delta.rel_value_us);
 
      /* Total throughput */
      if (NULL != prev_log_mlt)
      {
        if (mlt->total_bytes_sent - mlt->prev->total_bytes_sent > 0)
+       {
          mlt->total_throughput_send = mult * (mlt->total_bytes_sent - mlt->prev->total_bytes_sent);
+       }
        else
-         mlt->total_throughput_send = prev_log_mlt->total_throughput_send; /* no msgs send */
+       {
+         mlt->total_throughput_send = 0;
+        // mlt->total_throughput_send = prev_log_mlt->total_throughput_send; /* no msgs send */
+       }
 
        if (mlt->total_bytes_received - mlt->prev->total_bytes_received > 0)
+       {
          mlt->total_throughput_recv = mult * (mlt->total_bytes_received - mlt->prev->total_bytes_received);
+       }
        else
-         mlt->total_throughput_recv = prev_log_mlt->total_throughput_recv; /* no msgs received */
+       {
+         mlt->total_throughput_send = 0;
+         //mlt->total_throughput_recv = prev_log_mlt->total_throughput_recv; /* no msgs received */
+       }
      }
      else
      {
@@ -627,13 +696,24 @@ GNUNET_ATS_TEST_logging_now (struct LoggingHandle *l)
        mlt->total_throughput_send = mult * mlt->total_bytes_received;
      }
 
+    if (GNUNET_YES == l->verbose)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  "Master[%u] delta: %llu us, bytes (sent/received): %u / %u; throughput send/recv: %u / %u\n",
+                  c_m,
+                  (unsigned long long) delta.rel_value_us,
+                  mlt->total_bytes_sent,
+                  mlt->total_bytes_received,
+                  mlt->total_throughput_send,
+                  mlt->total_throughput_recv);
+    }
+
     mlt->slaves_log = GNUNET_malloc (bp->peer->num_partners *
         sizeof (struct PartnerLoggingTimestep));
 
     for (c_s = 0; c_s < bp->peer->num_partners; c_s++)
     {
-
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
           "Collect logging data master[%u] slave [%u]\n", c_m, c_s);
 
       p = &bp->peer->partners[c_s];
@@ -650,16 +730,15 @@ GNUNET_ATS_TEST_logging_now (struct LoggingHandle *l)
       slt->total_messages_received = p->messages_received;
       slt->total_app_rtt = p->total_app_rtt;
       /* ats performance information */
-      slt->ats_cost_lan = p->ats_cost_lan;
-      slt->ats_cost_wan = p->ats_cost_wan;
-      slt->ats_cost_wlan = p->ats_cost_wlan;
-      slt->ats_delay = p->ats_delay;
-      slt->ats_distance = p->ats_distance;
-      slt->ats_network_type = p->ats_network_type;
-      slt->ats_utilization_down = p->ats_utilization_down;
-      slt->ats_utilization_up = p->ats_utilization_up;
+      slt->ats_delay = p->props.delay;
+      slt->ats_distance = p->props.distance;
+      slt->ats_network_type = p->props.scope;
+      slt->ats_utilization_in = p->props.utilization_out;
+      slt->ats_utilization_out = p->props.utilization_out;
       slt->bandwidth_in = p->bandwidth_in;
       slt->bandwidth_out = p->bandwidth_out;
+      slt->pref_bandwidth = p->pref_bandwidth;
+      slt->pref_delay = p->pref_delay;
 
       /* Total application level rtt  */
       if (NULL == prev_log_mlt)
@@ -676,7 +755,9 @@ GNUNET_ATS_TEST_logging_now (struct LoggingHandle *l)
           app_rtt = (slt->total_app_rtt - prev_log_slt->total_app_rtt) /
                   (slt->total_messages_sent - prev_log_slt->total_messages_sent);
         else
+        {
           app_rtt = prev_log_slt->app_rtt; /* No messages were */
+        }
       }
       slt->app_rtt = app_rtt;
 
@@ -684,44 +765,56 @@ GNUNET_ATS_TEST_logging_now (struct LoggingHandle *l)
       if (NULL != prev_log_mlt)
       {
         prev_log_slt =  &prev_log_mlt->slaves_log[c_s];
-        if (slt->total_bytes_sent - prev_log_slt->total_bytes_sent > 0)
+        if (slt->total_bytes_sent > prev_log_slt->total_bytes_sent)
           slt->throughput_sent = mult * (slt->total_bytes_sent - prev_log_slt->total_bytes_sent);
         else
-          slt->throughput_sent = prev_log_slt->throughput_sent; /* no msgs send */
+          slt->throughput_sent = 0;
 
-        if (slt->total_bytes_received - prev_log_slt->total_bytes_received > 0)
-          slt->throughput_recv = mult * (slt->total_bytes_received - prev_log_slt->total_bytes_received);
+        if (slt->total_bytes_received > prev_log_slt->total_bytes_received)
+          slt->throughput_recv = mult *
+              (slt->total_bytes_received - prev_log_slt->total_bytes_received);
         else
-          slt->throughput_recv = prev_log_slt->throughput_recv; /* no msgs received */
+          slt->throughput_recv = 0;
       }
       else
       {
         slt->throughput_sent = mult * slt->total_bytes_sent;
-        slt->throughput_sent = mult * slt->total_bytes_received;
+        slt->throughput_recv = mult * slt->total_bytes_received;
       }
 
-      GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+      if (GNUNET_YES == l->verbose)
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    "Master [%u] -> Slave [%u]: delta: %llu us, bytes (sent/received): %u / %u; throughput send/recv: %u / %u\n",
+                    c_m, c_s,
+                    (unsigned long long) delta.rel_value_us,
+                    mlt->total_bytes_sent,
+                    mlt->total_bytes_received,
+                    slt->throughput_sent,
+                    slt->throughput_recv);
+      }
+      else
+        GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
           "Master [%u]: slave [%u]\n",
           bp->peer->no, p->dest->no);
     }
   }
 }
 
+
 static void
-collect_log_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+collect_log_task (void *cls)
 {
   struct LoggingHandle *l = cls;
-  l->log_task = GNUNET_SCHEDULER_NO_TASK;
 
+  l->log_task = NULL;
   GNUNET_ATS_TEST_logging_now (l);
-
-  if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN)
-    return;
-
   l->log_task = GNUNET_SCHEDULER_add_delayed (l->frequency,
-      &collect_log_task, l);
+                                              &collect_log_task,
+                                              l);
 }
 
+
 /**
  * Stop logging
  *
@@ -730,15 +823,14 @@ collect_log_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 void
 GNUNET_ATS_TEST_logging_stop (struct LoggingHandle *l)
 {
-  struct GNUNET_SCHEDULER_TaskContext tc;
   if (GNUNET_YES!= l->running)
     return;
 
-  if (GNUNET_SCHEDULER_NO_TASK != l->log_task)
+  if (NULL != l->log_task)
+  {
     GNUNET_SCHEDULER_cancel (l->log_task);
-  l->log_task = GNUNET_SCHEDULER_NO_TASK;
-  tc.reason = GNUNET_SCHEDULER_REASON_SHUTDOWN;
-  collect_log_task (l, &tc);
+    l->log_task = NULL;
+  }
   l->running = GNUNET_NO;
 
   GNUNET_log(GNUNET_ERROR_TYPE_INFO,
@@ -759,7 +851,7 @@ GNUNET_ATS_TEST_logging_clean_up (struct LoggingHandle *l)
   if (GNUNET_YES == l->running)
     GNUNET_ATS_TEST_logging_stop (l);
 
-  for (c_m = 0; c_m < l->num_peers; c_m++)
+  for (c_m = 0; c_m < l->num_masters; c_m++)
   {
     while (NULL != (cur = l->lp[c_m].head))
     {
@@ -780,22 +872,31 @@ GNUNET_ATS_TEST_logging_clean_up (struct LoggingHandle *l)
  * @param log_frequency the logging frequency
  * @param testname the testname
  * @param masters the master peers used for benchmarking
- * @oaram num_master the number of master peers
+ * @param num_masters the number of master peers
+ * @param num_slaves the number of slave peers
+ * @param verbose verbose logging
  * @return the logging handle or NULL on error
  */
 struct LoggingHandle *
-GNUNET_ATS_TEST_logging_start (struct GNUNET_TIME_Relative log_frequency,
-    char * testname, struct BenchmarkPeer *masters, int num_masters)
+GNUNET_ATS_TEST_logging_start(struct GNUNET_TIME_Relative log_frequency,
+                              const char *testname,
+                              struct BenchmarkPeer *masters,
+                              int num_masters,
+                              int num_slaves,
+                              int verbose)
 {
   struct LoggingHandle *l;
   int c_m;
+
   GNUNET_log(GNUNET_ERROR_TYPE_INFO,
       _("Start logging `%s'\n"), testname);
 
   l = GNUNET_new (struct LoggingHandle);
-  l->num_peers = num_masters;
+  l->num_masters = num_masters;
+  l->num_slaves = num_slaves;
   l->name = testname;
   l->frequency = log_frequency;
+  l->verbose = verbose;
   l->lp = GNUNET_malloc (num_masters * sizeof (struct LoggingPeer));
 
   for (c_m = 0; c_m < num_masters; c_m ++)
@@ -811,4 +912,3 @@ GNUNET_ATS_TEST_logging_start (struct GNUNET_TIME_Relative log_frequency,
   return l;
 }
 /* end of file ats-testing-log.c */
-