Ignore:
File:
1 edited

Legend:

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

    r4a5a18be r1d24ad3  
    4343#include <stdlib.h>
    4444#include <str.h>
    45 
     45#include <net/socket_codes.h>
    4646#include "addrobj.h"
    4747#include "inetsrv.h"
     
    4949#include "pdu.h"
    5050
    51 static int inet_link_open(service_id_t sid);
    52 static int inet_iplink_recv(iplink_t *ilink, iplink_sdu_t *sdu);
     51static int inet_link_open(service_id_t);
     52static int inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, uint16_t);
    5353
    5454static iplink_ev_ops_t inet_iplink_ev_ops = {
     
    5959static FIBRIL_MUTEX_INITIALIZE(inet_discovery_lock);
    6060
    61 static int inet_iplink_recv(iplink_t *iplink, iplink_sdu_t *sdu)
    62 {
     61static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, uint16_t af)
     62{
     63        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_iplink_recv()");
     64       
     65        int rc;
    6366        inet_packet_t packet;
    64         int rc;
    65 
    66         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_iplink_recv()");
    67         rc = inet_pdu_decode(sdu->data, sdu->size, &packet);
     67       
     68        switch (af) {
     69        case AF_INET:
     70                rc = inet_pdu_decode(sdu->data, sdu->size, &packet);
     71                break;
     72        case AF_INET6:
     73                rc = inet_pdu_decode6(sdu->data, sdu->size, &packet);
     74                break;
     75        default:
     76                log_msg(LOG_DEFAULT, LVL_DEBUG, "invalid address family");
     77                return EINVAL;
     78        }
     79       
    6880        if (rc != EOK) {
    6981                log_msg(LOG_DEFAULT, LVL_DEBUG, "failed decoding PDU");
    7082                return rc;
    7183        }
    72 
     84       
    7385        log_msg(LOG_DEFAULT, LVL_DEBUG, "call inet_recv_packet()");
    7486        rc = inet_recv_packet(&packet);
    7587        log_msg(LOG_DEFAULT, LVL_DEBUG, "call inet_recv_packet -> %d", rc);
    7688        free(packet.data);
    77 
     89       
    7890        return rc;
    7991}
     
    153165{
    154166        inet_link_t *ilink;
    155         iplink_addr_t iaddr;
     167        inet_addr_t iaddr;
    156168        int rc;
    157169
     
    194206
    195207        inet_addrobj_t *addr;
     208        inet_addrobj_t *addr6;
    196209
    197210        static int first = 1;
    198         /* XXX For testing: set static IP address 10.0.2.15/24 */
     211       
    199212        addr = inet_addrobj_new();
     213        addr6 = inet_addrobj_new();
     214       
    200215        if (first) {
    201                 addr->naddr.ipv4 = (127 << 24) + (0 << 16) + (0 << 8) + 1;
     216                inet_naddr(&addr->naddr, 127, 0, 0, 1, 24);
     217                inet_naddr6(&addr6->naddr, 0, 0, 0, 0, 0, 0, 0, 1, 128);
    202218                first = 0;
    203219        } else {
    204                 addr->naddr.ipv4 = (10 << 24) + (0 << 16) + (2 << 8) + 15;
    205         }
    206         addr->naddr.bits = 24;
     220                /*
     221                 * FIXME
     222                 * Setting static IP addresses for testing purposes
     223                 * 10.0.2.15/24
     224                 * fd19:1680::4/120
     225                 */
     226                inet_naddr(&addr->naddr, 10, 0, 2, 15, 24);
     227                inet_naddr6(&addr6->naddr, 0xfd19, 0x1680, 0, 0, 0, 0, 0, 4, 120);
     228        }
     229       
    207230        addr->ilink = ilink;
     231        addr6->ilink = ilink;
    208232        addr->name = str_dup("v4a");
     233        addr6->name = str_dup("v6a");
     234       
    209235        rc = inet_addrobj_add(addr);
    210236        if (rc != EOK) {
    211                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IP address on internet link.");
     237                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding IPv4 address.");
    212238                inet_addrobj_delete(addr);
    213239                /* XXX Roll back */
    214240                return rc;
    215241        }
    216 
    217         iaddr.ipv4 = addr->naddr.ipv4;
     242       
     243        rc = inet_addrobj_add(addr6);
     244        if (rc != EOK) {
     245                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding IPv6 address.");
     246                inet_addrobj_delete(addr6);
     247                /* XXX Roll back */
     248                return rc;
     249        }
     250       
     251        inet_naddr_addr(&addr->naddr, &iaddr);
    218252        rc = iplink_addr_add(ilink->iplink, &iaddr);
    219253        if (rc != EOK) {
    220                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IP address on internet link.");
     254                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IPv4 address on internet link.");
    221255                inet_addrobj_remove(addr);
    222256                inet_addrobj_delete(addr);
     
    224258                return rc;
    225259        }
    226 
     260       
     261        inet_naddr_addr(&addr6->naddr, &iaddr);
     262        rc = iplink_addr_add(ilink->iplink, &iaddr);
     263        if (rc != EOK) {
     264                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IPv6 address on internet link.");
     265                inet_addrobj_remove(addr6);
     266                inet_addrobj_delete(addr6);
     267                /* XXX Roll back */
     268                return rc;
     269        }
     270       
    227271        return EOK;
    228 
     272       
    229273error:
    230274        if (ilink->iplink != NULL)
    231275                iplink_close(ilink->iplink);
     276       
    232277        inet_link_delete(ilink);
    233278        return rc;
     
    257302    inet_addr_t *ldest, inet_dgram_t *dgram, uint8_t proto, uint8_t ttl, int df)
    258303{
    259         iplink_sdu_t sdu;
    260         inet_packet_t packet;
    261         int rc;
    262         size_t offs, roffs;
    263 
    264304        /*
    265305         * Fill packet structure. Fragmentation is performed by
    266306         * inet_pdu_encode().
    267307         */
     308       
     309        inet_packet_t packet;
     310       
    268311        packet.src = dgram->src;
    269312        packet.dest = dgram->dest;
     
    274317        packet.data = dgram->data;
    275318        packet.size = dgram->size;
    276 
    277         sdu.lsrc.ipv4 = lsrc->ipv4;
    278         sdu.ldest.ipv4 = ldest->ipv4;
    279 
    280         offs = 0;
     319       
     320        iplink_sdu_t sdu;
     321        size_t offs = 0;
     322        int rc;
     323       
     324        sdu.src = *lsrc;
     325        sdu.dest = *ldest;
     326       
    281327        do {
    282328                /* Encode one fragment */
     329                size_t roffs;
    283330                rc = inet_pdu_encode(&packet, offs, ilink->def_mtu, &sdu.data,
    284331                    &sdu.size, &roffs);
    285332                if (rc != EOK)
    286333                        return rc;
    287 
     334               
    288335                /* Send the PDU */
    289336                rc = iplink_send(ilink->iplink, &sdu);
    290337                free(sdu.data);
    291 
     338               
    292339                offs = roffs;
    293340        } while (offs < packet.size);
    294 
     341       
    295342        return rc;
    296343}
Note: See TracChangeset for help on using the changeset viewer.