From 145a5105d15f6a8942f65480f674f8a771166f1b Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Fri, 29 Aug 2014 13:44:17 +0000 Subject: profiler and cfg --- src/transport/Makefile.am | 5 +- src/transport/gnunet-transport-profiler.c | 1708 +++-------------------------- src/transport/perf_tcp_peer1.conf | 33 + src/transport/perf_tcp_peer2.conf | 35 + 4 files changed, 254 insertions(+), 1527 deletions(-) create mode 100644 src/transport/perf_tcp_peer1.conf create mode 100644 src/transport/perf_tcp_peer2.conf diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am index 46d7ef3e0..bab29d0f3 100644 --- a/src/transport/Makefile.am +++ b/src/transport/Makefile.am @@ -1320,4 +1320,7 @@ test_transport_blacklisting_cfg_blp_peer2_plugin.conf \ test_transport_blacklisting_cfg_blp_peer1_multiple_plugins.conf \ test_transport_blacklisting_cfg_blp_peer2_multiple_plugins.conf \ test_transport_api_http_reverse_peer1.conf \ -test_transport_api_http_reverse_peer2.conf +test_transport_api_http_reverse_peer2.conf \ +perf_tcp_peer1.conf \ +perf_tcp_peer2.conf + diff --git a/src/transport/gnunet-transport-profiler.c b/src/transport/gnunet-transport-profiler.c index 354060ac8..f37d2f8a4 100644 --- a/src/transport/gnunet-transport-profiler.c +++ b/src/transport/gnunet-transport-profiler.c @@ -34,236 +34,41 @@ #include "gnunet_transport_service.h" #include "gnunet_nat_lib.h" -/** - * How long do we wait for the NAT test to report success? - * Should match NAT_SERVER_TIMEOUT in 'nat_test.c'. - */ -#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 20) - -/** - * Timeout for a name resolution - */ -#define RESOLUTION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) /** - * Timeout for an operations + * Timeout for a connections */ -#define OP_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) - +#define CONNECT_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) /** - * Context to store name resolutions for valiation + * Benchmarking block size in bye */ -struct ValidationResolutionContext -{ - /** - * Next in DLL - */ - struct ValidationResolutionContext *next; - - /** - * Previous in DLL - */ - struct ValidationResolutionContext *prev; - - /** - * Peer identity - */ - struct GNUNET_PeerIdentity id; - - /** - * Address to resolve - */ - struct GNUNET_HELLO_Address *addrcp; - - /** - * Time of last validation - */ - struct GNUNET_TIME_Absolute last_validation; - - /** - * Address is valid until - */ - struct GNUNET_TIME_Absolute valid_until; - - /** - * Time of next validation - */ - struct GNUNET_TIME_Absolute next_validation; - - /** - * state of validation process - */ - enum GNUNET_TRANSPORT_ValidationState state; - - /** - * Tranport conversion handle - */ - struct GNUNET_TRANSPORT_AddressToStringContext *asc; - - /** - * plugin name - */ - char *transport; - - /** - * was the entry printed - */ - int printed; -}; +#define DEFAULT_MESSAGE_SIZE 1024 /** - * Struct to store information about peers in monitor mode + * Benchmarking message count */ -struct MonitoredPeer -{ - /** - * State of the peer - */ - enum GNUNET_TRANSPORT_PeerState state; - - /** - * Timeout - */ - struct GNUNET_TIME_Absolute state_timeout; - - /** - * The address to convert - */ - struct GNUNET_HELLO_Address *address; -}; +#define DEFAULT_MESSAGE_COUNT 1024 /** - * Context to store name resolutions for valiation + * Option -s. */ -struct PeerResolutionContext -{ - /** - * Next in DLL - */ - struct PeerResolutionContext *next; - - /** - * Prev in DLL - */ - struct PeerResolutionContext *prev; - - /** - * The peer id - */ - struct GNUNET_PeerIdentity id; - - /** - * address to resolve - */ - struct GNUNET_HELLO_Address *addrcp; - - /** - * transport conversiion context - */ - struct GNUNET_TRANSPORT_AddressToStringContext *asc; - - /** - * peer state - */ - enum GNUNET_TRANSPORT_PeerState state; - - /** - * state timeout - */ - struct GNUNET_TIME_Absolute state_timeout; - - /** - * transport plugin - */ - char *transport; - - /** - * was the entry printed - */ - int printed; -}; - +static int benchmark_send; /** - * Context for a plugin test. + * Option -b. */ -struct TestContext -{ - /** - * Previous in DLL - */ - struct TestContext *prev; - - /** - * Next in DLL - */ - struct TestContext *next; - - /** - * Handle to the active NAT test. - */ - struct GNUNET_NAT_Test *tst; - - /** - * Task identifier for the timeout. - */ - GNUNET_SCHEDULER_TaskIdentifier tsk; - - /** - * Name of plugin under test. - */ - char *name; - - /** - * Bound port - */ - unsigned long long bnd_port; - - /** - * Advertised ports - */ - unsigned long long adv_port; - -}; - +static int benchmark_receive; /** - * + * Option -n. */ -enum TestResult -{ - /** - * NAT returned success - */ - NAT_TEST_SUCCESS = GNUNET_OK, - - /** - * NAT returned failure - */ - NAT_TEST_FAIL = GNUNET_NO, - - /** - * NAT returned failure while running test - */ - NAT_TEST_INTERNAL_FAIL = GNUNET_SYSERR, - - /** - * We could not start the test - */ - NAT_TEST_FAILED_TO_START = 2, - - /** - * We had a timeout while running the test - */ - NAT_TEST_TIMEOUT = 3 -}; - +static unsigned int benchmark_count; /** - * Benchmarking block size in KB + * Option -m. */ -#define BLOCKSIZE 4 +static unsigned int benchmark_size; /** * Which peer should we connect to? @@ -285,81 +90,12 @@ static struct GNUNET_CONFIGURATION_Handle *cfg; */ struct GNUNET_TRANSPORT_TryConnectHandle *tc_handle; -/** - * Option -s. - */ -static int benchmark_send; - -/** - * Option -b. - */ -static int benchmark_receive; - -/** - * Option -l. - */ -static int benchmark_receive; - -/** - * Option -i. - */ -static int iterate_connections; - -/** - * Option -d. - */ -static int iterate_validation; - -/** - * Option -a. - */ -static int iterate_all; - -/** - * Option -t. - */ -static int test_configuration; - -/** - * Option -c. - */ -static int monitor_connects; - -/** - * Option -m. - */ -static int monitor_connections; - -/** - * Option -f. - */ -static int monitor_validation; - -/** - * Option -C. - */ -static int try_connect; - -/** - * Option -D. - */ -static int try_disconnect; -/** - * Option -n. - */ -static int numeric; /** * Global return value (0 success). */ static int ret; - -/** - * Current number of connections in monitor mode - */ -static int monitor_connect_counter; - /** * Number of bytes of traffic we received so far. */ @@ -380,20 +116,7 @@ static struct GNUNET_TIME_Absolute start_time; */ static struct GNUNET_TRANSPORT_TransmitHandle *th; -/** - * Map storing information about monitored peers - */ -static struct GNUNET_CONTAINER_MultiPeerMap *monitored_peers; - -/** - * - */ -static struct GNUNET_TRANSPORT_PeerMonitoringContext *pic; - -/** - * - */ -static struct GNUNET_TRANSPORT_ValidationMonitoringContext *vic; +struct GNUNET_TRANSPORT_Blacklist *bl_handle; /** * Identity of the peer we transmit to / connect to. @@ -416,69 +139,6 @@ static GNUNET_SCHEDULER_TaskIdentifier op_timeout; */ static int verbosity; -/** - * Resolver process handle. - */ -struct GNUNET_OS_Process *resolver; - -/** - * Number of address resolutions pending - */ -static unsigned int address_resolutions; - -/** - * Address resolutions pending in progress - */ -static unsigned int address_resolution_in_progress; - -/** - * DLL for NAT Test Contexts: head - */ -struct TestContext *head; - -/** - * DLL for NAT Test Contexts: tail - */ -struct TestContext *tail; - -/** - * DLL: head of validation resolution entries - */ -static struct ValidationResolutionContext *vc_head; - -/** - * DLL: tail of validation resolution entries - */ -static struct ValidationResolutionContext *vc_tail; - -/** - * DLL: head of resolution entries - */ -static struct PeerResolutionContext *rc_head; - -/** - * DLL: head of resolution entries - */ -static struct PeerResolutionContext *rc_tail; - - -static int -destroy_it (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) -{ - struct MonitoredPeer *m = value; - - GNUNET_assert (GNUNET_OK == - GNUNET_CONTAINER_multipeermap_remove (monitored_peers, - key, - value)); - GNUNET_free_non_null (m->address); - GNUNET_free (value); - return GNUNET_OK; -} - - /** * Task run in monitor mode when the user presses CTRL-C to abort. * Stops monitoring activity. @@ -491,8 +151,6 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { struct GNUNET_TIME_Relative duration; - struct ValidationResolutionContext *cur; - struct ValidationResolutionContext *next; end = GNUNET_SCHEDULER_NO_TASK; if (GNUNET_SCHEDULER_NO_TASK != op_timeout) @@ -500,34 +158,12 @@ shutdown_task (void *cls, GNUNET_SCHEDULER_cancel (op_timeout); op_timeout = GNUNET_SCHEDULER_NO_TASK; } + if (NULL != tc_handle) { GNUNET_TRANSPORT_try_connect_cancel (tc_handle); tc_handle = NULL; } - if (NULL != pic) - { - GNUNET_TRANSPORT_monitor_peers_cancel (pic); - pic = NULL; - } - if (NULL != vic) - { - GNUNET_TRANSPORT_monitor_validation_entries_cancel (vic); - vic = NULL; - } - - next = vc_head; - for (cur = next; NULL != cur; cur = next) - { - next = cur->next; - - GNUNET_TRANSPORT_address_to_string_cancel (cur->asc); - GNUNET_CONTAINER_DLL_remove (vc_head, vc_tail, cur); - GNUNET_free (cur->transport); - GNUNET_HELLO_address_free (cur->addrcp); - GNUNET_free (cur); - } - if (NULL != th) { GNUNET_TRANSPORT_notify_transmit_ready_cancel (th); @@ -538,6 +174,12 @@ shutdown_task (void *cls, GNUNET_TRANSPORT_disconnect (handle); handle = NULL; } + if (NULL != bl_handle ) + { + GNUNET_TRANSPORT_blacklist_cancel (bl_handle); + bl_handle = NULL; + } +#if 0 if (benchmark_send) { duration = GNUNET_TIME_absolute_get_duration (start_time); @@ -556,13 +198,7 @@ shutdown_task (void *cls, traffic_received, GNUNET_STRINGS_relative_time_to_string (duration, GNUNET_YES)); } - - if (NULL != monitored_peers) - { - GNUNET_CONTAINER_multipeermap_iterate (monitored_peers, &destroy_it, NULL); - GNUNET_CONTAINER_multipeermap_destroy (monitored_peers); - monitored_peers = NULL; - } +#endif } @@ -570,10 +206,9 @@ static void operation_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { - struct PeerResolutionContext *cur; - struct PeerResolutionContext *next; + op_timeout = GNUNET_SCHEDULER_NO_TASK; - if ((try_connect) || (benchmark_send) || (benchmark_receive)) + if ((benchmark_send) || (benchmark_receive)) { FPRINTF (stdout, _("Failed to connect to `%s'\n"), @@ -584,597 +219,136 @@ operation_timeout (void *cls, ret = 1; return; } - if (iterate_connections) - { - next = rc_head; - while (NULL != (cur = next)) - { - next = cur->next; - FPRINTF (stdout, - _("Failed to resolve address for peer `%s'\n"), - GNUNET_i2s (&cur->addrcp->peer)); - - GNUNET_CONTAINER_DLL_remove(rc_head, rc_tail, cur); - GNUNET_TRANSPORT_address_to_string_cancel (cur->asc); - GNUNET_free(cur->transport); - GNUNET_free(cur->addrcp); - GNUNET_free(cur); - - } - FPRINTF (stdout, - "%s", - _("Failed to list connections, timeout occured\n")); - if (GNUNET_SCHEDULER_NO_TASK != end) - GNUNET_SCHEDULER_cancel (end); - end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); - ret = 1; - return; - } } -static void -run_nat_test (); - - /** - * Display the result of the test. + * Function called to notify a client about the socket + * begin ready to queue more data. @a buf will be + * NULL and @a size zero if the socket was closed for + * writing in the meantime. * - * @param tc test context - * @param result #GNUNET_YES on success + * @param cls closure + * @param size number of bytes available in @a buf + * @param buf where the callee should write the message + * @return number of bytes written to @a buf */ -static void -display_test_result (struct TestContext *tc, - enum TestResult result) +static size_t +transmit_data (void *cls, + size_t size, + void *buf) { - switch (result) { - case NAT_TEST_FAIL: - FPRINTF (stderr, - _("Configuration for plugin `%s' did not work!\n"), - tc->name); - break; - case NAT_TEST_SUCCESS: - FPRINTF (stderr, - _("Configuration for plugin `%s' did work!\n"), - tc->name); - break; - case NAT_TEST_INTERNAL_FAIL: - FPRINTF (stderr, - _("Internal NAT error while running test for plugin `%s'\n"), - tc->name); - break; - case NAT_TEST_FAILED_TO_START: - FPRINTF (stderr, - _("Failed to start NAT test for plugin `%s'\n"), - tc->name); - break; - case NAT_TEST_TIMEOUT: - FPRINTF (stderr, - _("Timeout while waiting for result of NAT test for plugin `%s'\n"), - tc->name); - break; - default: - break; - } + static msgs_sent = 0; + struct GNUNET_MessageHeader *m = buf; - if (GNUNET_YES != result) - { - FPRINTF (stderr, - _("Configuration for plugin `%s' did not work!\n"), - tc->name); - } - else + + if ((NULL == buf) || (0 == size)) { - FPRINTF (stderr, - _("Configuration for plugin `%s' is working!\n"), - tc->name); + th = NULL; + return 0; } - if (GNUNET_SCHEDULER_NO_TASK != tc->tsk) + + msgs_sent ++; + + GNUNET_assert(size >= sizeof(struct GNUNET_MessageHeader)); + GNUNET_assert(size < GNUNET_SERVER_MAX_MESSAGE_SIZE); + m->size = ntohs (size); + m->type = ntohs (GNUNET_MESSAGE_TYPE_DUMMY); + memset (&m[1], 52, size - sizeof(struct GNUNET_MessageHeader)); + traffic_sent += size; + + if (msgs_sent tsk); - tc->tsk = GNUNET_SCHEDULER_NO_TASK; + th = GNUNET_TRANSPORT_notify_transmit_ready (handle, &pid, + benchmark_size, + GNUNET_TIME_UNIT_FOREVER_REL, + &transmit_data, NULL); } - if (NULL != tc->tst) + else { - GNUNET_NAT_test_stop (tc->tst); - tc->tst = NULL; + if (verbosity > 0) + FPRINTF (stdout, _("DONE!\n")); + return size; } + if (verbosity > 0) + FPRINTF (stdout, _("Transmitting %u bytes to %s\n"), (unsigned int) size, + GNUNET_i2s (&pid)); + return size; +} - GNUNET_CONTAINER_DLL_remove (head, tail, tc); - GNUNET_free (tc->name); - GNUNET_free (tc); - - if ((NULL == head) && (NULL != resolver)) +static void +start_benchmark () +{ + ret = 0; + if (benchmark_send) { - GNUNET_break (0 == GNUNET_OS_process_kill (resolver, - GNUNET_TERM_SIG)); - GNUNET_OS_process_destroy (resolver); - resolver = NULL; + if (GNUNET_SCHEDULER_NO_TASK != op_timeout) + { + GNUNET_SCHEDULER_cancel (op_timeout); + op_timeout = GNUNET_SCHEDULER_NO_TASK; + } + if (verbosity > 0) + FPRINTF (stdout, + _("Successfully connected to `%s', starting to send %u messages in %u byte blocks\n"), + GNUNET_i2s (&pid), benchmark_count, benchmark_size); + start_time = GNUNET_TIME_absolute_get (); + if (NULL == th) + th = GNUNET_TRANSPORT_notify_transmit_ready (handle, &pid, benchmark_size, + GNUNET_TIME_UNIT_FOREVER_REL, &transmit_data, NULL ); + else + GNUNET_break(0); + return; } - if (NULL != head) - run_nat_test (); } + /** - * Function called by NAT to report the outcome of the nat-test. - * Clean up and update GUI. + * Function called to notify transport users that another + * peer connected to us. * - * @param cls test context - * @param result status code + * @param cls closure + * @param peer the peer that connected */ static void -result_callback (void *cls, - enum GNUNET_NAT_StatusCode result) +notify_connect (void *cls, + const struct GNUNET_PeerIdentity *peer) { - struct TestContext *tc = cls; + if (0 != memcmp (&pid, peer, sizeof(struct GNUNET_PeerIdentity))) + { + FPRINTF (stdout, + _("Connected to different peer `%s'\n"), GNUNET_i2s (&pid)); + return; + } - display_test_result (tc, result); -} + if (verbosity > 0) + FPRINTF (stdout, + _("Successfully connected to `%s'\n"), + GNUNET_i2s (&pid)); + if (NULL != tc_handle) + { + GNUNET_TRANSPORT_try_connect_cancel (tc_handle); + tc_handle = NULL; + } -/** - * Resolve address we got a validation state for to a string. - * - * @param id peer identity the address is for - * @param address the address itself - * @param numeric #GNUNET_YES to disable DNS, #GNUNET_NO to try reverse lookup - * @param last_validation when was the address validated last - * @param valid_until until when is the address valid - * @param next_validation when will we try to revalidate the address next - * @param state where are we in the validation state machine - */ -static void -resolve_validation_address (const struct GNUNET_PeerIdentity *id, - const struct GNUNET_HELLO_Address *address, - int numeric, - struct GNUNET_TIME_Absolute last_validation, - struct GNUNET_TIME_Absolute valid_until, - struct GNUNET_TIME_Absolute next_validation, - enum GNUNET_TRANSPORT_ValidationState state); + start_benchmark (); +} /** - * Function to call with a textual representation of an address. This - * function will be called several times with different possible - * textual representations, and a last time with @a address being NULL - * to signal the end of the iteration. Note that @a address NULL - * always is the last call, regardless of the value in @a res. + * Function called to notify transport users that another + * peer disconnected from us. * * @param cls closure - * @param address NULL on end of iteration, - * otherwise 0-terminated printable UTF-8 string, - * in particular an empty string if @a res is #GNUNET_NO - * @param res result of the address to string conversion: - * if #GNUNET_OK: conversion successful - * if #GNUNET_NO: address was invalid (or not supported) - * if #GNUNET_SYSERR: communication error (IPC error) + * @param peer the peer that disconnected */ static void -process_validation_string (void *cls, - const char *address, - int res) +notify_disconnect (void *cls, + const struct GNUNET_PeerIdentity *peer) { - struct ValidationResolutionContext *vc = cls; - char *s_valid; - char *s_last; - char *s_next; - - if (NULL != address) - { - if (GNUNET_SYSERR == res) - { - FPRINTF (stderr, - "Failed to convert address for peer `%s' plugin `%s' length %lu to string \n", - GNUNET_i2s (&vc->id), - vc->addrcp->transport_name, - vc->addrcp->address_length); - } - if (GNUNET_TIME_UNIT_ZERO_ABS.abs_value_us == vc->valid_until.abs_value_us) - s_valid = GNUNET_strdup ("never"); - else - s_valid = GNUNET_strdup (GNUNET_STRINGS_absolute_time_to_string (vc->valid_until)); - - if (GNUNET_TIME_UNIT_ZERO_ABS.abs_value_us == vc->last_validation.abs_value_us) - s_last = GNUNET_strdup ("never"); - else - s_last = GNUNET_strdup (GNUNET_STRINGS_absolute_time_to_string (vc->last_validation)); - - if (GNUNET_TIME_UNIT_ZERO_ABS.abs_value_us == vc->next_validation.abs_value_us) - s_next = GNUNET_strdup ("never"); - else - s_next = GNUNET_strdup (GNUNET_STRINGS_absolute_time_to_string (vc->next_validation)); - - FPRINTF (stdout, - _("Peer `%s' %s %s\n\t%s%s\n\t%s%s\n\t%s%s\n"), - GNUNET_i2s (&vc->id), - (GNUNET_OK == res) ? address : "", - (monitor_validation) ? GNUNET_TRANSPORT_vs2s (vc->state) : "", - "Valid until : ", s_valid, - "Last validation: ",s_last, - "Next validation: ", s_next); - GNUNET_free (s_valid); - GNUNET_free (s_last); - GNUNET_free (s_next); - vc->printed = GNUNET_YES; - return; - } - /* last call, we are done */ - GNUNET_assert (address_resolutions > 0); - address_resolutions--; - if ( (GNUNET_SYSERR == res) && - (GNUNET_NO == vc->printed)) - { - if (numeric == GNUNET_NO) - { - /* Failed to resolve address, try numeric lookup - (note: this should be unnecessary, as - transport should fallback to numeric lookup - internally if DNS takes too long anyway) */ - resolve_validation_address (&vc->id, - vc->addrcp, - GNUNET_NO, - vc->last_validation, - vc->valid_until, - vc->next_validation, - vc->state); - } - else - { - FPRINTF (stdout, - _("Peer `%s' %s `%s' \n"), - GNUNET_i2s (&vc->id), - "", - GNUNET_TRANSPORT_vs2s (vc->state)); - } - } - GNUNET_free (vc->transport); - GNUNET_free (vc->addrcp); - GNUNET_CONTAINER_DLL_remove (vc_head, vc_tail, vc); - GNUNET_free (vc); - if ((0 == address_resolutions) && (iterate_validation)) - { - if (GNUNET_SCHEDULER_NO_TASK != end) - { - GNUNET_SCHEDULER_cancel (end); - end = GNUNET_SCHEDULER_NO_TASK; - } - if (GNUNET_SCHEDULER_NO_TASK != op_timeout) - { - GNUNET_SCHEDULER_cancel (op_timeout); - op_timeout = GNUNET_SCHEDULER_NO_TASK; - } - ret = 0; - end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); - } -} - - -/** - * Resolve address we got a validation state for to a string. - * - * @param id peer identity the address is for - * @param address the address itself - * @param numeric #GNUNET_YES to disable DNS, #GNUNET_NO to try reverse lookup - * @param last_validation when was the address validated last - * @param valid_until until when is the address valid - * @param next_validation when will we try to revalidate the address next - * @param state where are we in the validation state machine - */ -static void -resolve_validation_address (const struct GNUNET_PeerIdentity *id, - const struct GNUNET_HELLO_Address *address, - int numeric, - struct GNUNET_TIME_Absolute last_validation, - struct GNUNET_TIME_Absolute valid_until, - struct GNUNET_TIME_Absolute next_validation, - enum GNUNET_TRANSPORT_ValidationState state) -{ - struct ValidationResolutionContext *vc; - - vc = GNUNET_new (struct ValidationResolutionContext); - GNUNET_assert(NULL != vc); - GNUNET_CONTAINER_DLL_insert(vc_head, vc_tail, vc); - address_resolutions++; - - vc->id = (*id); - vc->transport = GNUNET_strdup(address->transport_name); - vc->addrcp = GNUNET_HELLO_address_copy (address); - vc->printed = GNUNET_NO; - vc->state = state; - vc->last_validation = last_validation; - vc->valid_until = valid_until; - vc->next_validation = next_validation; - - /* Resolve address to string */ - vc->asc = GNUNET_TRANSPORT_address_to_string (cfg, - address, - numeric, - RESOLUTION_TIMEOUT, - &process_validation_string, vc); -} - - -/** - * Resolve address we got a validation state for to a string. - * - * @param cls NULL - * @param peer peer identity the address is for - * @param address the address itself - * @param last_validation when was the address validated last - * @param valid_until until when is the address valid - * @param next_validation when will we try to revalidate the address next - * @param state where are we in the validation state machine - */ -static void -process_validation_cb (void *cls, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_HELLO_Address *address, - struct GNUNET_TIME_Absolute last_validation, - struct GNUNET_TIME_Absolute valid_until, - struct GNUNET_TIME_Absolute next_validation, - enum GNUNET_TRANSPORT_ValidationState state) -{ - if ((NULL == peer) && (NULL == address)) - { - if (monitor_validation) - { - FPRINTF (stdout, - "%s", - _("Monitor disconnected from transport service. Reconnecting.\n")); - return; - } - - /* done */ - vic = NULL; - if (GNUNET_SCHEDULER_NO_TASK != end) - GNUNET_SCHEDULER_cancel (end); - end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); - return; - } - if ((NULL == peer) || (NULL == address)) - { - /* invalid response */ - vic = NULL; - if (GNUNET_SCHEDULER_NO_TASK != end) - GNUNET_SCHEDULER_cancel (end); - end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); - return; - } - resolve_validation_address (peer, - address, - numeric, - last_validation, - valid_until, - next_validation, - state); -} - - -static void -run_nat_test () -{ - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Running test for plugin `%s' using bind port %u and advertised port %u \n", - head->name, - (uint16_t) head->bnd_port, - (uint16_t) head->adv_port); - - head->tst = GNUNET_NAT_test_start (cfg, - (0 == strcasecmp (head->name, "udp")) ? GNUNET_NO : GNUNET_YES, - (uint16_t) head->bnd_port, - (uint16_t) head->adv_port, - TIMEOUT, - &result_callback, head); -} - - -/** - * Test our plugin's configuration (NAT traversal, etc.). - * - * @param cfg configuration to test - */ -static void -do_test_configuration (const struct GNUNET_CONFIGURATION_Handle *cfg) -{ - char *plugins; - char *tok; - unsigned long long bnd_port; - unsigned long long adv_port; - struct TestContext *tc; - char *binary; - - if (GNUNET_OK - != GNUNET_CONFIGURATION_get_value_string (cfg, "transport", "plugins", - &plugins)) - { - FPRINTF (stderr, "%s", _ - ("No transport plugins configured, peer will never communicate\n")); - ret = 4; - return; - } - - for (tok = strtok (plugins, " "); tok != NULL ; tok = strtok (NULL, " ")) - { - char section[12 + strlen (tok)]; - GNUNET_snprintf (section, sizeof(section), "transport-%s", tok); - if (GNUNET_OK - != GNUNET_CONFIGURATION_get_value_number (cfg, section, "PORT", - &bnd_port)) - { - FPRINTF (stderr, - _("No port configured for plugin `%s', cannot test it\n"), tok); - continue; - } - if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (cfg, section, - "ADVERTISED_PORT", &adv_port)) - adv_port = bnd_port; - - tc = GNUNET_new (struct TestContext); - tc->name = GNUNET_strdup (tok); - tc->adv_port = adv_port; - tc->bnd_port = bnd_port; - GNUNET_CONTAINER_DLL_insert_tail (head, tail, tc); - } - GNUNET_free(plugins); - - if ((NULL != head) && (NULL == resolver)) - { - binary = GNUNET_OS_get_libexec_binary_path ("gnunet-service-resolver"); - resolver = GNUNET_OS_start_process (GNUNET_YES, - GNUNET_OS_INHERIT_STD_OUT_AND_ERR, - NULL, NULL, NULL, - binary, - "gnunet-service-resolver", NULL); - if (NULL == resolver) - { - FPRINTF (stderr, _("Failed to start resolver!\n")); - return; - } - - GNUNET_free(binary); - GNUNET_RESOLVER_connect (cfg); - run_nat_test (); - } -} - - -/** - * Function called to notify a client about the socket - * begin ready to queue more data. @a buf will be - * NULL and @a size zero if the socket was closed for - * writing in the meantime. - * - * @param cls closure - * @param size number of bytes available in @a buf - * @param buf where the callee should write the message - * @return number of bytes written to @a buf - */ -static size_t -transmit_data (void *cls, - size_t size, - void *buf) -{ - struct GNUNET_MessageHeader *m = buf; - - if ((NULL == buf) || (0 == size)) - { - th = NULL; - return 0; - } - - GNUNET_assert(size >= sizeof(struct GNUNET_MessageHeader)); - GNUNET_assert(size < GNUNET_SERVER_MAX_MESSAGE_SIZE); - m->size = ntohs (size); - m->type = ntohs (GNUNET_MESSAGE_TYPE_DUMMY); - memset (&m[1], 52, size - sizeof(struct GNUNET_MessageHeader)); - traffic_sent += size; - th = GNUNET_TRANSPORT_notify_transmit_ready (handle, &pid, - BLOCKSIZE * 1024, - GNUNET_TIME_UNIT_FOREVER_REL, - &transmit_data, NULL); - if (verbosity > 0) - FPRINTF (stdout, _("Transmitting %u bytes to %s\n"), (unsigned int) size, - GNUNET_i2s (&pid)); - return size; -} - - -/** - * Function called to notify transport users that another - * peer connected to us. - * - * @param cls closure - * @param peer the peer that connected - */ -static void -notify_connect (void *cls, - const struct GNUNET_PeerIdentity *peer) -{ - if (0 != memcmp (&pid, peer, sizeof(struct GNUNET_PeerIdentity))) - return; - ret = 0; - if (try_connect) - { - /* all done, terminate instantly */ - FPRINTF (stdout, _("Successfully connected to `%s'\n"), - GNUNET_i2s_full (peer)); - ret = 0; - - if (GNUNET_SCHEDULER_NO_TASK != op_timeout) - { - GNUNET_SCHEDULER_cancel (op_timeout); - op_timeout = GNUNET_SCHEDULER_NO_TASK; - } - - if (GNUNET_SCHEDULER_NO_TASK != end) - GNUNET_SCHEDULER_cancel (end); - end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); - return; - } - if (benchmark_send) - { - if (GNUNET_SCHEDULER_NO_TASK != op_timeout) - { - GNUNET_SCHEDULER_cancel (op_timeout); - op_timeout = GNUNET_SCHEDULER_NO_TASK; - } - if (verbosity > 0) - FPRINTF (stdout, - _("Successfully connected to `%s', starting to send benchmark data in %u Kb blocks\n"), - GNUNET_i2s (&pid), BLOCKSIZE); - start_time = GNUNET_TIME_absolute_get (); - if (NULL == th) - th = GNUNET_TRANSPORT_notify_transmit_ready (handle, peer, - BLOCKSIZE * 1024, - GNUNET_TIME_UNIT_FOREVER_REL, - &transmit_data, - NULL); - else - GNUNET_break(0); - return; - } -} - - -/** - * Function called to notify transport users that another - * peer disconnected from us. - * - * @param cls closure - * @param peer the peer that disconnected - */ -static void -notify_disconnect (void *cls, - const struct GNUNET_PeerIdentity *peer) -{ - if (0 != memcmp (&pid, peer, sizeof(struct GNUNET_PeerIdentity))) - return; - - if (try_disconnect) - { - /* all done, terminate instantly */ - FPRINTF (stdout, _("Successfully disconnected from `%s'\n"), - GNUNET_i2s_full (peer)); - ret = 0; - - if (GNUNET_SCHEDULER_NO_TASK != op_timeout) - { - GNUNET_SCHEDULER_cancel (op_timeout); - op_timeout = GNUNET_SCHEDULER_NO_TASK; - } - - if (GNUNET_SCHEDULER_NO_TASK != end) - GNUNET_SCHEDULER_cancel (end); - end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); - return; - } - - if (NULL != th) - { - GNUNET_TRANSPORT_notify_transmit_ready_cancel (th); - th = NULL; - } - if (benchmark_send) + if (0 != memcmp (&pid, peer, sizeof(struct GNUNET_PeerIdentity))) + return; + if (benchmark_send) { FPRINTF (stdout, _("Disconnected from peer `%s' while benchmarking\n"), GNUNET_i2s (&pid)); @@ -1184,57 +358,6 @@ notify_disconnect (void *cls, } } - -/** - * Function called to notify transport users that another - * peer connected to us. - * - * @param cls closure - * @param peer the peer that connected - */ -static void -monitor_notify_connect (void *cls, - const struct GNUNET_PeerIdentity *peer) -{ - monitor_connect_counter++; - struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get (); - const char *now_str = GNUNET_STRINGS_absolute_time_to_string (now); - - FPRINTF (stdout, - _("%24s: %-17s %4s (%u connections in total)\n"), - now_str, - _("Connected to"), - GNUNET_i2s (peer), - monitor_connect_counter); -} - - -/** - * Function called to notify transport users that another - * peer disconnected from us. - * - * @param cls closure - * @param peer the peer that disconnected - */ -static void -monitor_notify_disconnect (void *cls, - const struct GNUNET_PeerIdentity *peer) -{ - struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get (); - const char *now_str = GNUNET_STRINGS_absolute_time_to_string (now); - - GNUNET_assert(monitor_connect_counter > 0); - monitor_connect_counter--; - - FPRINTF (stdout, - _("%24s: %-17s %4s (%u connections in total)\n"), - now_str, - _("Disconnected from"), - GNUNET_i2s (peer), - monitor_connect_counter); -} - - /** * Function called by the transport for each received message. * @@ -1265,304 +388,6 @@ notify_receive (void *cls, } -static void -resolve_peer_address (const struct GNUNET_PeerIdentity *id, - const struct GNUNET_HELLO_Address *address, - int numeric, - enum GNUNET_TRANSPORT_PeerState state, - struct GNUNET_TIME_Absolute state_timeout); - - -static void -print_info (const struct GNUNET_PeerIdentity *id, - const char *transport, - const char *addr, - enum GNUNET_TRANSPORT_PeerState state, - struct GNUNET_TIME_Absolute state_timeout) -{ - - if ( ((GNUNET_YES == iterate_connections) && (GNUNET_YES == iterate_all)) || - (GNUNET_YES == monitor_connections)) - { - FPRINTF (stdout, - _("Peer `%s': %s %s in state `%s' until %s\n"), - GNUNET_i2s (id), - (NULL == transport) ? "" : transport, - (NULL == transport) ? "" : addr, - GNUNET_TRANSPORT_ps2s (state), - GNUNET_STRINGS_absolute_time_to_string (state_timeout)); - } - else if ( (GNUNET_YES == iterate_connections) && - (GNUNET_TRANSPORT_is_connected(state))) - { - /* Only connected peers, skip state */ - FPRINTF (stdout, - _("Peer `%s': %s %s\n"), - GNUNET_i2s (id), - transport, - addr); - } -} - - -/** - * Function called with a textual representation of an address. This - * function will be called several times with different possible - * textual representations, and a last time with @a address being NULL - * to signal the end of the iteration. Note that @a address NULL - * always is the last call, regardless of the value in @a res. - * - * @param cls closure - * @param address NULL on end of iteration, - * otherwise 0-terminated printable UTF-8 string, - * in particular an empty string if @a res is #GNUNET_NO - * @param res result of the address to string conversion: - * if #GNUNET_OK: conversion successful - * if #GNUNET_NO: address was invalid (or not supported) - * if #GNUNET_SYSERR: communication error (IPC error) - */ -static void -process_peer_string (void *cls, - const char *address, - int res) -{ - struct PeerResolutionContext *rc = cls; - - if (NULL != address) - { - if (GNUNET_SYSERR == res) - { - FPRINTF (stderr, - "Failed to convert address for peer `%s' plugin `%s' length %lu to string \n", - GNUNET_i2s (&rc->id), - rc->addrcp->transport_name, - rc->addrcp->address_length); - print_info (&rc->id, - rc->transport, - NULL, - rc->state, - rc->state_timeout); - rc->printed = GNUNET_YES; - return; - } - if (GNUNET_OK == res) - { - print_info (&rc->id, - rc->transport, - address, - rc->state, - rc->state_timeout); - rc->printed = GNUNET_YES; - return; /* Wait for done call */ - } - /* GNUNET_NO == res: ignore, was simply not supported */ - return; - } - /* NULL == address, last call, we are done */ - - GNUNET_assert (address_resolutions > 0); - address_resolutions--; - if (GNUNET_NO == rc->printed) - { - if (numeric == GNUNET_NO) - { - /* Failed to resolve address, try numeric lookup - (note: this should not be needed, as transport - should fallback to numeric conversion if DNS takes - too long) */ - resolve_peer_address (&rc->id, - rc->addrcp, - GNUNET_YES, - rc->state, - rc->state_timeout); - } - else - { - print_info (&rc->id, - rc->transport, - NULL, - rc->state, - rc->state_timeout); - } - } - GNUNET_free (rc->transport); - GNUNET_free (rc->addrcp); - GNUNET_CONTAINER_DLL_remove (rc_head, rc_tail, rc); - GNUNET_free (rc); - if ((0 == address_resolutions) && (iterate_connections)) - { - if (GNUNET_SCHEDULER_NO_TASK != end) - { - GNUNET_SCHEDULER_cancel (end); - end = GNUNET_SCHEDULER_NO_TASK; - } - if (GNUNET_SCHEDULER_NO_TASK != op_timeout) - { - GNUNET_SCHEDULER_cancel (op_timeout); - op_timeout = GNUNET_SCHEDULER_NO_TASK; - } - ret = 0; - end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); - } -} - - -static void -resolve_peer_address (const struct GNUNET_PeerIdentity *id, - const struct GNUNET_HELLO_Address *address, - int numeric, - enum GNUNET_TRANSPORT_PeerState state, - struct GNUNET_TIME_Absolute state_timeout) -{ - struct PeerResolutionContext *rc; - - rc = GNUNET_new (struct PeerResolutionContext); - GNUNET_assert(NULL != rc); - GNUNET_CONTAINER_DLL_insert(rc_head, rc_tail, rc); - address_resolutions++; - - rc->id = (*id); - rc->transport = GNUNET_strdup(address->transport_name); - rc->addrcp = GNUNET_HELLO_address_copy (address); - rc->printed = GNUNET_NO; - rc->state = state; - rc->state_timeout = state_timeout; - /* Resolve address to string */ - rc->asc = GNUNET_TRANSPORT_address_to_string (cfg, - address, - numeric, - RESOLUTION_TIMEOUT, - &process_peer_string, rc); -} - - -/** - * Function called with information about a peers during a one shot iteration - * - * @param cls closure - * @param peer identity of the peer, NULL for final callback when operation done - * @param address binary address used to communicate with this peer, - * NULL on disconnect or when done - * @param state current state this peer is in - * @param state_timeout time out for the current state - */ -static void -process_peer_iteration_cb (void *cls, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_HELLO_Address *address, - enum GNUNET_TRANSPORT_PeerState state, - struct GNUNET_TIME_Absolute state_timeout) -{ - if (NULL == peer) - { - /* done */ - address_resolution_in_progress = GNUNET_NO; - pic = NULL; - if (GNUNET_SCHEDULER_NO_TASK != end) - GNUNET_SCHEDULER_cancel (end); - end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); - return; - } - - if ( (GNUNET_NO == iterate_all) && - (GNUNET_NO == GNUNET_TRANSPORT_is_connected(state))) - return; /* Display only connected peers */ - - if (GNUNET_SCHEDULER_NO_TASK != op_timeout) - GNUNET_SCHEDULER_cancel (op_timeout); - op_timeout = GNUNET_SCHEDULER_add_delayed (OP_TIMEOUT, - &operation_timeout, - NULL); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received address for peer `%s': %s\n", - GNUNET_i2s (peer), - address->transport_name); - - if (NULL != address) - resolve_peer_address (peer, address, numeric, state, state_timeout); - else - print_info (peer, NULL, NULL, state, state_timeout); -} - - -/** - * Function called with information about a peers - * - * @param cls closure - * @param peer identity of the peer, NULL for final callback when operation done - * @param address binary address used to communicate with this peer, - * NULL on disconnect or when done - * @param state current state this peer is in - * @param state_timeout time out for the current state - * - */ -static void -process_peer_monitoring_cb (void *cls, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_HELLO_Address *address, - enum GNUNET_TRANSPORT_PeerState state, - struct GNUNET_TIME_Absolute state_timeout) -{ - struct MonitoredPeer *m; - - if (NULL == peer) - { - FPRINTF (stdout, - "%s", - _("Monitor disconnected from transport service. Reconnecting.\n")); - return; - } - - if (GNUNET_SCHEDULER_NO_TASK != op_timeout) - GNUNET_SCHEDULER_cancel (op_timeout); - op_timeout = GNUNET_SCHEDULER_add_delayed (OP_TIMEOUT, - &operation_timeout, - NULL); - - if (NULL == (m = GNUNET_CONTAINER_multipeermap_get (monitored_peers, peer))) - { - m = GNUNET_new (struct MonitoredPeer); - GNUNET_CONTAINER_multipeermap_put (monitored_peers, peer, - m, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); - } - else - { - if ( (m->state == state) && - (m->state_timeout.abs_value_us == state_timeout.abs_value_us) && - ((NULL == address) && (NULL == m->address))) - { - return; /* No real change */ - } - if ( (m->state == state) && ((NULL != address) && (NULL != m->address)) && - (0 == GNUNET_HELLO_address_cmp(m->address, address))) - return; /* No real change */ - } - - if (NULL != m->address) - { - GNUNET_free (m->address); - m->address = NULL; - } - if (NULL != address) - m->address = GNUNET_HELLO_address_copy (address); - m->state = state; - m->state_timeout = state_timeout; - - if (NULL != address) - resolve_peer_address (peer, - m->address, - numeric, - m->state, - m->state_timeout); - else - print_info (peer, - NULL, - NULL, - m->state, - m->state_timeout); -} - static void try_connect_cb (void *cls, @@ -1575,10 +400,16 @@ try_connect_cb (void *cls, tc_handle = NULL; return; } + retries++; if (retries < 10) + { + if (verbosity > 0) + FPRINTF (stdout, _("Retrying to connect to `%s'\n"), GNUNET_i2s (&pid)); + tc_handle = GNUNET_TRANSPORT_try_connect (handle, &pid, try_connect_cb, NULL); + } else { FPRINTF (stderr, @@ -1592,34 +423,27 @@ try_connect_cb (void *cls, } } - -static void -try_disconnect_cb (void *cls, - const int result) +static int +blacklist_cb (void *cls, const struct GNUNET_PeerIdentity *peer) { - static int retries = 0; - if (GNUNET_OK == result) - { - tc_handle = NULL; - return; - } - retries++; - if (retries < 10) - tc_handle = GNUNET_TRANSPORT_try_disconnect (handle, &pid, try_disconnect_cb, - NULL); - else + if (0 != memcmp (&pid, peer, sizeof(struct GNUNET_PeerIdentity))) { - FPRINTF (stderr, "%s", - _("Failed to send connect request to transport service\n")); - if (GNUNET_SCHEDULER_NO_TASK != end) - GNUNET_SCHEDULER_cancel (end); - ret = 1; - end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); - return; + if (verbosity > 0) + FPRINTF (stdout, + _("Denying connection to `%s'\n"), + GNUNET_i2s (&peer)); + return GNUNET_SYSERR; } + + if (verbosity > 0) + FPRINTF (stdout, + _("Permitting connection to `%s'\n"), + GNUNET_i2s (&pid)); + return GNUNET_OK; } + /** * Function called with the result of the check if the 'transport' * service is running. @@ -1630,202 +454,59 @@ try_disconnect_cb (void *cls, static void testservice_task (void *cls, int result) { - int counter = 0; ret = 1; - +#if 0 if (GNUNET_YES != result) { FPRINTF (stderr, _("Service `%s' is not running\n"), "transport"); return; } +#endif - if ((NULL != cpid) - && (GNUNET_OK - != GNUNET_CRYPTO_eddsa_public_key_from_string (cpid, strlen (cpid), + if (NULL == cpid) + { + FPRINTF (stderr, _("No peer identity given\n")); + return; + } + if ((GNUNET_OK != GNUNET_CRYPTO_eddsa_public_key_from_string (cpid, strlen (cpid), &pid.public_key))) { FPRINTF (stderr, _("Failed to parse peer identity `%s'\n"), cpid); return; } - counter = benchmark_send + benchmark_receive + iterate_connections - + monitor_connections + monitor_connects + try_connect + try_disconnect + - + iterate_validation + monitor_validation; - if (1 < counter) + if (1 == benchmark_send) { FPRINTF (stderr, - _("Multiple operations given. Please choose only one operation: %s, %s, %s, %s, %s, %s\n"), - "connect", "benchmark send", "benchmark receive", "information", - "monitor", "events"); - return; + _("Trying to send %u messages with size %u to peer `%s'\n"), + benchmark_count, benchmark_size, GNUNET_i2s (&pid)); } - if (0 == counter) + else if (1 == benchmark_receive) { FPRINTF (stderr, - _("No operation given. Please choose one operation: %s, %s, %s, %s, %s, %s\n"), - "connect", "benchmark send", "benchmark receive", "information", - "monitor", "events"); - return; + _("Trying to receive messages from peer `%s'\n"), + GNUNET_i2s (&pid)); } - - if (try_connect) /* -C: Connect to peer */ + else { - if (NULL == cpid) - { - FPRINTF (stderr, _("Option `%s' makes no sense without option `%s'.\n"), - "-C", "-p"); - ret = 1; - return; - } - handle = GNUNET_TRANSPORT_connect (cfg, NULL, NULL, ¬ify_receive, - ¬ify_connect, ¬ify_disconnect); - if (NULL == handle) - { - FPRINTF (stderr, "%s", _("Failed to connect to transport service\n")); - ret = 1; - return; - } - tc_handle = GNUNET_TRANSPORT_try_connect (handle, &pid, try_connect_cb, - NULL); - if (NULL == tc_handle) - { - FPRINTF (stderr, "%s", - _("Failed to send request to transport service\n")); - ret = 1; - return; - } - op_timeout = GNUNET_SCHEDULER_add_delayed (OP_TIMEOUT, &operation_timeout, - NULL); - + FPRINTF (stderr, _("No operation given\n")); + return; } - else if (try_disconnect) /* -D: Disconnect from peer */ - { - if (NULL == cpid) - { - FPRINTF (stderr, _("Option `%s' makes no sense without option `%s'.\n"), - "-D", "-p"); - ret = 1; - return; - } - handle = GNUNET_TRANSPORT_connect (cfg, NULL, NULL, ¬ify_receive, - ¬ify_connect, ¬ify_disconnect); - if (NULL == handle) - { - FPRINTF (stderr, "%s", _("Failed to connect to transport service\n")); - ret = 1; - return; - } - tc_handle = GNUNET_TRANSPORT_try_disconnect (handle, &pid, try_disconnect_cb, - NULL); - if (NULL == tc_handle) - { - FPRINTF (stderr, "%s", - _("Failed to send request to transport service\n")); - ret = 1; - return; - } - op_timeout = GNUNET_SCHEDULER_add_delayed (OP_TIMEOUT, &operation_timeout, - NULL); - } - else if (benchmark_send) /* -s: Benchmark sending */ - { - if (NULL == cpid) - { - FPRINTF (stderr, _("Option `%s' makes no sense without option `%s'.\n"), - "-s", "-p"); - ret = 1; - return; - } - handle = GNUNET_TRANSPORT_connect (cfg, NULL, NULL, ¬ify_receive, - ¬ify_connect, ¬ify_disconnect); - if (NULL == handle) - { - FPRINTF (stderr, "%s", _("Failed to connect to transport service\n")); - ret = 1; - return; - } - tc_handle = GNUNET_TRANSPORT_try_connect (handle, &pid, try_connect_cb, - NULL); - if (NULL == tc_handle) - { - FPRINTF (stderr, "%s", - _("Failed to send request to transport service\n")); - ret = 1; - return; - } - start_time = GNUNET_TIME_absolute_get (); - op_timeout = GNUNET_SCHEDULER_add_delayed (OP_TIMEOUT, &operation_timeout, - NULL); - } - else if (benchmark_receive) /* -b: Benchmark receiving */ - { - handle = GNUNET_TRANSPORT_connect (cfg, NULL, NULL, ¬ify_receive, NULL, - NULL); - if (NULL == handle) - { - FPRINTF (stderr, "%s", _("Failed to connect to transport service\n")); - ret = 1; - return; - } - if (verbosity > 0) - FPRINTF (stdout, "%s", _("Starting to receive benchmark data\n")); - start_time = GNUNET_TIME_absolute_get (); + handle = GNUNET_TRANSPORT_connect (cfg, NULL, NULL, ¬ify_receive, + ¬ify_connect, ¬ify_disconnect); - } - else if (iterate_connections) /* -i: List information about peers once */ - { - address_resolution_in_progress = GNUNET_YES; - pic = GNUNET_TRANSPORT_monitor_peers (cfg, (NULL == cpid) ? NULL : &pid, - GNUNET_YES, TIMEOUT, &process_peer_iteration_cb, (void *) cfg); - op_timeout = GNUNET_SCHEDULER_add_delayed (OP_TIMEOUT, &operation_timeout, - NULL); - } - else if (monitor_connections) /* -m: List information about peers continuously */ - { - monitored_peers = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO); - address_resolution_in_progress = GNUNET_YES; - pic = GNUNET_TRANSPORT_monitor_peers (cfg, (NULL == cpid) ? NULL : &pid, - GNUNET_NO, TIMEOUT, - &process_peer_monitoring_cb, (void *) cfg); - } - else if (iterate_validation) /* -d: Print information about validations */ - { - vic = GNUNET_TRANSPORT_monitor_validation_entries (cfg, - (NULL == cpid) ? NULL : &pid, - GNUNET_YES, TIMEOUT, - &process_validation_cb, (void *) cfg); - } - else if (monitor_validation) /* -f: Print information about validations continuously */ - { - vic = GNUNET_TRANSPORT_monitor_validation_entries (cfg, - (NULL == cpid) ? NULL : &pid, - GNUNET_NO, TIMEOUT, - &process_validation_cb, (void *) cfg); - } - else if (monitor_connects) /* -e : Monitor (dis)connect events continuously */ - { - monitor_connect_counter = 0; - handle = GNUNET_TRANSPORT_connect (cfg, NULL, NULL, NULL, - &monitor_notify_connect, - &monitor_notify_disconnect); - if (NULL == handle) - { - FPRINTF (stderr, - "%s", - _("Failed to connect to transport service\n")); - ret = 1; - return; - } - ret = 0; - } - else + if (NULL == handle) { - GNUNET_break(0); + FPRINTF (stderr, "%s", _("Failed to connect to transport service\n")); + ret = 1; return; } + bl_handle = GNUNET_TRANSPORT_blacklist (cfg, blacklist_cb, NULL); + tc_handle = GNUNET_TRANSPORT_try_connect(handle, &pid, try_connect_cb, NULL); + end = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, NULL); @@ -1847,11 +528,6 @@ run (void *cls, const struct GNUNET_CONFIGURATION_Handle *mycfg) { cfg = (struct GNUNET_CONFIGURATION_Handle *) mycfg; - if (test_configuration) - { - do_test_configuration (cfg); - return; - } GNUNET_CLIENT_service_test ("transport", cfg, GNUNET_TIME_UNIT_SECONDS, &testservice_task, (void *) cfg); } @@ -1860,46 +536,26 @@ int main (int argc, char * const *argv) { int res; + benchmark_count = DEFAULT_MESSAGE_COUNT; + benchmark_size = DEFAULT_MESSAGE_SIZE; + static const struct GNUNET_GETOPT_CommandLineOption options[] = { - { 'a', "all", NULL, - gettext_noop ("print information for all peers (instead of only connected peers)"), - 0, &GNUNET_GETOPT_set_one, &iterate_all }, - { 'b', "benchmark", NULL, - gettext_noop ("measure how fast we are receiving data from all peers (until CTRL-C)"), - 0, &GNUNET_GETOPT_set_one, &benchmark_receive }, - { 'C', "connect", - NULL, gettext_noop ("connect to a peer"), 0, - &GNUNET_GETOPT_set_one, &try_connect }, - { 'D', "disconnect", - NULL, gettext_noop ("disconnect to a peer"), 0, - &GNUNET_GETOPT_set_one, &try_disconnect }, - { 'd', "validation", NULL, - gettext_noop ("print information for all pending validations "), - 0, &GNUNET_GETOPT_set_one, &iterate_validation }, - { 'f', "monitorvalidation", NULL, - gettext_noop ("print information for all pending validations continously"), - 0, &GNUNET_GETOPT_set_one, &monitor_validation }, - { 'i', "information", NULL, - gettext_noop ("provide information about all current connections (once)"), - 0, &GNUNET_GETOPT_set_one, &iterate_connections }, - { 'm', "monitor", NULL, - gettext_noop ("provide information about all current connections (continuously)"), - 0, &GNUNET_GETOPT_set_one, &monitor_connections }, - { 'e', "events", NULL, - gettext_noop ("provide information about all connects and disconnect events (continuously)"), - 0, &GNUNET_GETOPT_set_one, &monitor_connects }, - { 'n', "numeric", - NULL, gettext_noop ("do not resolve hostnames"), 0, - &GNUNET_GETOPT_set_one, &numeric }, + + { 's', "send", NULL, + gettext_noop ("send data to peer"), + 0, &GNUNET_GETOPT_set_one, &benchmark_send}, + { 'r', "receive", NULL, gettext_noop + ("receive data from peer"), 0, + &GNUNET_GETOPT_set_one, &benchmark_receive}, + { 'n', "number", NULL, gettext_noop + ("number of messages to send"), 1, + &GNUNET_GETOPT_set_uint, &benchmark_count}, + { 'm', "messagesize", NULL, gettext_noop + ("message size to use"), 1, + &GNUNET_GETOPT_set_uint, &benchmark_size}, { 'p', "peer", "PEER", gettext_noop ("peer identity"), 1, &GNUNET_GETOPT_set_string, &cpid }, - { 's', "send", NULL, gettext_noop - ("send data for benchmarking to the other peer (until CTRL-C)"), 0, - &GNUNET_GETOPT_set_one, &benchmark_send }, - { 't', "test", NULL, - gettext_noop ("test transport configuration (involves external server)"), - 0, &GNUNET_GETOPT_set_one, &test_configuration }, GNUNET_GETOPT_OPTION_VERBOSE (&verbosity), GNUNET_GETOPT_OPTION_END }; diff --git a/src/transport/perf_tcp_peer1.conf b/src/transport/perf_tcp_peer1.conf new file mode 100644 index 000000000..26ac32e55 --- /dev/null +++ b/src/transport/perf_tcp_peer1.conf @@ -0,0 +1,33 @@ +@INLINE@ template_cfg_peer1.conf +[PATHS] +GNUNET_TEST_HOME = /tmp/test-transport/api-tcp-p1/ + +[transport-tcp] +PORT = 12000 +TIMEOUT = 5 s + +[arm] +PORT = 12005 +DEFAULTSERVICES = transport hostlist +UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock + +[statistics] +PORT = 12004 +UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock + +[resolver] +PORT = 12003 +UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock + +[peerinfo] +PORT = 12002 +UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock + +[transport] +PORT = 12001 +UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock +PLUGINS = tcp + +[hostlist] +OPTIONS = -b +SERVERS = http://localhost:9080/ diff --git a/src/transport/perf_tcp_peer2.conf b/src/transport/perf_tcp_peer2.conf new file mode 100644 index 000000000..dacfe9cc9 --- /dev/null +++ b/src/transport/perf_tcp_peer2.conf @@ -0,0 +1,35 @@ +@INLINE@ template_cfg_peer2.conf +[PATHS] +GNUNET_TEST_HOME = /tmp/test-transport/api-tcp-p2/ + +[transport-tcp] +PORT = 12015 +TIMEOUT = 5 s + +[arm] +PORT = 12014 +DEFAULTSERVICES = transport hostlist +UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock + +[statistics] +PORT = 12013 +UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock + +[resolver] +PORT = 12012 +UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock + +[peerinfo] +PORT = 12011 +UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock + +[transport] +PORT = 12010 +PLUGINS = tcp +UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock + +[hostlist] +HTTPPORT = 9080 +OPTIONS = -p +BINDTOIPV4 = YES +BINDTOIP = 127.0.0.1 -- cgit v1.2.3