Changeset a2e3ee6 in mainline for uspace/srv/net/inetsrv


Ignore:
Timestamp:
2013-06-20T16:45:58Z (12 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
08bb73b
Parents:
19a4f73
Message:

use new network address infrastructure (towards IPv6 support)

Location:
uspace/srv/net/inetsrv
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/inetsrv/addrobj.c

    r19a4f73 ra2e3ee6  
    112112inet_addrobj_t *inet_addrobj_find(inet_addr_t *addr, inet_addrobj_find_t find)
    113113{
    114         uint32_t mask;
    115 
    116         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find(%x)", (unsigned)addr->ipv4);
    117 
    118         fibril_mutex_lock(&addr_list_lock);
    119 
     114        uint32_t addr_addr;
     115        int rc = inet_addr_pack(addr, &addr_addr);
     116        if (rc != EOK)
     117                return NULL;
     118       
     119        fibril_mutex_lock(&addr_list_lock);
     120       
    120121        list_foreach(addr_list, link) {
    121122                inet_addrobj_t *naddr = list_get_instance(link,
    122123                    inet_addrobj_t, addr_list);
    123 
    124                 mask = inet_netmask(naddr->naddr.bits);
    125                 if ((naddr->naddr.ipv4 & mask) == (addr->ipv4 & mask)) {
     124               
     125                uint32_t naddr_addr;
     126                uint8_t naddr_bits;
     127                rc = inet_naddr_pack(&naddr->naddr, &naddr_addr, &naddr_bits);
     128                if (rc != EOK)
     129                        continue;
     130               
     131                uint32_t mask = inet_netmask(naddr_bits);
     132                if ((naddr_addr & mask) == (addr_addr & mask)) {
    126133                        fibril_mutex_unlock(&addr_list_lock);
    127134                        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p",
     
    218225{
    219226        inet_addr_t lsrc_addr;
    220         inet_addr_t *ldest_addr;
    221 
    222         lsrc_addr.ipv4 = addr->naddr.ipv4;
    223         ldest_addr = ldest;
    224 
     227        inet_naddr_addr(&addr->naddr, &lsrc_addr);
     228       
     229        inet_addr_t *ldest_addr = ldest;
     230       
    225231        return inet_link_send_dgram(addr->ilink, &lsrc_addr, ldest_addr, dgram,
    226232            proto, ttl, df);
  • uspace/srv/net/inetsrv/icmp.c

    r19a4f73 ra2e3ee6  
    120120static int icmp_recv_echo_reply(inet_dgram_t *dgram)
    121121{
    122         icmp_echo_t *reply;
    123         inetping_sdu_t sdu;
    124         uint16_t ident;
    125 
    126122        log_msg(LOG_DEFAULT, LVL_DEBUG, "icmp_recv_echo_reply()");
    127 
     123       
    128124        if (dgram->size < sizeof(icmp_echo_t))
    129125                return EINVAL;
    130 
    131         reply = (icmp_echo_t *)dgram->data;
    132 
    133         sdu.src = dgram->src;
    134         sdu.dest = dgram->dest;
     126       
     127        icmp_echo_t *reply = (icmp_echo_t *) dgram->data;
     128       
     129        inetping_sdu_t sdu;
     130       
     131        int rc = inet_addr_pack(&dgram->src, &sdu.src);
     132        if (rc != EOK)
     133                return rc;
     134       
     135        rc = inet_addr_pack(&dgram->dest, &sdu.dest);
     136        if (rc != EOK)
     137                return rc;
     138       
    135139        sdu.seq_no = uint16_t_be2host(reply->seq_no);
    136140        sdu.data = reply + sizeof(icmp_echo_t);
    137141        sdu.size = dgram->size - sizeof(icmp_echo_t);
    138         ident = uint16_t_be2host(reply->ident);
     142       
     143        uint16_t ident = uint16_t_be2host(reply->ident);
    139144
    140145        return inetping_recv(ident, &sdu);
     
    143148int icmp_ping_send(uint16_t ident, inetping_sdu_t *sdu)
    144149{
    145         inet_dgram_t dgram;
    146         icmp_echo_t *request;
    147         void *rdata;
    148         size_t rsize;
    149         uint16_t checksum;
    150         int rc;
    151 
    152         rsize = sizeof(icmp_echo_t) + sdu->size;
    153         rdata = calloc(rsize, 1);
     150        size_t rsize = sizeof(icmp_echo_t) + sdu->size;
     151        void *rdata = calloc(rsize, 1);
    154152        if (rdata == NULL)
    155153                return ENOMEM;
    156 
    157         request = (icmp_echo_t *)rdata;
    158 
     154       
     155        icmp_echo_t *request = (icmp_echo_t *)rdata;
     156       
    159157        request->type = ICMP_ECHO_REQUEST;
    160158        request->code = 0;
     
    162160        request->ident = host2uint16_t_be(ident);
    163161        request->seq_no = host2uint16_t_be(sdu->seq_no);
    164 
     162       
    165163        memcpy(rdata + sizeof(icmp_echo_t), sdu->data, sdu->size);
    166 
    167         checksum = inet_checksum_calc(INET_CHECKSUM_INIT, rdata, rsize);
     164       
     165        uint16_t checksum = inet_checksum_calc(INET_CHECKSUM_INIT, rdata, rsize);
    168166        request->checksum = host2uint16_t_be(checksum);
    169 
    170         dgram.src = sdu->src;
    171         dgram.dest = sdu->dest;
     167       
     168        inet_dgram_t dgram;
     169       
     170        inet_addr_unpack(sdu->src, &dgram.src);
     171        inet_addr_unpack(sdu->dest, &dgram.dest);
     172       
    172173        dgram.tos = ICMP_TOS;
    173174        dgram.data = rdata;
    174175        dgram.size = rsize;
    175 
    176         rc = inet_route_packet(&dgram, IP_PROTO_ICMP, INET_TTL_MAX, 0);
    177 
     176       
     177        int rc = inet_route_packet(&dgram, IP_PROTO_ICMP, INET_TTL_MAX, 0);
     178       
    178179        free(rdata);
    179180        return rc;
  • uspace/srv/net/inetsrv/inet_link.c

    r19a4f73 ra2e3ee6  
    153153{
    154154        inet_link_t *ilink;
    155         iplink_addr_t iaddr;
     155        inet_addr_t iaddr;
    156156        int rc;
    157157
     
    196196
    197197        static int first = 1;
    198         /* XXX For testing: set static IP address 10.0.2.15/24 */
     198       
    199199        addr = inet_addrobj_new();
     200       
    200201        if (first) {
    201                 addr->naddr.ipv4 = (127 << 24) + (0 << 16) + (0 << 8) + 1;
     202                inet_naddr(&addr->naddr, 127, 0, 0, 1, 24);
    202203                first = 0;
    203204        } else {
    204                 addr->naddr.ipv4 = (10 << 24) + (0 << 16) + (2 << 8) + 15;
    205         }
    206         addr->naddr.bits = 24;
     205                /* XXX For testing: set static IP address 10.0.2.15/24 */
     206                inet_naddr(&addr->naddr, 10, 0, 2, 15, 24);
     207        }
     208       
    207209        addr->ilink = ilink;
    208210        addr->name = str_dup("v4a");
     
    215217        }
    216218
    217         iaddr.ipv4 = addr->naddr.ipv4;
     219        inet_naddr_addr(&addr->naddr, &iaddr);
    218220        rc = iplink_addr_add(ilink->iplink, &iaddr);
    219221        if (rc != EOK) {
     
    257259    inet_addr_t *ldest, inet_dgram_t *dgram, uint8_t proto, uint8_t ttl, int df)
    258260{
    259         iplink_sdu_t sdu;
    260         inet_packet_t packet;
    261         int rc;
    262         size_t offs, roffs;
    263 
    264261        /*
    265262         * Fill packet structure. Fragmentation is performed by
    266263         * inet_pdu_encode().
    267264         */
     265        inet_packet_t packet;
     266       
    268267        packet.src = dgram->src;
    269268        packet.dest = dgram->dest;
     
    274273        packet.data = dgram->data;
    275274        packet.size = dgram->size;
    276 
    277         sdu.lsrc.ipv4 = lsrc->ipv4;
    278         sdu.ldest.ipv4 = ldest->ipv4;
    279 
    280         offs = 0;
     275       
     276        iplink_sdu_t sdu;
     277       
     278        int rc = inet_addr_pack(lsrc, &sdu.lsrc);
     279        if (rc != EOK)
     280                return rc;
     281       
     282        rc = inet_addr_pack(ldest, &sdu.ldest);
     283        if (rc != EOK)
     284                return rc;
     285       
     286        size_t offs = 0;
    281287        do {
     288                size_t roffs;
     289               
    282290                /* Encode one fragment */
    283291                rc = inet_pdu_encode(&packet, offs, ilink->def_mtu, &sdu.data,
     
    285293                if (rc != EOK)
    286294                        return rc;
    287 
     295               
    288296                /* Send the PDU */
    289297                rc = iplink_send(ilink->iplink, &sdu);
    290298                free(sdu.data);
    291 
     299               
    292300                offs = roffs;
    293301        } while (offs < packet.size);
    294 
     302       
    295303        return rc;
    296304}
  • uspace/srv/net/inetsrv/inetcfg.c

    r19a4f73 ra2e3ee6  
    5656        inet_link_t *ilink;
    5757        inet_addrobj_t *addr;
    58         iplink_addr_t iaddr;
     58        inet_addr_t iaddr;
    5959        int rc;
    6060
     
    8282        }
    8383
    84         iaddr.ipv4 = addr->naddr.ipv4;
     84        inet_naddr_addr(&addr->naddr, &iaddr);
    8585        rc = iplink_addr_add(ilink->iplink, &iaddr);
    8686        if (rc != EOK) {
     
    254254        }
    255255
    256         naddr.ipv4 = IPC_GET_ARG1(*call);
    257         naddr.bits = IPC_GET_ARG2(*call);
    258         link_id    = IPC_GET_ARG3(*call);
     256        inet_naddr_unpack(IPC_GET_ARG1(*call), IPC_GET_ARG2(*call), &naddr);
     257        link_id = IPC_GET_ARG3(*call);
    259258
    260259        addr_id = 0;
     
    279278static void inetcfg_addr_get_srv(ipc_callid_t callid, ipc_call_t *call)
    280279{
     280        log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_addr_get_srv()");
     281       
     282        sysarg_t addr_id = IPC_GET_ARG1(*call);
     283       
     284        inet_addr_info_t ainfo;
     285       
     286        inet_naddr_any(&ainfo.naddr);
     287        ainfo.ilink = 0;
     288        ainfo.name = NULL;
     289       
    281290        ipc_callid_t rcallid;
    282291        size_t max_size;
    283 
    284         sysarg_t addr_id;
    285         inet_addr_info_t ainfo;
    286         int rc;
    287 
    288         addr_id = IPC_GET_ARG1(*call);
    289         log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_addr_get_srv()");
    290 
    291         ainfo.naddr.ipv4 = 0;
    292         ainfo.naddr.bits = 0;
    293         ainfo.ilink = 0;
    294         ainfo.name = NULL;
    295 
     292       
    296293        if (!async_data_read_receive(&rcallid, &max_size)) {
    297294                async_answer_0(rcallid, EREFUSED);
     
    299296                return;
    300297        }
    301 
    302         rc = inetcfg_addr_get(addr_id, &ainfo);
    303         if (rc != EOK) {
    304                 async_answer_0(callid, rc);
    305                 return;
    306         }
    307 
     298       
     299        int rc = inetcfg_addr_get(addr_id, &ainfo);
     300        if (rc != EOK) {
     301                async_answer_0(callid, rc);
     302                return;
     303        }
     304       
     305        uint32_t naddr_addr;
     306        uint8_t naddr_bits;
     307        rc = inet_naddr_pack(&ainfo.naddr, &naddr_addr, &naddr_bits);
     308        if (rc != EOK) {
     309                async_answer_0(callid, rc);
     310                return;
     311        }
     312       
    308313        sysarg_t retval = async_data_read_finalize(rcallid, ainfo.name,
    309314            min(max_size, str_size(ainfo.name)));
    310315        free(ainfo.name);
    311 
    312         async_answer_3(callid, retval, ainfo.naddr.ipv4, ainfo.naddr.bits,
    313             ainfo.ilink);
     316       
     317        async_answer_3(callid, retval, (sysarg_t) naddr_addr,
     318            (sysarg_t) naddr_bits, ainfo.ilink);
    314319}
    315320
     
    476481    ipc_call_t *call)
    477482{
     483        log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_sroute_create_srv()");
     484       
    478485        char *name;
     486        int rc = async_data_write_accept((void **) &name, true, 0, LOC_NAME_MAXLEN,
     487            0, NULL);
     488        if (rc != EOK) {
     489                async_answer_0(callid, rc);
     490                return;
     491        }
     492       
    479493        inet_naddr_t dest;
    480494        inet_addr_t router;
    481         sysarg_t sroute_id;
    482         int rc;
    483 
    484         log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_sroute_create_srv()");
    485 
    486         rc = async_data_write_accept((void **) &name, true, 0, LOC_NAME_MAXLEN,
    487             0, NULL);
    488         if (rc != EOK) {
    489                 async_answer_0(callid, rc);
    490                 return;
    491         }
    492 
    493         dest.ipv4   = IPC_GET_ARG1(*call);
    494         dest.bits   = IPC_GET_ARG2(*call);
    495         router.ipv4 = IPC_GET_ARG3(*call);
    496 
    497         sroute_id = 0;
     495       
     496        inet_naddr_unpack(IPC_GET_ARG1(*call), IPC_GET_ARG2(*call), &dest);
     497        inet_addr_unpack(IPC_GET_ARG3(*call), &router);
     498       
     499        sysarg_t sroute_id = 0;
    498500        rc = inetcfg_sroute_create(name, &dest, &router, &sroute_id);
    499501        free(name);
     
    516518static void inetcfg_sroute_get_srv(ipc_callid_t callid, ipc_call_t *call)
    517519{
     520        log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_sroute_get_srv()");
     521       
     522        sysarg_t sroute_id = IPC_GET_ARG1(*call);
     523       
     524        inet_sroute_info_t srinfo;
     525       
     526        inet_naddr_any(&srinfo.dest);
     527        inet_addr_any(&srinfo.router);
     528        srinfo.name = NULL;
     529       
    518530        ipc_callid_t rcallid;
    519531        size_t max_size;
    520 
    521         sysarg_t sroute_id;
    522         inet_sroute_info_t srinfo;
    523         int rc;
    524 
    525         sroute_id = IPC_GET_ARG1(*call);
    526         log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_sroute_get_srv()");
    527 
    528         srinfo.dest.ipv4 = 0;
    529         srinfo.dest.bits = 0;
    530         srinfo.router.ipv4 = 0;
    531         srinfo.name = NULL;
    532 
    533532        if (!async_data_read_receive(&rcallid, &max_size)) {
    534533                async_answer_0(rcallid, EREFUSED);
     
    536535                return;
    537536        }
    538 
    539         rc = inetcfg_sroute_get(sroute_id, &srinfo);
    540         if (rc != EOK) {
    541                 async_answer_0(callid, rc);
    542                 return;
    543         }
    544 
     537       
     538        int rc = inetcfg_sroute_get(sroute_id, &srinfo);
     539        if (rc != EOK) {
     540                async_answer_0(callid, rc);
     541                return;
     542        }
     543       
     544        uint32_t dest_addr;
     545        uint8_t dest_bits;
     546        rc = inet_naddr_pack(&srinfo.dest, &dest_addr, &dest_bits);
     547        if (rc != EOK) {
     548                async_answer_0(callid, rc);
     549                return;
     550        }
     551       
     552        uint32_t router_addr;
     553        rc = inet_addr_pack(&srinfo.router, &router_addr);
     554        if (rc != EOK) {
     555                async_answer_0(callid, rc);
     556                return;
     557        }
     558       
    545559        sysarg_t retval = async_data_read_finalize(rcallid, srinfo.name,
    546560            min(max_size, str_size(srinfo.name)));
    547561        free(srinfo.name);
    548 
    549         async_answer_3(callid, retval, srinfo.dest.ipv4, srinfo.dest.bits,
    550             srinfo.router.ipv4);
     562       
     563        async_answer_3(callid, retval, (sysarg_t) dest_addr,
     564            (sysarg_t) dest_bits, (sysarg_t) router_addr);
    551565}
    552566
  • uspace/srv/net/inetsrv/inetping.c

    r19a4f73 ra2e3ee6  
    6262}
    6363
    64 static int inetping_get_srcaddr(inetping_client_t *client, inet_addr_t *remote,
    65     inet_addr_t *local)
    66 {
    67         return inet_get_srcaddr(remote, ICMP_TOS, local);
     64static int inetping_get_srcaddr(inetping_client_t *client, uint32_t remote,
     65    uint32_t *local)
     66{
     67        inet_addr_t remote_addr;
     68        inet_addr_unpack(remote, &remote_addr);
     69       
     70        inet_addr_t local_addr;
     71        int rc = inet_get_srcaddr(&remote_addr, ICMP_TOS, &local_addr);
     72        if (rc != EOK)
     73                return rc;
     74       
     75        return inet_addr_pack(&local_addr, local);
    6876}
    6977
     
    8290        exch = async_exchange_begin(client->sess);
    8391
    84         aid_t req = async_send_3(exch, INETPING_EV_RECV, sdu->src.ipv4,
    85             sdu->dest.ipv4, sdu->seq_no, &answer);
     92        aid_t req = async_send_3(exch, INETPING_EV_RECV, (sysarg_t) sdu->src,
     93            (sysarg_t) sdu->dest, sdu->seq_no, &answer);
    8694        int rc = async_data_write_start(exch, sdu->data, sdu->size);
    8795        async_exchange_end(exch);
     
    116124        }
    117125
    118         sdu.src.ipv4 = IPC_GET_ARG1(*call);
    119         sdu.dest.ipv4 = IPC_GET_ARG2(*call);
     126        sdu.src = IPC_GET_ARG1(*call);
     127        sdu.dest = IPC_GET_ARG2(*call);
    120128        sdu.seq_no = IPC_GET_ARG3(*call);
    121129
     
    129137    ipc_callid_t callid, ipc_call_t *call)
    130138{
    131         inet_addr_t remote;
    132         inet_addr_t local;
    133         int rc;
    134 
    135139        log_msg(LOG_DEFAULT, LVL_DEBUG, "inetping_get_srcaddr_srv()");
    136 
    137         remote.ipv4 = IPC_GET_ARG1(*call);
    138         local.ipv4 = 0;
    139 
    140         rc = inetping_get_srcaddr(client, &remote, &local);
    141         async_answer_1(callid, rc, local.ipv4);
     140       
     141        uint32_t remote = IPC_GET_ARG1(*call);
     142        uint32_t local = 0;
     143       
     144        int rc = inetping_get_srcaddr(client, remote, &local);
     145        async_answer_1(callid, rc, (sysarg_t) local);
    142146}
    143147
  • uspace/srv/net/inetsrv/inetping.h

    r19a4f73 ra2e3ee6  
    3838#define INETPING_H_
    3939
     40#include "inetsrv.h"
     41
    4042extern void inetping_conn(ipc_callid_t, ipc_call_t *, void *);
    4143extern int inetping_recv(uint16_t, inetping_sdu_t *);
  • uspace/srv/net/inetsrv/inetsrv.c

    r19a4f73 ra2e3ee6  
    104104        }
    105105
    106         sroute->dest.ipv4 = 0;
    107         sroute->dest.bits = 0;
    108         sroute->router.ipv4 = (10 << 24) | (0 << 16) | (2 << 8) | 2;
     106        inet_naddr(&sroute->dest, 0, 0, 0, 0, 0);
     107        inet_addr(&sroute->router, 10, 0, 2, 2);
    109108        sroute->name = str_dup("default");
    110109        inet_sroute_add(sroute);
    111110
    112         rc = inet_link_discovery_start();
     111        rc = inet_link_discovery_start();
    113112        if (rc != EOK)
    114113                return EEXIST;
     
    194193
    195194        /* Take source address from the address object */
    196         local->ipv4 = dir.aobj->naddr.ipv4;
     195        inet_naddr_addr(&dir.aobj->naddr, local);
    197196        return EOK;
    198197}
     
    201200    ipc_call_t *call)
    202201{
     202        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_get_srcaddr_srv()");
     203       
    203204        inet_addr_t remote;
    204         uint8_t tos;
     205        inet_addr_unpack(IPC_GET_ARG1(*call), &remote);
     206        uint8_t tos = IPC_GET_ARG2(*call);
     207       
    205208        inet_addr_t local;
    206         int rc;
    207 
    208         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_get_srcaddr_srv()");
    209 
    210         remote.ipv4 = IPC_GET_ARG1(*call);
    211         tos = IPC_GET_ARG2(*call);
    212         local.ipv4 = 0;
    213 
    214         rc = inet_get_srcaddr(&remote, tos, &local);
    215         async_answer_1(callid, rc, local.ipv4);
     209        int rc = inet_get_srcaddr(&remote, tos, &local);
     210        if (rc != EOK) {
     211                async_answer_0(callid, rc);
     212                return;
     213        }
     214       
     215        uint32_t local_addr;
     216        rc = inet_addr_pack(&local, &local_addr);
     217        if (rc != EOK) {
     218                async_answer_0(callid, rc);
     219                return;
     220        }
     221       
     222        async_answer_1(callid, rc, (sysarg_t) local_addr);
    216223}
    217224
     
    219226    ipc_call_t *call)
    220227{
     228        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_send_srv()");
     229       
    221230        inet_dgram_t dgram;
    222         uint8_t ttl;
    223         int df;
    224         int rc;
    225 
    226         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_send_srv()");
    227 
    228         dgram.src.ipv4 = IPC_GET_ARG1(*call);
    229         dgram.dest.ipv4 = IPC_GET_ARG2(*call);
     231       
     232        inet_addr_unpack(IPC_GET_ARG1(*call), &dgram.src);
     233        inet_addr_unpack(IPC_GET_ARG2(*call), &dgram.dest);
    230234        dgram.tos = IPC_GET_ARG3(*call);
    231         ttl = IPC_GET_ARG4(*call);
    232         df = IPC_GET_ARG5(*call);
    233 
    234         rc = async_data_write_accept(&dgram.data, false, 0, 0, 0, &dgram.size);
     235       
     236        uint8_t ttl = IPC_GET_ARG4(*call);
     237        int df = IPC_GET_ARG5(*call);
     238       
     239        int rc = async_data_write_accept(&dgram.data, false, 0, 0, 0,
     240            &dgram.size);
    235241        if (rc != EOK) {
    236242                async_answer_0(callid, rc);
    237243                return;
    238244        }
    239 
     245       
    240246        rc = inet_send(client, &dgram, client->protocol, ttl, df);
    241 
     247       
    242248        free(dgram.data);
    243249        async_answer_0(callid, rc);
     
    365371int inet_ev_recv(inet_client_t *client, inet_dgram_t *dgram)
    366372{
     373        uint32_t src;
     374        int rc = inet_addr_pack(&dgram->src, &src);
     375        if (rc != EOK)
     376                return rc;
     377       
     378        uint32_t dest;
     379        rc = inet_addr_pack(&dgram->dest, &dest);
     380        if (rc != EOK)
     381                return rc;
     382       
    367383        async_exch_t *exch = async_exchange_begin(client->sess);
    368 
     384       
    369385        ipc_call_t answer;
    370         aid_t req = async_send_3(exch, INET_EV_RECV, dgram->src.ipv4,
    371             dgram->dest.ipv4, dgram->tos, &answer);
    372         int rc = async_data_write_start(exch, dgram->data, dgram->size);
     386        aid_t req = async_send_3(exch, INET_EV_RECV, (sysarg_t) src,
     387            (sysarg_t) dest, dgram->tos, &answer);
     388        rc = async_data_write_start(exch, dgram->data, dgram->size);
    373389        async_exchange_end(exch);
    374 
     390       
    375391        if (rc != EOK) {
    376392                async_forget(req);
    377393                return rc;
    378394        }
    379 
     395       
    380396        sysarg_t retval;
    381397        async_wait_for(req, &retval);
    382398        if (retval != EOK)
    383399                return retval;
    384 
     400       
    385401        return EOK;
    386402}
  • uspace/srv/net/inetsrv/inetsrv.h

    r19a4f73 ra2e3ee6  
    172172
    173173typedef struct {
    174         inet_addr_t src;
    175         inet_addr_t dest;
     174        uint32_t src;
     175        uint32_t dest;
    176176        uint16_t seq_no;
    177177        void *data;
  • uspace/srv/net/inetsrv/pdu.c

    r19a4f73 ra2e3ee6  
    106106    void **rdata, size_t *rsize, size_t *roffs)
    107107{
    108         void *data;
    109         size_t size;
    110         ip_header_t *hdr;
    111         size_t hdr_size;
    112         size_t data_offs;
    113         uint16_t chksum;
    114         uint16_t ident;
    115         uint16_t flags_foff;
    116         uint16_t foff;
    117         size_t fragoff_limit;
    118         size_t xfer_size;
    119         size_t spc_avail;
    120         size_t rem_offs;
    121 
     108        uint32_t src_addr;
     109        int rc = inet_addr_pack(&packet->src, &src_addr);
     110        if (rc != EOK)
     111                return rc;
     112       
     113        uint32_t dest_addr;
     114        rc = inet_addr_pack(&packet->dest, &dest_addr);
     115        if (rc != EOK)
     116                return rc;
     117       
    122118        /* Upper bound for fragment offset field */
    123         fragoff_limit = 1 << (FF_FRAGOFF_h - FF_FRAGOFF_l);
    124 
     119        size_t fragoff_limit = 1 << (FF_FRAGOFF_h - FF_FRAGOFF_l);
     120       
    125121        /* Verify that total size of datagram is within reasonable bounds */
    126122        if (offs + packet->size > FRAG_OFFS_UNIT * fragoff_limit)
    127123                return ELIMIT;
    128 
    129         hdr_size = sizeof(ip_header_t);
    130         data_offs = ROUND_UP(hdr_size, 4);
    131 
     124       
     125        size_t hdr_size = sizeof(ip_header_t);
     126        size_t data_offs = ROUND_UP(hdr_size, 4);
     127       
    132128        assert(offs % FRAG_OFFS_UNIT == 0);
    133129        assert(offs / FRAG_OFFS_UNIT < fragoff_limit);
    134 
     130       
    135131        /* Value for the fragment offset field */
    136         foff = offs / FRAG_OFFS_UNIT;
    137 
     132        uint16_t foff = offs / FRAG_OFFS_UNIT;
     133       
    138134        if (hdr_size >= mtu)
    139135                return EINVAL;
    140 
     136       
    141137        /* Amount of space in the PDU available for payload */
    142         spc_avail = mtu - hdr_size;
     138        size_t spc_avail = mtu - hdr_size;
    143139        spc_avail -= (spc_avail % FRAG_OFFS_UNIT);
    144 
     140       
    145141        /* Amount of data (payload) to transfer */
    146         xfer_size = min(packet->size - offs, spc_avail);
    147 
     142        size_t xfer_size = min(packet->size - offs, spc_avail);
     143       
    148144        /* Total PDU size */
    149         size = hdr_size + xfer_size;
    150 
     145        size_t size = hdr_size + xfer_size;
     146       
    151147        /* Offset of remaining payload */
    152         rem_offs = offs + xfer_size;
    153 
     148        size_t rem_offs = offs + xfer_size;
     149       
    154150        /* Flags */
    155         flags_foff =
     151        uint16_t flags_foff =
    156152            (packet->df ? BIT_V(uint16_t, FF_FLAG_DF) : 0) +
    157153            (rem_offs < packet->size ? BIT_V(uint16_t, FF_FLAG_MF) : 0) +
    158154            (foff << FF_FRAGOFF_l);
    159 
    160         data = calloc(size, 1);
     155       
     156        void *data = calloc(size, 1);
    161157        if (data == NULL)
    162158                return ENOMEM;
    163 
     159       
    164160        /* Allocate identifier */
    165161        fibril_mutex_lock(&ip_ident_lock);
    166         ident = ++ip_ident;
     162        uint16_t ident = ++ip_ident;
    167163        fibril_mutex_unlock(&ip_ident_lock);
    168 
     164       
    169165        /* Encode header fields */
    170         hdr = (ip_header_t *)data;
     166        ip_header_t *hdr = (ip_header_t *) data;
     167       
    171168        hdr->ver_ihl = (4 << VI_VERSION_l) | (hdr_size / sizeof(uint32_t));
    172169        hdr->tos = packet->tos;
     
    177174        hdr->proto = packet->proto;
    178175        hdr->chksum = 0;
    179         hdr->src_addr = host2uint32_t_be(packet->src.ipv4);
    180         hdr->dest_addr = host2uint32_t_be(packet->dest.ipv4);
    181 
     176        hdr->src_addr = host2uint32_t_be(src_addr);
     177        hdr->dest_addr = host2uint32_t_be(dest_addr);
     178       
    182179        /* Compute checksum */
    183         chksum = inet_checksum_calc(INET_CHECKSUM_INIT, (void *)hdr, hdr_size);
     180        uint16_t chksum = inet_checksum_calc(INET_CHECKSUM_INIT, (void *) hdr,
     181            hdr_size);
    184182        hdr->chksum = host2uint16_t_be(chksum);
    185 
     183       
    186184        /* Copy payload */
    187         memcpy((uint8_t *)data + data_offs, packet->data + offs, xfer_size);
    188 
     185        memcpy((uint8_t *) data + data_offs, packet->data + offs, xfer_size);
     186       
    189187        *rdata = data;
    190188        *rsize = size;
    191189        *roffs = rem_offs;
    192 
     190       
    193191        return EOK;
    194192}
     
    238236        /* XXX Checksum */
    239237
    240         packet->src.ipv4 = uint32_t_be2host(hdr->src_addr);
    241         packet->dest.ipv4 = uint32_t_be2host(hdr->dest_addr);
     238        inet_addr_unpack(uint32_t_be2host(hdr->src_addr), &packet->src);
     239        inet_addr_unpack(uint32_t_be2host(hdr->dest_addr), &packet->dest);
    242240        packet->tos = hdr->tos;
    243241        packet->proto = hdr->proto;
  • uspace/srv/net/inetsrv/reass.c

    r19a4f73 ra2e3ee6  
    139139                    dgram_link);
    140140
    141                 if (f1->packet.src.ipv4 == packet->src.ipv4 &&
    142                     f1->packet.dest.ipv4 == packet->dest.ipv4 &&
    143                     f1->packet.proto == packet->proto &&
    144                     f1->packet.ident == packet->ident) {
     141                if ((inet_addr_compare(&f1->packet.src, &packet->src)) &&
     142                    (inet_addr_compare(&f1->packet.dest, &packet->dest)) &&
     143                    (f1->packet.proto == packet->proto) &&
     144                    (f1->packet.ident == packet->ident)) {
    145145                        /* Match */
    146146                        return rdg;
  • uspace/srv/net/inetsrv/sroute.c

    r19a4f73 ra2e3ee6  
    9797inet_sroute_t *inet_sroute_find(inet_addr_t *addr)
    9898{
    99         uint32_t mask;
    100         inet_sroute_t *best;
    101 
    102         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find(%x)", (unsigned)addr->ipv4);
    103 
    104         fibril_mutex_lock(&sroute_list_lock);
    105 
    106         best = NULL;
    107 
    108         list_foreach(sroute_list, link) {
    109                 inet_sroute_t *sroute = list_get_instance(link,
    110                     inet_sroute_t, sroute_list);
    111 
     99        uint32_t addr_addr;
     100        int rc = inet_addr_pack(addr, &addr_addr);
     101        if (rc != EOK)
     102                return NULL;
     103       
     104        inet_sroute_t *best = NULL;
     105        uint8_t best_bits = 0;
     106       
     107        fibril_mutex_lock(&sroute_list_lock);
     108       
     109        list_foreach(sroute_list, link) {
     110                inet_sroute_t *sroute = list_get_instance(link,
     111                    inet_sroute_t, sroute_list);
     112               
     113                uint32_t dest_addr;
     114                uint8_t dest_bits;
     115                rc = inet_naddr_pack(&sroute->dest, &dest_addr, &dest_bits);
     116                if (rc != EOK)
     117                        continue;
     118               
    112119                /* Look for the most specific route */
    113                 if (best != NULL && best->dest.bits >= sroute->dest.bits)
     120                if ((best != NULL) && (best_bits >= dest_bits))
    114121                        continue;
    115 
    116                 mask = inet_netmask(sroute->dest.bits);
    117                 if ((sroute->dest.ipv4 & mask) == (addr->ipv4 & mask)) {
    118                         fibril_mutex_unlock(&sroute_list_lock);
    119                         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: found %p",
     122               
     123                uint32_t mask = inet_netmask(dest_bits);
     124                if ((dest_addr & mask) == (addr_addr & mask)) {
     125                        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: found candidate %p",
    120126                            sroute);
    121                         return sroute;
     127                       
     128                        best = sroute;
     129                        best_bits = dest_bits;
    122130                }
    123131        }
    124 
    125         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: Not found");
    126         fibril_mutex_unlock(&sroute_list_lock);
    127 
    128         return NULL;
     132       
     133        if (best == NULL)
     134                log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: Not found");
     135       
     136        fibril_mutex_unlock(&sroute_list_lock);
     137       
     138        return best;
    129139}
    130140
Note: See TracChangeset for help on using the changeset viewer.