Ignore:
File:
1 edited

Legend:

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

    r02a09ed rffa8912  
    3939#include <errno.h>
    4040#include <inet/iplink.h>
    41 #include <inet/addr.h>
    4241#include <ipc/iplink.h>
    4342#include <ipc/services.h>
     
    5049    iplink_t **riplink)
    5150{
    52         iplink_t *iplink = calloc(1, sizeof(iplink_t));
     51        iplink_t *iplink = NULL;
     52        int rc;
     53
     54        iplink = calloc(1, sizeof(iplink_t));
    5355        if (iplink == NULL)
    5456                return ENOMEM;
    55        
     57
    5658        iplink->sess = sess;
    5759        iplink->ev_ops = ev_ops;
    58        
     60
    5961        async_exch_t *exch = async_exchange_begin(sess);
    60        
    61         int rc = async_connect_to_me(exch, 0, 0, 0, iplink_cb_conn, iplink);
     62
     63        rc = async_connect_to_me(exch, 0, 0, 0, iplink_cb_conn, iplink);
    6264        async_exchange_end(exch);
    63        
     65
    6466        if (rc != EOK)
    6567                goto error;
    66        
     68
    6769        *riplink = iplink;
    6870        return EOK;
    69        
     71
    7072error:
    7173        if (iplink != NULL)
    7274                free(iplink);
    73        
     75
    7476        return rc;
    7577}
     
    8486{
    8587        async_exch_t *exch = async_exchange_begin(iplink->sess);
    86        
     88
    8789        ipc_call_t answer;
    88         aid_t req = async_send_0(exch, IPLINK_SEND, &answer);
    89        
    90         int rc = async_data_write_start(exch, &sdu->src, sizeof(inet_addr_t));
     90        aid_t req = async_send_2(exch, IPLINK_SEND, sdu->lsrc.ipv4,
     91            sdu->ldest.ipv4, &answer);
     92        int rc = async_data_write_start(exch, sdu->data, sdu->size);
     93        async_exchange_end(exch);
     94
    9195        if (rc != EOK) {
    92                 async_exchange_end(exch);
    93                 async_forget(req);
     96                async_wait_for(req, NULL);
    9497                return rc;
    9598        }
    96        
    97         rc = async_data_write_start(exch, &sdu->dest, sizeof(inet_addr_t));
    98         if (rc != EOK) {
    99                 async_exchange_end(exch);
    100                 async_forget(req);
    101                 return rc;
    102         }
    103        
    104         rc = async_data_write_start(exch, sdu->data, sdu->size);
    105        
    106         async_exchange_end(exch);
    107        
    108         if (rc != EOK) {
    109                 async_forget(req);
    110                 return rc;
    111         }
    112        
     99
    113100        sysarg_t retval;
    114101        async_wait_for(req, &retval);
    115        
    116         return (int) retval;
     102        if (retval != EOK)
     103                return retval;
     104
     105        return EOK;
    117106}
    118107
     
    132121}
    133122
    134 int iplink_addr_add(iplink_t *iplink, inet_addr_t *addr)
     123int iplink_addr_add(iplink_t *iplink, iplink_addr_t *addr)
    135124{
    136125        async_exch_t *exch = async_exchange_begin(iplink->sess);
    137        
    138         ipc_call_t answer;
    139         aid_t req = async_send_0(exch, IPLINK_ADDR_ADD, &answer);
    140        
    141         int rc = async_data_write_start(exch, addr, sizeof(inet_addr_t));
     126
     127        int rc = async_req_1_0(exch, IPLINK_ADDR_ADD, (sysarg_t)addr->ipv4);
    142128        async_exchange_end(exch);
    143        
    144         if (rc != EOK) {
    145                 async_forget(req);
    146                 return rc;
    147         }
    148        
    149         sysarg_t retval;
    150         async_wait_for(req, &retval);
    151        
    152         return (int) retval;
     129
     130        return rc;
    153131}
    154132
    155 int iplink_addr_remove(iplink_t *iplink, inet_addr_t *addr)
     133int iplink_addr_remove(iplink_t *iplink, iplink_addr_t *addr)
    156134{
    157135        async_exch_t *exch = async_exchange_begin(iplink->sess);
    158        
    159         ipc_call_t answer;
    160         aid_t req = async_send_0(exch, IPLINK_ADDR_REMOVE, &answer);
    161        
    162         int rc = async_data_write_start(exch, addr, sizeof(inet_addr_t));
     136
     137        int rc = async_req_1_0(exch, IPLINK_ADDR_REMOVE, (sysarg_t)addr->ipv4);
    163138        async_exchange_end(exch);
    164        
    165         if (rc != EOK) {
    166                 async_forget(req);
    167                 return rc;
    168         }
    169        
    170         sysarg_t retval;
    171         async_wait_for(req, &retval);
    172        
    173         return (int) retval;
     139
     140        return rc;
    174141}
    175142
    176 static void iplink_ev_recv(iplink_t *iplink, ipc_callid_t iid,
    177     ipc_call_t *icall)
     143static void iplink_ev_recv(iplink_t *iplink, ipc_callid_t callid,
     144    ipc_call_t *call)
    178145{
    179         iplink_recv_sdu_t sdu;
    180        
    181         uint16_t af = IPC_GET_ARG1(*icall);
    182        
    183         int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0,
    184             &sdu.size);
     146        int rc;
     147        iplink_sdu_t sdu;
     148
     149        sdu.lsrc.ipv4 = IPC_GET_ARG1(*call);
     150        sdu.ldest.ipv4 = IPC_GET_ARG2(*call);
     151
     152        rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);
    185153        if (rc != EOK) {
    186                 async_answer_0(iid, rc);
     154                async_answer_0(callid, rc);
    187155                return;
    188156        }
    189        
    190         rc = iplink->ev_ops->recv(iplink, &sdu, af);
     157
     158        rc = iplink->ev_ops->recv(iplink, &sdu);
    191159        free(sdu.data);
    192         async_answer_0(iid, rc);
     160        async_answer_0(callid, rc);
    193161}
    194162
    195163static void iplink_cb_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
    196164{
    197         iplink_t *iplink = (iplink_t *) arg;
    198        
     165        iplink_t *iplink = (iplink_t *)arg;
     166
    199167        while (true) {
    200168                ipc_call_t call;
    201169                ipc_callid_t callid = async_get_call(&call);
    202                
     170
    203171                if (!IPC_GET_IMETHOD(call)) {
    204172                        /* TODO: Handle hangup */
    205173                        return;
    206174                }
    207                
     175
    208176                switch (IPC_GET_IMETHOD(call)) {
    209177                case IPLINK_EV_RECV:
Note: See TracChangeset for help on using the changeset viewer.