Changeset e64e40b in mainline for uspace/srv/net/tl/tcp/tcp.c


Ignore:
Timestamp:
2010-12-27T20:05:44Z (13 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
097967b
Parents:
6e5b4e7 (diff), 45bb1d2 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge TCP FIN fix and some cleanup.

File:
1 edited

Legend:

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

    r6e5b4e7 re64e40b  
    205205static int tcp_queue_received_packet(socket_core_t *, tcp_socket_data_t *,
    206206    packet_t *, int, size_t);
     207static void tcp_queue_received_end_of_data(socket_core_t *socket);
    207208
    208209static int tcp_received_msg(device_id_t, packet_t *, services_t, services_t);
     
    504505        size_t offset;
    505506        uint32_t new_sequence_number;
     507        bool forced_ack;
    506508        int rc;
    507509
     
    512514        assert(packet);
    513515
     516        forced_ack = false;
     517
    514518        new_sequence_number = ntohl(header->sequence_number);
    515519        old_incoming = socket_data->next_incoming;
    516520
    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        }
    519525
    520526        /* Trim begining if containing expected data */
     
    760766                /* Release duplicite or restricted */
    761767                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 */
    767780                switch (socket_data->state) {
    768781                case TCP_SOCKET_FIN_WAIT_1:
     
    771784                        socket_data->state = TCP_SOCKET_CLOSING;
    772785                        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;
    774791                default:
    775792                        socket_data->state = TCP_SOCKET_CLOSE_WAIT;
     
    779796
    780797        packet = tcp_get_packets_to_send(socket, socket_data);
    781         if (!packet) {
     798        if (!packet && (socket_data->next_incoming != old_incoming || forced_ack)) {
    782799                /* Create the notification packet */
    783800                rc = tcp_create_notification_packet(&packet, socket,
     
    835852
    836853        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 */
     863static 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 */);
    837872}
    838873
Note: See TracChangeset for help on using the changeset viewer.