diff options
author | Sree Harsha Totakura <totakura@in.tum.de> | 2012-11-26 13:33:24 +0000 |
---|---|---|
committer | Sree Harsha Totakura <totakura@in.tum.de> | 2012-11-26 13:33:24 +0000 |
commit | 481f9b4ffc0b3b33f6ac59a3aa482e2a1a280e3e (patch) | |
tree | 8ea7094f2510d2da1a6ec713f95ad19981ee9fbf /src/stream | |
parent | f09ca0dd1661e83739900f3eb39bb24a0ee7d79d (diff) | |
download | gnunet-481f9b4ffc0b3b33f6ac59a3aa482e2a1a280e3e.tar.gz gnunet-481f9b4ffc0b3b33f6ac59a3aa482e2a1a280e3e.zip |
exponential delay for data retransmissions
Diffstat (limited to 'src/stream')
-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 8b771f84b..72056fa62 100644 --- a/src/stream/stream_api.c +++ b/src/stream/stream_api.c | |||
@@ -283,7 +283,12 @@ struct GNUNET_STREAM_Socket | |||
283 | /** | 283 | /** |
284 | * Mesh transmit timeout | 284 | * Mesh transmit timeout |
285 | */ | 285 | */ |
286 | struct GNUNET_TIME_Relative mesh_retry_timeout; | 286 | struct GNUNET_TIME_Relative mesh_retry_timeout; |
287 | |||
288 | /** | ||
289 | * Data retransmission timeout | ||
290 | */ | ||
291 | struct GNUNET_TIME_Relative data_retransmit_timeout; | ||
287 | 292 | ||
288 | /** | 293 | /** |
289 | * The state of the protocol associated with this socket | 294 | * The state of the protocol associated with this socket |
@@ -296,11 +301,6 @@ struct GNUNET_STREAM_Socket | |||
296 | enum GNUNET_STREAM_Status status; | 301 | enum GNUNET_STREAM_Status status; |
297 | 302 | ||
298 | /** | 303 | /** |
299 | * The number of previous timeouts; FIXME: currently not used | ||
300 | */ | ||
301 | unsigned int retries; | ||
302 | |||
303 | /** | ||
304 | * Whether testing mode is active or not | 304 | * Whether testing mode is active or not |
305 | */ | 305 | */ |
306 | int testing_active; | 306 | int testing_active; |
@@ -928,11 +928,14 @@ write_data (struct GNUNET_STREAM_Socket *socket) | |||
928 | io_handle->packets_sent = packet; | 928 | io_handle->packets_sent = packet; |
929 | // FIXME: 8s is not good, should use GNUNET_TIME_STD_BACKOFF... | 929 | // FIXME: 8s is not good, should use GNUNET_TIME_STD_BACKOFF... |
930 | if (GNUNET_SCHEDULER_NO_TASK == socket->data_retransmission_task_id) | 930 | if (GNUNET_SCHEDULER_NO_TASK == socket->data_retransmission_task_id) |
931 | { | ||
932 | socket->data_retransmit_timeout = GNUNET_TIME_STD_BACKOFF | ||
933 | (socket->data_retransmit_timeout); | ||
931 | socket->data_retransmission_task_id = | 934 | socket->data_retransmission_task_id = |
932 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply | 935 | GNUNET_SCHEDULER_add_delayed (socket->data_retransmit_timeout, |
933 | (GNUNET_TIME_UNIT_SECONDS, 8), | 936 | &data_retransmission_task, |
934 | &data_retransmission_task, | 937 | socket); |
935 | socket); | 938 | } |
936 | } | 939 | } |
937 | 940 | ||
938 | 941 | ||
@@ -2555,6 +2558,7 @@ handle_ack (struct GNUNET_STREAM_Socket *socket, | |||
2555 | { | 2558 | { |
2556 | GNUNET_SCHEDULER_cancel (socket->data_retransmission_task_id); | 2559 | GNUNET_SCHEDULER_cancel (socket->data_retransmission_task_id); |
2557 | socket->data_retransmission_task_id = GNUNET_SCHEDULER_NO_TASK; | 2560 | socket->data_retransmission_task_id = GNUNET_SCHEDULER_NO_TASK; |
2561 | socket->data_retransmit_timeout = GNUNET_TIME_UNIT_SECONDS; | ||
2558 | } | 2562 | } |
2559 | for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) | 2563 | for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) |
2560 | { | 2564 | { |
@@ -3511,6 +3515,7 @@ GNUNET_STREAM_write (struct GNUNET_STREAM_Socket *socket, | |||
3511 | using RTT */ | 3515 | using RTT */ |
3512 | io_handle->messages[num_needed_packets - 1]->ack_deadline = | 3516 | io_handle->messages[num_needed_packets - 1]->ack_deadline = |
3513 | GNUNET_TIME_relative_hton (GNUNET_TIME_UNIT_ZERO); | 3517 | GNUNET_TIME_relative_hton (GNUNET_TIME_UNIT_ZERO); |
3518 | socket->data_retransmit_timeout = GNUNET_TIME_UNIT_SECONDS; | ||
3514 | socket->write_handle = io_handle; | 3519 | socket->write_handle = io_handle; |
3515 | write_data (socket); | 3520 | write_data (socket); |
3516 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 3521 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
@@ -3595,19 +3600,16 @@ GNUNET_STREAM_io_write_cancel (struct GNUNET_STREAM_IOWriteHandle *ioh) | |||
3595 | 3600 | ||
3596 | GNUNET_assert (NULL != socket->write_handle); | 3601 | GNUNET_assert (NULL != socket->write_handle); |
3597 | GNUNET_assert (socket->write_handle == ioh); | 3602 | GNUNET_assert (socket->write_handle == ioh); |
3598 | |||
3599 | if (GNUNET_SCHEDULER_NO_TASK != socket->data_retransmission_task_id) | 3603 | if (GNUNET_SCHEDULER_NO_TASK != socket->data_retransmission_task_id) |
3600 | { | 3604 | { |
3601 | GNUNET_SCHEDULER_cancel (socket->data_retransmission_task_id); | 3605 | GNUNET_SCHEDULER_cancel (socket->data_retransmission_task_id); |
3602 | socket->data_retransmission_task_id = GNUNET_SCHEDULER_NO_TASK; | 3606 | socket->data_retransmission_task_id = GNUNET_SCHEDULER_NO_TASK; |
3603 | } | 3607 | } |
3604 | |||
3605 | for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) | 3608 | for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) |
3606 | { | 3609 | { |
3607 | if (NULL == ioh->messages[packet]) break; | 3610 | if (NULL == ioh->messages[packet]) break; |
3608 | GNUNET_free (ioh->messages[packet]); | 3611 | GNUNET_free (ioh->messages[packet]); |
3609 | } | 3612 | } |
3610 | |||
3611 | GNUNET_free (socket->write_handle); | 3613 | GNUNET_free (socket->write_handle); |
3612 | socket->write_handle = NULL; | 3614 | socket->write_handle = NULL; |
3613 | } | 3615 | } |