Ignore:
File:
1 edited

Legend:

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

    ra1a101d ra17356fd  
    4242#include <stdlib.h>
    4343#include <str.h>
    44 
     44#include <net/socket_codes.h>
    4545#include "addrobj.h"
    4646#include "inetsrv.h"
    4747#include "inet_link.h"
    48 #include "inet_util.h"
     48#include "ndp.h"
    4949
    5050static inet_addrobj_t *inet_addrobj_find_by_name_locked(const char *, inet_link_t *);
     
    106106/** Find address object matching address @a addr.
    107107 *
    108  * @param addr  Address
    109  * @oaram find  iaf_net to find network (using mask),
    110  *              iaf_addr to find local address (exact match)
     108 * @param addr Address
     109 * @oaram find iaf_net to find network (using mask),
     110 *             iaf_addr to find local address (exact match)
     111 *
    111112 */
    112113inet_addrobj_t *inet_addrobj_find(inet_addr_t *addr, inet_addrobj_find_t find)
    113114{
    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 
     115        fibril_mutex_lock(&addr_list_lock);
     116       
    120117        list_foreach(addr_list, link) {
    121118                inet_addrobj_t *naddr = list_get_instance(link,
    122119                    inet_addrobj_t, addr_list);
    123 
    124                 mask = inet_netmask(naddr->naddr.bits);
    125                 if ((naddr->naddr.ipv4 & mask) == (addr->ipv4 & mask)) {
     120               
     121                if (inet_naddr_compare_mask(&naddr->naddr, addr)) {
    126122                        fibril_mutex_unlock(&addr_list_lock);
    127123                        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p",
     
    130126                }
    131127        }
    132 
     128       
    133129        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: Not found");
    134130        fibril_mutex_unlock(&addr_list_lock);
    135 
     131       
    136132        return NULL;
    137133}
     
    218214{
    219215        inet_addr_t lsrc_addr;
    220         inet_addr_t *ldest_addr;
    221 
    222         lsrc_addr.ipv4 = addr->naddr.ipv4;
    223         ldest_addr = &dgram->dest;
    224 
    225         return inet_link_send_dgram(addr->ilink, &lsrc_addr, ldest_addr, dgram,
    226             proto, ttl, df);
     216        inet_naddr_addr(&addr->naddr, &lsrc_addr);
     217       
     218        addr32_t lsrc_v4;
     219        addr128_t lsrc_v6;
     220        uint16_t lsrc_af = inet_addr_get(&lsrc_addr, &lsrc_v4, &lsrc_v6);
     221       
     222        addr32_t ldest_v4;
     223        addr128_t ldest_v6;
     224        uint16_t ldest_af = inet_addr_get(ldest, &ldest_v4, &ldest_v6);
     225       
     226        if (lsrc_af != ldest_af)
     227                return EINVAL;
     228       
     229        int rc;
     230        addr48_t ldest_mac;
     231       
     232        switch (ldest_af) {
     233        case AF_INET:
     234                return inet_link_send_dgram(addr->ilink, lsrc_v4, ldest_v4,
     235                    dgram, proto, ttl, df);
     236        case AF_INET6:
     237                /*
     238                 * Translate local destination IPv6 address.
     239                 */
     240                rc = ndp_translate(lsrc_v6, ldest_v6, ldest_mac, addr->ilink);
     241                if (rc != EOK)
     242                        return rc;
     243               
     244                return inet_link_send_dgram6(addr->ilink, ldest_mac, dgram,
     245                    proto, ttl, df);
     246        }
     247       
     248        return ENOTSUP;
    227249}
    228250
Note: See TracChangeset for help on using the changeset viewer.