X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fdv%2Ftest_transport_api_dv.c;h=39dd08877db643700a50cc0bc104b3ef68985ad2;hb=19377520016cc644070d207af34ae3e76618fdc8;hp=48db86cdc100ce3ae7406fd8704c5e97aa32884b;hpb=38b29592cf2e8b816cab68579e07e2477153f739;p=oweals%2Fgnunet.git diff --git a/src/dv/test_transport_api_dv.c b/src/dv/test_transport_api_dv.c index 48db86cdc..39dd08877 100644 --- a/src/dv/test_transport_api_dv.c +++ b/src/dv/test_transport_api_dv.c @@ -25,7 +25,7 @@ #include "gnunet_testing_lib.h" #include "gnunet_core_service.h" -#define VERBOSE GNUNET_YES +#define VERBOSE GNUNET_NO #define TEST_ALL GNUNET_NO @@ -75,8 +75,6 @@ static unsigned long long peers_left; static struct GNUNET_TESTING_PeerGroup *pg; -static struct GNUNET_SCHEDULER_Handle *sched; - const struct GNUNET_CONFIGURATION_Handle *main_cfg; GNUNET_SCHEDULER_TaskIdentifier die_task; @@ -198,7 +196,6 @@ finish_testing () struct PeerContext *free_peer_pos; struct TestMessageContext *pos; struct TestMessageContext *free_pos; - int count; #if VERBOSE GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -215,7 +212,6 @@ finish_testing () } all_peers = NULL; - count = 0; pos = test_messages; while (pos != NULL) { @@ -233,7 +229,7 @@ finish_testing () pos = pos->next; if (free_pos->disconnect_task != GNUNET_SCHEDULER_NO_TASK) { - GNUNET_SCHEDULER_cancel(sched, free_pos->disconnect_task); + GNUNET_SCHEDULER_cancel(free_pos->disconnect_task); } GNUNET_free(free_pos); } @@ -255,7 +251,7 @@ finish_testing () pos = pos->next; if (free_pos->disconnect_task != GNUNET_SCHEDULER_NO_TASK) { - GNUNET_SCHEDULER_cancel(sched, free_pos->disconnect_task); + GNUNET_SCHEDULER_cancel(free_pos->disconnect_task); } GNUNET_free(free_pos); } @@ -366,7 +362,7 @@ end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc) pos = pos->next; if (free_pos->disconnect_task != GNUNET_SCHEDULER_NO_TASK) { - GNUNET_SCHEDULER_cancel(sched, free_pos->disconnect_task); + GNUNET_SCHEDULER_cancel(free_pos->disconnect_task); } GNUNET_free(free_pos); } @@ -389,18 +385,44 @@ end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc) static void send_other_messages (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc); +/** + * Get distance information from 'atsi'. + * + * @param atsi performance data + * @return connected transport distance + */ +static uint32_t +get_atsi_distance (const struct GNUNET_TRANSPORT_ATS_Information *atsi) +{ + while ( (ntohl (atsi->type) != GNUNET_TRANSPORT_ATS_ARRAY_TERMINATOR) && + (ntohl (atsi->type) != GNUNET_TRANSPORT_ATS_QUALITY_NET_DISTANCE) ) + atsi++; + if (ntohl (atsi->type) == GNUNET_TRANSPORT_ATS_ARRAY_TERMINATOR) + { + GNUNET_break (0); + /* FIXME: we do not have distance data? Assume direct neighbor. */ + return 1; + } + return ntohl (atsi->value); +} + static int process_mtype (void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_MessageHeader *message, - struct GNUNET_TIME_Relative latency, - uint32_t distance) + const struct GNUNET_TRANSPORT_ATS_Information *atsi) { struct TestMessageContext *pos = cls; struct GNUNET_TestMessage *msg = (struct GNUNET_TestMessage *)message; +#if VERBOSE + uint32_t distance; +#endif if (pos->uid != ntohl(msg->uid)) return GNUNET_OK; +#if VERBOSE + distance = get_atsi_distance(atsi); +#endif GNUNET_assert(0 == memcmp(peer, &pos->peer1->id, sizeof(struct GNUNET_PeerIdentity))); if (total_other_expected_messages == 0) { @@ -425,28 +447,27 @@ process_mtype (void *cls, if ((total_messages_received == expected_messages) && (total_other_messages == 0)) { - GNUNET_SCHEDULER_cancel (sched, die_task); - die_task = GNUNET_SCHEDULER_add_delayed (sched, - TEST_TIMEOUT, + GNUNET_SCHEDULER_cancel (die_task); + die_task = GNUNET_SCHEDULER_add_delayed (TEST_TIMEOUT, &end_badly, "waiting for DV peers to connect!"); /* if ((num_peers == 3) && (total_other_expected_messages == 2)) { - GNUNET_SCHEDULER_add_now (sched, &send_other_messages, NULL); + GNUNET_SCHEDULER_add_now (&send_other_messages, NULL); } else { - GNUNET_SCHEDULER_add_delayed (sched, GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 20), &send_other_messages, NULL); + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 20), &send_other_messages, NULL); }*/ } else if ((total_other_expected_messages > 0) && (total_other_messages == total_other_expected_messages)) { - GNUNET_SCHEDULER_cancel (sched, die_task); - GNUNET_SCHEDULER_add_now (sched, &finish_testing, NULL); + GNUNET_SCHEDULER_cancel (die_task); + GNUNET_SCHEDULER_add_now (&finish_testing, NULL); } else { - pos->disconnect_task = GNUNET_SCHEDULER_add_now(sched, &disconnect_cores, pos); + pos->disconnect_task = GNUNET_SCHEDULER_add_now(&disconnect_cores, pos); } return GNUNET_OK; @@ -481,68 +502,112 @@ static struct GNUNET_CORE_MessageHandler handlers[] = { {NULL, 0, 0} }; -static void -init_notify_peer2 (void *cls, - struct GNUNET_CORE_Handle *server, - const struct GNUNET_PeerIdentity *my_identity, - const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *publicKey) +/** + * Notify of all peer1's peers, once peer 2 is found, schedule connect + * to peer two for message send. + * + * @param cls closure + * @param peer peer identity this notification is about + * @param atsi performance data for the connection + */ +static void connect_notify_peer2 (void *cls, + const struct + GNUNET_PeerIdentity *peer, + const struct GNUNET_TRANSPORT_ATS_Information *atsi) { struct TestMessageContext *pos = cls; + if (0 == memcmp(&pos->peer1->id, peer, sizeof(struct GNUNET_PeerIdentity))) + { +#if VERBOSE + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Core connection from `%s' to `%4s' verfied, sending message!\n", + GNUNET_i2s(&pos->peer2->id), GNUNET_h2s (&peer->hashPubKey)); +#endif + if (NULL == GNUNET_CORE_notify_transmit_ready (pos->peer1handle, + GNUNET_YES, + 0, + TIMEOUT, + &pos->peer2->id, + sizeof (struct GNUNET_TestMessage), + &transmit_ready, pos)) + { + /* This probably shouldn't happen, but it does (timing issue?) */ + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "RECEIVED NULL when asking core (1) for transmission to peer `%4s'\n", + GNUNET_i2s (&pos->peer2->id)); + transmit_ready_failed++; + total_other_expected_messages--; + } + else + { + transmit_ready_scheduled++; + } + } +} + +static void +init_notify_peer2 (void *cls, + struct GNUNET_CORE_Handle *server, + const struct GNUNET_PeerIdentity *my_identity, + const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *publicKey) +{ #if VERBOSE GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Core connection to `%4s' established, scheduling message send\n", + "Core connection to `%4s' established, awaiting connections.\n", GNUNET_i2s (my_identity)); #endif total_server_connections++; +} + +/** + * Notify of all peer1's peers, once peer 2 is found, schedule connect + * to peer two for message send. + * + * @param cls closure + * @param peer peer identity this notification is about + * @param atsi performance data for the connection + */ +static void connect_notify_peer1 (void *cls, + const struct + GNUNET_PeerIdentity *peer, + const struct GNUNET_TRANSPORT_ATS_Information *atsi) +{ + struct TestMessageContext *pos = cls; - if (NULL == GNUNET_CORE_notify_transmit_ready (pos->peer1handle, - 0, - TIMEOUT, - &pos->peer2->id, - sizeof (struct GNUNET_TestMessage), - &transmit_ready, pos)) + if (0 == memcmp(&pos->peer2->id, peer, sizeof(struct GNUNET_PeerIdentity))) { +#if VERBOSE GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "RECEIVED NULL when asking core (1) for transmission to peer `%4s'\n", - GNUNET_i2s (&pos->peer2->id)); - transmit_ready_failed++; - } - else - { - transmit_ready_scheduled++; + "Core connection from `%s' to `%4s' verified.\n", + GNUNET_i2s(&pos->peer1->id), GNUNET_h2s (&peer->hashPubKey)); +#endif + /* + * Connect to the receiving peer + */ + pos->peer2handle = GNUNET_CORE_connect (pos->peer2->cfg, + 1, + pos, + &init_notify_peer2, + &connect_notify_peer2, + NULL, + NULL, NULL, + GNUNET_YES, NULL, GNUNET_YES, handlers); } } - static void init_notify_peer1 (void *cls, - struct GNUNET_CORE_Handle *server, - const struct GNUNET_PeerIdentity *my_identity, - const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *publicKey) + struct GNUNET_CORE_Handle *server, + const struct GNUNET_PeerIdentity *my_identity, + const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *publicKey) { - struct TestMessageContext *pos = cls; total_server_connections++; - #if VERBOSE GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Core connection to `%4s' established, setting up handles\n", + "Core connection to `%4s' established, awaiting connections...\n", GNUNET_i2s (my_identity)); #endif - - /* - * Connect to the receiving peer - */ - pos->peer2handle = GNUNET_CORE_connect (sched, - pos->peer2->cfg, - TIMEOUT, - pos, - &init_notify_peer2, - NULL, - NULL, - NULL, - GNUNET_YES, NULL, GNUNET_YES, handlers); - } @@ -551,19 +616,18 @@ send_test_messages (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc) { struct TestMessageContext *pos = cls; - if ((tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN) || (cls == NULL)) + if (( (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0) || (cls == NULL)) return; if (die_task == GNUNET_SCHEDULER_NO_TASK) { - die_task = GNUNET_SCHEDULER_add_delayed (sched, - TEST_TIMEOUT, + die_task = GNUNET_SCHEDULER_add_delayed (TEST_TIMEOUT, &end_badly, "from create topology (timeout)"); } if (total_server_connections >= MAX_OUTSTANDING_CONNECTIONS) { - GNUNET_SCHEDULER_add_delayed (sched, GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1), + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1), &send_test_messages, pos); return; /* Otherwise we'll double schedule messages here! */ } @@ -573,11 +637,11 @@ send_test_messages (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc) /* * Connect to the sending peer */ - pos->peer1handle = GNUNET_CORE_connect (sched, - pos->peer1->cfg, - TIMEOUT, + pos->peer1handle = GNUNET_CORE_connect (pos->peer1->cfg, + 1, pos, &init_notify_peer1, + &connect_notify_peer1, NULL, NULL, NULL, @@ -587,12 +651,11 @@ send_test_messages (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc) if (total_server_connections < MAX_OUTSTANDING_CONNECTIONS) { - GNUNET_SCHEDULER_add_now (sched, - &send_test_messages, pos->next); + GNUNET_SCHEDULER_add_now (&send_test_messages, pos->next); } else { - GNUNET_SCHEDULER_add_delayed (sched, GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1), + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1), &send_test_messages, pos->next); } } @@ -654,7 +717,7 @@ send_other_messages (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc) pos = pos->next; if (free_pos->disconnect_task != GNUNET_SCHEDULER_NO_TASK) { - GNUNET_SCHEDULER_cancel(sched, free_pos->disconnect_task); + GNUNET_SCHEDULER_cancel(free_pos->disconnect_task); } GNUNET_free(free_pos); } @@ -663,15 +726,15 @@ send_other_messages (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc) total_other_expected_messages = temp_total_other_messages; if (total_other_expected_messages == 0) { - GNUNET_SCHEDULER_add_now (sched, &end_badly, "send_other_messages had 0 messages to send, no DV connections made!"); + GNUNET_SCHEDULER_add_now (&end_badly, "send_other_messages had 0 messages to send, no DV connections made!"); } #if VERBOSE GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Preparing to send %d other test messages\n", total_other_expected_messages); #endif - GNUNET_SCHEDULER_add_now (sched, &send_test_messages, other_test_messages); - GNUNET_SCHEDULER_cancel(sched, die_task); - die_task = GNUNET_SCHEDULER_add_delayed (sched, GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 250), &end_badly, "from send_other_messages"); + GNUNET_SCHEDULER_add_now (&send_test_messages, other_test_messages); + GNUNET_SCHEDULER_cancel(die_task); + die_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 250), &end_badly, "from send_other_messages"); } void @@ -702,9 +765,7 @@ topology_callback (void *cls, temp_context->uid = total_connections; temp_context->disconnect_task = GNUNET_SCHEDULER_NO_TASK; test_messages = temp_context; - expected_messages++; - } #if VERBOSE else @@ -720,27 +781,26 @@ topology_callback (void *cls, { #if VERBOSE GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Created %d total connections, which is our target number! Calling send messages.\n", + "Created %u total connections, which is our target number! Calling send messages.\n", total_connections); #endif - GNUNET_SCHEDULER_cancel (sched, die_task); + GNUNET_SCHEDULER_cancel (die_task); die_task = GNUNET_SCHEDULER_NO_TASK; - GNUNET_SCHEDULER_add_now (sched, &send_test_messages, test_messages); + GNUNET_SCHEDULER_add_now (&send_test_messages, test_messages); } else if (total_connections + failed_connections == expected_connections) { if (failed_connections < (unsigned int)(fail_percentage * total_connections)) { - GNUNET_SCHEDULER_cancel (sched, die_task); + GNUNET_SCHEDULER_cancel (die_task); die_task = GNUNET_SCHEDULER_NO_TASK; - GNUNET_SCHEDULER_add_now (sched, &send_test_messages, test_messages); + GNUNET_SCHEDULER_add_now (&send_test_messages, test_messages); } else { - GNUNET_SCHEDULER_cancel (sched, die_task); - die_task = GNUNET_SCHEDULER_add_now (sched, - &end_badly, "from topology_callback (too many failed connections)"); + GNUNET_SCHEDULER_cancel (die_task); + die_task = GNUNET_SCHEDULER_add_now (&end_badly, "from topology_callback (too many failed connections)"); } } else @@ -759,22 +819,26 @@ connect_topology () expected_connections = -1; if ((pg != NULL) && (peers_left == 0)) { - expected_connections = GNUNET_TESTING_connect_topology (pg, connection_topology, connect_topology_option, connect_topology_option_modifier); + expected_connections = GNUNET_TESTING_connect_topology (pg, + connection_topology, + connect_topology_option, + connect_topology_option_modifier, + TIMEOUT, + 12, + NULL, NULL); #if VERBOSE GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Have %d expected connections\n", expected_connections); #endif } - GNUNET_SCHEDULER_cancel (sched, die_task); + GNUNET_SCHEDULER_cancel (die_task); if (expected_connections == GNUNET_SYSERR) { - die_task = GNUNET_SCHEDULER_add_now (sched, - &end_badly, "from connect topology (bad return)"); + die_task = GNUNET_SCHEDULER_add_now (&end_badly, "from connect topology (bad return)"); } - die_task = GNUNET_SCHEDULER_add_delayed (sched, - TEST_TIMEOUT, + die_task = GNUNET_SCHEDULER_add_delayed (TEST_TIMEOUT, &end_badly, "from connect topology (timeout)"); } @@ -792,13 +856,11 @@ create_topology () } else { - GNUNET_SCHEDULER_cancel (sched, die_task); - die_task = GNUNET_SCHEDULER_add_now (sched, - &end_badly, "from create topology (bad return)"); + GNUNET_SCHEDULER_cancel (die_task); + die_task = GNUNET_SCHEDULER_add_now (&end_badly, "from create topology (bad return)"); } - GNUNET_SCHEDULER_cancel (sched, die_task); - die_task = GNUNET_SCHEDULER_add_delayed (sched, - TEST_TIMEOUT, + GNUNET_SCHEDULER_cancel (die_task); + die_task = GNUNET_SCHEDULER_add_delayed (TEST_TIMEOUT, &end_badly, "from continue startup (timeout)"); } @@ -813,8 +875,7 @@ create_topology () static void all_connect_handler (void *cls, const struct GNUNET_PeerIdentity * peer, - struct GNUNET_TIME_Relative latency, - uint32_t distance) + const struct GNUNET_TRANSPORT_ATS_Information *atsi) { struct GNUNET_TESTING_Daemon *d = cls; struct GNUNET_TESTING_Daemon *second_daemon; @@ -822,6 +883,13 @@ static void all_connect_handler (void *cls, #if !TEST_ALL struct TestMessageContext *temp_context; #endif + uint32_t distance; + + if (0 == memcmp(&d->id, peer, sizeof(struct GNUNET_PeerIdentity))) + return; + + distance = get_atsi_distance(atsi); + #if VERBOSE GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "connected peer %s to peer %s, distance %u\n", d->shortname, @@ -834,6 +902,7 @@ static void all_connect_handler (void *cls, if (second_daemon == NULL) { GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Couldn't find second peer!\n"); + GNUNET_free(second_shortname); return; } #if !TEST_ALL @@ -850,7 +919,6 @@ static void all_connect_handler (void *cls, } #endif - if (dotOutFile != NULL) { if (distance == 1) @@ -868,7 +936,7 @@ static void all_connect_handler (void *cls, if (temp_total_other_messages == num_additional_messages) { - GNUNET_SCHEDULER_add_now (sched, &send_other_messages, NULL); + GNUNET_SCHEDULER_add_now (&send_other_messages, NULL); } } @@ -893,7 +961,13 @@ peers_started_callback (void *cls, GNUNET_assert(GNUNET_SYSERR != GNUNET_CONTAINER_multihashmap_put(peer_daemon_hash, &id->hashPubKey, d, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); new_peer = GNUNET_malloc(sizeof(struct PeerContext)); - new_peer->peer_handle = GNUNET_CORE_connect(sched, cfg, GNUNET_TIME_UNIT_FOREVER_REL, d, NULL, &all_connect_handler, NULL, NULL, GNUNET_NO, NULL, GNUNET_NO, no_handlers); + new_peer->peer_handle = GNUNET_CORE_connect(cfg, + 1, + d, NULL, + &all_connect_handler, + NULL, NULL, NULL, + GNUNET_NO, NULL, GNUNET_NO, + no_handlers); new_peer->daemon = d; new_peer->next = all_peers; all_peers = new_peer; @@ -906,11 +980,10 @@ peers_started_callback (void *cls, "All %d daemons started, now creating topology!\n", num_peers); #endif - GNUNET_SCHEDULER_cancel (sched, die_task); + GNUNET_SCHEDULER_cancel (die_task); /* Set up task in case topology creation doesn't finish * within a reasonable amount of time */ - die_task = GNUNET_SCHEDULER_add_delayed (sched, - GNUNET_TIME_relative_multiply + die_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5), &end_badly, "from peers_started_callback"); @@ -950,21 +1023,19 @@ void hostkey_callback (void *cls, "All %d hostkeys created, now creating topology!\n", num_peers); #endif - GNUNET_SCHEDULER_cancel (sched, die_task); + GNUNET_SCHEDULER_cancel (die_task); /* Set up task in case topology creation doesn't finish * within a reasonable amount of time */ - die_task = GNUNET_SCHEDULER_add_delayed (sched, - GNUNET_TIME_relative_multiply + die_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5), &end_badly, "from hostkey_callback"); - GNUNET_SCHEDULER_add_now(sched, &create_topology, NULL); + GNUNET_SCHEDULER_add_now(&create_topology, NULL); ok = 0; } } static void run (void *cls, - struct GNUNET_SCHEDULER_Handle *s, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { @@ -973,7 +1044,6 @@ run (void *cls, char * blacklist_topology_str; char * connect_topology_option_str; char * connect_topology_option_modifier_string; - sched = s; ok = 1; dotOutFile = fopen (dotOutFileName, "w"); @@ -1059,18 +1129,27 @@ run (void *cls, main_cfg = cfg; + GNUNET_assert(num_peers > 0 && num_peers < (unsigned int)-1); peers_left = num_peers; /* Set up a task to end testing if peer start fails */ - die_task = GNUNET_SCHEDULER_add_delayed (sched, - GNUNET_TIME_relative_multiply + die_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5), &end_badly, "didn't start all daemons in reasonable amount of time!!!"); peer_daemon_hash = GNUNET_CONTAINER_multihashmap_create(peers_left); - pg = GNUNET_TESTING_daemons_start (sched, cfg, - peers_left, TIMEOUT, &hostkey_callback, NULL, &peers_started_callback, NULL, - &topology_callback, NULL, NULL); + pg = GNUNET_TESTING_daemons_start (cfg, + peers_left, /* Total number of peers */ + peers_left, /* Number of outstanding connections */ + peers_left, /* Number of parallel ssh connections, or peers being started at once */ + TIMEOUT, + &hostkey_callback, + NULL, + &peers_started_callback, + NULL, + &topology_callback, + NULL, + NULL); }