X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fats-tests%2Fats-testing.h;h=59a9145d7122d48ed734fe576d5982aec68d161a;hb=49abab4a07a12b81d596ba166d3601055acf2da4;hp=7dd05bb210b04b94f03d818642a4de3f0d8514ad;hpb=f15624031417464fa72c659be7e0be8db55a909b;p=oweals%2Fgnunet.git diff --git a/src/ats-tests/ats-testing.h b/src/ats-tests/ats-testing.h index 7dd05bb21..59a9145d7 100644 --- a/src/ats-tests/ats-testing.h +++ b/src/ats-tests/ats-testing.h @@ -18,8 +18,8 @@ Boston, MA 02111-1307, USA. */ /** - * @file ats/perf_ats.c - * @brief ats benchmark: start peers and modify preferences, monitor change over time + * @file ats-tests/ats-testing.h + * @brief ats testing library: setup topology and provide logging to test ats * @author Christian Grothoff * @author Matthias Wachs */ @@ -29,132 +29,64 @@ #include "gnunet_ats_service.h" #include "gnunet_core_service.h" -#define TEST_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 120) -#define BENCHMARK_DURATION GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10) -#define LOGGING_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 500) -#define TESTNAME_PREFIX "perf_ats_" -#define DEFAULT_SLAVES_NUM 2 -#define DEFAULT_MASTERS_NUM 1 - -#define TEST_ATS_PREFRENCE_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1) -#define TEST_ATS_PREFRENCE_START 1.0 -#define TEST_ATS_PREFRENCE_DELTA 1.0 +#define TEST_ATS_PREFERENCE_DEFAULT 1.0 +/** + * Message type sent for traffic generation + */ #define TEST_MESSAGE_TYPE_PING 12345 -#define TEST_MESSAGE_TYPE_PONG 12346 -#define TEST_MESSAGE_SIZE 1000 -#define TEST_MESSAGE_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1) /** - * Overall state of the performance benchmark + * Message type sent as response during traffic generation */ -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; -}; - +#define TEST_MESSAGE_TYPE_PONG 12346 /** - * Information about a benchmarking partner + * Size of test messages */ -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; - - /** - * 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; +#define TEST_MESSAGE_SIZE 100 - /** - * Number of messages received from this partner - */ - unsigned int messages_received; +struct BenchmarkPartner; - /** - * Number of bytes received from this partner - */ - unsigned int bytes_received; +struct BenchmarkPeer; - /* Current ATS properties */ +struct GNUNET_ATS_TEST_Topology; - uint32_t ats_distance; +struct TrafficGenerator; - uint32_t ats_delay; +struct LoggingHandle; - 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; -}; +/** + * 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, + 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. @@ -278,30 +210,131 @@ struct BenchmarkPeer unsigned int total_bytes_received; }; +struct TrafficGenerator +{ + struct TrafficGenerator *prev; + struct TrafficGenerator *next; + + struct BenchmarkPeer *src; + struct BenchmarkPartner *dest; + unsigned int rate; + GNUNET_SCHEDULER_TaskIdentifier send_task; + struct GNUNET_TIME_Absolute next_ping_transmission; + struct GNUNET_TIME_Relative delta; +}; + + +/** + * 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; + + /** + * 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; +}; + /** - * Connect peers with testbed + * Overall state of the performance benchmark */ -struct TestbedConnectOperation +struct BenchmarkState { /** - * The benchmarking master initiating this connection + * Are we connected to ATS service of all peers: GNUNET_YES/NO */ - struct BenchmarkPeer *master; + int connected_ATS_service; /** - * The benchmarking slave to connect to + * Are we connected to CORE service of all peers: GNUNET_YES/NO */ - struct BenchmarkPeer *slave; + int connected_COMM_service; /** - * Testbed operation to connect peers + * Are we connected to all peers: GNUNET_YES/NO */ - struct GNUNET_TESTBED_Operation *connect_op; + 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; }; -typedef void (*GNUNET_ATS_TESTING_TopologySetupDoneCallback) (void *cls, - struct BenchmarkPeer *masters, - struct BenchmarkPeer *slaves); struct GNUNET_ATS_TEST_Topology { @@ -320,11 +353,6 @@ struct GNUNET_ATS_TEST_Topology */ int result; - /** - * Test result logging - */ - int logging; - /**Test core (GNUNET_YES) or transport (GNUNET_NO) */ int test_core; @@ -388,22 +416,218 @@ struct GNUNET_ATS_TEST_Topology GNUNET_TRANSPORT_ReceiveCallback transport_recv_cb; - GNUNET_ATS_TESTING_TopologySetupDoneCallback done_cb; - + GNUNET_ATS_TEST_TopologySetupDoneCallback done_cb; + GNUNET_ATS_AddressInformationCallback ats_perf_cb; void *done_cb_cls; }; +enum OperationType +{ + START_SEND, + STOP_SEND, + SET_RATE, + SET_PREFERENCE +}; + +struct Episode; + +struct Experiment; + +typedef void (*GNUNET_ATS_TESTING_EpisodeDoneCallback) ( + struct Episode *e); + +typedef void (*GNUNET_ATS_TESTING_ExperimentDoneCallback) (struct Experiment *e, + struct GNUNET_TIME_Relative duration,int success); + +struct Operation +{ + struct Operation *next; + struct Operation *prev; + long long unsigned int src_id; + long long unsigned int dest_id; + long long unsigned int value; + enum OperationType type; +}; + +struct Episode +{ + int id; + struct Episode *next; + struct GNUNET_TIME_Relative duration; + + struct Operation *head; + struct Operation *tail; +}; + + +struct Experiment +{ + char *name; + char *cfg_file; + unsigned long long int num_masters; + unsigned long long int num_slaves; + struct GNUNET_TIME_Relative max_duration; + struct GNUNET_TIME_Relative total_duration; + struct GNUNET_TIME_Absolute start_time; + unsigned int num_episodes; + struct Episode *start; + + GNUNET_SCHEDULER_TaskIdentifier experiment_timeout_task; + GNUNET_SCHEDULER_TaskIdentifier episode_timeout_task; + struct Episode *cur; + + GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb; + GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb; +}; + +/* + * 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); + + +struct TrafficGenerator * +GNUNET_ATS_TEST_generate_traffic_start (struct BenchmarkPeer *src, + struct BenchmarkPartner *dest, + unsigned int rate, + 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 (); + + +/* + * Logging related functions + */ + +/** + * Start logging + * + * @param log_frequency the logging frequency + * @param testname the testname + * @param masters the master peers used for benchmarking + * @param num_master the number of master peers + * @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); + +/** + * Stop logging + * + * @param l the logging handle + */ +void +GNUNET_ATS_TEST_logging_clean_up (struct LoggingHandle *l); + +/** + * Stop logging + * + * @param l the logging handle + */ +void +GNUNET_ATS_TEST_logging_stop (struct LoggingHandle *l); + +/** + * Log all data now + * + * @param llogging handle to use + */ +void +GNUNET_ATS_TEST_logging_now (struct LoggingHandle *l); + + +/** + * Write logging data to file + * + * @param l logging handle to use + * @param test_name name of the current test + * @param plots create gnuplots: GNUNET_YES or GNUNET_NO + */ +void +GNUNET_ATS_TEST_logging_write_to_file (struct LoggingHandle *l, + char *test_name, int plots); + +/* + * Topology related functions + */ + +/** + * 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_TESTING_TopologySetupDoneCallback done_cb, + GNUNET_ATS_TEST_TopologySetupDoneCallback done_cb, void *done_cb_cls, - struct GNUNET_CORE_MessageHandler *handlers, - GNUNET_TRANSPORT_ReceiveCallback transport_recv_cb); + GNUNET_TRANSPORT_ReceiveCallback recv_cb, + GNUNET_ATS_TEST_LogRequest ats_perf_cb); +/** + * Shutdown topology + */ void GNUNET_ATS_TEST_shutdown_topology (void); -/* end of file perf_ats.c */ +/* end of file ats-testing.h */