Changeset d493830e in mainline
- Timestamp:
- 2010-12-27T19:16:47Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 727f04f
- Parents:
- 58fe0aa
- Location:
- uspace
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/net/socket_client.c
r58fe0aa rd493830e 1006 1006 // wait for a received packet 1007 1007 ++socket->blocked; 1008 while ((result = dyn_fifo_value(&socket->received)) < =0) {1008 while ((result = dyn_fifo_value(&socket->received)) < 0) { 1009 1009 fibril_rwlock_read_unlock(&socket_globals.lock); 1010 1010 fibril_condvar_wait(&socket->receive_signal, … … 1018 1018 --socket->blocked; 1019 1019 fragments = (size_t) result; 1020 1021 if (fragments == 0) { 1022 /* No more data, other side has closed the connection. */ 1023 return 0; 1024 } 1020 1025 1021 1026 // prepare lengths if more fragments … … 1057 1062 1058 1063 free(lengths); 1059 } else { 1064 } else { /* fragments == 1 */ 1060 1065 // request packet data 1061 1066 message_id = async_send_4(socket->phone, message, -
uspace/srv/net/tl/tcp/tcp.c
r58fe0aa rd493830e 205 205 static int tcp_queue_received_packet(socket_core_t *, tcp_socket_data_t *, 206 206 packet_t *, int, size_t); 207 static void tcp_queue_received_end_of_data(socket_core_t *socket); 207 208 208 209 static int tcp_received_msg(device_id_t, packet_t *, services_t, services_t); … … 504 505 size_t offset; 505 506 uint32_t new_sequence_number; 507 bool forced_ack; 506 508 int rc; 507 509 … … 512 514 assert(packet); 513 515 516 forced_ack = false; 517 514 518 new_sequence_number = ntohl(header->sequence_number); 515 519 old_incoming = socket_data->next_incoming; 516 520 517 if (header->finalize) 518 socket_data->fin_incoming = new_sequence_number; 521 if (header->finalize) { 522 socket_data->fin_incoming = new_sequence_number + 523 total_length - TCP_HEADER_LENGTH(header); 524 } 519 525 520 526 /* Trim begining if containing expected data */ … … 760 766 /* Release duplicite or restricted */ 761 767 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 762 } 763 764 /* Change state according to the acknowledging incoming fin */ 765 if (IS_IN_INTERVAL_OVERFLOW(old_incoming, socket_data->fin_incoming, 766 socket_data->next_incoming)) { 768 forced_ack = true; 769 } 770 771 if (header->finalize) 772 socket_data->next_incoming += 1; 773 774 /* If next in sequence is an incoming FIN */ 775 if (socket_data->next_incoming == socket_data->fin_incoming) { 776 /* Advance sequence number */ 777 socket_data->next_incoming += 1; 778 779 /* Handle FIN */ 767 780 switch (socket_data->state) { 768 781 case TCP_SOCKET_FIN_WAIT_1: … … 771 784 socket_data->state = TCP_SOCKET_CLOSING; 772 785 break; 773 /*case TCP_ESTABLISHED:*/ 786 case TCP_SOCKET_ESTABLISHED: 787 /* Queue end-of-data marker on the socket. */ 788 tcp_queue_received_end_of_data(socket); 789 socket_data->state = TCP_SOCKET_CLOSE_WAIT; 790 break; 774 791 default: 775 792 socket_data->state = TCP_SOCKET_CLOSE_WAIT; … … 779 796 780 797 packet = tcp_get_packets_to_send(socket, socket_data); 781 if (!packet ) {798 if (!packet && (socket_data->next_incoming != old_incoming || forced_ack)) { 782 799 /* Create the notification packet */ 783 800 rc = tcp_create_notification_packet(&packet, socket, … … 835 852 836 853 return EOK; 854 } 855 856 /** Queue end-of-data marker on the socket. 857 * 858 * Next element in the sequence space is FIN. Queue end-of-data marker 859 * on the socket. 860 * 861 * @param socket Socket 862 */ 863 static void tcp_queue_received_end_of_data(socket_core_t *socket) 864 { 865 assert(socket != NULL); 866 867 /* Notify the destination socket */ 868 async_msg_5(socket->phone, NET_SOCKET_RECEIVED, 869 (sysarg_t) socket->socket_id, 870 0, 0, 0, 871 (sysarg_t) 0 /* 0 fragments == no more data */); 837 872 } 838 873
Note:
See TracChangeset
for help on using the changeset viewer.