aboutsummaryrefslogtreecommitdiff
path: root/src/stream
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2012-11-26 16:27:24 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2012-11-26 16:27:24 +0000
commit3c4db5aeee2a22aa38ee8049c3dbbd7fa989bf45 (patch)
tree748a70e9d1c3294c9cf4b6de541d161b492104ae /src/stream
parentf2c236074334b86f61bcc8ab64c8636a2998353e (diff)
downloadgnunet-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.c18
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++)