Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/tl/tcp/tcp.c

    r86f6121 rbe942bc  
    205205static int tcp_queue_received_packet(socket_core_t *, tcp_socket_data_t *,
    206206    packet_t *, int, size_t);
    207 static void tcp_queue_received_end_of_data(socket_core_t *socket);
    208207
    209208static int tcp_received_msg(device_id_t, packet_t *, services_t, services_t);
     
    454453
    455454has_error_service:
    456         fibril_rwlock_write_unlock(&tcp_globals.lock);
     455        fibril_rwlock_read_unlock(&tcp_globals.lock);
    457456
    458457        /* TODO error reporting/handling */
     
    505504        size_t offset;
    506505        uint32_t new_sequence_number;
    507         bool forced_ack;
    508506        int rc;
    509507
     
    514512        assert(packet);
    515513
    516         forced_ack = false;
    517 
    518514        new_sequence_number = ntohl(header->sequence_number);
    519515        old_incoming = socket_data->next_incoming;
    520516
    521         if (header->finalize) {
    522                 socket_data->fin_incoming = new_sequence_number +
    523                     total_length - TCP_HEADER_LENGTH(header);
    524         }
     517        if (header->finalize)
     518                socket_data->fin_incoming = new_sequence_number;
    525519
    526520        /* Trim begining if containing expected data */
     
    766760                /* Release duplicite or restricted */
    767761                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    768                 forced_ack = true;
    769         }
    770 
    771         /* If next in sequence is an incoming FIN */
    772         if (socket_data->next_incoming == socket_data->fin_incoming) {
    773                 /* Advance sequence number */
    774                 socket_data->next_incoming += 1;
    775 
    776                 /* Handle FIN */
     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)) {
    777767                switch (socket_data->state) {
    778768                case TCP_SOCKET_FIN_WAIT_1:
     
    781771                        socket_data->state = TCP_SOCKET_CLOSING;
    782772                        break;
    783                 case TCP_SOCKET_ESTABLISHED:
    784                         /* Queue end-of-data marker on the socket. */
    785                         tcp_queue_received_end_of_data(socket);
    786                         socket_data->state = TCP_SOCKET_CLOSE_WAIT;
    787                         break;
     773                /*case TCP_ESTABLISHED:*/
    788774                default:
    789775                        socket_data->state = TCP_SOCKET_CLOSE_WAIT;
     
    793779
    794780        packet = tcp_get_packets_to_send(socket, socket_data);
    795         if (!packet && (socket_data->next_incoming != old_incoming || forced_ack)) {
     781        if (!packet) {
    796782                /* Create the notification packet */
    797783                rc = tcp_create_notification_packet(&packet, socket,
     
    849835
    850836        return EOK;
    851 }
    852 
    853 /** Queue end-of-data marker on the socket.
    854  *
    855  * Next element in the sequence space is FIN. Queue end-of-data marker
    856  * on the socket.
    857  *
    858  * @param socket        Socket
    859  */
    860 static void tcp_queue_received_end_of_data(socket_core_t *socket)
    861 {
    862         assert(socket != NULL);
    863 
    864         /* Notify the destination socket */
    865         async_msg_5(socket->phone, NET_SOCKET_RECEIVED,
    866             (sysarg_t) socket->socket_id,
    867             0, 0, 0,
    868             (sysarg_t) 0 /* 0 fragments == no more data */);
    869837}
    870838
     
    18351803                        fibril_rwlock_write_unlock(socket_data->local_lock);
    18361804
    1837                         socket_data->state = TCP_SOCKET_SYN_SENT;
    1838 
    18391805                        /* Send the packet */
    18401806                        printf("connecting %d\n", packet_get_id(packet));
     
    22442210
    22452211                tcp_prepare_operation_header(socket, socket_data, header, 0, 0);
    2246                 rc = tcp_queue_packet(socket, socket_data, packet, total_length);
     2212                rc = tcp_queue_packet(socket, socket_data, packet, 0);
    22472213                if (rc != EOK)
    22482214                        return rc;
Note: See TracChangeset for help on using the changeset viewer.