Changeset d8b47eca in mainline for uspace/lib/c/generic/inet.c


Ignore:
Timestamp:
2013-07-03T17:16:44Z (12 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
66366470, 882bc4b
Parents:
1d24ad3
Message:

support arbitrary addresses in INET_SEND and INET_GET_SRCADDR
use addr32_t instead of uint32_t

File:
1 edited

Legend:

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

    r1d24ad3 rd8b47eca  
    108108int inet_send(inet_dgram_t *dgram, uint8_t ttl, inet_df_t df)
    109109{
    110         addr32_t src_v4;
    111         addr128_t src_v6;
    112         uint16_t src_af = inet_addr_get(&dgram->src, &src_v4, &src_v6);
    113        
    114         addr32_t dest_v4;
    115         addr128_t dest_v6;
    116         uint16_t dest_af = inet_addr_get(&dgram->dest, &dest_v4, &dest_v6);
    117        
    118         if (src_af != dest_af)
    119                 return EINVAL;
    120        
    121         async_exch_t *exch;
     110        async_exch_t *exch = async_exchange_begin(inet_sess);
     111       
    122112        ipc_call_t answer;
    123         aid_t req;
    124         int rc;
    125        
    126         switch (src_af) {
    127         case AF_INET:
    128                 exch = async_exchange_begin(inet_sess);
    129                
    130                 req = async_send_5(exch, INET_SEND, (sysarg_t) src_v4,
    131                     (sysarg_t) dest_v4, dgram->tos, ttl, df, &answer);
    132                 rc = async_data_write_start(exch, dgram->data, dgram->size);
    133                
     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));
     117        if (rc != EOK) {
    134118                async_exchange_end(exch);
    135                 break;
    136         case AF_INET6:
    137                 // FIXME TODO
    138                 return ENOTSUP;
    139         default:
    140                 return EINVAL;
    141         }
     119                async_forget(req);
     120                return rc;
     121        }
     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);
    142133       
    143134        if (rc != EOK) {
     
    154145int inet_get_srcaddr(inet_addr_t *remote, uint8_t tos, inet_addr_t *local)
    155146{
    156         addr32_t remote_v4;
    157         addr128_t remote_v6;
    158         uint16_t remote_af = inet_addr_get(remote, &remote_v4, &remote_v6);
    159        
    160         async_exch_t *exch;
    161         int rc;
    162        
    163         switch (remote_af) {
    164         case AF_INET:
    165                 exch = async_exchange_begin(inet_sess);
    166                
    167                 sysarg_t local_v4;
    168                 rc = async_req_2_1(exch, INET_GET_SRCADDR, (sysarg_t) remote_v4,
    169                     tos, &local_v4);
    170                
     147        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) {
    171154                async_exchange_end(exch);
    172                
    173                 if (rc != EOK)
    174                         return rc;
    175                
    176                 inet_addr_set(local_v4, local);
    177                 return EOK;
    178         case AF_INET6:
    179                 // FIXME TODO
    180                 return ENOTSUP;
    181         default:
    182                 return EINVAL;
    183         }
     155                async_forget(req);
     156                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;
    184172}
    185173
Note: See TracChangeset for help on using the changeset viewer.