diff options
Diffstat (limited to 'src/mesh/test_mesh_small.c')
-rw-r--r-- | src/mesh/test_mesh_small.c | 336 |
1 files changed, 83 insertions, 253 deletions
diff --git a/src/mesh/test_mesh_small.c b/src/mesh/test_mesh_small.c index efe939876f..81f9c566c3 100644 --- a/src/mesh/test_mesh_small.c +++ b/src/mesh/test_mesh_small.c @@ -48,11 +48,9 @@ * DIFFERENT TESTS TO RUN */ #define SETUP 0 -#define UNICAST 1 -#define MULTICAST 2 +#define FORWARD 1 #define SPEED 3 #define SPEED_ACK 4 -#define SPEED_MIN 5 #define SPEED_NOBUF 6 #define P2P_SIGNAL 10 @@ -97,12 +95,12 @@ size_t size_payload = sizeof (struct GNUNET_MessageHeader) + sizeof (uint32_t); /** * Operation to get peer ids. */ -struct GNUNET_TESTBED_Operation *t_op[3]; +struct GNUNET_TESTBED_Operation *t_op[2]; /** * Peer ids. */ -struct GNUNET_PeerIdentity *p_id[3]; +struct GNUNET_PeerIdentity *p_id[2]; /** * Peer ids counter. @@ -115,11 +113,6 @@ unsigned int p_ids; static int initialized; /** - * Peers that have been connected - */ -static int peers_in_tunnel; - -/** * Peers that have responded */ static int peers_responded; @@ -175,11 +168,6 @@ static struct GNUNET_MESH_Handle *h1; static struct GNUNET_MESH_Handle *h2; /** - * Mesh handle for the second leaf peer - */ -static struct GNUNET_MESH_Handle *h3; - -/** * Tunnel handle for the root peer */ static struct GNUNET_MESH_Tunnel *t; @@ -190,11 +178,6 @@ static struct GNUNET_MESH_Tunnel *t; static struct GNUNET_MESH_Tunnel *incoming_t; /** - * Tunnel handle for the second leaf peer - */ -static struct GNUNET_MESH_Tunnel *incoming_t2; - -/** * Time we started the data transmission (after tunnel has been established * and initilized). */ @@ -251,16 +234,14 @@ disconnect_mesh_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) long line = (long) cls; unsigned int i; - for (i = 0; i < 3; i++) - if (NULL != t_op[i]) - { - GNUNET_TESTBED_operation_done (t_op[i]); - t_op[i] = NULL; - } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "disconnecting mesh service of peers, called from line %ld\n", line); disconnect_task = GNUNET_SCHEDULER_NO_TASK; + for (i = 0; i < 2; i++) + { + GNUNET_TESTBED_operation_done (t_op[i]); + } if (NULL != t) { GNUNET_MESH_tunnel_destroy (t); @@ -271,11 +252,6 @@ disconnect_mesh_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_MESH_tunnel_destroy (incoming_t); incoming_t = NULL; } - if (NULL != incoming_t2) - { - GNUNET_MESH_tunnel_destroy (incoming_t2); - incoming_t2 = NULL; - } GNUNET_MESH_TEST_cleanup (test_ctx); if (GNUNET_SCHEDULER_NO_TASK != shutdown_handle) { @@ -290,16 +266,15 @@ disconnect_mesh_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) * * @param line Line in the code the abort is requested from (__LINE__). */ -void +static void abort_test (long line) { if (disconnect_task != GNUNET_SCHEDULER_NO_TASK) { GNUNET_SCHEDULER_cancel (disconnect_task); + disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_mesh_peers, + (void *) line); } - disconnect_task = GNUNET_SCHEDULER_add_delayed (SHORT_TIME, - &disconnect_mesh_peers, - (void *) line); } /** @@ -326,7 +301,6 @@ data_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { struct GNUNET_MESH_TransmitHandle *th; struct GNUNET_MESH_Tunnel *tunnel; - struct GNUNET_PeerIdentity *destination; if ((GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason) != 0) return; @@ -335,18 +309,14 @@ data_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) if (GNUNET_YES == test_backwards) { tunnel = incoming_t; - destination = p_id[0]; } else { tunnel = t; - destination = p_id[2]; } th = GNUNET_MESH_notify_transmit_ready (tunnel, GNUNET_NO, GNUNET_TIME_UNIT_FOREVER_REL, - destination, - size_payload, - &tmt_rdy, (void *) 1L); + size_payload, &tmt_rdy, (void *) 1L); if (NULL == th) { unsigned long i = (unsigned long) cls; @@ -423,17 +393,13 @@ tmt_rdy (void *cls, size_t size, void *buf) * @param cls closure (set from GNUNET_MESH_connect) * @param tunnel connection to the other end * @param tunnel_ctx place to store local state associated with the tunnel - * @param sender who sent the message * @param message the actual message - * @param atsi performance data for the connection * @return GNUNET_OK to keep the connection open, * GNUNET_SYSERR to close it (signal serious error) */ int data_callback (void *cls, struct GNUNET_MESH_Tunnel *tunnel, void **tunnel_ctx, - const struct GNUNET_PeerIdentity *sender, - const struct GNUNET_MessageHeader *message, - const struct GNUNET_ATS_Information *atsi) + const struct GNUNET_MessageHeader *message) { long client = (long) cls; long expected_target_client; @@ -441,15 +407,17 @@ data_callback (void *cls, struct GNUNET_MESH_Tunnel *tunnel, void **tunnel_ctx, ok++; + GNUNET_MESH_receive_done (tunnel); + if ((ok % 20) == 0) { if (GNUNET_SCHEDULER_NO_TASK != disconnect_task) { GNUNET_SCHEDULER_cancel (disconnect_task); + disconnect_task = GNUNET_SCHEDULER_add_delayed (SHORT_TIME, + &disconnect_mesh_peers, + (void *) __LINE__); } - disconnect_task = - GNUNET_SCHEDULER_add_delayed (SHORT_TIME, &disconnect_mesh_peers, - (void *) __LINE__); } switch (client) @@ -457,10 +425,7 @@ data_callback (void *cls, struct GNUNET_MESH_Tunnel *tunnel, void **tunnel_ctx, case 0L: GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Root client got a message!\n"); peers_responded++; - if (test == MULTICAST && peers_responded < 2) - return GNUNET_OK; break; - case 3L: case 4L: GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Leaf client %li got a message.\n", @@ -503,9 +468,8 @@ data_callback (void *cls, struct GNUNET_MESH_Tunnel *tunnel, void **tunnel_ctx, if (SPEED != test || (ok_goal - 2) == ok) { GNUNET_MESH_notify_transmit_ready (tunnel, GNUNET_NO, - GNUNET_TIME_UNIT_FOREVER_REL, sender, - size_payload, - &tmt_rdy, (void *) 1L); + GNUNET_TIME_UNIT_FOREVER_REL, + size_payload, &tmt_rdy, (void *) 1L); return GNUNET_OK; } else @@ -522,9 +486,8 @@ data_callback (void *cls, struct GNUNET_MESH_Tunnel *tunnel, void **tunnel_ctx, GNUNET_log (GNUNET_ERROR_TYPE_INFO, " received ack %u\n", data_ack); GNUNET_MESH_notify_transmit_ready (tunnel, GNUNET_NO, - GNUNET_TIME_UNIT_FOREVER_REL, sender, - size_payload, - &tmt_rdy, (void *) 1L); + GNUNET_TIME_UNIT_FOREVER_REL, + size_payload, &tmt_rdy, (void *) 1L); if (data_ack < TOTAL_PACKETS && SPEED != test) return GNUNET_OK; if (ok == 2 && SPEED == test) @@ -546,10 +509,10 @@ data_callback (void *cls, struct GNUNET_MESH_Tunnel *tunnel, void **tunnel_ctx, if (GNUNET_SCHEDULER_NO_TASK != disconnect_task) { GNUNET_SCHEDULER_cancel (disconnect_task); + disconnect_task = GNUNET_SCHEDULER_add_delayed (SHORT_TIME, + &disconnect_mesh_peers, + (void *) __LINE__); } - disconnect_task = - GNUNET_SCHEDULER_add_delayed (SHORT_TIME, &disconnect_mesh_peers, - (void *) __LINE__); return GNUNET_OK; } @@ -568,17 +531,17 @@ static struct GNUNET_MESH_MessageHandler handlers[] = { * Method called whenever another peer has added us to a tunnel * the other peer initiated. * - * @param cls closure - * @param tunnel new handle to the tunnel - * @param initiator peer that started the tunnel - * @param atsi performance information for the tunnel - * @return initial tunnel context for the tunnel - * (can be NULL -- that's not an error) + * @param cls Closure. + * @param tunnel New handle to the tunnel. + * @param initiator Peer that started the tunnel. + * @param port Port this tunnels is connected to. + * @return Initial tunnel context for the tunnel + * (can be NULL -- that's not an error). */ static void * incoming_tunnel (void *cls, struct GNUNET_MESH_Tunnel *tunnel, const struct GNUNET_PeerIdentity *initiator, - const struct GNUNET_ATS_Information *atsi) + uint32_t port) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Incoming tunnel from %s to peer %d\n", @@ -587,8 +550,6 @@ incoming_tunnel (void *cls, struct GNUNET_MESH_Tunnel *tunnel, GNUNET_log (GNUNET_ERROR_TYPE_INFO, " ok: %d\n", ok); if ((long) cls == 4L) incoming_t = tunnel; - else if ((long) cls == 3L) - incoming_t2 = tunnel; else { GNUNET_log (GNUNET_ERROR_TYPE_WARNING, @@ -598,10 +559,10 @@ incoming_tunnel (void *cls, struct GNUNET_MESH_Tunnel *tunnel, if (GNUNET_SCHEDULER_NO_TASK != disconnect_task) { GNUNET_SCHEDULER_cancel (disconnect_task); + disconnect_task = GNUNET_SCHEDULER_add_delayed (SHORT_TIME, + &disconnect_mesh_peers, + (void *) __LINE__); } - disconnect_task = - GNUNET_SCHEDULER_add_delayed (SHORT_TIME, &disconnect_mesh_peers, - (void *) __LINE__); return NULL; } @@ -629,129 +590,22 @@ tunnel_cleaner (void *cls, const struct GNUNET_MESH_Tunnel *tunnel, ok++; incoming_t = NULL; } - else if (3L == i) + else if (0L == i && P2P_SIGNAL == test) { - ok++; - incoming_t2 = NULL; + ok ++; } else GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Unknown peer! %d\n", i); GNUNET_log (GNUNET_ERROR_TYPE_INFO, " ok: %d\n", ok); - peers_in_tunnel--; - if (peers_in_tunnel > 0) - return; if (GNUNET_SCHEDULER_NO_TASK != disconnect_task) { GNUNET_SCHEDULER_cancel (disconnect_task); - } - disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_mesh_peers, - (void *) __LINE__); - - return; -} - - -/** - * Method called whenever a tunnel falls apart. - * - * @param cls closure - * @param peer peer identity the tunnel stopped working with - */ -static void -dh (void *cls, const struct GNUNET_PeerIdentity *peer) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "peer %s disconnected\n", - GNUNET_i2s (peer)); - if (P2P_SIGNAL == test) - { - ok ++; - if (GNUNET_SCHEDULER_NO_TASK != disconnect_task) - { - GNUNET_SCHEDULER_cancel (disconnect_task); - } disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_mesh_peers, (void *) __LINE__); } - return; -} - - -/** - * Method called whenever a peer connects to a tunnel. - * - * @param cls closure - * @param peer peer identity the tunnel was created to, NULL on timeout - * @param atsi performance data for the connection - */ -static void -ch (void *cls, const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_ATS_Information *atsi) -{ - long i = (long) cls; - - struct GNUNET_PeerIdentity *dest; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "%ld peer %s connected\n", i, GNUNET_i2s (peer)); - - if (0 == memcmp (p_id[2], peer, sizeof (struct GNUNET_PeerIdentity)) && - i == 0L) - { - ok++; - } - if (test == MULTICAST && - 0 == memcmp (p_id[1], peer, sizeof (struct GNUNET_PeerIdentity)) && - i == 0L) - { - ok++; - } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, " ok: %d\n", ok); - switch (test) - { - case UNICAST: - case P2P_SIGNAL: - case SPEED: - case SPEED_ACK: - // incoming_t is NULL unless we send a relevant data packet - dest = p_id[2]; - break; - case MULTICAST: - peers_in_tunnel++; - if (peers_in_tunnel < 2) - return; - dest = NULL; - break; - default: - GNUNET_assert (0); - return; - } - if (GNUNET_SCHEDULER_NO_TASK != disconnect_task) - { - GNUNET_SCHEDULER_cancel (disconnect_task); - disconnect_task = - GNUNET_SCHEDULER_add_delayed (SHORT_TIME, &disconnect_mesh_peers, - (void *) __LINE__); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending data initializer...\n"); - peers_responded = 0; - data_ack = 0; - data_received = 0; - data_sent = 0; - GNUNET_MESH_notify_transmit_ready (t, GNUNET_NO, - GNUNET_TIME_UNIT_FOREVER_REL, dest, - size_payload, - &tmt_rdy, (void *) 1L); - } - else - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Disconnect already run?\n"); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Aborting...\n"); - } return; } @@ -770,14 +624,6 @@ do_test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test_task\n"); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "add peer 2\n"); - GNUNET_MESH_peer_request_connect_add (t, p_id[2]); - - if (test == MULTICAST) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "add peer 3\n"); - GNUNET_MESH_peer_request_connect_add (t, p_id[1]); - } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "schedule timeout in TIMEOUT\n"); @@ -785,21 +631,37 @@ do_test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { GNUNET_SCHEDULER_cancel (disconnect_task); } - disconnect_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, + t = GNUNET_MESH_tunnel_create (h1, NULL, p_id[1], 1); + if (SPEED_NOBUF == test) + { + GNUNET_MESH_tunnel_buffer(t, GNUNET_NO); + test = SPEED; + } + + disconnect_task = GNUNET_SCHEDULER_add_delayed (SHORT_TIME, &disconnect_mesh_peers, (void *) __LINE__); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Sending data initializer...\n"); + peers_responded = 0; + data_ack = 0; + data_received = 0; + data_sent = 0; + GNUNET_MESH_notify_transmit_ready (t, GNUNET_NO, + GNUNET_TIME_UNIT_FOREVER_REL, + size_payload, &tmt_rdy, (void *) 1L); } /** * Callback to be called when the requested peer information is available * - * @param cls the closure from GNUNET_TETSBED_peer_get_information() + * @param cls the closure from GNUNET_TESTBED_peer_get_information() * @param op the operation this callback corresponds to * @param pinfo the result; will be NULL if the operation has failed * @param emsg error message if the operation has failed; * NULL if the operation is successfull */ -void +static void pi_cb (void *cls, struct GNUNET_TESTBED_Operation *op, const struct GNUNET_TESTBED_PeerInformation *pinfo, @@ -808,6 +670,7 @@ pi_cb (void *cls, long i = (long) cls; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "id callback for %ld\n", i); + if (NULL == pinfo || NULL != emsg) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "pi_cb: %s\n", emsg); @@ -817,7 +680,7 @@ pi_cb (void *cls, p_id[i] = pinfo->result.id; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " id: %s\n", GNUNET_i2s (p_id[i])); p_ids++; - if ((MULTICAST == test && p_ids < 3) || p_ids < 2) + if (p_ids < 2) return; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Got all IDs, starting test\n"); test_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, @@ -846,18 +709,6 @@ tmain (void *cls, peers_running = num_peers; h1 = meshes[0]; h2 = meshes[num_peers - 1]; - t = GNUNET_MESH_tunnel_create (h1, NULL, &ch, &dh, (void *) 0L); - if (SPEED_MIN == test) - { - GNUNET_MESH_tunnel_speed_min(t); - test = SPEED; - } - if (SPEED_NOBUF == test) - { - GNUNET_MESH_tunnel_buffer(t, GNUNET_NO); - test = SPEED; - } - peers_in_tunnel = 0; disconnect_task = GNUNET_SCHEDULER_add_delayed (SHORT_TIME, &disconnect_mesh_peers, (void *) __LINE__); @@ -866,20 +717,9 @@ tmain (void *cls, t_op[0] = GNUNET_TESTBED_peer_get_information (peers[0], GNUNET_TESTBED_PIT_IDENTITY, &pi_cb, (void *) 0L); - t_op[2] = GNUNET_TESTBED_peer_get_information (peers[num_peers - 1], + t_op[1] = GNUNET_TESTBED_peer_get_information (peers[num_peers - 1], GNUNET_TESTBED_PIT_IDENTITY, - &pi_cb, (void *) 2L); - if (MULTICAST == test) - { - h3 = meshes[num_peers - 2]; - t_op[1] = GNUNET_TESTBED_peer_get_information (peers[num_peers - 2], - GNUNET_TESTBED_PIT_IDENTITY, - &pi_cb, (void *) 1L); - } - else - { - t_op[1] = NULL; - } + &pi_cb, (void *) 1L); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "requested peer ids\n"); } @@ -891,36 +731,29 @@ int main (int argc, char *argv[]) { initialized = GNUNET_NO; + uint32_t ports[2]; GNUNET_log_setup ("test", "DEBUG", NULL); - + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Start\n"); - if (strstr (argv[0], "test_mesh_small_unicast") != NULL) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "UNICAST\n"); - test = UNICAST; - test_name = "unicast"; - ok_goal = 5; - } - else if (strstr (argv[0], "test_mesh_small_multicast") != NULL) + if (strstr (argv[0], "_small_forward") != NULL) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "MULTICAST\n"); - test = MULTICAST; - test_name = "multicast"; - ok_goal = 10; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "FORWARD\n"); + test = FORWARD; + test_name = "unicast2"; + ok_goal = 4; } - else if (strstr (argv[0], "test_mesh_small_signal") != NULL) + else if (strstr (argv[0], "_small_signal") != NULL) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "SIGNAL\n"); test = P2P_SIGNAL; - test_name = "signal"; - ok_goal = 5; + test_name = "signal2"; + ok_goal = 4; } - else if (strstr (argv[0], "test_mesh_small_speed_ack") != NULL) + else if (strstr (argv[0], "_small_speed_ack") != NULL) { /* Each peer is supposed to generate the following callbacks: * 1 incoming tunnel (@dest) - * 1 connected peer (@orig) * TOTAL_PACKETS received data packet (@dest) * TOTAL_PACKETS received data packet (@orig) * 1 received tunnel destroy (@dest) @@ -929,14 +762,13 @@ main (int argc, char *argv[]) */ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "SPEED_ACK\n"); test = SPEED_ACK; - test_name = "speed ack"; - ok_goal = TOTAL_PACKETS * 2 + 3; + test_name = "speed2 ack"; + ok_goal = TOTAL_PACKETS * 2 + 2; } - else if (strstr (argv[0], "test_mesh_small_speed") != NULL) + else if (strstr (argv[0], "_small_speed") != NULL) { /* Each peer is supposed to generate the following callbacks: * 1 incoming tunnel (@dest) - * 1 connected peer (@orig) * 1 initial packet (@dest) * TOTAL_PACKETS received data packet (@dest) * 1 received data packet (@orig) @@ -944,21 +776,16 @@ main (int argc, char *argv[]) * _________________________________ */ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "SPEED\n"); - ok_goal = TOTAL_PACKETS + 5; - if (strstr (argv[0], "_min") != NULL) - { - test = SPEED_MIN; - test_name = "speed min"; - } - else if (strstr (argv[0], "_nobuf") != NULL) + ok_goal = TOTAL_PACKETS + 4; + if (strstr (argv[0], "_nobuf") != NULL) { test = SPEED_NOBUF; - test_name = "speed nobuf"; + test_name = "speed2 nobuf"; } else { test = SPEED; - test_name = "speed"; + test_name = "speed2"; } } else @@ -980,15 +807,17 @@ main (int argc, char *argv[]) } p_ids = 0; + ports[0] = 1; + ports[1] = 0; GNUNET_MESH_TEST_run ("test_mesh_small", - "test_mesh_small.conf", + "test_mesh.conf", 5, &tmain, - NULL, + NULL, /* tmain cls */ &incoming_tunnel, &tunnel_cleaner, handlers, - NULL); + ports); if (ok_goal > ok) { @@ -1001,3 +830,4 @@ main (int argc, char *argv[]) } /* end of test_mesh_small.c */ + |