*/
static GNUNET_SCHEDULER_TaskIdentifier hello_task;
+/**
+ * Identifier of ats scheduler task.
+ */
+static GNUNET_SCHEDULER_TaskIdentifier ats_task;
+
/**
* Is transport service shutting down ?
*/
fal->quality[c].values[1] = fal->quality[c].values[2];
fal->quality[c].values[2] = value;
set = GNUNET_YES;
- if (ats != NULL)
- ats->stat.modified_quality = GNUNET_YES;
+ ats_modify_problem_state (ats, ATS_QUALITY_UPDATED);
}
}
if (set == GNUNET_NO)
{
fal->ressources[c].c = value;
set = GNUNET_YES;
- if (ats != NULL)
- ats->stat.modified_resources = GNUNET_YES;
+ ats_modify_problem_state (ats, ATS_COST_UPDATED);
}
}
}
}
GNUNET_free_non_null(pos->ressources);
GNUNET_free_non_null(pos->quality);
- if (ats != NULL)
- ats->stat.recreate_problem = GNUNET_YES;
+ ats_modify_problem_state (ats, ATS_MODIFIED);
+
if (GNUNET_YES != pos->connected)
{
/* nothing else to do, connection was never up... */
/* notify ats about connecting peer */
if ((ats != NULL) && (shutdown_in_progress == GNUNET_NO))
{
- ats->stat.recreate_problem = GNUNET_YES;
+ ats_modify_problem_state(ats, ATS_MODIFIED);
ats_calculate_bandwidth_distribution (ats, stats, neighbours);
}
/* notify ats about connecting peer */
if ((ats != NULL) && (shutdown_in_progress == GNUNET_NO))
{
- ats->stat.recreate_problem = GNUNET_YES;
+ ats_modify_problem_state(ats, ATS_MODIFIED);
ats_calculate_bandwidth_distribution (ats, stats, neighbours);
}
if (GNUNET_YES == n->received_pong)
notify_clients_disconnect (&n->id);
- if (ats != NULL)
- ats->stat.recreate_problem = GNUNET_YES;
+ ats_modify_problem_state(ats, ATS_QUALITY_COST_UPDATED);
/* clean up all plugins, cancel connections and pending transmissions */
while (NULL != (rpos = n->plugins))
//GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "GNUNET_MESSAGE_TYPE_TRANSPORT_ATS: %i \n", value);
/* Force ressource and quality update */
if ((value == 4) && (ats != NULL))
- {
- ats->stat.modified_resources = GNUNET_YES;
- ats->stat.modified_quality = GNUNET_YES;
- }
+ ats_modify_problem_state(ats, ATS_QUALITY_COST_UPDATED);
/* Force cost update */
if ((value == 3) && (ats != NULL))
- ats->stat.modified_resources = GNUNET_YES;
+ ats_modify_problem_state(ats, ATS_COST_UPDATED);
/* Force quality update */
if ((value == 2) && (ats != NULL))
- ats->stat.modified_quality = GNUNET_YES;
+ ats_modify_problem_state(ats, ATS_QUALITY_UPDATED);
/* Force full rebuild */
if ((value == 1) && (ats != NULL))
- ats->stat.recreate_problem = GNUNET_YES;
+ ats_modify_problem_state(ats, ATS_MODIFIED);
}
#if DEBUG_PING_PONG
GNUNET_CONTAINER_multihashmap_destroy (validation_map);
validation_map = NULL;
+ if (ats_task != GNUNET_SCHEDULER_NO_TASK)
+ {
+ GNUNET_SCHEDULER_cancel(ats_task);
+ ats_task = GNUNET_SCHEDULER_NO_TASK;
+ }
+
+
if (ats != NULL)
ats_shutdown (ats);
if (ats==NULL)
return;
- ats->ats_task = GNUNET_SCHEDULER_NO_TASK;
+ ats_task = GNUNET_SCHEDULER_NO_TASK;
if ( (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0)
return;
if (shutdown_in_progress == GNUNET_YES)
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Running scheduled calculation\n");
#endif
ats_calculate_bandwidth_distribution (ats, stats, neighbours);
- ats->ats_task = GNUNET_SCHEDULER_add_delayed (ats->exec_interval,
+ ats_task = GNUNET_SCHEDULER_add_delayed (ats->exec_interval,
&schedule_ats, ats);
}
ats = ats_init (cfg);
if (ats != NULL)
- ats->ats_task = GNUNET_SCHEDULER_add_now (&schedule_ats, ats);
+ ats_task = GNUNET_SCHEDULER_add_now (&schedule_ats, ats);
#if DEBUG_TRANSPORT
PLUGINS = tcp
#DEBUG = YES
#PREFIX = xterm -e xterm -T transport -e gdb -x cmd --args
-#PREFIX = valgrind --tool=memcheck --log-file=logs%p
+#PREFIX = valgrind --tool=memcheck --log-file=multiple_peers/logs%p
#WAN_BW_LIMIT_DOWN = 100
#WAN_BW_LIMIT_UP = 1000000
#LAN_BW_LIMIT_DOWN = 100
#include "gnunet_transport_service.h"
#include "gnunet_scheduler_lib.h"
#include "gauger.h"
+#include "transport_ats.h"
#define VERBOSE GNUNET_NO
#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 300)
#define SEND_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1)
-#define ATS_NEW 0
-#define ATS_Q_UPDATED 1
-#define ATS_C_UPDATED 2
-#define ATS_QC_UPDATED 3
-#define ATS_UNMODIFIED 4
-
static int ok;
static int peers_left;
int is_persistent)
{
static int printed = GNUNET_NO;
- //GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s = %llu\n", name ,value);
+#if VERBOSE_ATS
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s = %llu\n", name ,value);
+#endif
if (0 == strcmp (name,"ATS invalid solutions"))
{
if (stats_task != GNUNET_SCHEDULER_NO_TASK)
}
}
- if (current.state == ATS_Q_UPDATED)
+ if (current.state == ATS_QUALITY_UPDATED)
{
if (c_modified < MEASUREMENTS)
{
char * cont;
if (value == ATS_NEW)
cont = "NEW";
- if (value == ATS_C_UPDATED)
+ if (value == ATS_COST_UPDATED)
cont = "C_UPDATED";
- if (value == ATS_Q_UPDATED)
+ if (value == ATS_QUALITY_UPDATED)
cont = "Q_UPDATED";
- if (value == ATS_QC_UPDATED)
+ if (value == ATS_QUALITY_COST_UPDATED)
cont = "QC_UPDATED";
if (value == ATS_UNMODIFIED)
cont = "UNMODIFIED";
static void _dummy2 ()
{
+ ats_modify_problem_state (NULL, 0);
_dummy();
+ int t = ATS_COST_UPDATED + ATS_MODIFIED + ATS_NEW;
+ t = 0;
}
/*
ats->exec_interval = ATS_EXEC_INTERVAL;
ats->max_exec_duration = ATS_MAX_EXEC_DURATION;
ats->max_iterations = ATS_MAX_ITERATIONS;
- ats->ats_task = GNUNET_SCHEDULER_NO_TASK;
ats->D = 1.0;
ats->U = 1.0;
ats->stat.valid = GNUNET_SYSERR;
}
+void ats_modify_problem_state (struct ATS_Handle * ats, enum ATS_problem_state s)
+{
+ if (ats == NULL)
+ return;
+ switch (s)
+ {
+ case ATS_NEW :
+ ats->stat.recreate_problem = GNUNET_NO;
+ ats->stat.modified_quality = GNUNET_NO;
+ ats->stat.modified_resources = GNUNET_NO;
+ break;
+ case ATS_MODIFIED:
+ ats->stat.recreate_problem = GNUNET_YES;
+ break;
+ case ATS_QUALITY_UPDATED :
+ ats->stat.modified_quality = GNUNET_YES;
+ break;
+ case ATS_COST_UPDATED :
+ ats->stat.modified_resources = GNUNET_YES;
+ break;
+ case ATS_QUALITY_COST_UPDATED:
+ ats->stat.modified_resources = GNUNET_YES;
+ ats->stat.modified_quality = GNUNET_YES;
+ break;
+ default:
+ return;
+ }
+
+}
+
void ats_solve_problem (struct ATS_Handle * ats,
unsigned int max_it,
unsigned int max_dur,
#if DEBUG_ATS
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "ATS shutdown\n");
#endif
- if (ats->ats_task != GNUNET_SCHEDULER_NO_TASK)
- GNUNET_SCHEDULER_cancel(ats->ats_task);
- ats->ats_task = GNUNET_SCHEDULER_NO_TASK;
ats_delete_problem (ats);
_lp_free_env();
GNUNET_STATISTICS_set (stats, "ATS state",ATS_NEW, GNUNET_NO);
else if ((ats->stat.modified_resources == GNUNET_YES) &&
(ats->stat.modified_quality == GNUNET_NO))
- GNUNET_STATISTICS_set (stats, "ATS state", ATS_C_UPDATED, GNUNET_NO);
+ GNUNET_STATISTICS_set (stats, "ATS state", ATS_COST_UPDATED, GNUNET_NO);
else if ((ats->stat.modified_resources == GNUNET_NO) &&
(ats->stat.modified_quality == GNUNET_YES) &&
(ats->stat.simplex_rerun_required == GNUNET_NO))
- GNUNET_STATISTICS_set (stats, "ATS state", ATS_Q_UPDATED, GNUNET_NO);
+ GNUNET_STATISTICS_set (stats, "ATS state", ATS_QUALITY_UPDATED, GNUNET_NO);
else if ((ats->stat.modified_resources == GNUNET_YES) &&
(ats->stat.modified_quality == GNUNET_YES) &&
(ats->stat.simplex_rerun_required == GNUNET_NO))
- GNUNET_STATISTICS_set (stats, "ATS state", ATS_QC_UPDATED, GNUNET_NO);
+ GNUNET_STATISTICS_set (stats, "ATS state", ATS_QUALITY_COST_UPDATED, GNUNET_NO);
else if (ats->stat.simplex_rerun_required == GNUNET_NO)
GNUNET_STATISTICS_set (stats, "ATS state", ATS_UNMODIFIED, GNUNET_NO);
}
#define VERY_BIG_DOUBLE_VALUE 100000000000LL
-#define ATS_NEW 0
-#define ATS_Q_UPDATED 1
-#define ATS_C_UPDATED 2
-#define ATS_QC_UPDATED 3
-#define ATS_UNMODIFIED 4
+enum ATS_problem_state
+{
+ /**
+ * Problem is new / unmodified
+ */
+ ATS_NEW = 0,
+
+ /**
+ * Problem quality properties were modified
+ */
+ ATS_QUALITY_UPDATED = 1,
+
+ /**
+ * Problem ressource properties were modified
+ */
+ ATS_COST_UPDATED = 2,
+
+ /**
+ * Problem quality and ressource properties were modified
+ */
+ ATS_QUALITY_COST_UPDATED = 3,
+
+ /**
+ * Problem is modified and needs to be completely recalculated
+ * due to e.g. connecting or disconnecting peers
+ */
+ ATS_MODIFIED = 4,
+
+ /**
+ * Problem is modified and needs to be completely recalculated
+ * due to e.g. connecting or disconnecting peers
+ */
+ ATS_UNMODIFIED = 8
+};
/*
* ATS data structures
void * prob;
#endif
- /**
- * task to recalculate the bandwidth assignment
- */
- GNUNET_SCHEDULER_TaskIdentifier ats_task;
-
/**
* Current state of the GLPK problem
*/
int v_n_min,
struct ATS_stat *stat);
+void ats_modify_problem_state (struct ATS_Handle * ats,
+ enum ATS_problem_state s);
+
void
ats_calculate_bandwidth_distribution (struct ATS_Handle * ats,
struct GNUNET_STATISTICS_Handle *stats,