Ignore:
File:
1 edited

Legend:

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

    rd8b47eca rbd8bfc5a  
    3030#include <assert.h>
    3131#include <errno.h>
    32 #include <net/socket_codes.h>
    3332#include <inet/inet.h>
    3433#include <ipc/inet.h>
     
    4544{
    4645        async_exch_t *exch = async_exchange_begin(inet_sess);
    47        
     46
    4847        ipc_call_t answer;
    4948        aid_t req = async_send_0(exch, INET_CALLBACK_CREATE, &answer);
    5049        int rc = async_connect_to_me(exch, 0, 0, 0, inet_cb_conn, NULL);
    5150        async_exchange_end(exch);
    52        
     51
    5352        if (rc != EOK)
    5453                return rc;
    55        
     54
    5655        sysarg_t retval;
    5756        async_wait_for(req, &retval);
    58        
    59         return retval;
     57        if (retval != EOK)
     58                return retval;
     59
     60        return EOK;
    6061}
    6162
    6263static int inet_set_proto(uint8_t protocol)
    6364{
     65        int rc;
     66
    6467        async_exch_t *exch = async_exchange_begin(inet_sess);
    65         int rc = async_req_1_0(exch, INET_SET_PROTO, protocol);
     68        rc = async_req_1_0(exch, INET_SET_PROTO, protocol);
    6669        async_exchange_end(exch);
    67        
     70
    6871        return rc;
    6972}
     
    7780        assert(inet_ev_ops == NULL);
    7881        assert(inet_protocol == 0);
    79        
     82
    8083        rc = loc_service_get_id(SERVICE_NAME_INET, &inet_svc,
    8184            IPC_FLAG_BLOCKING);
    8285        if (rc != EOK)
    8386                return ENOENT;
    84        
     87
    8588        inet_sess = loc_service_connect(EXCHANGE_SERIALIZE, inet_svc,
    8689            IPC_FLAG_BLOCKING);
    8790        if (inet_sess == NULL)
    8891                return ENOENT;
    89        
     92
    9093        if (inet_set_proto(protocol) != EOK) {
    9194                async_hangup(inet_sess);
     
    9396                return EIO;
    9497        }
    95        
     98
    9699        if (inet_callback_create() != EOK) {
    97100                async_hangup(inet_sess);
     
    99102                return EIO;
    100103        }
    101        
     104
    102105        inet_protocol = protocol;
    103106        inet_ev_ops = ev_ops;
     
    109112{
    110113        async_exch_t *exch = async_exchange_begin(inet_sess);
    111        
     114
    112115        ipc_call_t answer;
    113         aid_t req = async_send_3(exch, INET_SEND, dgram->tos, ttl, df,
    114             &answer);
    115        
    116         int rc = async_data_write_start(exch, &dgram->src, sizeof(inet_addr_t));
     116        aid_t req = async_send_5(exch, INET_SEND, dgram->src.ipv4,
     117            dgram->dest.ipv4, dgram->tos, ttl, df, &answer);
     118        int rc = async_data_write_start(exch, dgram->data, dgram->size);
     119        async_exchange_end(exch);
     120
    117121        if (rc != EOK) {
    118                 async_exchange_end(exch);
    119                 async_forget(req);
     122                async_wait_for(req, NULL);
    120123                return rc;
    121124        }
    122        
    123         rc = async_data_write_start(exch, &dgram->dest, sizeof(inet_addr_t));
    124         if (rc != EOK) {
    125                 async_exchange_end(exch);
    126                 async_forget(req);
    127                 return rc;
    128         }
    129        
    130         rc = async_data_write_start(exch, dgram->data, dgram->size);
    131        
    132         async_exchange_end(exch);
    133        
    134         if (rc != EOK) {
    135                 async_forget(req);
    136                 return rc;
    137         }
    138        
     125
    139126        sysarg_t retval;
    140127        async_wait_for(req, &retval);
    141        
    142         return (int) retval;
     128        if (retval != EOK)
     129                return retval;
     130
     131        return EOK;
    143132}
    144133
    145134int inet_get_srcaddr(inet_addr_t *remote, uint8_t tos, inet_addr_t *local)
    146135{
     136        sysarg_t local_addr;
    147137        async_exch_t *exch = async_exchange_begin(inet_sess);
    148        
    149         ipc_call_t answer;
    150         aid_t req = async_send_1(exch, INET_GET_SRCADDR, tos, &answer);
    151        
    152         int rc = async_data_write_start(exch, remote, sizeof(inet_addr_t));
    153         if (rc != EOK) {
    154                 async_exchange_end(exch);
    155                 async_forget(req);
     138
     139        int rc = async_req_2_1(exch, INET_GET_SRCADDR, remote->ipv4,
     140            tos, &local_addr);
     141        async_exchange_end(exch);
     142
     143        if (rc != EOK)
    156144                return rc;
    157         }
    158        
    159         rc = async_data_read_start(exch, local, sizeof(inet_addr_t));
    160        
    161         async_exchange_end(exch);
    162        
    163         if (rc != EOK) {
    164                 async_forget(req);
    165                 return rc;
    166         }
    167        
    168         sysarg_t retval;
    169         async_wait_for(req, &retval);
    170        
    171         return (int) retval;
     145
     146        local->ipv4 = local_addr;
     147        return EOK;
    172148}
    173149
    174 static void inet_ev_recv(ipc_callid_t iid, ipc_call_t *icall)
     150static void inet_ev_recv(ipc_callid_t callid, ipc_call_t *call)
    175151{
     152        int rc;
    176153        inet_dgram_t dgram;
    177        
    178         dgram.tos = IPC_GET_ARG1(*icall);
    179        
    180         ipc_callid_t callid;
    181         size_t size;
    182         if (!async_data_write_receive(&callid, &size)) {
    183                 async_answer_0(callid, EINVAL);
    184                 async_answer_0(iid, EINVAL);
     154
     155        dgram.src.ipv4 = IPC_GET_ARG1(*call);
     156        dgram.dest.ipv4 = IPC_GET_ARG2(*call);
     157        dgram.tos = IPC_GET_ARG3(*call);
     158
     159        rc = async_data_write_accept(&dgram.data, false, 0, 0, 0, &dgram.size);
     160        if (rc != EOK) {
     161                async_answer_0(callid, rc);
    185162                return;
    186163        }
    187        
    188         if (size != sizeof(inet_addr_t)) {
    189                 async_answer_0(callid, EINVAL);
    190                 async_answer_0(iid, EINVAL);
    191                 return;
    192         }
    193        
    194         int rc = async_data_write_finalize(callid, &dgram.src, size);
    195         if (rc != EOK) {
    196                 async_answer_0(callid, rc);
    197                 async_answer_0(iid, rc);
    198                 return;
    199         }
    200        
    201         if (!async_data_write_receive(&callid, &size)) {
    202                 async_answer_0(callid, EINVAL);
    203                 async_answer_0(iid, EINVAL);
    204                 return;
    205         }
    206        
    207         if (size != sizeof(inet_addr_t)) {
    208                 async_answer_0(callid, EINVAL);
    209                 async_answer_0(iid, EINVAL);
    210                 return;
    211         }
    212        
    213         rc = async_data_write_finalize(callid, &dgram.dest, size);
    214         if (rc != EOK) {
    215                 async_answer_0(callid, rc);
    216                 async_answer_0(iid, rc);
    217                 return;
    218         }
    219        
    220         rc = async_data_write_accept(&dgram.data, false, 0, 0, 0, &dgram.size);
    221         if (rc != EOK) {
    222                 async_answer_0(iid, rc);
    223                 return;
    224         }
    225        
     164
    226165        rc = inet_ev_ops->recv(&dgram);
    227         async_answer_0(iid, rc);
     166        async_answer_0(callid, rc);
    228167}
    229168
     
    233172                ipc_call_t call;
    234173                ipc_callid_t callid = async_get_call(&call);
    235                
     174
    236175                if (!IPC_GET_IMETHOD(call)) {
    237176                        /* TODO: Handle hangup */
    238177                        return;
    239178                }
    240                
     179
    241180                switch (IPC_GET_IMETHOD(call)) {
    242181                case INET_EV_RECV:
Note: See TracChangeset for help on using the changeset viewer.