From 21d40f40cd7307a541a68b0d3b31ef4c2b2cdf7d Mon Sep 17 00:00:00 2001 From: Sree Harsha Totakura Date: Sat, 16 Jun 2012 19:27:15 +0000 Subject: [PATCH] -stream testing hooks and options --- src/include/gnunet_stream_lib.h | 12 +++++- src/stream/stream_api.c | 66 ++++++++++++++++++++++++++++++++- src/stream/test_stream_2peers.c | 3 +- src/stream/test_stream_api.c | 6 ++- src/stream/test_stream_big.c | 6 ++- src/stream/test_stream_local.c | 3 +- 6 files changed, 86 insertions(+), 10 deletions(-) diff --git a/src/include/gnunet_stream_lib.h b/src/include/gnunet_stream_lib.h index e09c264d6..f348780e3 100644 --- a/src/include/gnunet_stream_lib.h +++ b/src/include/gnunet_stream_lib.h @@ -103,7 +103,13 @@ enum GNUNET_STREAM_Option * of '0' means to use the round-trip time (plus a tiny grace period); * this is also the default. */ - GNUNET_STREAM_OPTION_INITIAL_RETRANSMIT_TIMEOUT + GNUNET_STREAM_OPTION_INITIAL_RETRANSMIT_TIMEOUT, + + /** + * Option to set the write sequence number. Takes a uint32_t as parameter + * to set the value of the write sequence number + */ + GNUNET_STREAM_OPTION_TESTING_SET_WRITE_SEQUENCE_NUMBER }; @@ -211,13 +217,15 @@ struct GNUNET_STREAM_ListenSocket; * @param listen_cb this function will be called when a peer tries to establish * a stream with us * @param listen_cb_cls closure for listen_cb + * @param ... options to the stream, terminated by GNUNET_STREAM_OPTION_END * @return listen socket, NULL for any error */ struct GNUNET_STREAM_ListenSocket * GNUNET_STREAM_listen (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_MESH_ApplicationType app_port, GNUNET_STREAM_ListenCallback listen_cb, - void *listen_cb_cls); + void *listen_cb_cls, + ...); /** diff --git a/src/stream/stream_api.c b/src/stream/stream_api.c index 1dc1ba80e..8c25965f1 100644 --- a/src/stream/stream_api.c +++ b/src/stream/stream_api.c @@ -300,6 +300,16 @@ struct GNUNET_STREAM_Socket */ GNUNET_MESH_ApplicationType app_port; + /** + * Whether testing mode is active or not + */ + int testing_active; + + /** + * The write sequence number to be set incase of testing + */ + uint32_t testing_set_write_sequence_number_value; + /** * The session id associated with this stream connection * FIXME: Not used currently, may be removed @@ -374,6 +384,21 @@ struct GNUNET_STREAM_ListenSocket * FIXME: Remove if not required! */ GNUNET_MESH_ApplicationType port; + + /** + * The retransmit timeout + */ + struct GNUNET_TIME_Relative retransmit_timeout; + + /** + * Whether testing mode is active or not + */ + int testing_active; + + /** + * The write sequence number to be set incase of testing + */ + uint32_t testing_set_write_sequence_number_value; }; @@ -2666,7 +2691,11 @@ new_tunnel_notify (void *cls, socket->session_id = 0; /* FIXME */ socket->state = STATE_INIT; socket->lsocket = lsocket; - + socket->retransmit_timeout = lsocket->retransmit_timeout; + socket->testing_active = lsocket->testing_active; + socket->testing_set_write_sequence_number_value = + lsocket->testing_set_write_sequence_number_value; + LOG (GNUNET_ERROR_TYPE_DEBUG, "%s: Peer %s initiated tunnel to us\n", GNUNET_i2s (&socket->other_peer), @@ -2777,6 +2806,7 @@ GNUNET_STREAM_open (const struct GNUNET_CONFIGURATION_Handle *cfg, /* Set defaults */ socket->retransmit_timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, default_timeout); + socket->testing_active = GNUNET_NO; va_start (vargs, open_cb_cls); /* Parse variable args */ do { option = va_arg (vargs, enum GNUNET_STREAM_Option); @@ -2787,6 +2817,11 @@ GNUNET_STREAM_open (const struct GNUNET_CONFIGURATION_Handle *cfg, socket->retransmit_timeout = va_arg (vargs, struct GNUNET_TIME_Relative); break; + case GNUNET_STREAM_OPTION_TESTING_SET_WRITE_SEQUENCE_NUMBER: + socket->testing_active = GNUNET_YES; + socket->testing_set_write_sequence_number_value = va_arg (vargs, + uint32_t); + break; case GNUNET_STREAM_OPTION_END: break; } @@ -3018,19 +3053,46 @@ GNUNET_STREAM_close (struct GNUNET_STREAM_Socket *socket) * @param listen_cb this function will be called when a peer tries to establish * a stream with us * @param listen_cb_cls closure for listen_cb + * @param ... options to the stream, terminated by GNUNET_STREAM_OPTION_END * @return listen socket, NULL for any error */ struct GNUNET_STREAM_ListenSocket * GNUNET_STREAM_listen (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_MESH_ApplicationType app_port, GNUNET_STREAM_ListenCallback listen_cb, - void *listen_cb_cls) + void *listen_cb_cls, + ...) { /* FIXME: Add variable args for passing configration options? */ struct GNUNET_STREAM_ListenSocket *lsocket; GNUNET_MESH_ApplicationType ports[] = {app_port, 0}; + enum GNUNET_STREAM_Option option; + va_list vargs; lsocket = GNUNET_malloc (sizeof (struct GNUNET_STREAM_ListenSocket)); + /* Set defaults */ + lsocket->retransmit_timeout = + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, default_timeout); + lsocket->testing_active = GNUNET_NO; + va_start (vargs, listen_cb_cls); + do { + option = va_arg (vargs, enum GNUNET_STREAM_Option); + switch (option) + { + case GNUNET_STREAM_OPTION_INITIAL_RETRANSMIT_TIMEOUT: + lsocket->retransmit_timeout = va_arg (vargs, + struct GNUNET_TIME_Relative); + break; + case GNUNET_STREAM_OPTION_TESTING_SET_WRITE_SEQUENCE_NUMBER: + lsocket->testing_active = GNUNET_YES; + lsocket->testing_set_write_sequence_number_value = va_arg (vargs, + uint32_t); + break; + case GNUNET_STREAM_OPTION_END: + break; + } + } while (GNUNET_STREAM_OPTION_END != option); + va_end (vargs); lsocket->port = app_port; lsocket->listen_cb = listen_cb; lsocket->listen_cb_cls = listen_cb_cls; diff --git a/src/stream/test_stream_2peers.c b/src/stream/test_stream_2peers.c index 1fdc0ee19..6a61022e0 100644 --- a/src/stream/test_stream_2peers.c +++ b/src/stream/test_stream_2peers.c @@ -474,7 +474,8 @@ peergroup_ready (void *cls, const char *emsg) peer2_listen_socket = GNUNET_STREAM_listen (d2->cfg, 10, /* App port */ &stream_listen_cb, - NULL); + NULL, + GNUNET_STREAM_OPTION_END); GNUNET_assert (NULL != peer2_listen_socket); /* Connect to stream library */ diff --git a/src/stream/test_stream_api.c b/src/stream/test_stream_api.c index 84c486763..20581f9b6 100644 --- a/src/stream/test_stream_api.c +++ b/src/stream/test_stream_api.c @@ -348,7 +348,8 @@ test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) peer2_listen_socket = GNUNET_STREAM_listen (config, 10, /* App port */ &stream_listen_cb, - NULL); + NULL, + GNUNET_STREAM_OPTION_END); GNUNET_assert (NULL != peer2_listen_socket); /* Connect to stream library */ @@ -356,7 +357,8 @@ test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) &self, /* Null for local peer? */ 10, /* App port */ &stream_open_cb, - (void *) &peer1); + (void *) &peer1, + GNUNET_STREAM_OPTION_END); GNUNET_assert (NULL != peer1.socket); } diff --git a/src/stream/test_stream_big.c b/src/stream/test_stream_big.c index d645f66a7..58ad4427c 100644 --- a/src/stream/test_stream_big.c +++ b/src/stream/test_stream_big.c @@ -345,7 +345,8 @@ test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) peer2_listen_socket = GNUNET_STREAM_listen (config, 10, /* App port */ &stream_listen_cb, - NULL); + NULL, + GNUNET_STREAM_OPTION_END); GNUNET_assert (NULL != peer2_listen_socket); /* Connect to stream library */ @@ -353,7 +354,8 @@ test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) &self, /* Null for local peer? */ 10, /* App port */ &stream_open_cb, - (void *) &peer1); + (void *) &peer1, + GNUNET_STREAM_OPTION_END); GNUNET_assert (NULL != peer1.socket); } diff --git a/src/stream/test_stream_local.c b/src/stream/test_stream_local.c index c9fab8406..fc2a8f842 100644 --- a/src/stream/test_stream_local.c +++ b/src/stream/test_stream_local.c @@ -373,7 +373,8 @@ test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) peer2_listen_socket = GNUNET_STREAM_listen (config_peer2, 10, /* App port */ &stream_listen_cb, - &peer2); + &peer2, + GNUNET_STREAM_OPTION_END); GNUNET_assert (NULL != peer2_listen_socket); /* Connect to stream library */ -- 2.25.1