diff options
author | Sree Harsha Totakura <totakura@in.tum.de> | 2012-11-26 15:40:41 +0000 |
---|---|---|
committer | Sree Harsha Totakura <totakura@in.tum.de> | 2012-11-26 15:40:41 +0000 |
commit | f2c236074334b86f61bcc8ab64c8636a2998353e (patch) | |
tree | 0015248564f538a4707261f92d98a46f1c621dca /src/stream | |
parent | 7185cbac9989889c18f04ee77133060e6fba7263 (diff) | |
download | gnunet-f2c236074334b86f61bcc8ab64c8636a2998353e.tar.gz gnunet-f2c236074334b86f61bcc8ab64c8636a2998353e.zip |
- simplify
Diffstat (limited to 'src/stream')
-rw-r--r-- | src/stream/stream_api.c | 76 |
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) |