diff options
author | harsha <harsha@140774ce-b5e7-0310-ab8b-a85725594a96> | 2012-11-26 13:33:24 +0000 |
---|---|---|
committer | harsha <harsha@140774ce-b5e7-0310-ab8b-a85725594a96> | 2012-11-26 13:33:24 +0000 |
commit | f4b6104ed81be669e9cb8ce031efbed3b1534bcc (patch) | |
tree | 8ea7094f2510d2da1a6ec713f95ad19981ee9fbf | |
parent | 35be5a80ff0923692fb6b1c0bde0081f3bb43789 (diff) |
exponential delay for data retransmissions
git-svn-id: https://gnunet.org/svn/gnunet@25139 140774ce-b5e7-0310-ab8b-a85725594a96
-rw-r--r-- | src/stream/stream_api.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/src/stream/stream_api.c b/src/stream/stream_api.c index 8b771f84b4..72056fa62c 100644 --- a/src/stream/stream_api.c +++ b/src/stream/stream_api.c @@ -283,7 +283,12 @@ struct GNUNET_STREAM_Socket /** * Mesh transmit timeout */ - struct GNUNET_TIME_Relative mesh_retry_timeout; + struct GNUNET_TIME_Relative mesh_retry_timeout; + + /** + * Data retransmission timeout + */ + struct GNUNET_TIME_Relative data_retransmit_timeout; /** * The state of the protocol associated with this socket @@ -296,11 +301,6 @@ struct GNUNET_STREAM_Socket enum GNUNET_STREAM_Status status; /** - * The number of previous timeouts; FIXME: currently not used - */ - unsigned int retries; - - /** * Whether testing mode is active or not */ int testing_active; @@ -928,11 +928,14 @@ write_data (struct GNUNET_STREAM_Socket *socket) io_handle->packets_sent = packet; // FIXME: 8s is not good, should use GNUNET_TIME_STD_BACKOFF... if (GNUNET_SCHEDULER_NO_TASK == socket->data_retransmission_task_id) + { + socket->data_retransmit_timeout = GNUNET_TIME_STD_BACKOFF + (socket->data_retransmit_timeout); socket->data_retransmission_task_id = - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, 8), - &data_retransmission_task, - socket); + GNUNET_SCHEDULER_add_delayed (socket->data_retransmit_timeout, + &data_retransmission_task, + socket); + } } @@ -2555,6 +2558,7 @@ handle_ack (struct GNUNET_STREAM_Socket *socket, { GNUNET_SCHEDULER_cancel (socket->data_retransmission_task_id); socket->data_retransmission_task_id = GNUNET_SCHEDULER_NO_TASK; + socket->data_retransmit_timeout = GNUNET_TIME_UNIT_SECONDS; } for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) { @@ -3511,6 +3515,7 @@ GNUNET_STREAM_write (struct GNUNET_STREAM_Socket *socket, using RTT */ io_handle->messages[num_needed_packets - 1]->ack_deadline = GNUNET_TIME_relative_hton (GNUNET_TIME_UNIT_ZERO); + socket->data_retransmit_timeout = GNUNET_TIME_UNIT_SECONDS; socket->write_handle = io_handle; write_data (socket); LOG (GNUNET_ERROR_TYPE_DEBUG, @@ -3595,19 +3600,16 @@ GNUNET_STREAM_io_write_cancel (struct GNUNET_STREAM_IOWriteHandle *ioh) GNUNET_assert (NULL != socket->write_handle); GNUNET_assert (socket->write_handle == ioh); - if (GNUNET_SCHEDULER_NO_TASK != socket->data_retransmission_task_id) { GNUNET_SCHEDULER_cancel (socket->data_retransmission_task_id); socket->data_retransmission_task_id = GNUNET_SCHEDULER_NO_TASK; } - for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) { if (NULL == ioh->messages[packet]) break; GNUNET_free (ioh->messages[packet]); - } - + } GNUNET_free (socket->write_handle); socket->write_handle = NULL; } |