Ignore:
File:
1 edited

Legend:

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

    r6b82009 r0743493a  
    206206
    207207static 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);
     208static int tcp_process_client_messages(ipc_callid_t, ipc_call_t);
    210209
    211210static int tcp_listen_message(socket_cores_t *, int, int);
     
    325324
    326325        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,
     326                if (tl_prepare_icmp_packet(tcp_globals.net_phone,
     327                    tcp_globals.icmp_phone, packet, error) == EOK) {
     328                        icmp_destination_unreachable_msg(tcp_globals.icmp_phone,
    330329                            ICMP_PORT_UNREACH, 0, packet);
    331330                }
     
    398397                fibril_rwlock_write_unlock(socket_data->local_lock);
    399398
    400                 rc = tl_prepare_icmp_packet(tcp_globals.net_sess,
    401                     tcp_globals.icmp_sess, packet, error);
     399                rc = tl_prepare_icmp_packet(tcp_globals.net_phone,
     400                    tcp_globals.icmp_phone, packet, error);
    402401                if (rc == EOK) {
    403402                        /* Checksum error ICMP */
    404                         icmp_parameter_problem_msg(tcp_globals.icmp_sess,
     403                        icmp_parameter_problem_msg(tcp_globals.icmp_phone,
    405404                            ICMP_PARAM_POINTER,
    406405                            ((size_t) ((void *) &header->checksum)) -
     
    440439                break;
    441440        default:
    442                 pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     441                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    443442        }
    444443
     
    503502                        /* Release the acknowledged packets */
    504503                        next_packet = pq_next(packet);
    505                         pq_release_remote(tcp_globals.net_sess,
     504                        pq_release_remote(tcp_globals.net_phone,
    506505                            packet_get_id(packet));
    507506                        packet = next_packet;
     
    562561                        next_packet = pq_next(next_packet);
    563562                        pq_insert_after(tmp_packet, next_packet);
    564                         pq_release_remote(tcp_globals.net_sess,
     563                        pq_release_remote(tcp_globals.net_phone,
    565564                            packet_get_id(tmp_packet));
    566565                }
     
    599598                                if (packet == socket_data->incoming)
    600599                                        socket_data->incoming = next_packet;
    601                                 pq_release_remote(tcp_globals.net_sess,
     600                                pq_release_remote(tcp_globals.net_phone,
    602601                                    packet_get_id(packet));
    603602                                packet = next_packet;
     
    622621                                if (length <= 0) {
    623622                                        /* Remove the empty packet */
    624                                         pq_release_remote(tcp_globals.net_sess,
     623                                        pq_release_remote(tcp_globals.net_phone,
    625624                                            packet_get_id(packet));
    626625                                        packet = next_packet;
     
    669668                                }
    670669                                /* Remove the duplicit or corrupted packet */
    671                                 pq_release_remote(tcp_globals.net_sess,
     670                                pq_release_remote(tcp_globals.net_phone,
    672671                                    packet_get_id(packet));
    673672                                packet = next_packet;
     
    696695                if (rc != EOK) {
    697696                        /* Remove the corrupted packets */
    698                         pq_release_remote(tcp_globals.net_sess,
     697                        pq_release_remote(tcp_globals.net_phone,
    699698                            packet_get_id(packet));
    700                         pq_release_remote(tcp_globals.net_sess,
     699                        pq_release_remote(tcp_globals.net_phone,
    701700                            packet_get_id(next_packet));
    702701                } else {
     
    709708                                    new_sequence_number, length);
    710709                                if (rc != EOK) {
    711                                         pq_release_remote(tcp_globals.net_sess,
     710                                        pq_release_remote(tcp_globals.net_phone,
    712711                                            packet_get_id(next_packet));
    713712                                }
    714713                                rc = pq_insert_after(packet, next_packet);
    715714                                if (rc != EOK) {
    716                                         pq_release_remote(tcp_globals.net_sess,
     715                                        pq_release_remote(tcp_globals.net_phone,
    717716                                            packet_get_id(next_packet));
    718717                                }
     
    723722                printf("unexpected\n");
    724723                /* Release duplicite or restricted */
    725                 pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     724                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    726725                forced_ack = true;
    727726        }
     
    791790        if (rc != EOK)
    792791                return tcp_release_and_return(packet, rc);
    793         rc = tl_get_ip_packet_dimension(tcp_globals.ip_sess,
     792        rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    794793            &tcp_globals.dimensions, socket_data->device_id, &packet_dimension);
    795794        if (rc != EOK)
     
    800799
    801800        /* 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,
     801        async_msg_5(socket->phone, NET_SOCKET_RECEIVED,
     802            (sysarg_t) socket->socket_id,
    804803            ((packet_dimension->content < socket_data->data_fragment_size) ?
    805804            packet_dimension->content : socket_data->data_fragment_size), 0, 0,
    806805            (sysarg_t) fragments);
    807         async_exchange_end(exch);
    808806
    809807        return EOK;
     
    822820
    823821        /* 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);
     822        async_msg_5(socket->phone, NET_SOCKET_RECEIVED,
     823            (sysarg_t) socket->socket_id,
     824            0, 0, 0,
     825            (sysarg_t) 0 /* 0 fragments == no more data */);
    828826}
    829827
     
    851849        next_packet = pq_detach(packet);
    852850        if (next_packet) {
    853                 pq_release_remote(tcp_globals.net_sess,
     851                pq_release_remote(tcp_globals.net_phone,
    854852                    packet_get_id(next_packet));
    855853        }
     
    938936        /* Create a socket */
    939937        socket_id = -1;
    940         rc = socket_create(socket_data->local_sockets, listening_socket->sess,
     938        rc = socket_create(socket_data->local_sockets, listening_socket->phone,
    941939            socket_data, &socket_id);
    942940        if (rc != EOK) {
     
    991989        fibril_rwlock_write_unlock(&tcp_globals.lock);
    992990        if (rc != EOK) {
    993                 socket_destroy(tcp_globals.net_sess, socket->socket_id,
     991                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    994992                    socket_data->local_sockets, &tcp_globals.sockets,
    995993                    tcp_free_socket_data);
     
    10031001        next_packet = pq_detach(packet);
    10041002        if (next_packet) {
    1005                 pq_release_remote(tcp_globals.net_sess,
     1003                pq_release_remote(tcp_globals.net_phone,
    10061004                    packet_get_id(next_packet));
    10071005        }
     
    10121010                    packet_get_data_length(packet) - sizeof(*header));
    10131011                if (rc != EOK) {
    1014                         socket_destroy(tcp_globals.net_sess, socket->socket_id,
     1012                        socket_destroy(tcp_globals.net_phone, socket->socket_id,
    10151013                            socket_data->local_sockets, &tcp_globals.sockets,
    10161014                            tcp_free_socket_data);
     
    10231021        rc = tcp_queue_packet(socket, socket_data, packet, 1);
    10241022        if (rc != EOK) {
    1025                 socket_destroy(tcp_globals.net_sess, socket->socket_id,
     1023                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    10261024                    socket_data->local_sockets, &tcp_globals.sockets,
    10271025                    tcp_free_socket_data);
     
    10311029        packet = tcp_get_packets_to_send(socket, socket_data);
    10321030        if (!packet) {
    1033                 socket_destroy(tcp_globals.net_sess, socket->socket_id,
     1031                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    10341032                    socket_data->local_sockets, &tcp_globals.sockets,
    10351033                    tcp_free_socket_data);
     
    10661064
    10671065        socket_data->next_incoming = ntohl(header->sequence_number); /* + 1; */
    1068         pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     1066        pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    10691067        socket_data->state = TCP_SOCKET_ESTABLISHED;
    10701068        listening_socket = socket_cores_find(socket_data->local_sockets,
     
    10801078                if (rc == EOK) {
    10811079                        /* Notify the destination socket */
    1082                         async_exch_t *exch = async_exchange_begin(socket->sess);
    1083                         async_msg_5(exch, NET_SOCKET_ACCEPTED,
     1080                        async_msg_5(socket->phone, NET_SOCKET_ACCEPTED,
    10841081                            (sysarg_t) listening_socket->socket_id,
    10851082                            socket_data->data_fragment_size, TCP_HEADER_SIZE,
    10861083                            0, (sysarg_t) socket->socket_id);
    1087                         async_exchange_end(exch);
    10881084
    10891085                        fibril_rwlock_write_unlock(socket_data->local_lock);
     
    11811177                                /* Add to acknowledged or release */
    11821178                                if (pq_add(&acknowledged, packet, 0, 0) != EOK)
    1183                                         pq_release_remote(tcp_globals.net_sess,
     1179                                        pq_release_remote(tcp_globals.net_phone,
    11841180                                            packet_get_id(packet));
    11851181                                packet = next;
     
    11901186                /* Release acknowledged */
    11911187                if (acknowledged) {
    1192                         pq_release_remote(tcp_globals.net_sess,
     1188                        pq_release_remote(tcp_globals.net_phone,
    11931189                            packet_get_id(acknowledged));
    11941190                }
     
    12341230        assert(answer);
    12351231        assert(answer_count);
    1236        
     1232
    12371233        *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        
     1234        switch (IPC_GET_IMETHOD(*call)) {
     1235        case IPC_M_CONNECT_TO_ME:
     1236                return tcp_process_client_messages(callid, *call);
     1237        }
     1238
    12441239        return ENOTSUP;
    12451240}
     
    12711266}
    12721267
    1273 int tcp_process_client_messages(async_sess_t *sess, ipc_callid_t callid,
    1274     ipc_call_t call)
     1268int tcp_process_client_messages(ipc_callid_t callid, ipc_call_t call)
    12751269{
    12761270        int res;
     1271        bool keep_on_going = true;
    12771272        socket_cores_t local_sockets;
     1273        int app_phone = IPC_GET_PHONE(call);
    12781274        struct sockaddr *addr;
    12791275        int socket_id;
     
    12971293        fibril_rwlock_initialize(&lock);
    12981294
    1299         while (true) {
     1295        while (keep_on_going) {
    13001296
    13011297                /* Answer the call */
     
    13051301                /* Get the next call */
    13061302                callid = async_get_call(&call);
    1307                
    1308                 if (!IPC_GET_IMETHOD(call)) {
     1303
     1304                /* Process the call */
     1305                switch (IPC_GET_IMETHOD(call)) {
     1306                case IPC_M_PHONE_HUNGUP:
     1307                        keep_on_going = false;
    13091308                        res = EHANGUP;
    13101309                        break;
    1311                 }
    1312 
    1313                 /* Process the call */
    1314                 switch (IPC_GET_IMETHOD(call)) {
     1310
    13151311                case NET_SOCKET:
    13161312                        socket_data =
     
    13261322                        fibril_rwlock_write_lock(&lock);
    13271323                        socket_id = SOCKET_GET_SOCKET_ID(call);
    1328                         res = socket_create(&local_sockets, sess,
     1324                        res = socket_create(&local_sockets, app_phone,
    13291325                            socket_data, &socket_id);
    13301326                        SOCKET_SET_SOCKET_ID(answer, socket_id);
     
    13341330                                break;
    13351331                        }
    1336                         if (tl_get_ip_packet_dimension(tcp_globals.ip_sess,
     1332                        if (tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    13371333                            &tcp_globals.dimensions, DEVICE_INVALID_ID,
    13381334                            &packet_dimension) == EOK) {
     
    15091505        }
    15101506
    1511         /* Release the application session */
    1512         async_hangup(sess);
     1507        /* Release the application phone */
     1508        async_hangup(app_phone);
    15131509
    15141510        printf("release\n");
    15151511        /* Release all local sockets */
    1516         socket_cores_release(tcp_globals.net_sess, &local_sockets,
     1512        socket_cores_release(tcp_globals.net_phone, &local_sockets,
    15171513            &tcp_globals.sockets, tcp_free_socket_data);
    15181514
     
    16221618                        local_lock = socket_data->local_lock;
    16231619                        fibril_rwlock_write_lock(local_lock);
    1624                         socket_destroy(tcp_globals.net_sess,
     1620                        socket_destroy(tcp_globals.net_phone,
    16251621                            timeout->socket_id, timeout->local_sockets,
    16261622                            &tcp_globals.sockets, tcp_free_socket_data);
     
    17551751        }
    17561752
    1757         rc = ip_get_route_req(tcp_globals.ip_sess, IPPROTO_TCP,
     1753        rc = ip_get_route_req(tcp_globals.ip_phone, IPPROTO_TCP,
    17581754            addr, addrlen, &socket_data->device_id,
    17591755            &socket_data->pseudo_header, &socket_data->headerlen);
     
    19031899                        rc = pq_insert_after(previous, copy);
    19041900                        if (rc != EOK) {
    1905                                 pq_release_remote(tcp_globals.net_sess,
     1901                                pq_release_remote(tcp_globals.net_phone,
    19061902                                    packet_get_id(copy));
    19071903                                return sending;
     
    19401936            socket_data->headerlen, packet_get_data_length(packet));
    19411937        if (rc != EOK) {
    1942                 pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     1938                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19431939                return NULL;
    19441940        }
     
    19471943        header = (tcp_header_t *) packet_get_data(packet);
    19481944        if (!header) {
    1949                 pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     1945                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19501946                return NULL;
    19511947        }
     
    19721968        rc = ip_client_prepare_packet(packet, IPPROTO_TCP, 0, 0, 0, 0);
    19731969        if (rc != EOK) {
    1974                 pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     1970                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19751971                return NULL;
    19761972        }
     
    19791975            sequence_number, socket_data->state, socket_data->timeout, true);
    19801976        if (rc != EOK) {
    1981                 pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     1977                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19821978                return NULL;
    19831979        }
     
    19961992
    19971993        /* Make a copy of the packet */
    1998         copy = packet_get_copy(tcp_globals.net_sess, packet);
     1994        copy = packet_get_copy(tcp_globals.net_phone, packet);
    19991995        if (!copy)
    20001996                return NULL;
     
    20102006        while (packet) {
    20112007                next = pq_detach(packet);
    2012                 ip_send_msg(tcp_globals.ip_sess, device_id, packet,
     2008                ip_send_msg(tcp_globals.ip_phone, device_id, packet,
    20132009                    SERVICE_TCP, 0);
    20142010                packet = next;
     
    21232119                return NO_DATA;
    21242120
    2125         rc = packet_translate_remote(tcp_globals.net_sess, &packet, packet_id);
     2121        rc = packet_translate_remote(tcp_globals.net_phone, &packet, packet_id);
    21262122        if (rc != EOK)
    21272123                return rc;
     
    21342130        /* Release the packet */
    21352131        dyn_fifo_pop(&socket->received);
    2136         pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     2132        pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    21372133
    21382134        /* Return the total length */
     
    21722168                return ENOTCONN;
    21732169
    2174         rc = tl_get_ip_packet_dimension(tcp_globals.ip_sess,
     2170        rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    21752171            &tcp_globals.dimensions, socket_data->device_id, &packet_dimension);
    21762172        if (rc != EOK)
     
    21832179        for (index = 0; index < fragments; index++) {
    21842180                /* Read the data fragment */
    2185                 result = tl_socket_read_packet_data(tcp_globals.net_sess,
     2181                result = tl_socket_read_packet_data(tcp_globals.net_phone,
    21862182                    &packet, TCP_HEADER_SIZE, packet_dimension,
    21872183                    socket_data->addr, socket_data->addrlen);
     
    22462242        default:
    22472243                /* Just destroy */
    2248                 rc = socket_destroy(tcp_globals.net_sess, socket_id,
     2244                rc = socket_destroy(tcp_globals.net_phone, socket_id,
    22492245                    local_sockets, &tcp_globals.sockets,
    22502246                    tcp_free_socket_data);
     
    22942290
    22952291        /* Get the device packet dimension */
    2296         rc = tl_get_ip_packet_dimension(tcp_globals.ip_sess,
     2292        rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    22972293            &tcp_globals.dimensions, socket_data->device_id, &packet_dimension);
    22982294        if (rc != EOK)
     
    23002296
    23012297        /* Get a new packet */
    2302         *packet = packet_get_4_remote(tcp_globals.net_sess, TCP_HEADER_SIZE,
     2298        *packet = packet_get_4_remote(tcp_globals.net_phone, TCP_HEADER_SIZE,
    23032299            packet_dimension->addr_len, packet_dimension->prefix,
    23042300            packet_dimension->suffix);
     
    23632359                        if (rc != EOK)
    23642360                                return rc;
    2365                         rc = tl_get_ip_packet_dimension(tcp_globals.ip_sess,
     2361                        rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    23662362                            &tcp_globals.dimensions, socket_data->device_id,
    23672363                            &packet_dimension);
     
    24352431int tcp_release_and_return(packet_t *packet, int result)
    24362432{
    2437         pq_release_remote(tcp_globals.net_sess, packet_get_id(packet));
     2433        pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    24382434        return result;
    24392435}
     
    24432439 * @param[in]     iid   Message identifier.
    24442440 * @param[in,out] icall Message parameters.
    2445  * @param[in]     arg   Local argument.
    24462441 *
    24472442 */
    2448 static void tcp_receiver(ipc_callid_t iid, ipc_call_t *icall, void *arg)
     2443static void tcp_receiver(ipc_callid_t iid, ipc_call_t *icall)
    24492444{
    24502445        packet_t *packet;
     
    24542449                switch (IPC_GET_IMETHOD(*icall)) {
    24552450                case NET_TL_RECEIVED:
    2456                         rc = packet_translate_remote(tcp_globals.net_sess, &packet,
     2451                        rc = packet_translate_remote(tcp_globals.net_phone, &packet,
    24572452                            IPC_GET_PACKET(*icall));
    24582453                        if (rc == EOK)
     
    24722467/** Initialize the TCP module.
    24732468 *
    2474  * @param[in] sess Network module session.
     2469 * @param[in] net_phone Network module phone.
    24752470 *
    24762471 * @return EOK on success.
     
    24782473 *
    24792474 */
    2480 int tl_initialize(async_sess_t *sess)
     2475int tl_initialize(int net_phone)
    24812476{
    24822477        fibril_rwlock_initialize(&tcp_globals.lock);
    24832478        fibril_rwlock_write_lock(&tcp_globals.lock);
    24842479       
    2485         tcp_globals.net_sess = sess;
     2480        tcp_globals.net_phone = net_phone;
    24862481       
    2487         tcp_globals.icmp_sess = icmp_connect_module();
    2488         tcp_globals.ip_sess = ip_bind_service(SERVICE_IP, IPPROTO_TCP,
     2482        tcp_globals.icmp_phone = icmp_connect_module(ICMP_CONNECT_TIMEOUT);
     2483        tcp_globals.ip_phone = ip_bind_service(SERVICE_IP, IPPROTO_TCP,
    24892484            SERVICE_TCP, tcp_receiver);
    2490         if (tcp_globals.ip_sess == NULL) {
     2485        if (tcp_globals.ip_phone < 0) {
    24912486                fibril_rwlock_write_unlock(&tcp_globals.lock);
    2492                 return ENOENT;
     2487                return tcp_globals.ip_phone;
    24932488        }
    24942489       
Note: See TracChangeset for help on using the changeset viewer.