From f339605b423c496ed28664e0d9ea2c8dec8f83f7 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Wed, 16 Apr 2014 09:35:10 +0000 Subject: [PATCH] file logging --- src/ats/gnunet-ats-solver-eval.c | 183 ++++++++-- src/ats/gnunet-ats-solver-eval.h | 589 +------------------------------ 2 files changed, 172 insertions(+), 600 deletions(-) diff --git a/src/ats/gnunet-ats-solver-eval.c b/src/ats/gnunet-ats-solver-eval.c index 610074669..32b392bf0 100644 --- a/src/ats/gnunet-ats-solver-eval.c +++ b/src/ats/gnunet-ats-solver-eval.c @@ -53,7 +53,7 @@ static int opt_log; /** * cmd option -p: enable plots */ -static int opt_plot; +static int opt_save; /** * cmd option -v: verbose logs @@ -262,6 +262,105 @@ GNUNET_ATS_solver_logging_stop (struct LoggingHandle *l) l->logging_task = GNUNET_SCHEDULER_NO_TASK; } +static struct LoggingFileHandle * +find_logging_file_handle (struct LoggingFileHandle *lf_head, + struct LoggingFileHandle *lf_tail, + int peer_id, int address_id) +{ + struct LoggingFileHandle *res; + + for (res = lf_head; NULL != res; res = res->next) + if ((res->pid == peer_id) && (res->pid == address_id)) + return res; + return NULL; + +} + +void +GNUNET_ATS_solver_logging_write_to_disk (struct LoggingHandle *l) +{ + struct LoggingTimeStep *lts; + struct LoggingPeer *log_p; + struct LoggingAddress *log_a; + struct LoggingFileHandle *lf_head; + struct LoggingFileHandle *lf_tail; + struct LoggingFileHandle *cur; + struct LoggingFileHandle *next; + char * filename; + char * datastring; + int c; + + + lf_head = NULL; + lf_tail = NULL; + + for (lts = l->head; NULL != lts; lts = lts->next) + { + + fprintf (stderr, "Log step %llu %llu: \n", + (long long unsigned int) lts->timestamp.abs_value_us, + (long long unsigned int) lts->delta.rel_value_us); + + for (log_p = lts->head; NULL != log_p; log_p = log_p->next) + { + for (log_a = log_p->addr_head; NULL != log_a; log_a = log_a->next) + { + + cur = find_logging_file_handle (lf_head, lf_tail, log_p->id, + log_a->aid); + if (NULL == cur) + { + cur = GNUNET_new (struct LoggingFileHandle); + cur->aid = log_a->aid; + cur->pid = log_p->id; + + fprintf (stderr, "Add logging for %i %i: \n", + cur->pid, cur->aid); + + GNUNET_asprintf (&filename, "%s_%s_%u_%u_%llu.log", e->log_prefix, opt_solver, + cur->aid, cur->pid, l->head->timestamp.abs_value_us); + cur->f_hd = GNUNET_DISK_file_open (filename, + GNUNET_DISK_OPEN_READWRITE | + GNUNET_DISK_OPEN_CREATE | + GNUNET_DISK_OPEN_TRUNCATE, + GNUNET_DISK_PERM_USER_READ | + GNUNET_DISK_PERM_USER_WRITE | + GNUNET_DISK_PERM_GROUP_READ | + GNUNET_DISK_PERM_OTHER_READ); + if (NULL == cur->f_hd) + { + fprintf (stderr, "Cannot open `%s' to write log data!\n", filename); + GNUNET_free (filename); + goto cleanup; + } + GNUNET_free (filename); + GNUNET_CONTAINER_DLL_insert (lf_head, lf_tail, cur); + } + + GNUNET_asprintf(&datastring,"%i;%u;%u\n", + log_a->active, + ntohl (log_a->assigned_bw_in.value__), + ntohl (log_a->assigned_bw_out.value__)); + GNUNET_DISK_file_write (cur->f_hd, datastring, strlen(datastring)); + GNUNET_free (datastring); + + } + } + } + +cleanup: + next = lf_head; + for (cur = next; NULL != cur; cur = next) + { + next = cur->next; + GNUNET_CONTAINER_DLL_remove (lf_head, lf_tail, cur); + if (NULL != cur->f_hd) + GNUNET_DISK_file_close (cur->f_hd); + GNUNET_free (cur); + } + +} + void GNUNET_ATS_solver_logging_eval (struct LoggingHandle *l) { @@ -278,7 +377,7 @@ GNUNET_ATS_solver_logging_eval (struct LoggingHandle *l) for (log_p = lts->head; NULL != log_p; log_p = log_p->next) { - fprintf (stderr,"\tLogging peer id %u\n", log_p->id); + fprintf (stderr,"\tLogging peer pid %u\n", log_p->id); for (c = 0; c < GNUNET_ATS_PreferenceCount; c++) { fprintf(stderr,"\t %s = %.2f %.2f [abs/rel]\n", @@ -288,7 +387,7 @@ GNUNET_ATS_solver_logging_eval (struct LoggingHandle *l) for (log_a = log_p->addr_head; NULL != log_a; log_a = log_a->next) { - fprintf (stderr, "\tPeer id %u address %u: %u %u %u\n", + fprintf (stderr, "\tPeer pid %u address %u: %u %u %u\n", log_p->id, log_a->aid, log_a->active, ntohl(log_a->assigned_bw_in.value__), ntohl(log_a->assigned_bw_out.value__)); @@ -911,6 +1010,7 @@ free_experiment (struct Experiment *e) } GNUNET_free_non_null (e->name); + GNUNET_free_non_null (e->log_prefix); GNUNET_free_non_null (e->cfg_file); GNUNET_free (e); } @@ -925,7 +1025,7 @@ load_op_add_address (struct GNUNET_ATS_TEST_Operation *o, { char *op_name; - /* peer id */ + /* peer pid */ GNUNET_asprintf(&op_name, "op-%u-peer-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->peer_id)) @@ -937,7 +1037,7 @@ load_op_add_address (struct GNUNET_ATS_TEST_Operation *o, } GNUNET_free (op_name); - /* address id */ + /* address pid */ GNUNET_asprintf(&op_name, "op-%u-address-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->address_id)) @@ -1013,7 +1113,7 @@ load_op_del_address (struct GNUNET_ATS_TEST_Operation *o, { char *op_name; - /* peer id */ + /* peer pid */ GNUNET_asprintf(&op_name, "op-%u-peer-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->peer_id)) @@ -1025,7 +1125,7 @@ load_op_del_address (struct GNUNET_ATS_TEST_Operation *o, } GNUNET_free (op_name); - /* address id */ + /* address pid */ GNUNET_asprintf(&op_name, "op-%u-address-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->address_id)) @@ -1115,7 +1215,7 @@ load_op_start_set_preference (struct GNUNET_ATS_TEST_Operation *o, char *type; char *pref; - /* peer id */ + /* peer pid */ GNUNET_asprintf(&op_name, "op-%u-peer-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->peer_id)) @@ -1127,8 +1227,8 @@ load_op_start_set_preference (struct GNUNET_ATS_TEST_Operation *o, } GNUNET_free (op_name); - /* address id */ - GNUNET_asprintf(&op_name, "op-%u-client-id", op_counter); + /* address pid */ + GNUNET_asprintf(&op_name, "op-%u-client-pid", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->client_id)) { @@ -1270,7 +1370,7 @@ load_op_stop_set_preference (struct GNUNET_ATS_TEST_Operation *o, char *op_name; char *pref; - /* peer id */ + /* peer pid */ GNUNET_asprintf(&op_name, "op-%u-peer-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->peer_id)) @@ -1282,7 +1382,7 @@ load_op_stop_set_preference (struct GNUNET_ATS_TEST_Operation *o, } GNUNET_free (op_name); - /* address id */ + /* address pid */ GNUNET_asprintf(&op_name, "op-%u-address-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->address_id)) @@ -1346,7 +1446,7 @@ load_op_start_set_property(struct GNUNET_ATS_TEST_Operation *o, char *type; char *prop; - /* peer id */ + /* peer pid */ GNUNET_asprintf(&op_name, "op-%u-peer-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->peer_id)) @@ -1358,7 +1458,7 @@ load_op_start_set_property(struct GNUNET_ATS_TEST_Operation *o, } GNUNET_free (op_name); - /* address id */ + /* address pid */ GNUNET_asprintf(&op_name, "op-%u-address-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->address_id)) @@ -1503,7 +1603,7 @@ load_op_stop_set_property (struct GNUNET_ATS_TEST_Operation *o, char *op_name; char *pref; - /* peer id */ + /* peer pid */ GNUNET_asprintf(&op_name, "op-%u-peer-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->peer_id)) @@ -1515,7 +1615,7 @@ load_op_stop_set_property (struct GNUNET_ATS_TEST_Operation *o, } GNUNET_free (op_name); - /* address id */ + /* address pid */ GNUNET_asprintf(&op_name, "op-%u-address-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->address_id)) @@ -1569,7 +1669,7 @@ load_op_start_request (struct GNUNET_ATS_TEST_Operation *o, { char *op_name; - /* peer id */ + /* peer pid */ GNUNET_asprintf(&op_name, "op-%u-peer-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->peer_id)) @@ -1592,7 +1692,7 @@ load_op_stop_request (struct GNUNET_ATS_TEST_Operation *o, { char *op_name; - /* peer id */ + /* peer pid */ GNUNET_asprintf(&op_name, "op-%u-peer-id", op_counter); if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg, sec_name, op_name, &o->peer_id)) @@ -1631,6 +1731,9 @@ load_episode (struct Experiment *e, struct Episode *cur, break; } o = GNUNET_new (struct GNUNET_ATS_TEST_Operation); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "==== Parsing operation %u: `%s'\n", + cur->id, op_name); + /* operations = set_rate, start_send, stop_send, set_preference */ if (0 == strcmp (op, "address_add")) { @@ -2193,6 +2296,17 @@ GNUNET_ATS_solvers_experimentation_load (char *filename) else GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment name: `%s'\n", e->name); + if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string(cfg, "experiment", + "log_prefix", &e->log_prefix)) + { + fprintf (stderr, "Invalid %s", "name"); + free_experiment (e); + return NULL; + } + else + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment logging prefix: `%s'\n", + e->log_prefix); + if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_filename (cfg, "experiment", "cfg_file", &e->cfg_file)) { @@ -2670,15 +2784,16 @@ done () /* Stop all property generation */ GNUNET_ATS_solver_generate_property_stop_all (); - /* Clean up experiment */ - if (NULL != e) - { - GNUNET_ATS_solvers_experimentation_stop (e); - e = NULL; - } - if (opt_print) + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "== Printing log information \n"); GNUNET_ATS_solver_logging_eval (l); + } + if (opt_save) + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "== Saving log information \n"); + GNUNET_ATS_solver_logging_write_to_disk (l); + } if (NULL != l) { @@ -2686,6 +2801,13 @@ done () l = NULL; } + /* Clean up experiment */ + if (NULL != e) + { + GNUNET_ATS_solvers_experimentation_stop (e); + e = NULL; + } + next = peer_head; while (NULL != (cur = next)) { @@ -2836,7 +2958,7 @@ main (int argc, char *argv[]) opt_exp_file = NULL; opt_solver = NULL; opt_log = GNUNET_NO; - opt_plot = GNUNET_NO; + opt_save = GNUNET_NO; res = 0; @@ -2848,12 +2970,15 @@ main (int argc, char *argv[]) { 'e', "experiment", NULL, gettext_noop ("experiment to use"), 1, &GNUNET_GETOPT_set_string, &opt_exp_file}, - { 'e', "experiment", NULL, - gettext_noop ("experiment to use"), - 1, &GNUNET_GETOPT_set_one, &opt_verbose}, + { 'V', "verbose", NULL, + gettext_noop ("be verbose"), + 0, &GNUNET_GETOPT_set_one, &opt_verbose}, { 'p', "print", NULL, gettext_noop ("print logging"), 0, &GNUNET_GETOPT_set_one, &opt_print}, + { 'f', "file", NULL, + gettext_noop ("save logging to disk"), + 0, &GNUNET_GETOPT_set_one, &opt_save}, GNUNET_GETOPT_OPTION_END }; diff --git a/src/ats/gnunet-ats-solver-eval.h b/src/ats/gnunet-ats-solver-eval.h index 3d26afcd9..990a0fd88 100644 --- a/src/ats/gnunet-ats-solver-eval.h +++ b/src/ats/gnunet-ats-solver-eval.h @@ -25,6 +25,7 @@ */ #ifndef GNUNET_ATS_SOLVER_EVAL_H #define GNUNET_ATS_SOLVER_EVAL_H + #include "platform.h" #include "gnunet_util_lib.h" #include "gnunet_ats_plugin.h" @@ -84,6 +85,21 @@ enum GNUNET_ATS_Solvers GNUNET_ATS_SOLVER_RIL, }; +struct LoggingFileHandle +{ + /* DLL list for logging time steps */ + struct LoggingFileHandle *next; + struct LoggingFileHandle *prev; + + /* peer id */ + int pid; + + /* address id */ + int aid; + + struct GNUNET_DISK_FileHandle *f_hd; + +}; struct LoggingTimeStep { @@ -111,7 +127,6 @@ struct LoggingPeer struct LoggingAddress *addr_tail; }; - struct LoggingAddress { struct LoggingAddress *next; @@ -209,14 +224,15 @@ struct LoggingHandle GNUNET_SCHEDULER_TaskIdentifier logging_task; struct GNUNET_TIME_Relative log_freq; + /* DLL list for logging time steps */ struct LoggingTimeStep *head; - struct LoggingTimeStep *tail; }; struct Experiment { char *name; + char *log_prefix; char *cfg_file; struct GNUNET_TIME_Relative log_freq; struct GNUNET_TIME_Relative max_duration; @@ -282,574 +298,5 @@ struct PropertyGenerator struct GNUNET_TIME_Absolute time_start; }; - -/* LEGACY */ - -#if 0 -#define TEST_ATS_PREFERENCE_DEFAULT 1.0 - -/** - * Message type sent for traffic generation - */ -#define TEST_MESSAGE_TYPE_PING 12345 - -/** - * Message type sent as response during traffic generation - */ -#define TEST_MESSAGE_TYPE_PONG 12346 - -/** - * Size of test messages - */ -#define TEST_MESSAGE_SIZE 100 - -struct BenchmarkPartner; - -struct BenchmarkPeer; - -struct GNUNET_ATS_TEST_Topology; - -struct TrafficGenerator; - - - - - -/** - * Callback to call when topology setup is completed - * - * @param cls the closure - * @param masters array of master peers - * @param slaves array of master peers - */ -typedef void (*GNUNET_ATS_TEST_TopologySetupDoneCallback) (void *cls, - struct BenchmarkPeer *masters, - struct BenchmarkPeer *slaves); - -/** - * Callback called when logging is required for the data contained - * - * @param cls the closure - * @param address an address - * @param address_active is address active - * @param bandwidth_out bandwidth outbound - * @param bandwidth_in bandwidth inbound - * @param ats ats information - * @param ats_count number of ats inforation - */ -typedef void -(*GNUNET_ATS_TEST_LogRequest) (void *cls, - const struct GNUNET_HELLO_Address *address_id, - int address_active, - struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, - struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in, - const struct GNUNET_ATS_Information *ats, - uint32_t ats_count); - -/** - * Information we track for a peer in the testbed. - */ -struct BenchmarkPeer -{ - /** - * Handle with testbed. - */ - struct GNUNET_TESTBED_Peer *peer; - - /** - * Unique identifier - */ - int no; - - /** - * Is this peer a measter: GNUNET_YES/GNUNET_NO - */ - int master; - - /** - * Peer ID - */ - struct GNUNET_PeerIdentity id; - - /** - * Testbed operation to get peer information - */ - struct GNUNET_TESTBED_Operation *peer_id_op; - - /** - * Testbed operation to connect to ATS performance service - */ - struct GNUNET_TESTBED_Operation *ats_perf_op; - - /** - * Testbed operation to connect to core - */ - struct GNUNET_TESTBED_Operation *comm_op; - - /** - * ATS performance handle - */ - struct GNUNET_ATS_PerformanceHandle *ats_perf_handle; - - /** - * Masters only: - * Testbed connect operations to connect masters to slaves - */ - struct TestbedConnectOperation *core_connect_ops; - - /** - * Core handle - */ - struct GNUNET_CORE_Handle *ch; - - /** - * Core handle - */ - struct GNUNET_TRANSPORT_Handle *th; - - /** - * Masters only: - * Peer to set ATS preferences for - */ - struct BenchmarkPeer *pref_partner; - - /** - * Masters only - * Progress task - */ - GNUNET_SCHEDULER_TaskIdentifier ats_task; - - /** - * Masters only - * Progress task - */ - double pref_value; - - /** - * Array of partners with num_slaves entries (if master) or - * num_master entries (if slave) - */ - struct BenchmarkPartner *partners; - - /** - * Number of partners - */ - int num_partners; - - /** - * Number of core connections - */ - int core_connections; - - /** - * Masters only: - * Number of connections to slave peers - */ - int core_slave_connections; - - /** - * Total number of messages this peer has sent - */ - unsigned int total_messages_sent; - - /** - * Total number of bytes this peer has sent - */ - unsigned int total_bytes_sent; - - /** - * Total number of messages this peer has received - */ - unsigned int total_messages_received; - - /** - * Total number of bytes this peer has received - */ - unsigned int total_bytes_received; -}; - -struct TrafficGenerator -{ - struct TrafficGenerator *prev; - struct TrafficGenerator *next; - - enum GeneratorType type; - - struct BenchmarkPeer *src; - struct BenchmarkPartner *dest; - - long int base_rate; - long int max_rate; - struct GNUNET_TIME_Relative duration_period; - - GNUNET_SCHEDULER_TaskIdentifier send_task; - struct GNUNET_TIME_Absolute next_ping_transmission; - struct GNUNET_TIME_Absolute time_start; -}; - - -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 - */ -struct BenchmarkPartner -{ - /** - * The peer itself this partner belongs to - */ - struct BenchmarkPeer *me; - - /** - * The partner peer - */ - struct BenchmarkPeer *dest; - - /** - * Core transmit handles - */ - struct GNUNET_CORE_TransmitHandle *cth; - - /** - * Transport transmit handles - */ - struct GNUNET_TRANSPORT_TransmitHandle *tth; - - struct TrafficGenerator *tg; - struct PreferenceGenerator *pg; - - /** - * Timestamp to calculate communication layer delay - */ - struct GNUNET_TIME_Absolute last_message_sent; - - /** - * Accumulated RTT for all messages - */ - unsigned int total_app_rtt; - - /** - * Number of messages sent to this partner - */ - unsigned int messages_sent; - - /** - * Number of bytes sent to this partner - */ - unsigned int bytes_sent; - - /** - * Number of messages received from this partner - */ - unsigned int messages_received; - - /** - * Number of bytes received from this partner - */ - unsigned int bytes_received; - - /* Current ATS properties */ - - uint32_t ats_distance; - - uint32_t ats_delay; - - uint32_t bandwidth_in; - - uint32_t bandwidth_out; - - uint32_t ats_utilization_up; - - uint32_t ats_utilization_down; - - uint32_t ats_network_type; - - uint32_t ats_cost_wan; - - uint32_t ats_cost_lan; - - uint32_t ats_cost_wlan; - - double pref_bandwidth; - double pref_delay; -}; - -/** - * Overall state of the performance benchmark - */ -struct BenchmarkState -{ - /** - * Are we connected to ATS service of all peers: GNUNET_YES/NO - */ - int connected_ATS_service; - - /** - * Are we connected to CORE service of all peers: GNUNET_YES/NO - */ - int connected_COMM_service; - - /** - * Are we connected to all peers: GNUNET_YES/NO - */ - int connected_PEERS; - - /** - * Are we connected to all slave peers on CORE level: GNUNET_YES/NO - */ - int connected_CORE; - - /** - * Are we connected to CORE service of all peers: GNUNET_YES/NO - */ - int benchmarking; -}; - - -struct GNUNET_ATS_TEST_Topology -{ - /** - * Shutdown task - */ - GNUNET_SCHEDULER_TaskIdentifier shutdown_task; - - /** - * Progress task - */ - GNUNET_SCHEDULER_TaskIdentifier progress_task; - - /** - * Test result - */ - int result; - - /**Test core (GNUNET_YES) or transport (GNUNET_NO) - */ - int test_core; - - /** - * Solver string - */ - char *solver; - - /** - * Preference string - */ - char *testname; - - /** - * Preference string - */ - char *pref_str; - - /** - * ATS preference value - */ - int pref_val; - - /** - * Number master peers - */ - unsigned int num_masters; - - /** - * Array of master peers - */ - struct BenchmarkPeer *mps; - - /** - * Number slave peers - */ - unsigned int num_slaves; - - /** - * Array of slave peers - */ - struct BenchmarkPeer *sps; - - /** - * Benchmark duration - */ - struct GNUNET_TIME_Relative perf_duration; - - /** - * Logging frequency - */ - struct GNUNET_TIME_Relative log_frequency; - - /** - * Benchmark state - */ - struct BenchmarkState state; - - struct GNUNET_CORE_MessageHandler *handlers; - - GNUNET_TRANSPORT_ReceiveCallback transport_recv_cb; - - GNUNET_ATS_TEST_TopologySetupDoneCallback done_cb; - GNUNET_ATS_AddressInformationCallback ats_perf_cb; - void *done_cb_cls; -}; - - - -/* - * Experiment related functions - */ - - -/** - * Execute the specified experiment - * - * @param e the Experiment - * @param ep_done_cb a episode is completed - * @param e_done_cb the experiment is completed - */ -void -GNUNET_ATS_TEST_experimentation_run (struct Experiment *e, - GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb, - GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb); - -/** - * Load an experiment from a file - * - * @param filename the file - * @return the Experiment or NULL on failure - */ -struct Experiment * -GNUNET_ATS_TEST_experimentation_load (char *filename); - - -/** - * Stop an experiment - * - * @param e the experiment - */ -void -GNUNET_ATS_TEST_experimentation_stop (struct Experiment *e); - -/* - * Traffic related functions - */ - -void -GNUNET_ATS_TEST_traffic_handle_ping (struct BenchmarkPartner *p); - -void -GNUNET_ATS_TEST_traffic_handle_pong (struct BenchmarkPartner *p); - - -/** - * Generate between the source master and the partner and send traffic with a - * maximum rate. - * - * @param src traffic source - * @param dest traffic partner - * @param type type of traffic 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 TrafficGenerator * -GNUNET_ATS_TEST_generate_traffic_start (struct BenchmarkPeer *src, - struct BenchmarkPartner *dest, - enum GeneratorType type, - long int base_rate, - long int max_rate, - struct GNUNET_TIME_Relative period, - struct GNUNET_TIME_Relative duration); - -void -GNUNET_ATS_TEST_generate_traffic_stop (struct TrafficGenerator *tg); - -/** - * Stop all traffic generators - */ -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 - */ - - - -/* - * Topology related functions - */ - -struct BenchmarkPeer * -GNUNET_ATS_TEST_get_peer (int src); - -struct BenchmarkPartner * -GNUNET_ATS_TEST_get_partner (int src, int dest); - -/** - * Create a topology for ats testing - * - * @param name test name - * @param cfg_file configuration file to use for the peers - * @param num_slaves number of slaves - * @param num_masters number of masters - * @param test_core connect to CORE service (GNUNET_YES) or transport (GNUNET_NO) - * @param done_cb function to call when topology is setup - * @param done_cb_cls cls for callback - * @param recv_cb callback to call when data are received - * @param perf_cb callback to call when performance info are received - */ -void -GNUNET_ATS_TEST_create_topology (char *name, char *cfg_file, - unsigned int num_slaves, - unsigned int num_masters, - int test_core, - GNUNET_ATS_TEST_TopologySetupDoneCallback done_cb, - void *done_cb_cls, - GNUNET_TRANSPORT_ReceiveCallback recv_cb, - GNUNET_ATS_TEST_LogRequest ats_perf_cb); - -/** - * Shutdown topology - */ -void -GNUNET_ATS_TEST_shutdown_topology (void); -#endif #endif /* #ifndef GNUNET_ATS_SOLVER_EVAL_H */ /* end of file ats-testing.h */ -- 2.25.1