gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r32175 - gnunet/src/ats-tests


From: gnunet
Subject: [GNUnet-SVN] r32175 - gnunet/src/ats-tests
Date: Mon, 3 Feb 2014 22:51:43 +0100

Author: wachs
Date: 2014-02-03 22:51:43 +0100 (Mon, 03 Feb 2014)
New Revision: 32175

Added:
   gnunet/src/ats-tests/ats-testing-preferences.c
Modified:
   gnunet/src/ats-tests/Makefile.am
   gnunet/src/ats-tests/ats-testing-traffic.c
   gnunet/src/ats-tests/ats-testing.h
   gnunet/src/ats-tests/gnunet-ats-sim.c
Log:
adding preference generation


Modified: gnunet/src/ats-tests/Makefile.am
===================================================================
--- gnunet/src/ats-tests/Makefile.am    2014-02-03 21:25:53 UTC (rev 32174)
+++ gnunet/src/ats-tests/Makefile.am    2014-02-03 21:51:43 UTC (rev 32175)
@@ -54,7 +54,7 @@
  
 libgnunetatstesting_la_SOURCES = \
   ats-testing.c ats-testing-log.c ats-testing-traffic.c \
-  ats-testing-experiment.c
+  ats-testing-experiment.c ats-testing-preferences.c
 libgnunetatstesting_la_LIBADD = \
   $(top_builddir)/src/transport/libgnunettransport.la \
   $(top_builddir)/src/hello/libgnunethello.la \

