Ignore:
File:
1 edited

Legend:

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

    r1d24ad3 r4a5a18be  
    4343#include <stdlib.h>
    4444#include <str.h>
    45 #include <net/socket_codes.h>
     45
    4646#include "addrobj.h"
    4747#include "inetsrv.h"
     
    4949#include "pdu.h"
    5050
    51 static int inet_link_open(service_id_t);
    52 static int inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, uint16_t);
     51static int inet_link_open(service_id_t sid);
     52static int inet_iplink_recv(iplink_t *ilink, iplink_sdu_t *sdu);
    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_recv_sdu_t *sdu, uint16_t af)
    62 {
     61static int inet_iplink_recv(iplink_t *iplink, iplink_sdu_t *sdu)
     62{
     63        inet_packet_t packet;
     64        int rc;
     65
    6366        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_iplink_recv()");
    64        
    65         int rc;
    66         inet_packet_t 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        
     67        rc = inet_pdu_decode(sdu->data, sdu->size, &packet);
    8068        if (rc != EOK) {
    8169                log_msg(LOG_DEFAULT, LVL_DEBUG, "failed decoding PDU");
    8270                return rc;
    8371        }
    84        
     72
    8573        log_msg(LOG_DEFAULT, LVL_DEBUG, "call inet_recv_packet()");
    8674        rc = inet_recv_packet(&packet);
    8775        log_msg(LOG_DEFAULT, LVL_DEBUG, "call inet_recv_packet -> %d", rc);
    8876        free(packet.data);
    89        
     77
    9078        return rc;
    9179}
     
    165153{
    166154        inet_link_t *ilink;
    167         inet_addr_t iaddr;
     155        iplink_addr_t iaddr;
    168156        int rc;
    169157
     
    206194
    207195        inet_addrobj_t *addr;
    208         inet_addrobj_t *addr6;
    209196
    210197        static int first = 1;
    211        
     198        /* XXX For testing: set static IP address 10.0.2.15/24 */
    212199        addr = inet_addrobj_new();
    213         addr6 = inet_addrobj_new();
    214        
    215200        if (first) {
    216                 inet_naddr(&addr->naddr, 127, 0, 0, 1, 24);
    217                 inet_naddr6(&addr6->naddr, 0, 0, 0, 0, 0, 0, 0, 1, 128);
     201                addr->naddr.ipv4 = (127 << 24) + (0 << 16) + (0 << 8) + 1;
    218202                first = 0;
    219203        } else {
    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        
     204                addr->naddr.ipv4 = (10 << 24) + (0 << 16) + (2 << 8) + 15;
     205        }
     206        addr->naddr.bits = 24;
    230207        addr->ilink = ilink;
    231         addr6->ilink = ilink;
    232208        addr->name = str_dup("v4a");
    233         addr6->name = str_dup("v6a");
    234        
    235209        rc = inet_addrobj_add(addr);
    236210        if (rc != EOK) {
    237                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding IPv4 address.");
     211                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IP address on internet link.");
    238212                inet_addrobj_delete(addr);
    239213                /* XXX Roll back */
    240214                return rc;
    241215        }
    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);
     216
     217        iaddr.ipv4 = addr->naddr.ipv4;
    252218        rc = iplink_addr_add(ilink->iplink, &iaddr);
    253219        if (rc != EOK) {
    254                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IPv4 address on internet link.");
     220                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IP address on internet link.");
    255221                inet_addrobj_remove(addr);
    256222                inet_addrobj_delete(addr);
     
    258224                return rc;
    259225        }
    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        
     226
    271227        return EOK;
    272        
     228
    273229error:
    274230        if (ilink->iplink != NULL)
    275231                iplink_close(ilink->iplink);
    276        
    277232        inet_link_delete(ilink);
    278233        return rc;
     
    302257    inet_addr_t *ldest, inet_dgram_t *dgram, uint8_t proto, uint8_t ttl, int df)
    303258{
     259        iplink_sdu_t sdu;
     260        inet_packet_t packet;
     261        int rc;
     262        size_t offs, roffs;
     263
    304264        /*
    305265         * Fill packet structure. Fragmentation is performed by
    306266         * inet_pdu_encode().
    307267         */
    308        
    309         inet_packet_t packet;
    310        
    311268        packet.src = dgram->src;
    312269        packet.dest = dgram->dest;
     
    317274        packet.data = dgram->data;
    318275        packet.size = dgram->size;
    319        
    320         iplink_sdu_t sdu;
    321         size_t offs = 0;
    322         int rc;
    323        
    324         sdu.src = *lsrc;
    325         sdu.dest = *ldest;
    326        
     276
     277        sdu.lsrc.ipv4 = lsrc->ipv4;
     278        sdu.ldest.ipv4 = ldest->ipv4;
     279
     280        offs = 0;
    327281        do {
    328282                /* Encode one fragment */
    329                 size_t roffs;
    330283                rc = inet_pdu_encode(&packet, offs, ilink->def_mtu, &sdu.data,
    331284                    &sdu.size, &roffs);
    332285                if (rc != EOK)
    333286                        return rc;
    334                
     287
    335288                /* Send the PDU */
    336289                rc = iplink_send(ilink->iplink, &sdu);
    337290                free(sdu.data);
    338                
     291
    339292                offs = roffs;
    340293        } while (offs < packet.size);
    341        
     294
    342295        return rc;
    343296}
Note: See TracChangeset for help on using the changeset viewer.