diff options
author | Sree Harsha Totakura <totakura@in.tum.de> | 2012-03-23 10:58:13 +0000 |
---|---|---|
committer | Sree Harsha Totakura <totakura@in.tum.de> | 2012-03-23 10:58:13 +0000 |
commit | 49a24cff5967abb88985ecfd3c86a52f228bc54b (patch) | |
tree | b9e0ba510c50aec2e41ef86299b05ad4860b67e8 /src/stream/stream_api.c | |
parent | 5924c2885a3b4cb5aa9b09163b83883ccc03d640 (diff) | |
download | gnunet-49a24cff5967abb88985ecfd3c86a52f228bc54b.tar.gz gnunet-49a24cff5967abb88985ecfd3c86a52f228bc54b.zip |
fixed read packets removal after read processor,
byte ordering bugs,
ack_bitmap handling in handle_ack
ack_task cancelling in socket close
Diffstat (limited to 'src/stream/stream_api.c')
-rw-r--r-- | src/stream/stream_api.c | 63 |
1 files changed, 51 insertions, 12 deletions
diff --git a/src/stream/stream_api.c b/src/stream/stream_api.c index 2b9363c68..b384e2524 100644 --- a/src/stream/stream_api.c +++ b/src/stream/stream_api.c | |||
@@ -870,13 +870,21 @@ call_read_processor (void *cls, | |||
870 | 870 | ||
871 | /* Determine upto which packet we can remove from the buffer */ | 871 | /* Determine upto which packet we can remove from the buffer */ |
872 | for (packet = 0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) | 872 | for (packet = 0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) |
873 | if (socket->copy_offset < socket->receive_buffer_boundaries[packet]) | 873 | { |
874 | break; | 874 | if (socket->copy_offset = socket->receive_buffer_boundaries[packet]) |
875 | { packet++; break; } | ||
876 | if (socket->copy_offset < socket->receive_buffer_boundaries[packet]) | ||
877 | break; | ||
878 | } | ||
875 | 879 | ||
876 | /* If no packets can be removed we can't move the buffer */ | 880 | /* If no packets can be removed we can't move the buffer */ |
877 | if (0 == packet) return; | 881 | if (0 == packet) return; |
878 | 882 | ||
879 | sequence_increase = packet; | 883 | sequence_increase = packet; |
884 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
885 | "%x: Sequence increase after read processor completion: %u\n", | ||
886 | socket->our_id, | ||
887 | sequence_increase); | ||
880 | 888 | ||
881 | /* Shift the data in the receive buffer */ | 889 | /* Shift the data in the receive buffer */ |
882 | memmove (socket->receive_buffer, | 890 | memmove (socket->receive_buffer, |
@@ -1886,6 +1894,7 @@ handle_ack (struct GNUNET_STREAM_Socket *socket, | |||
1886 | { | 1894 | { |
1887 | unsigned int packet; | 1895 | unsigned int packet; |
1888 | int need_retransmission; | 1896 | int need_retransmission; |
1897 | |||
1889 | 1898 | ||
1890 | if (GNUNET_PEER_search (sender) != socket->other_peer) | 1899 | if (GNUNET_PEER_search (sender) != socket->other_peer) |
1891 | { | 1900 | { |
@@ -1908,12 +1917,17 @@ handle_ack (struct GNUNET_STREAM_Socket *socket, | |||
1908 | /* FIXME: increment in the base sequence number is breaking current flow | 1917 | /* FIXME: increment in the base sequence number is breaking current flow |
1909 | */ | 1918 | */ |
1910 | if (!((socket->write_sequence_number | 1919 | if (!((socket->write_sequence_number |
1911 | - htonl (ack->base_sequence_number)) < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH)) | 1920 | - ntohl (ack->base_sequence_number)) < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH)) |
1912 | { | 1921 | { |
1913 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1922 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
1914 | "%x: Received DATA_ACK with unexpected base sequence " | 1923 | "%x: Received DATA_ACK with unexpected base sequence " |
1915 | "number\n", | 1924 | "number\n", |
1916 | socket->our_id); | 1925 | socket->our_id); |
1926 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
1927 | "%x: Current write sequence: %u; Ack's base sequence: %u\n", | ||
1928 | socket->our_id, | ||
1929 | socket->write_sequence_number, | ||
1930 | ntohl (ack->base_sequence_number)); | ||
1917 | return GNUNET_OK; | 1931 | return GNUNET_OK; |
1918 | } | 1932 | } |
1919 | /* FIXME: include the case when write_handle is cancelled - ignore the | 1933 | /* FIXME: include the case when write_handle is cancelled - ignore the |
@@ -1932,9 +1946,27 @@ handle_ack (struct GNUNET_STREAM_Socket *socket, | |||
1932 | GNUNET_SCHEDULER_NO_TASK; | 1946 | GNUNET_SCHEDULER_NO_TASK; |
1933 | } | 1947 | } |
1934 | 1948 | ||
1935 | /* FIXME: Bits in the ack_bitmap are only to be set; Once set they cannot | 1949 | for (packet=0; packet < GNUNET_STREAM_ACK_BITMAP_BIT_LENGTH; packet++) |
1936 | be unset */ | 1950 | { |
1937 | socket->write_handle->ack_bitmap = GNUNET_ntohll (ack->bitmap); | 1951 | if (NULL == socket->write_handle->messages[packet]) break; |
1952 | if (ntohl (ack->base_sequence_number) | ||
1953 | >= ntohl (socket->write_handle->messages[packet]->sequence_number)) | ||
1954 | ackbitmap_modify_bit (&socket->write_handle->ack_bitmap, | ||
1955 | packet, | ||
1956 | GNUNET_YES); | ||
1957 | else | ||
1958 | if (GNUNET_YES == | ||
1959 | ackbitmap_is_bit_set (&socket->write_handle->ack_bitmap, | ||
1960 | ntohl (socket->write_handle->messages[packet]->sequence_number) | ||
1961 | - ntohl (ack->base_sequence_number))) | ||
1962 | ackbitmap_modify_bit (&socket->write_handle->ack_bitmap, | ||
1963 | packet, | ||
1964 | GNUNET_YES); | ||
1965 | } | ||
1966 | |||
1967 | /* Update the receive window remaining | ||
1968 | FIXME : Should update with the value from a data ack with greater | ||
1969 | sequence number */ | ||
1938 | socket->receiver_window_available = | 1970 | socket->receiver_window_available = |
1939 | ntohl (ack->receive_window_remaining); | 1971 | ntohl (ack->receive_window_remaining); |
1940 | 1972 | ||
@@ -2353,12 +2385,19 @@ GNUNET_STREAM_close (struct GNUNET_STREAM_Socket *socket) | |||
2353 | struct MessageQueue *head; | 2385 | struct MessageQueue *head; |
2354 | 2386 | ||
2355 | if (socket->read_task_id != GNUNET_SCHEDULER_NO_TASK) | 2387 | if (socket->read_task_id != GNUNET_SCHEDULER_NO_TASK) |
2356 | { | 2388 | { |
2357 | /* socket closed with read task pending!? */ | 2389 | /* socket closed with read task pending!? */ |
2358 | GNUNET_break (0); | 2390 | GNUNET_break (0); |
2359 | GNUNET_SCHEDULER_cancel (socket->read_task_id); | 2391 | GNUNET_SCHEDULER_cancel (socket->read_task_id); |
2360 | socket->read_task_id = GNUNET_SCHEDULER_NO_TASK; | 2392 | socket->read_task_id = GNUNET_SCHEDULER_NO_TASK; |
2361 | } | 2393 | } |
2394 | |||
2395 | /* Terminate the ack'ing tasks if they are still present */ | ||
2396 | if (socket->ack_task_id != GNUNET_SCHEDULER_NO_TASK) | ||
2397 | { | ||
2398 | GNUNET_SCHEDULER_cancel (socket->ack_task_id); | ||
2399 | socket->ack_task_id = GNUNET_SCHEDULER_NO_TASK; | ||
2400 | } | ||
2362 | 2401 | ||
2363 | /* Clear Transmit handles */ | 2402 | /* Clear Transmit handles */ |
2364 | if (NULL != socket->transmit_handle) | 2403 | if (NULL != socket->transmit_handle) |