Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/inetping.c

    rf9b2cb4c r3e66428  
    11/*
    2  * Copyright (c) 2013 Jiri Svoboda
    3  * Copyright (c) 2013 Martin Decky
     2 * Copyright (c) 2012 Jiri Svoboda
    43 * All rights reserved.
    54 *
     
    5049
    5150        assert(inetping_sess == NULL);
    52 
     51       
    5352        inetping_ev_ops = ev_ops;
    54 
    55         rc = loc_service_get_id(SERVICE_NAME_INET, &inetping_svc,
     53       
     54        rc = loc_service_get_id(SERVICE_NAME_INETPING, &inetping_svc,
    5655            IPC_FLAG_BLOCKING);
    5756        if (rc != EOK)
    5857                return ENOENT;
    59 
    60         inetping_sess = loc_service_connect(inetping_svc, INTERFACE_INETPING,
     58       
     59        inetping_sess = loc_service_connect(EXCHANGE_SERIALIZE, inetping_svc,
    6160            IPC_FLAG_BLOCKING);
    6261        if (inetping_sess == NULL)
    6362                return ENOENT;
    64 
     63       
    6564        async_exch_t *exch = async_exchange_begin(inetping_sess);
    6665
    67         port_id_t port;
    68         rc = async_create_callback_port(exch, INTERFACE_INETPING_CB, 0, 0,
    69             inetping_cb_conn, NULL, &port);
     66        rc = async_connect_to_me(exch, 0, 0, 0, inetping_cb_conn, NULL);
     67        async_exchange_end(exch);
    7068       
    71         async_exchange_end(exch);
    72 
    7369        if (rc != EOK) {
    7470                async_hangup(inetping_sess);
     
    7672                return rc;
    7773        }
    78 
     74       
    7975        return EOK;
    8076}
     
    8379{
    8480        async_exch_t *exch = async_exchange_begin(inetping_sess);
    85 
     81       
    8682        ipc_call_t answer;
    87         aid_t req = async_send_1(exch, INETPING_SEND, sdu->seq_no, &answer);
    88 
    89         int rc = async_data_write_start(exch, &sdu->src, sizeof(sdu->src));
    90         if (rc != EOK) {
    91                 async_exchange_end(exch);
     83        aid_t req = async_send_3(exch, INETPING_SEND, (sysarg_t) sdu->src,
     84            (sysarg_t) sdu->dest, sdu->seq_no, &answer);
     85        sysarg_t retval = async_data_write_start(exch, sdu->data, sdu->size);
     86       
     87        async_exchange_end(exch);
     88       
     89        if (retval != EOK) {
    9290                async_forget(req);
    93                 return rc;
     91                return retval;
    9492        }
    95 
    96         rc = async_data_write_start(exch, &sdu->dest, sizeof(sdu->dest));
    97         if (rc != EOK) {
    98                 async_exchange_end(exch);
    99                 async_forget(req);
    100                 return rc;
    101         }
    102 
    103         rc = async_data_write_start(exch, sdu->data, sdu->size);
    104 
    105         async_exchange_end(exch);
    106 
    107         if (rc != EOK) {
    108                 async_forget(req);
    109                 return rc;
    110         }
    111 
    112         sysarg_t retval;
     93       
    11394        async_wait_for(req, &retval);
    114 
    115         return (int) retval;
     95        return retval;
    11696}
    11797
    118 int inetping_get_srcaddr(const inet_addr_t *remote, inet_addr_t *local)
     98int inetping_get_srcaddr(uint32_t remote, uint32_t *local)
    11999{
    120100        async_exch_t *exch = async_exchange_begin(inetping_sess);
    121 
    122         ipc_call_t answer;
    123         aid_t req = async_send_0(exch, INETPING_GET_SRCADDR, &answer);
    124 
    125         int rc = async_data_write_start(exch, remote, sizeof(*remote));
    126         if (rc != EOK) {
    127                 async_exchange_end(exch);
    128                 async_forget(req);
     101       
     102        sysarg_t local_addr;
     103        int rc = async_req_1_1(exch, INETPING_GET_SRCADDR, (sysarg_t) remote,
     104            &local_addr);
     105       
     106        async_exchange_end(exch);
     107       
     108        if (rc != EOK)
    129109                return rc;
    130         }
    131 
    132         ipc_call_t answer_local;
    133         aid_t req_local = async_data_read(exch, local, sizeof(*local),
    134             &answer_local);
    135 
    136         async_exchange_end(exch);
    137 
    138         sysarg_t retval_local;
    139         async_wait_for(req_local, &retval_local);
    140 
    141         if (retval_local != EOK) {
    142                 async_forget(req);
    143                 return (int) retval_local;
    144         }
    145 
    146         sysarg_t retval;
    147         async_wait_for(req, &retval);
    148 
    149         return (int) retval;
     110       
     111        *local = (uint32_t) local_addr;
     112        return EOK;
    150113}
    151114
    152 static void inetping_ev_recv(ipc_callid_t iid, ipc_call_t *icall)
     115static void inetping_ev_recv(ipc_callid_t callid, ipc_call_t *call)
    153116{
    154117        inetping_sdu_t sdu;
    155 
    156         sdu.seq_no = IPC_GET_ARG1(*icall);
    157 
    158         ipc_callid_t callid;
    159         size_t size;
    160         if (!async_data_write_receive(&callid, &size)) {
    161                 async_answer_0(callid, EREFUSED);
    162                 async_answer_0(iid, EREFUSED);
     118       
     119        sdu.src = IPC_GET_ARG1(*call);
     120        sdu.dest = IPC_GET_ARG2(*call);
     121        sdu.seq_no = IPC_GET_ARG3(*call);
     122       
     123        int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);
     124        if (rc != EOK) {
     125                async_answer_0(callid, rc);
    163126                return;
    164127        }
    165 
    166         if (size != sizeof(sdu.src)) {
    167                 async_answer_0(callid, EINVAL);
    168                 async_answer_0(iid, EINVAL);
    169                 return;
    170         }
    171 
    172         int rc = async_data_write_finalize(callid, &sdu.src, size);
    173         if (rc != EOK) {
    174                 async_answer_0(callid, rc);
    175                 async_answer_0(iid, rc);
    176                 return;
    177         }
    178 
    179         if (!async_data_write_receive(&callid, &size)) {
    180                 async_answer_0(callid, EREFUSED);
    181                 async_answer_0(iid, EREFUSED);
    182                 return;
    183         }
    184 
    185         if (size != sizeof(sdu.dest)) {
    186                 async_answer_0(callid, EINVAL);
    187                 async_answer_0(iid, EINVAL);
    188                 return;
    189         }
    190 
    191         rc = async_data_write_finalize(callid, &sdu.dest, size);
    192         if (rc != EOK) {
    193                 async_answer_0(callid, rc);
    194                 async_answer_0(iid, rc);
    195                 return;
    196         }
    197 
    198         rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);
    199         if (rc != EOK) {
    200                 async_answer_0(iid, rc);
    201                 return;
    202         }
    203 
     128       
    204129        rc = inetping_ev_ops->recv(&sdu);
    205130        free(sdu.data);
    206         async_answer_0(iid, rc);
     131        async_answer_0(callid, rc);
    207132}
    208133
Note: See TracChangeset for help on using the changeset viewer.