aboutsummaryrefslogtreecommitdiff
path: root/src/stream
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2012-11-26 15:40:41 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2012-11-26 15:40:41 +0000
commitf2c236074334b86f61bcc8ab64c8636a2998353e (patch)
tree0015248564f538a4707261f92d98a46f1c621dca /src/stream
parent7185cbac9989889c18f04ee77133060e6fba7263 (diff)
downloadgnunet-f2c236074334b86f61bcc8ab64c8636a2998353e.tar.gz
gnunet-f2c236074334b86f61bcc8ab64c8636a2998353e.zip
- simplify
Diffstat (limited to 'src/stream')
-rw-r--r--src/stream/stream_api.c76
1 files changed, 49 insertions, 27 deletions
diff --git a/src/stream/stream_api.c b/src/stream/stream_api.c
index 72056fa62..cedfb53c9 100644
--- a/src/stream/stream_api.c
+++ b/src/stream/stream_api.c
@@ -499,6 +499,12 @@ struct GNUNET_STREAM_IOWriteHandle
499 * the receiver. 499 * the receiver.
500 */ 500 */
501 unsigned int packets_sent; 501 unsigned int packets_sent;
502
503 /**
504 * The maximum of the base numbers of the received acks
505 */
506 uint32_t max_ack_base_num;
507
502}; 508};
503 509
504 510
@@ -926,7 +932,6 @@ write_data (struct GNUNET_STREAM_Socket *socket)
926 packet++; 932 packet++;
927 } 933 }
928 io_handle->packets_sent = packet; 934 io_handle->packets_sent = packet;
929 // FIXME: 8s is not good, should use GNUNET_TIME_STD_BACKOFF...
930 if (GNUNET_SCHEDULER_NO_TASK == socket->data_retransmission_task_id) 935 if (GNUNET_SCHEDULER_NO_TASK == socket->data_retransmission_task_id)
931 { 936 {
932 socket->data_retransmit_timeout = GNUNET_TIME_STD_BACKOFF 937 socket->data_retransmit_timeout = GNUNET_TIME_STD_BACKOFF
@@ -2510,10 +2515,11 @@ handle_ack (struct GNUNET_STREAM_Socket *socket,
2510 const struct GNUNET_STREAM_AckMessage *ack, 2515 const struct GNUNET_STREAM_AckMessage *ack,
2511 const struct GNUNET_ATS_Information*atsi) 2516 const struct GNUNET_ATS_Information*atsi)
2512{ 2517{
2518 struct GNUNET_STREAM_IOWriteHandle *write_handle;
2513 unsigned int packet; 2519 unsigned int packet;
2514 int need_retransmission; 2520 int need_retransmission;
2515 uint32_t sequence_difference; 2521 uint32_t sequence_difference;
2516 2522
2517 if (0 != memcmp (sender, 2523 if (0 != memcmp (sender,
2518 &socket->other_peer, 2524 &socket->other_peer,
2519 sizeof (struct GNUNET_PeerIdentity))) 2525 sizeof (struct GNUNET_PeerIdentity)))
@@ -2549,8 +2555,6 @@ handle_ack (struct GNUNET_STREAM_Socket *socket,
2549 ntohl (ack->base_sequence_number)); 2555 ntohl (ack->base_sequence_number));
2550 return GNUNET_OK; 2556 return GNUNET_OK;
2551 } 2557 }
2552 /* FIXME: include the case when write_handle is cancelled - ignore the
2553 acks */
2554 LOG (GNUNET_ERROR_TYPE_DEBUG, "%s: Received DATA_ACK from %s\n", 2558 LOG (GNUNET_ERROR_TYPE_DEBUG, "%s: Received DATA_ACK from %s\n",
2555 GNUNET_i2s (&socket->other_peer), GNUNET_i2s (&socket->other_peer)); 2559 GNUNET_i2s (&socket->other_peer), GNUNET_i2s (&socket->other_peer));
2556 /* Cancel the retransmission task */ 2560 /* Cancel the retransmission task */
@@ -2562,13 +2566,14 @@ handle_ack (struct GNUNET_STREAM_Socket *socket,
2562 } 2566 }
2563 for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) 2567 for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++)
2564 { 2568 {
2565 if (NULL == socket->write_handle->messages[packet]) break; 2569 if (NULL == socket->write_handle->messages[packet])
2570 break;
2566 /* BS: Base sequence from ack; PS: sequence num of current packet */ 2571 /* BS: Base sequence from ack; PS: sequence num of current packet */
2567 sequence_difference = ntohl (ack->base_sequence_number) 2572 sequence_difference = ntohl (ack->base_sequence_number)
2568 - ntohl (socket->write_handle->messages[packet]->sequence_number); 2573 - ntohl (socket->write_handle->messages[packet]->sequence_number);
2569 if ((0 == sequence_difference) || 2574 if ((0 == sequence_difference) ||
2570 (GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH < sequence_difference)) 2575 (GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH < sequence_difference))
2571 continue; /* The message in our handle is not yet received */ 2576 break; /* The message in our handle is not yet received */
2572 /* case where BS = PS + GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH */ 2577 /* case where BS = PS + GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH */
2573 /* sequence_difference <= GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH */ 2578 /* sequence_difference <= GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH */
2574 ackbitmap_modify_bit (&socket->write_handle->ack_bitmap, 2579 ackbitmap_modify_bit (&socket->write_handle->ack_bitmap,
@@ -2577,8 +2582,26 @@ handle_ack (struct GNUNET_STREAM_Socket *socket,
2577 /* Update the receive window remaining 2582 /* Update the receive window remaining
2578 FIXME : Should update with the value from a data ack with greater 2583 FIXME : Should update with the value from a data ack with greater
2579 sequence number */ 2584 sequence number */
2580 socket->receiver_window_available = 2585 if (((ntohl (ack->base_sequence_number)
2581 ntohl (ack->receive_window_remaining); 2586 - (socket->write_handle->max_ack_base_num))
2587 <= GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH))
2588 {
2589 socket->write_handle->max_ack_base_num = ntohl (ack->base_sequence_number);
2590 socket->receiver_window_available =
2591 ntohl (ack->receive_window_remaining);
2592 }
2593 else
2594 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2595 "Ignoring to modify receive window available as base: %u, max_ack_base: %u\n",
2596 ntohl (ack->base_sequence_number),
2597 socket->write_handle->max_ack_base_num);
2598 if ((packet == GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH)
2599 || ((packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH)
2600 && (NULL == socket->write_handle->messages[packet])))
2601 goto call_write_cont_cb;
2602 GNUNET_assert (ntohl
2603 (socket->write_handle->messages[packet]->sequence_number)
2604 == ntohl (ack->base_sequence_number));
2582 /* Check if we have received all acknowledgements */ 2605 /* Check if we have received all acknowledgements */
2583 need_retransmission = GNUNET_NO; 2606 need_retransmission = GNUNET_NO;
2584 for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) 2607 for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++)
@@ -2594,28 +2617,26 @@ handle_ack (struct GNUNET_STREAM_Socket *socket,
2594 if (GNUNET_YES == need_retransmission) 2617 if (GNUNET_YES == need_retransmission)
2595 { 2618 {
2596 write_data (socket); 2619 write_data (socket);
2620 return GNUNET_OK;
2597 } 2621 }
2598 else /* We have to call the write continuation callback now */ 2622
2623 call_write_cont_cb:
2624 /* Free the packets */
2625 for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++)
2599 { 2626 {
2600 struct GNUNET_STREAM_IOWriteHandle *write_handle; 2627 GNUNET_free_non_null (socket->write_handle->messages[packet]);
2601
2602 /* Free the packets */
2603 for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++)
2604 {
2605 GNUNET_free_non_null (socket->write_handle->messages[packet]);
2606 }
2607 write_handle = socket->write_handle;
2608 socket->write_handle = NULL;
2609 if (NULL != write_handle->write_cont)
2610 write_handle->write_cont (write_handle->write_cont_cls,
2611 socket->status,
2612 write_handle->size);
2613 /* We are done with the write handle - Freeing it */
2614 GNUNET_free (write_handle);
2615 LOG (GNUNET_ERROR_TYPE_DEBUG,
2616 "%s: Write completion callback completed\n",
2617 GNUNET_i2s (&socket->other_peer));
2618 } 2628 }
2629 write_handle = socket->write_handle;
2630 socket->write_handle = NULL;
2631 if (NULL != write_handle->write_cont)
2632 write_handle->write_cont (write_handle->write_cont_cls,
2633 socket->status,
2634 write_handle->size);
2635 /* We are done with the write handle - Freeing it */
2636 GNUNET_free (write_handle);
2637 LOG (GNUNET_ERROR_TYPE_DEBUG,
2638 "%s: Write completion callback completed\n",
2639 GNUNET_i2s (&socket->other_peer));
2619 break; 2640 break;
2620 default: 2641 default:
2621 break; 2642 break;
@@ -3481,6 +3502,7 @@ GNUNET_STREAM_write (struct GNUNET_STREAM_Socket *socket,
3481 /* Divide the given buffer into packets for sending */ 3502 /* Divide the given buffer into packets for sending */
3482 max_data_packet_size = 3503 max_data_packet_size =
3483 socket->max_payload_size + sizeof (struct GNUNET_STREAM_DataMessage); 3504 socket->max_payload_size + sizeof (struct GNUNET_STREAM_DataMessage);
3505 io_handle->max_ack_base_num = socket->write_sequence_number;
3484 for (packet=0; packet < num_needed_packets; packet++) 3506 for (packet=0; packet < num_needed_packets; packet++)
3485 { 3507 {
3486 if ((packet + 1) * socket->max_payload_size < size) 3508 if ((packet + 1) * socket->max_payload_size < size)