Changeset 02a09ed in mainline for uspace/lib/c/generic/iplink.c


Ignore:
Timestamp:
2013-06-28T20:20:03Z (11 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1d24ad3
Parents:
edf0d27
Message:

add basic infrastructure for IPv6 (inactive)
make inet_addr_t a universal address type

File:
1 edited

Legend:

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

    redf0d27 r02a09ed  
    8686       
    8787        ipc_call_t answer;
    88         aid_t req = async_send_2(exch, IPLINK_SEND, (sysarg_t) sdu->lsrc,
    89             (sysarg_t) sdu->ldest, &answer);
    90         int rc = async_data_write_start(exch, sdu->data, sdu->size);
     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));
     91        if (rc != EOK) {
     92                async_exchange_end(exch);
     93                async_forget(req);
     94                return rc;
     95        }
     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);
    91105       
    92106        async_exchange_end(exch);
     
    120134int iplink_addr_add(iplink_t *iplink, inet_addr_t *addr)
    121135{
    122         uint32_t addr_addr;
    123         int rc = inet_addr_pack(addr, &addr_addr);
    124         if (rc != EOK)
    125                 return rc;
    126        
    127         async_exch_t *exch = async_exchange_begin(iplink->sess);
    128         rc = async_req_1_0(exch, IPLINK_ADDR_ADD, (sysarg_t) addr_addr);
    129         async_exchange_end(exch);
    130        
    131         return rc;
     136        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));
     142        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;
    132153}
    133154
    134155int iplink_addr_remove(iplink_t *iplink, inet_addr_t *addr)
    135156{
    136         uint32_t addr_addr;
    137         int rc = inet_addr_pack(addr, &addr_addr);
    138         if (rc != EOK)
    139                 return rc;
    140        
    141         async_exch_t *exch = async_exchange_begin(iplink->sess);
    142         rc = async_req_1_0(exch, IPLINK_ADDR_REMOVE, (sysarg_t) addr_addr);
    143         async_exchange_end(exch);
    144        
    145         return rc;
    146 }
    147 
    148 static void iplink_ev_recv(iplink_t *iplink, ipc_callid_t callid,
    149     ipc_call_t *call)
    150 {
    151         iplink_sdu_t sdu;
    152        
    153         sdu.lsrc = IPC_GET_ARG1(*call);
    154         sdu.ldest = IPC_GET_ARG2(*call);
    155        
    156         int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);
    157         if (rc != EOK) {
    158                 async_answer_0(callid, rc);
     157        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));
     163        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;
     174}
     175
     176static void iplink_ev_recv(iplink_t *iplink, ipc_callid_t iid,
     177    ipc_call_t *icall)
     178{
     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);
     185        if (rc != EOK) {
     186                async_answer_0(iid, rc);
    159187                return;
    160188        }
    161189       
    162         rc = iplink->ev_ops->recv(iplink, &sdu);
     190        rc = iplink->ev_ops->recv(iplink, &sdu, af);
    163191        free(sdu.data);
    164         async_answer_0(callid, rc);
     192        async_answer_0(iid, rc);
    165193}
    166194
Note: See TracChangeset for help on using the changeset viewer.