aboutsummaryrefslogtreecommitdiff
path: root/src/stream/stream_api.c
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2012-03-23 10:58:13 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2012-03-23 10:58:13 +0000
commit49a24cff5967abb88985ecfd3c86a52f228bc54b (patch)
treeb9e0ba510c50aec2e41ef86299b05ad4860b67e8 /src/stream/stream_api.c
parent5924c2885a3b4cb5aa9b09163b83883ccc03d640 (diff)
downloadgnunet-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.c63
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)