Added: gnunet/src/ats-tests/ats-testing-preferences.c
===================================================================
--- gnunet/src/ats-tests/ats-testing-preferences.c                              
(rev 0)
+++ gnunet/src/ats-tests/ats-testing-preferences.c      2014-02-03 21:51:43 UTC 
(rev 32175)
@@ -0,0 +1,232 @@
+/*
+ This file is part of GNUnet.
+ (C) 2010-2013 Christian Grothoff (and other contributing authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet 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 GNUnet; see the file COPYING.  If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+ */
+/**
+ * @file ats-tests/ats-testing-preferences.c
+ * @brief ats benchmark: preference generator
+ * @author Christian Grothoff
+ * @author Matthias Wachs
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "ats-testing.h"
+
+static struct PreferenceGenerator *pg_head;
+static struct PreferenceGenerator *pg_tail;
+
+extern struct GNUNET_ATS_TEST_Topology *top;
+
+static double
+get_preference (struct PreferenceGenerator *pg)
+{
+  struct GNUNET_TIME_Relative time_delta;
+  double delta_value;
+  double pref_value;
+
+  /* Calculate the current transmission rate based on the type of traffic */
+  switch (pg->type) {
+    case GNUNET_ATS_TEST_TG_CONSTANT:
+      pref_value = pg->base_value;
+      break;
+    case GNUNET_ATS_TEST_TG_LINEAR:
+      time_delta = GNUNET_TIME_absolute_get_duration(pg->time_start);
+      /* Calculate point of time in the current period */
+      time_delta.rel_value_us = time_delta.rel_value_us %
+          pg->duration_period.rel_value_us;
+      delta_value = ((double) time_delta.rel_value_us  /
+          pg->duration_period.rel_value_us) * (pg->max_value - pg->base_value);
+      if ((pg->max_value < pg->base_value) &&
+          ((pg->max_value - pg->base_value) > pg->base_value))
+      {
+        /* This will cause an underflow */
+        GNUNET_break (0);
+      }
+      pref_value = pg->base_value + delta_value;
+      break;
+    case GNUNET_ATS_TEST_TG_RANDOM:
+      delta_value =  (double) GNUNET_CRYPTO_random_u32 
(GNUNET_CRYPTO_QUALITY_WEAK,
+          10000 * (pg->max_value - pg->base_value)) / 10000;
+      pref_value = pg->base_value + delta_value;
+      break;
+    case GNUNET_ATS_TEST_TG_SINUS:
+      time_delta = GNUNET_TIME_absolute_get_duration(pg->time_start);
+      /* Calculate point of time in the current period */
+      time_delta.rel_value_us = time_delta.rel_value_us %
+          pg->duration_period.rel_value_us;
+      if ((pg->max_value - pg->base_value) > pg->base_value)
+      {
+        /* This will cause an underflow for second half of sinus period,
+         * will be detected in general when experiments are loaded */
+        GNUNET_break (0);
+      }
+      delta_value = (pg->max_value - pg->base_value) *
+          sin ( (2 * M_PI) / ((double) pg->duration_period.rel_value_us) *
+              time_delta.rel_value_us);
+      pref_value = pg->base_value + delta_value;
+      break;
+    default:
+      pref_value = 0.0;
+      break;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Current preference value is %f\n",
+      pref_value);
+  return pref_value;
+}
+
+
+static void
+set_pref_task (void *cls,
+                    const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct BenchmarkPartner *p = cls;
+  double pref_value;
+  p->pg->set_task = GNUNET_SCHEDULER_NO_TASK;
+
+  pref_value = get_preference (p->pg);
+
+  GNUNET_log(GNUNET_ERROR_TYPE_INFO,
+      "Setting preference for master [%u] and slave [%u] for %s to %f\n",
+      p->me->no, p->dest->no,
+      GNUNET_ATS_print_preference_type (p->pg->kind), pref_value);
+
+  GNUNET_ATS_performance_change_preference(p->me->ats_perf_handle,
+      &p->dest->id, p->pg->kind, pref_value, GNUNET_ATS_PREFERENCE_END);
+
+  p->pg->set_task = GNUNET_SCHEDULER_add_delayed (p->pg->frequency,
+      set_pref_task, p);
+
+}
+
+
+/**
+ * Generate between the source master and the partner and set preferences with 
a
+ * value depending on the generator.
+ *
+ * @param src source
+ * @param dest partner
+ * @param type type of preferences to generate
+ * @param base_rate traffic base rate to send data with
+ * @param max_rate  traffic maximum rate to send data with
+ * @param period duration of a period of traffic generation (~ 1/frequency)
+ * @param duration how long to generate traffic
+ * @return the traffic generator
+ */
+struct PreferenceGenerator *
+GNUNET_ATS_TEST_generate_preferences_start (struct BenchmarkPeer *src,
+    struct BenchmarkPartner *dest,
+    enum GeneratorType type,
+    long int base_value,
+    long int value_rate,
+    struct GNUNET_TIME_Relative period,
+    struct GNUNET_TIME_Relative frequency,
+    enum GNUNET_ATS_PreferenceKind kind)
+{
+  struct PreferenceGenerator *pg;
+
+  if (NULL != dest->pg)
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
+
+  pg = GNUNET_new (struct PreferenceGenerator);
+  GNUNET_CONTAINER_DLL_insert (pg_head, pg_tail, pg);
+  pg->type = type;
+  pg->src = src;
+  pg->dest = dest;
+  pg->kind = kind;
+  pg->base_value = base_value;
+  pg->max_value = value_rate;
+  pg->duration_period = period;
+  pg->frequency = frequency;
+  pg->time_start = GNUNET_TIME_absolute_get();
+
+  switch (type) {
+    case GNUNET_ATS_TEST_TG_CONSTANT:
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+          "Setting up constant preference generator master[%u] `%s' and slave 
[%u] `%s' max %u Bips\n",
+          dest->me->no, GNUNET_i2s (&dest->me->id),
+          dest->dest->no, GNUNET_i2s (&dest->dest->id),
+          base_value);
+      break;
+    case GNUNET_ATS_TEST_TG_LINEAR:
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+          "Setting up linear preference generator master[%u] `%s' and slave 
[%u] `%s' min %u Bips max %u Bips\n",
+          dest->me->no, GNUNET_i2s (&dest->me->id),
+          dest->dest->no, GNUNET_i2s (&dest->dest->id),
+          base_value, value_rate);
+      break;
+    case GNUNET_ATS_TEST_TG_SINUS:
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+          "Setting up sinus preference generator master[%u] `%s' and slave 
[%u] `%s' baserate %u Bips, amplitude %u Bps\n",
+          dest->me->no, GNUNET_i2s (&dest->me->id),
+          dest->dest->no, GNUNET_i2s (&dest->dest->id),
+          base_value, value_rate);
+      break;
+    case GNUNET_ATS_TEST_TG_RANDOM:
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+          "Setting up random preference generator master[%u] `%s' and slave 
[%u] `%s' min %u Bips max %u Bps\n",
+          dest->me->no, GNUNET_i2s (&dest->me->id),
+          dest->dest->no, GNUNET_i2s (&dest->dest->id),
+          base_value, value_rate);
+      break;
+    default:
+      break;
+  }
+
+  dest->pg = pg;
+  pg->set_task = GNUNET_SCHEDULER_add_now (&set_pref_task, dest);
+  return pg;
+}
+
+
+void
+GNUNET_ATS_TEST_generate_preferences_stop (struct PreferenceGenerator *pg)
+{
+  GNUNET_CONTAINER_DLL_remove (pg_head, pg_tail, pg);
+  pg->dest->pg = NULL;
+
+  if (GNUNET_SCHEDULER_NO_TASK != pg->set_task)
+  {
+    GNUNET_SCHEDULER_cancel (pg->set_task);
+    pg->set_task = GNUNET_SCHEDULER_NO_TASK;
+  }
+
+  GNUNET_free (pg);
+}
+
+
+/**
+ * Stop all preferences generators
+ */
+void
+GNUNET_ATS_TEST_generate_preferences_stop_all ()
+{
+  struct PreferenceGenerator *cur;
+  struct PreferenceGenerator *next;
+  next = pg_head;
+  for (cur = next; NULL != cur; cur = next)
+  {
+      next = cur->next;
+      GNUNET_ATS_TEST_generate_preferences_stop(cur);
+  }
+}
+
+/* end of file ats-testing-preferences.c */
+

Modified: gnunet/src/ats-tests/ats-testing-traffic.c
===================================================================
--- gnunet/src/ats-tests/ats-testing-traffic.c  2014-02-03 21:25:53 UTC (rev 
32174)
+++ gnunet/src/ats-tests/ats-testing-traffic.c  2014-02-03 21:51:43 UTC (rev 
32175)
@@ -310,7 +310,7 @@
 struct TrafficGenerator *
 GNUNET_ATS_TEST_generate_traffic_start (struct BenchmarkPeer *src,
     struct BenchmarkPartner *dest,
-    enum TrafficGeneratorType type,
+    enum GeneratorType type,
     long int base_rate,
     long int max_rate,
     struct GNUNET_TIME_Relative period,

Modified: gnunet/src/ats-tests/ats-testing.h
===================================================================
--- gnunet/src/ats-tests/ats-testing.h  2014-02-03 21:25:53 UTC (rev 32174)
+++ gnunet/src/ats-tests/ats-testing.h  2014-02-03 21:51:43 UTC (rev 32175)
@@ -56,7 +56,7 @@
 
 struct LoggingHandle;
 
-enum TrafficGeneratorType
+enum GeneratorType
 {
   GNUNET_ATS_TEST_TG_LINEAR,
   GNUNET_ATS_TEST_TG_CONSTANT,
@@ -223,7 +223,7 @@
   struct TrafficGenerator *prev;
   struct TrafficGenerator *next;
 
-  enum TrafficGeneratorType type;
+  enum GeneratorType type;
 
   struct BenchmarkPeer *src;
   struct BenchmarkPartner *dest;
@@ -238,6 +238,28 @@
 };
 
 
+struct PreferenceGenerator
+{
+  struct PreferenceGenerator *prev;
+  struct PreferenceGenerator *next;
+
+  enum GeneratorType type;
+
+  struct BenchmarkPeer *src;
+  struct BenchmarkPartner *dest;
+
+  enum GNUNET_ATS_PreferenceKind kind;
+
+  long int base_value;
+  long int max_value;
+  struct GNUNET_TIME_Relative duration_period;
+  struct GNUNET_TIME_Relative frequency;
+
+  GNUNET_SCHEDULER_TaskIdentifier set_task;
+  struct GNUNET_TIME_Absolute next_ping_transmission;
+  struct GNUNET_TIME_Absolute time_start;
+};
+
 /**
  * Information about a benchmarking partner
  */
@@ -264,6 +286,7 @@
   struct GNUNET_TRANSPORT_TransmitHandle *tth;
 
   struct TrafficGenerator *tg;
+  struct PreferenceGenerator *pg;
 
   /**
    * Timestamp to calculate communication layer delay
@@ -468,7 +491,7 @@
   struct GNUNET_TIME_Relative period;
 
   enum OperationType type;
-  enum TrafficGeneratorType tg_type;
+  enum GeneratorType tg_type;
 };
 
 struct Episode
@@ -565,7 +588,7 @@
 struct TrafficGenerator *
 GNUNET_ATS_TEST_generate_traffic_start (struct BenchmarkPeer *src,
     struct BenchmarkPartner *dest,
-    enum TrafficGeneratorType type,
+    enum GeneratorType type,
     long int base_rate,
     long int max_rate,
     struct GNUNET_TIME_Relative period,
@@ -580,7 +603,22 @@
 void
 GNUNET_ATS_TEST_generate_traffic_stop_all ();
 
+struct PreferenceGenerator *
+GNUNET_ATS_TEST_generate_preferences_start (struct BenchmarkPeer *src,
+    struct BenchmarkPartner *dest,
+    enum GeneratorType type,
+    long int base_value,
+    long int value_rate,
+    struct GNUNET_TIME_Relative period,
+    struct GNUNET_TIME_Relative frequency,
+    enum GNUNET_ATS_PreferenceKind kind);
 
+void
+GNUNET_ATS_TEST_generate_preferences_stop (struct PreferenceGenerator *pg);
+
+void
+GNUNET_ATS_TEST_generate_preferences_stop_all ();
+
 /*
  * Logging related functions
  */

Modified: gnunet/src/ats-tests/gnunet-ats-sim.c
===================================================================
--- gnunet/src/ats-tests/gnunet-ats-sim.c       2014-02-03 21:25:53 UTC (rev 
32174)
+++ gnunet/src/ats-tests/gnunet-ats-sim.c       2014-02-03 21:51:43 UTC (rev 
32175)
@@ -136,13 +136,18 @@
     GNUNET_ATS_TEST_logging_clean_up (l);
     l = NULL;
   }
+
+  /* Stop traffic generation */
+  GNUNET_ATS_TEST_generate_traffic_stop_all();
+
+  /* Stop all preference generations */
+  GNUNET_ATS_TEST_generate_preferences_stop_all ();
+
   if (NULL != e)
   {
-    GNUNET_break (0);
     GNUNET_ATS_TEST_experimentation_stop (e);
     e = NULL;
   }
-  GNUNET_break (0);
   GNUNET_ATS_TEST_shutdown_topology ();
 }
 
@@ -189,6 +194,9 @@
   /* Stop traffic generation */
   GNUNET_ATS_TEST_generate_traffic_stop_all();
 
+  /* Stop all preference generations */
+  GNUNET_ATS_TEST_generate_preferences_stop_all ();
+
   evaluate (duration);
   if (opt_log)
     GNUNET_ATS_TEST_logging_write_to_file(l, opt_exp_file, opt_plot);
@@ -229,6 +237,31 @@
       e->num_masters, e->num_slaves,
       opt_verbose);
   GNUNET_ATS_TEST_experimentation_run (e, &episode_done_cb, 
&experiment_done_cb);
+/*
+  
GNUNET_ATS_TEST_generate_preferences_start(&masters[0],&masters[0].partners[0],
+      GNUNET_ATS_TEST_TG_CONSTANT, 1, 1, GNUNET_TIME_UNIT_SECONDS,
+      GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 250),
+      GNUNET_ATS_PREFERENCE_BANDWIDTH);
+*/
+/*
+  
GNUNET_ATS_TEST_generate_preferences_start(&masters[0],&masters[0].partners[0],
+      GNUNET_ATS_TEST_TG_LINEAR, 1, 50,
+      GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 2),
+      GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 250),
+      GNUNET_ATS_PREFERENCE_BANDWIDTH);
+*/
+/*
+  
GNUNET_ATS_TEST_generate_preferences_start(&masters[0],&masters[0].partners[0],
+        GNUNET_ATS_TEST_TG_RANDOM, 1, 50,
+        GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 2),
+        GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 250),
+        GNUNET_ATS_PREFERENCE_BANDWIDTH);
+*/
+  
GNUNET_ATS_TEST_generate_preferences_start(&masters[0],&masters[0].partners[0],
+        GNUNET_ATS_TEST_TG_SINUS, 10, 5,
+        GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 5),
+        GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 250),
+        GNUNET_ATS_PREFERENCE_BANDWIDTH);
 
 #if 0
   int c_m;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]