aboutsummaryrefslogtreecommitdiff
path: root/src/stream
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2012-11-26 13:33:24 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2012-11-26 13:33:24 +0000
commit481f9b4ffc0b3b33f6ac59a3aa482e2a1a280e3e (patch)
tree8ea7094f2510d2da1a6ec713f95ad19981ee9fbf /src/stream
parentf09ca0dd1661e83739900f3eb39bb24a0ee7d79d (diff)
downloadgnunet-481f9b4ffc0b3b33f6ac59a3aa482e2a1a280e3e.tar.gz
gnunet-481f9b4ffc0b3b33f6ac59a3aa482e2a1a280e3e.zip
exponential delay for data retransmissions
Diffstat (limited to 'src/stream')
-rw-r--r--src/stream/stream_api.c30
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}