Ignore:
File:
1 edited

Legend:

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

    r6b82009 r9934f7d  
    3737
    3838#include <async.h>
     39#include <async_obsolete.h>
    3940#include <fibril_synch.h>
    4041#include <malloc.h>
     
    7071#include "udp_header.h"
    7172
     73// FIXME: remove this header
     74#include <kernel/ipc/ipc_methods.h>
     75
    7276/** UDP module name. */
    7377#define NAME  "udp"
     
    99103static int udp_release_and_return(packet_t *packet, int result)
    100104{
    101         pq_release_remote(udp_globals.net_sess, packet_get_id(packet));
     105        pq_release_remote(udp_globals.net_phone, packet_get_id(packet));
    102106        return result;
    103107}
     
    192196            ntohs(header->destination_port), (uint8_t *) SOCKET_MAP_KEY_LISTENING, 0);
    193197        if (!socket) {
    194                 if (tl_prepare_icmp_packet(udp_globals.net_sess,
    195                     udp_globals.icmp_sess, packet, error) == EOK) {
    196                         icmp_destination_unreachable_msg(udp_globals.icmp_sess,
     198                if (tl_prepare_icmp_packet(udp_globals.net_phone,
     199                    udp_globals.icmp_phone, packet, error) == EOK) {
     200                        icmp_destination_unreachable_msg(udp_globals.icmp_phone,
    197201                            ICMP_PORT_UNREACH, 0, packet);
    198202                }
     
    251255                        while (tmp_packet) {
    252256                                next_packet = pq_detach(tmp_packet);
    253                                 pq_release_remote(udp_globals.net_sess,
     257                                pq_release_remote(udp_globals.net_phone,
    254258                                    packet_get_id(tmp_packet));
    255259                                tmp_packet = next_packet;
     
    274278                if (flip_checksum(compact_checksum(checksum)) !=
    275279                    IP_CHECKSUM_ZERO) {
    276                         if (tl_prepare_icmp_packet(udp_globals.net_sess,
    277                             udp_globals.icmp_sess, packet, error) == EOK) {
     280                        if (tl_prepare_icmp_packet(udp_globals.net_phone,
     281                            udp_globals.icmp_phone, packet, error) == EOK) {
    278282                                /* Checksum error ICMP */
    279283                                icmp_parameter_problem_msg(
    280                                     udp_globals.icmp_sess, ICMP_PARAM_POINTER,
     284                                    udp_globals.icmp_phone, ICMP_PARAM_POINTER,
    281285                                    ((size_t) ((void *) &header->checksum)) -
    282286                                    ((size_t) ((void *) header)), packet);
     
    292296                return udp_release_and_return(packet, rc);
    293297               
    294         rc = tl_get_ip_packet_dimension(udp_globals.ip_sess,
     298        rc = tl_get_ip_packet_dimension(udp_globals.ip_phone,
    295299            &udp_globals.dimensions, device_id, &packet_dimension);
    296300        if (rc != EOK)
     
    299303        /* Notify the destination socket */
    300304        fibril_rwlock_write_unlock(&udp_globals.lock);
    301        
    302         async_exch_t *exch = async_exchange_begin(socket->sess);
    303         async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t) socket->socket_id,
    304             packet_dimension->content, 0, 0, (sysarg_t) fragments);
    305         async_exchange_end(exch);
     305        async_obsolete_msg_5(socket->phone, NET_SOCKET_RECEIVED,
     306            (sysarg_t) socket->socket_id, packet_dimension->content, 0, 0,
     307            (sysarg_t) fragments);
    306308
    307309        return EOK;
     
    340342 * @param[in,out] icall Message parameters.
    341343 * @param[in]     arg   Local argument.
    342  *
    343344 */
    344345static void udp_receiver(ipc_callid_t iid, ipc_call_t *icall, void *arg)
     
    350351                switch (IPC_GET_IMETHOD(*icall)) {
    351352                case NET_TL_RECEIVED:
    352                         rc = packet_translate_remote(udp_globals.net_sess, &packet,
     353                        rc = packet_translate_remote(udp_globals.net_phone, &packet,
    353354                            IPC_GET_PACKET(*icall));
    354355                        if (rc == EOK)
     
    368369/** Initialize the UDP module.
    369370 *
    370  * @param[in] sess Network module session.
     371 * @param[in] net_phone Network module phone.
    371372 *
    372373 * @return EOK on success.
     
    374375 *
    375376 */
    376 int tl_initialize(async_sess_t *sess)
     377int tl_initialize(int net_phone)
    377378{
    378379        measured_string_t names[] = {
     
    393394        fibril_rwlock_write_lock(&udp_globals.lock);
    394395       
    395         udp_globals.net_sess = sess;
    396         udp_globals.icmp_sess = icmp_connect_module();
    397        
    398         udp_globals.ip_sess = ip_bind_service(SERVICE_IP, IPPROTO_UDP,
    399              SERVICE_UDP, udp_receiver);
    400         if (udp_globals.ip_sess == NULL) {
    401             fibril_rwlock_write_unlock(&udp_globals.lock);
    402             return ENOENT;
     396        udp_globals.net_phone = net_phone;
     397       
     398        udp_globals.icmp_phone = icmp_connect_module(ICMP_CONNECT_TIMEOUT);
     399       
     400        udp_globals.ip_phone = ip_bind_service(SERVICE_IP, IPPROTO_UDP,
     401            SERVICE_UDP, udp_receiver);
     402        if (udp_globals.ip_phone < 0) {
     403                fibril_rwlock_write_unlock(&udp_globals.lock);
     404                return udp_globals.ip_phone;
    403405        }
    404406       
    405407        /* Read default packet dimensions */
    406         int rc = ip_packet_size_req(udp_globals.ip_sess, -1,
     408        int rc = ip_packet_size_req(udp_globals.ip_phone, -1,
    407409            &udp_globals.packet_dimension);
    408410        if (rc != EOK) {
     
    433435        /* Get configuration */
    434436        configuration = &names[0];
    435         rc = net_get_conf_req(udp_globals.net_sess, &configuration, count,
     437        rc = net_get_conf_req(udp_globals.net_phone, &configuration, count,
    436438            &data);
    437439        if (rc != EOK) {
     
    527529
    528530        if (udp_globals.checksum_computing) {
    529                 rc = ip_get_route_req(udp_globals.ip_sess, IPPROTO_UDP, addr,
     531                rc = ip_get_route_req(udp_globals.ip_phone, IPPROTO_UDP, addr,
    530532                    addrlen, &device_id, &ip_header, &headerlen);
    531533                if (rc != EOK)
    532534                        return rc;
    533535                /* Get the device packet dimension */
    534 //              rc = tl_get_ip_packet_dimension(udp_globals.ip_sess,
     536//              rc = tl_get_ip_packet_dimension(udp_globals.ip_phone,
    535537//                  &udp_globals.dimensions, device_id, &packet_dimension);
    536538//              if (rc != EOK)
     
    539541//      } else {
    540542                /* Do not ask all the time */
    541                 rc = ip_packet_size_req(udp_globals.ip_sess, -1,
     543                rc = ip_packet_size_req(udp_globals.ip_phone, -1,
    542544                    &udp_globals.packet_dimension);
    543545                if (rc != EOK)
     
    557559
    558560        /* Read the first packet fragment */
    559         result = tl_socket_read_packet_data(udp_globals.net_sess, &packet,
     561        result = tl_socket_read_packet_data(udp_globals.net_phone, &packet,
    560562            UDP_HEADER_SIZE, packet_dimension, addr, addrlen);
    561563        if (result < 0)
     
    578580        /* Read the rest of the packet fragments */
    579581        for (index = 1; index < fragments; index++) {
    580                 result = tl_socket_read_packet_data(udp_globals.net_sess,
     582                result = tl_socket_read_packet_data(udp_globals.net_phone,
    581583                    &next_packet, 0, packet_dimension, addr, addrlen);
    582584                if (result < 0)
     
    630632
    631633        /* Send the packet */
    632         ip_send_msg(udp_globals.ip_sess, device_id, packet, SERVICE_UDP, 0);
     634        ip_send_msg(udp_globals.ip_phone, device_id, packet, SERVICE_UDP, 0);
    633635
    634636        return EOK;
     
    677679                return NO_DATA;
    678680       
    679         rc = packet_translate_remote(udp_globals.net_sess, &packet, packet_id);
     681        rc = packet_translate_remote(udp_globals.net_phone, &packet, packet_id);
    680682        if (rc != EOK) {
    681683                (void) dyn_fifo_pop(&socket->received);
     
    737739}
    738740
    739 /** Process the socket client messages.
    740  *
    741  * Run until the client module disconnects.
    742  *
    743  * @see socket.h
    744  *
    745  * @param[in] sess   Callback session.
    746  * @param[in] callid Message identifier.
    747  * @param[in] call   Message parameters.
    748  *
    749  * @return EOK on success.
    750  *
    751  */
    752 static int udp_process_client_messages(async_sess_t *sess, ipc_callid_t callid,
    753     ipc_call_t call)
     741/** Processes the socket client messages.
     742 *
     743 * Runs until the client module disconnects.
     744 *
     745 * @param[in] callid    The message identifier.
     746 * @param[in] call      The message parameters.
     747 * @return              EOK on success.
     748 *
     749 * @see socket.h
     750 */
     751static int udp_process_client_messages(ipc_callid_t callid, ipc_call_t call)
    754752{
    755753        int res;
    756754        socket_cores_t local_sockets;
     755        int app_phone = IPC_GET_PHONE(call);
    757756        struct sockaddr *addr;
    758757        int socket_id;
     
    787786                /* Get the next call */
    788787                callid = async_get_call(&call);
    789 
    790                 /* Process the call */
     788               
    791789                if (!IPC_GET_IMETHOD(call)) {
    792790                        res = EHANGUP;
    793791                        break;
    794792                }
    795                
     793
     794                /* Process the call */
    796795                switch (IPC_GET_IMETHOD(call)) {
    797796                case NET_SOCKET:
    798797                        socket_id = SOCKET_GET_SOCKET_ID(call);
    799                         res = socket_create(&local_sockets, sess, NULL,
     798                        res = socket_create(&local_sockets, app_phone, NULL,
    800799                            &socket_id);
    801800                        SOCKET_SET_SOCKET_ID(answer, socket_id);
     
    805804                       
    806805                        size = MAX_UDP_FRAGMENT_SIZE;
    807                         if (tl_get_ip_packet_dimension(udp_globals.ip_sess,
     806                        if (tl_get_ip_packet_dimension(udp_globals.ip_phone,
    808807                            &udp_globals.dimensions, DEVICE_INVALID_ID,
    809808                            &packet_dimension) == EOK) {
     
    869868                case NET_SOCKET_CLOSE:
    870869                        fibril_rwlock_write_lock(&udp_globals.lock);
    871                         res = socket_destroy(udp_globals.net_sess,
     870                        res = socket_destroy(udp_globals.net_phone,
    872871                            SOCKET_GET_SOCKET_ID(call), &local_sockets,
    873872                            &udp_globals.sockets, NULL);
     
    883882        }
    884883
    885         /* Release the application session */
    886         async_hangup(sess);
     884        /* Release the application phone */
     885        async_obsolete_hangup(app_phone);
    887886
    888887        /* Release all local sockets */
    889         socket_cores_release(udp_globals.net_sess, &local_sockets,
     888        socket_cores_release(udp_globals.net_phone, &local_sockets,
    890889            &udp_globals.sockets, NULL);
    891890
     
    917916{
    918917        *answer_count = 0;
    919        
    920         async_sess_t *callback =
    921             async_callback_receive_start(EXCHANGE_SERIALIZE, call);
    922         if (callback)
    923                 return udp_process_client_messages(callback, callid, *call);
    924        
     918
     919        switch (IPC_GET_IMETHOD(*call)) {
     920        case IPC_M_CONNECT_TO_ME:
     921                return udp_process_client_messages(callid, *call);
     922        }
     923
    925924        return ENOTSUP;
    926925}
Note: See TracChangeset for help on using the changeset viewer.