diff options
author | Sree Harsha Totakura <totakura@in.tum.de> | 2012-11-26 16:27:24 +0000 |
---|---|---|
committer | Sree Harsha Totakura <totakura@in.tum.de> | 2012-11-26 16:27:24 +0000 |
commit | 3c4db5aeee2a22aa38ee8049c3dbbd7fa989bf45 (patch) | |
tree | 748a70e9d1c3294c9cf4b6de541d161b492104ae /src/stream | |
parent | f2c236074334b86f61bcc8ab64c8636a2998353e (diff) | |
download | gnunet-3c4db5aeee2a22aa38ee8049c3dbbd7fa989bf45.tar.gz gnunet-3c4db5aeee2a22aa38ee8049c3dbbd7fa989bf45.zip |
- update bitmap not only on ACK's base number but also by looking into its bitmap
Diffstat (limited to 'src/stream')
-rw-r--r-- | src/stream/stream_api.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/stream/stream_api.c b/src/stream/stream_api.c index cedfb53c9..60e7cfbd8 100644 --- a/src/stream/stream_api.c +++ b/src/stream/stream_api.c | |||
@@ -2515,7 +2515,8 @@ handle_ack (struct GNUNET_STREAM_Socket *socket, | |||
2515 | const struct GNUNET_STREAM_AckMessage *ack, | 2515 | const struct GNUNET_STREAM_AckMessage *ack, |
2516 | const struct GNUNET_ATS_Information*atsi) | 2516 | const struct GNUNET_ATS_Information*atsi) |
2517 | { | 2517 | { |
2518 | struct GNUNET_STREAM_IOWriteHandle *write_handle; | 2518 | struct GNUNET_STREAM_IOWriteHandle *write_handle; |
2519 | uint64_t ack_bitmap; | ||
2519 | unsigned int packet; | 2520 | unsigned int packet; |
2520 | int need_retransmission; | 2521 | int need_retransmission; |
2521 | uint32_t sequence_difference; | 2522 | uint32_t sequence_difference; |
@@ -2571,17 +2572,13 @@ handle_ack (struct GNUNET_STREAM_Socket *socket, | |||
2571 | /* BS: Base sequence from ack; PS: sequence num of current packet */ | 2572 | /* BS: Base sequence from ack; PS: sequence num of current packet */ |
2572 | sequence_difference = ntohl (ack->base_sequence_number) | 2573 | sequence_difference = ntohl (ack->base_sequence_number) |
2573 | - ntohl (socket->write_handle->messages[packet]->sequence_number); | 2574 | - ntohl (socket->write_handle->messages[packet]->sequence_number); |
2574 | if ((0 == sequence_difference) || | 2575 | if (0 == sequence_difference) |
2575 | (GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH < sequence_difference)) | ||
2576 | break; /* The message in our handle is not yet received */ | 2576 | break; /* The message in our handle is not yet received */ |
2577 | /* case where BS = PS + GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH */ | 2577 | /* case where BS = PS + GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH */ |
2578 | /* sequence_difference <= GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH */ | 2578 | /* sequence_difference <= GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH */ |
2579 | ackbitmap_modify_bit (&socket->write_handle->ack_bitmap, | 2579 | ackbitmap_modify_bit (&socket->write_handle->ack_bitmap, |
2580 | packet, GNUNET_YES); | 2580 | packet, GNUNET_YES); |
2581 | } | 2581 | } |
2582 | /* Update the receive window remaining | ||
2583 | FIXME : Should update with the value from a data ack with greater | ||
2584 | sequence number */ | ||
2585 | if (((ntohl (ack->base_sequence_number) | 2582 | if (((ntohl (ack->base_sequence_number) |
2586 | - (socket->write_handle->max_ack_base_num)) | 2583 | - (socket->write_handle->max_ack_base_num)) |
2587 | <= GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH)) | 2584 | <= GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH)) |
@@ -2602,6 +2599,15 @@ handle_ack (struct GNUNET_STREAM_Socket *socket, | |||
2602 | GNUNET_assert (ntohl | 2599 | GNUNET_assert (ntohl |
2603 | (socket->write_handle->messages[packet]->sequence_number) | 2600 | (socket->write_handle->messages[packet]->sequence_number) |
2604 | == ntohl (ack->base_sequence_number)); | 2601 | == ntohl (ack->base_sequence_number)); |
2602 | /* Update our bitmap */ | ||
2603 | ack_bitmap = GNUNET_ntohll (ack->bitmap); | ||
2604 | for (; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) | ||
2605 | { | ||
2606 | if (ackbitmap_is_bit_set (&ack_bitmap, ntohl | ||
2607 | (socket->write_handle->messages[packet]->sequence_number) | ||
2608 | - ntohl (ack->base_sequence_number))) | ||
2609 | ackbitmap_modify_bit (&socket->write_handle->ack_bitmap, packet, GNUNET_YES); | ||
2610 | } | ||
2605 | /* Check if we have received all acknowledgements */ | 2611 | /* Check if we have received all acknowledgements */ |
2606 | need_retransmission = GNUNET_NO; | 2612 | need_retransmission = GNUNET_NO; |
2607 | for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) | 2613 | for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) |