[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r32175 - gnunet/src/ats-tests,
gnunet <=