aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2012-09-18 14:08:16 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2012-09-18 14:08:16 +0000
commit9dcdcdb429d8c3a13cda14ae5470bea0c861d15a (patch)
treee9fa3301196aa0305f7d37ff1b089f44fe44d925 /src
parent4e27ba9acbde9726ea29ccb4fbcc1afdfb80de8c (diff)
downloadgnunet-9dcdcdb429d8c3a13cda14ae5470bea0c861d15a.tar.gz
gnunet-9dcdcdb429d8c3a13cda14ae5470bea0c861d15a.zip
sequence difference calculation fixes while processing DATA_ACKs
Diffstat (limited to 'src')
-rw-r--r--src/stream/stream_api.c36
1 files changed, 12 insertions, 24 deletions
diff --git a/src/stream/stream_api.c b/src/stream/stream_api.c
index 0ef6ef85f..c618d3f2b 100644
--- a/src/stream/stream_api.c
+++ b/src/stream/stream_api.c
@@ -2450,8 +2450,9 @@ handle_ack (struct GNUNET_STREAM_Socket *socket,
2450 GNUNET_i2s (&socket->other_peer)); 2450 GNUNET_i2s (&socket->other_peer));
2451 return GNUNET_OK; 2451 return GNUNET_OK;
2452 } 2452 }
2453 if (!((socket->write_sequence_number 2453 sequence_difference =
2454 - ntohl (ack->base_sequence_number)) < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH)) 2454 socket->write_sequence_number - ntohl (ack->base_sequence_number);
2455 if (!(sequence_difference <= GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH))
2455 { 2456 {
2456 LOG (GNUNET_ERROR_TYPE_DEBUG, 2457 LOG (GNUNET_ERROR_TYPE_DEBUG,
2457 "%s: Received DATA_ACK with unexpected base sequence number\n", 2458 "%s: Received DATA_ACK with unexpected base sequence number\n",
@@ -2465,17 +2466,13 @@ handle_ack (struct GNUNET_STREAM_Socket *socket,
2465 } 2466 }
2466 /* FIXME: include the case when write_handle is cancelled - ignore the 2467 /* FIXME: include the case when write_handle is cancelled - ignore the
2467 acks */ 2468 acks */
2468 LOG (GNUNET_ERROR_TYPE_DEBUG, 2469 LOG (GNUNET_ERROR_TYPE_DEBUG, "%s: Received DATA_ACK from %s\n",
2469 "%s: Received DATA_ACK from %s\n", 2470 GNUNET_i2s (&socket->other_peer), GNUNET_i2s (&socket->other_peer));
2470 GNUNET_i2s (&socket->other_peer),
2471 GNUNET_i2s (&socket->other_peer));
2472
2473 /* Cancel the retransmission task */ 2471 /* Cancel the retransmission task */
2474 if (GNUNET_SCHEDULER_NO_TASK != socket->data_retransmission_task_id) 2472 if (GNUNET_SCHEDULER_NO_TASK != socket->data_retransmission_task_id)
2475 { 2473 {
2476 GNUNET_SCHEDULER_cancel (socket->data_retransmission_task_id); 2474 GNUNET_SCHEDULER_cancel (socket->data_retransmission_task_id);
2477 socket->data_retransmission_task_id = 2475 socket->data_retransmission_task_id = GNUNET_SCHEDULER_NO_TASK;
2478 GNUNET_SCHEDULER_NO_TASK;
2479 } 2476 }
2480 for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) 2477 for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++)
2481 { 2478 {
@@ -2483,22 +2480,13 @@ handle_ack (struct GNUNET_STREAM_Socket *socket,
2483 /* BS: Base sequence from ack; PS: sequence num of current packet */ 2480 /* BS: Base sequence from ack; PS: sequence num of current packet */
2484 sequence_difference = ntohl (ack->base_sequence_number) 2481 sequence_difference = ntohl (ack->base_sequence_number)
2485 - ntohl (socket->write_handle->messages[packet]->sequence_number); 2482 - ntohl (socket->write_handle->messages[packet]->sequence_number);
2483 if ((0 == sequence_difference) ||
2484 (GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH < sequence_difference))
2485 continue; /* The message in our handle is not yet received */
2486 /* case where BS = PS + GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH */ 2486 /* case where BS = PS + GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH */
2487 if ((sequence_difference == GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH) 2487 /* sequence_difference <= GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH */
2488 || ((sequence_difference < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH) 2488 ackbitmap_modify_bit (&socket->write_handle->ack_bitmap,
2489 && (0 != sequence_difference))) /* case: BS > PS and BS != PS*/ 2489 packet, GNUNET_YES);
2490 {
2491 ackbitmap_modify_bit (&socket->write_handle->ack_bitmap, packet,
2492 GNUNET_YES);
2493 continue;
2494 }
2495 if (GNUNET_YES ==
2496 ackbitmap_is_bit_set (&socket->write_handle->ack_bitmap,
2497 -sequence_difference))/*inversion as PS >= BS */
2498 {
2499 ackbitmap_modify_bit (&socket->write_handle->ack_bitmap, packet,
2500 GNUNET_YES);
2501 }
2502 } 2490 }
2503 /* Update the receive window remaining 2491 /* Update the receive window remaining
2504 FIXME : Should update with the value from a data ack with greater 2492 FIXME : Should update with the value from a data ack with greater