Ignore:
File:
1 edited

Legend:

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

    r6b82009 r9934f7d  
    3838#include <assert.h>
    3939#include <async.h>
     40#include <async_obsolete.h>
    4041#include <fibril_synch.h>
    4142#include <malloc.h>
     
    7374#include "tcp_header.h"
    7475
     76// FIXME: remove this header
     77#include <kernel/ipc/ipc_methods.h>
     78
    7579/** TCP module name. */
    7680#define NAME  "tcp"
     
    206210
    207211static int tcp_received_msg(device_id_t, packet_t *, services_t, services_t);
    208 static int tcp_process_client_messages(async_sess_t *, ipc_callid_t,
    209     ipc_call_t);
     212static int tcp_process_client_messages(ipc_callid_t, ipc_call_t);
    210213
    211214static int tcp_listen_message(socket_cores_t *, int, int);
     
    325328
    326329        if (!socket) {
    327                 if (tl_prepare_icmp_packet(tcp_globals.net_sess,
    328                     tcp_globals.icmp_sess, packet, error) == EOK) {
    329                         icmp_destination_unreachable_msg(tcp_globals.icmp_sess,
     330                if (tl_prepare_icmp_packet(tcp_globals.net_phone,
     331                    tcp_globals.icmp_phone, packet, error) == EOK) {
     332                        icmp_destination_unreachable_msg(tcp_globals.icmp_phone,
    330333                            ICMP_PORT_UNREACH, 0, packet);
    331334                }
     
    398401                fibril_rwlock_write_unlock(socket_data->local_lock);
    399402
    400                 rc = tl_prepare_icmp_packet(tcp_globals.net_sess,
    401                     tcp_globals.icmp_sess, packet, error);
     403                rc = tl_prepare_icmp_packet(tcp_globals.net_phone,
     404                    tcp_globals.icmp_phone, packet, error);
    402405                if (rc == EOK) {
    403406                        /* Checksum error ICMP */
    404                         icmp_parameter_problem_msg(tcp_globals.icmp_sess,
     407                        icmp_parameter_problem_msg(tcp_globals.icmp_phone,
    405408                            ICMP_PARAM_POINTER,
    406409                            ((size_t) ((void *) &header->checksum)) -
     
    440443                break;
    441444        default:
    442                 pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     445                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    443446        }
    444447
     
    503506                        /* Release the acknowledged packets */
    504507                        next_packet = pq_next(packet);
    505                         pq_release_remote(tcp_globals.net_sess,
     508                        pq_release_remote(tcp_globals.net_phone,
    506509                            packet_get_id(packet));
    507510                        packet = next_packet;
     
    562565                        next_packet = pq_next(next_packet);
    563566                        pq_insert_after(tmp_packet, next_packet);
    564                         pq_release_remote(tcp_globals.net_sess,
     567                        pq_release_remote(tcp_globals.net_phone,
    565568                            packet_get_id(tmp_packet));
    566569                }
     
    599602                                if (packet == socket_data->incoming)
    600603                                        socket_data->incoming = next_packet;
    601                                 pq_release_remote(tcp_globals.net_sess,
     604                                pq_release_remote(tcp_globals.net_phone,
    602605                                    packet_get_id(packet));
    603606                                packet = next_packet;
     
    622625                                if (length <= 0) {
    623626                                        /* Remove the empty packet */
    624                                         pq_release_remote(tcp_globals.net_sess,
     627                                        pq_release_remote(tcp_globals.net_phone,
    625628                                            packet_get_id(packet));
    626629                                        packet = next_packet;
     
    669672                                }
    670673                                /* Remove the duplicit or corrupted packet */
    671                                 pq_release_remote(tcp_globals.net_sess,
     674                                pq_release_remote(tcp_globals.net_phone,
    672675                                    packet_get_id(packet));
    673676                                packet = next_packet;
     
    696699                if (rc != EOK) {
    697700                        /* Remove the corrupted packets */
    698                         pq_release_remote(tcp_globals.net_sess,
     701                        pq_release_remote(tcp_globals.net_phone,
    699702                            packet_get_id(packet));
    700                         pq_release_remote(tcp_globals.net_sess,
     703                        pq_release_remote(tcp_globals.net_phone,
    701704                            packet_get_id(next_packet));
    702705                } else {
     
    709712                                    new_sequence_number, length);
    710713                                if (rc != EOK) {
    711                                         pq_release_remote(tcp_globals.net_sess,
     714                                        pq_release_remote(tcp_globals.net_phone,
    712715                                            packet_get_id(next_packet));
    713716                                }
    714717                                rc = pq_insert_after(packet, next_packet);
    715718                                if (rc != EOK) {
    716                                         pq_release_remote(tcp_globals.net_sess,
     719                                        pq_release_remote(tcp_globals.net_phone,
    717720                                            packet_get_id(next_packet));
    718721                                }
     
    723726                printf("unexpected\n");
    724727                /* Release duplicite or restricted */
    725                 pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     728                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    726729                forced_ack = true;
    727730        }
     
    791794        if (rc != EOK)
    792795                return tcp_release_and_return(packet, rc);
    793         rc = tl_get_ip_packet_dimension(tcp_globals.ip_sess,
     796        rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    794797            &tcp_globals.dimensions, socket_data->device_id, &packet_dimension);
    795798        if (rc != EOK)
     
    800803
    801804        /* Notify the destination socket */
    802         async_exch_t *exch = async_exchange_begin(socket->sess);
    803         async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t) socket->socket_id,
     805        async_obsolete_msg_5(socket->phone, NET_SOCKET_RECEIVED,
     806            (sysarg_t) socket->socket_id,
    804807            ((packet_dimension->content < socket_data->data_fragment_size) ?
    805808            packet_dimension->content : socket_data->data_fragment_size), 0, 0,
    806809            (sysarg_t) fragments);
    807         async_exchange_end(exch);
    808810
    809811        return EOK;
     
    822824
    823825        /* Notify the destination socket */
    824         async_exch_t *exch = async_exchange_begin(socket->sess);
    825         async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t) socket->socket_id,
    826             0, 0, 0, (sysarg_t) 0 /* 0 fragments == no more data */);
    827         async_exchange_end(exch);
     826        async_obsolete_msg_5(socket->phone, NET_SOCKET_RECEIVED,
     827            (sysarg_t) socket->socket_id,
     828            0, 0, 0,
     829            (sysarg_t) 0 /* 0 fragments == no more data */);
    828830}
    829831
     
    851853        next_packet = pq_detach(packet);
    852854        if (next_packet) {
    853                 pq_release_remote(tcp_globals.net_sess,
     855                pq_release_remote(tcp_globals.net_phone,
    854856                    packet_get_id(next_packet));
    855857        }
     
    938940        /* Create a socket */
    939941        socket_id = -1;
    940         rc = socket_create(socket_data->local_sockets, listening_socket->sess,
     942        rc = socket_create(socket_data->local_sockets, listening_socket->phone,
    941943            socket_data, &socket_id);
    942944        if (rc != EOK) {
     
    991993        fibril_rwlock_write_unlock(&tcp_globals.lock);
    992994        if (rc != EOK) {
    993                 socket_destroy(tcp_globals.net_sess, socket->socket_id,
     995                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    994996                    socket_data->local_sockets, &tcp_globals.sockets,
    995997                    tcp_free_socket_data);
     
    10031005        next_packet = pq_detach(packet);
    10041006        if (next_packet) {
    1005                 pq_release_remote(tcp_globals.net_sess,
     1007                pq_release_remote(tcp_globals.net_phone,
    10061008                    packet_get_id(next_packet));
    10071009        }
     
    10121014                    packet_get_data_length(packet) - sizeof(*header));
    10131015                if (rc != EOK) {
    1014                         socket_destroy(tcp_globals.net_sess, socket->socket_id,
     1016                        socket_destroy(tcp_globals.net_phone, socket->socket_id,
    10151017                            socket_data->local_sockets, &tcp_globals.sockets,
    10161018                            tcp_free_socket_data);
     
    10231025        rc = tcp_queue_packet(socket, socket_data, packet, 1);
    10241026        if (rc != EOK) {
    1025                 socket_destroy(tcp_globals.net_sess, socket->socket_id,
     1027                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    10261028                    socket_data->local_sockets, &tcp_globals.sockets,
    10271029                    tcp_free_socket_data);
     
    10311033        packet = tcp_get_packets_to_send(socket, socket_data);
    10321034        if (!packet) {
    1033                 socket_destroy(tcp_globals.net_sess, socket->socket_id,
     1035                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    10341036                    socket_data->local_sockets, &tcp_globals.sockets,
    10351037                    tcp_free_socket_data);
     
    10661068
    10671069        socket_data->next_incoming = ntohl(header->sequence_number); /* + 1; */
    1068         pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     1070        pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    10691071        socket_data->state = TCP_SOCKET_ESTABLISHED;
    10701072        listening_socket = socket_cores_find(socket_data->local_sockets,
     
    10801082                if (rc == EOK) {
    10811083                        /* Notify the destination socket */
    1082                         async_exch_t *exch = async_exchange_begin(socket->sess);
    1083                         async_msg_5(exch, NET_SOCKET_ACCEPTED,
     1084                        async_obsolete_msg_5(socket->phone, NET_SOCKET_ACCEPTED,
    10841085                            (sysarg_t) listening_socket->socket_id,
    10851086                            socket_data->data_fragment_size, TCP_HEADER_SIZE,
    10861087                            0, (sysarg_t) socket->socket_id);
    1087                         async_exchange_end(exch);
    10881088
    10891089                        fibril_rwlock_write_unlock(socket_data->local_lock);
     
    11811181                                /* Add to acknowledged or release */
    11821182                                if (pq_add(&acknowledged, packet, 0, 0) != EOK)
    1183                                         pq_release_remote(tcp_globals.net_sess,
     1183                                        pq_release_remote(tcp_globals.net_phone,
    11841184                                            packet_get_id(packet));
    11851185                                packet = next;
     
    11901190                /* Release acknowledged */
    11911191                if (acknowledged) {
    1192                         pq_release_remote(tcp_globals.net_sess,
     1192                        pq_release_remote(tcp_globals.net_phone,
    11931193                            packet_get_id(acknowledged));
    11941194                }
     
    12341234        assert(answer);
    12351235        assert(answer_count);
    1236        
     1236
    12371237        *answer_count = 0;
    1238        
    1239         async_sess_t *callback =
    1240             async_callback_receive_start(EXCHANGE_SERIALIZE, call);
    1241         if (callback)
    1242                 return tcp_process_client_messages(callback, callid, *call);
    1243        
     1238        switch (IPC_GET_IMETHOD(*call)) {
     1239        case IPC_M_CONNECT_TO_ME:
     1240                return tcp_process_client_messages(callid, *call);
     1241        }
     1242
    12441243        return ENOTSUP;
    12451244}
     
    12711270}
    12721271
    1273 int tcp_process_client_messages(async_sess_t *sess, ipc_callid_t callid,
    1274     ipc_call_t call)
     1272int tcp_process_client_messages(ipc_callid_t callid, ipc_call_t call)
    12751273{
    12761274        int res;
    12771275        socket_cores_t local_sockets;
     1276        int app_phone = IPC_GET_PHONE(call);
    12781277        struct sockaddr *addr;
    12791278        int socket_id;
     
    13261325                        fibril_rwlock_write_lock(&lock);
    13271326                        socket_id = SOCKET_GET_SOCKET_ID(call);
    1328                         res = socket_create(&local_sockets, sess,
     1327                        res = socket_create(&local_sockets, app_phone,
    13291328                            socket_data, &socket_id);
    13301329                        SOCKET_SET_SOCKET_ID(answer, socket_id);
     
    13341333                                break;
    13351334                        }
    1336                         if (tl_get_ip_packet_dimension(tcp_globals.ip_sess,
     1335                        if (tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    13371336                            &tcp_globals.dimensions, DEVICE_INVALID_ID,
    13381337                            &packet_dimension) == EOK) {
     
    15091508        }
    15101509
    1511         /* Release the application session */
    1512         async_hangup(sess);
     1510        /* Release the application phone */
     1511        async_obsolete_hangup(app_phone);
    15131512
    15141513        printf("release\n");
    15151514        /* Release all local sockets */
    1516         socket_cores_release(tcp_globals.net_sess, &local_sockets,
     1515        socket_cores_release(tcp_globals.net_phone, &local_sockets,
    15171516            &tcp_globals.sockets, tcp_free_socket_data);
    15181517
     
    16221621                        local_lock = socket_data->local_lock;
    16231622                        fibril_rwlock_write_lock(local_lock);
    1624                         socket_destroy(tcp_globals.net_sess,
     1623                        socket_destroy(tcp_globals.net_phone,
    16251624                            timeout->socket_id, timeout->local_sockets,
    16261625                            &tcp_globals.sockets, tcp_free_socket_data);
     
    17551754        }
    17561755
    1757         rc = ip_get_route_req(tcp_globals.ip_sess, IPPROTO_TCP,
     1756        rc = ip_get_route_req(tcp_globals.ip_phone, IPPROTO_TCP,
    17581757            addr, addrlen, &socket_data->device_id,
    17591758            &socket_data->pseudo_header, &socket_data->headerlen);
     
    19031902                        rc = pq_insert_after(previous, copy);
    19041903                        if (rc != EOK) {
    1905                                 pq_release_remote(tcp_globals.net_sess,
     1904                                pq_release_remote(tcp_globals.net_phone,
    19061905                                    packet_get_id(copy));
    19071906                                return sending;
     
    19401939            socket_data->headerlen, packet_get_data_length(packet));
    19411940        if (rc != EOK) {
    1942                 pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     1941                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19431942                return NULL;
    19441943        }
     
    19471946        header = (tcp_header_t *) packet_get_data(packet);
    19481947        if (!header) {
    1949                 pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     1948                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19501949                return NULL;
    19511950        }
     
    19721971        rc = ip_client_prepare_packet(packet, IPPROTO_TCP, 0, 0, 0, 0);
    19731972        if (rc != EOK) {
    1974                 pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     1973                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19751974                return NULL;
    19761975        }
     
    19791978            sequence_number, socket_data->state, socket_data->timeout, true);
    19801979        if (rc != EOK) {
    1981                 pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     1980                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19821981                return NULL;
    19831982        }
     
    19961995
    19971996        /* Make a copy of the packet */
    1998         copy = packet_get_copy(tcp_globals.net_sess, packet);
     1997        copy = packet_get_copy(tcp_globals.net_phone, packet);
    19991998        if (!copy)
    20001999                return NULL;
     
    20102009        while (packet) {
    20112010                next = pq_detach(packet);
    2012                 ip_send_msg(tcp_globals.ip_sess, device_id, packet,
     2011                ip_send_msg(tcp_globals.ip_phone, device_id, packet,
    20132012                    SERVICE_TCP, 0);
    20142013                packet = next;
     
    21232122                return NO_DATA;
    21242123
    2125         rc = packet_translate_remote(tcp_globals.net_sess, &packet, packet_id);
     2124        rc = packet_translate_remote(tcp_globals.net_phone, &packet, packet_id);
    21262125        if (rc != EOK)
    21272126                return rc;
     
    21342133        /* Release the packet */
    21352134        dyn_fifo_pop(&socket->received);
    2136         pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     2135        pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    21372136
    21382137        /* Return the total length */
     
    21722171                return ENOTCONN;
    21732172
    2174         rc = tl_get_ip_packet_dimension(tcp_globals.ip_sess,
     2173        rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    21752174            &tcp_globals.dimensions, socket_data->device_id, &packet_dimension);
    21762175        if (rc != EOK)
     
    21832182        for (index = 0; index < fragments; index++) {
    21842183                /* Read the data fragment */
    2185                 result = tl_socket_read_packet_data(tcp_globals.net_sess,
     2184                result = tl_socket_read_packet_data(tcp_globals.net_phone,
    21862185                    &packet, TCP_HEADER_SIZE, packet_dimension,
    21872186                    socket_data->addr, socket_data->addrlen);
     
    22462245        default:
    22472246                /* Just destroy */
    2248                 rc = socket_destroy(tcp_globals.net_sess, socket_id,
     2247                rc = socket_destroy(tcp_globals.net_phone, socket_id,
    22492248                    local_sockets, &tcp_globals.sockets,
    22502249                    tcp_free_socket_data);
     
    22942293
    22952294        /* Get the device packet dimension */
    2296         rc = tl_get_ip_packet_dimension(tcp_globals.ip_sess,
     2295        rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    22972296            &tcp_globals.dimensions, socket_data->device_id, &packet_dimension);
    22982297        if (rc != EOK)
     
    23002299
    23012300        /* Get a new packet */
    2302         *packet = packet_get_4_remote(tcp_globals.net_sess, TCP_HEADER_SIZE,
     2301        *packet = packet_get_4_remote(tcp_globals.net_phone, TCP_HEADER_SIZE,
    23032302            packet_dimension->addr_len, packet_dimension->prefix,
    23042303            packet_dimension->suffix);
     
    23632362                        if (rc != EOK)
    23642363                                return rc;
    2365                         rc = tl_get_ip_packet_dimension(tcp_globals.ip_sess,
     2364                        rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    23662365                            &tcp_globals.dimensions, socket_data->device_id,
    23672366                            &packet_dimension);
     
    24352434int tcp_release_and_return(packet_t *packet, int result)
    24362435{
    2437         pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     2436        pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    24382437        return result;
    24392438}
     
    24442443 * @param[in,out] icall Message parameters.
    24452444 * @param[in]     arg   Local argument.
    2446  *
    24472445 */
    24482446static void tcp_receiver(ipc_callid_t iid, ipc_call_t *icall, void *arg)
     
    24542452                switch (IPC_GET_IMETHOD(*icall)) {
    24552453                case NET_TL_RECEIVED:
    2456                         rc = packet_translate_remote(tcp_globals.net_sess, &packet,
     2454                        rc = packet_translate_remote(tcp_globals.net_phone, &packet,
    24572455                            IPC_GET_PACKET(*icall));
    24582456                        if (rc == EOK)
     
    24722470/** Initialize the TCP module.
    24732471 *
    2474  * @param[in] sess Network module session.
     2472 * @param[in] net_phone Network module phone.
    24752473 *
    24762474 * @return EOK on success.
     
    24782476 *
    24792477 */
    2480 int tl_initialize(async_sess_t *sess)
     2478int tl_initialize(int net_phone)
    24812479{
    24822480        fibril_rwlock_initialize(&tcp_globals.lock);
    24832481        fibril_rwlock_write_lock(&tcp_globals.lock);
    24842482       
    2485         tcp_globals.net_sess = sess;
     2483        tcp_globals.net_phone = net_phone;
    24862484       
    2487         tcp_globals.icmp_sess = icmp_connect_module();
    2488         tcp_globals.ip_sess = ip_bind_service(SERVICE_IP, IPPROTO_TCP,
     2485        tcp_globals.icmp_phone = icmp_connect_module(ICMP_CONNECT_TIMEOUT);
     2486        tcp_globals.ip_phone = ip_bind_service(SERVICE_IP, IPPROTO_TCP,
    24892487            SERVICE_TCP, tcp_receiver);
    2490         if (tcp_globals.ip_sess == NULL) {
     2488        if (tcp_globals.ip_phone < 0) {
    24912489                fibril_rwlock_write_unlock(&tcp_globals.lock);
    2492                 return ENOENT;
     2490                return tcp_globals.ip_phone;
    24932491        }
    24942492       
Note: See TracChangeset for help on using the changeset viewer.