diff options
author | Sree Harsha Totakura <totakura@in.tum.de> | 2012-09-18 14:08:16 +0000 |
---|---|---|
committer | Sree Harsha Totakura <totakura@in.tum.de> | 2012-09-18 14:08:16 +0000 |
commit | 9dcdcdb429d8c3a13cda14ae5470bea0c861d15a (patch) | |
tree | e9fa3301196aa0305f7d37ff1b089f44fe44d925 /src | |
parent | 4e27ba9acbde9726ea29ccb4fbcc1afdfb80de8c (diff) | |
download | gnunet-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.c | 36 |
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 |