Ignore:
File:
1 edited

Legend:

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

    ra1a101d r5a324d99  
    4242#include <stdlib.h>
    4343#include <str.h>
    44 
    4544#include "addrobj.h"
    4645#include "inetsrv.h"
    4746#include "inet_link.h"
    48 #include "inet_util.h"
     47#include "ndp.h"
    4948
    5049static inet_addrobj_t *inet_addrobj_find_by_name_locked(const char *, inet_link_t *);
     
    106105/** Find address object matching address @a addr.
    107106 *
    108  * @param addr  Address
    109  * @oaram find  iaf_net to find network (using mask),
    110  *              iaf_addr to find local address (exact match)
     107 * @param addr Address
     108 * @oaram find iaf_net to find network (using mask),
     109 *             iaf_addr to find local address (exact match)
     110 *
    111111 */
    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 
    120         list_foreach(addr_list, link) {
    121                 inet_addrobj_t *naddr = list_get_instance(link,
    122                     inet_addrobj_t, addr_list);
    123 
    124                 mask = inet_netmask(naddr->naddr.bits);
    125                 if ((naddr->naddr.ipv4 & mask) == (addr->ipv4 & mask)) {
    126                         fibril_mutex_unlock(&addr_list_lock);
    127                         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p",
    128                             naddr);
    129                         return naddr;
     114        fibril_mutex_lock(&addr_list_lock);
     115       
     116        list_foreach(addr_list, addr_list, inet_addrobj_t, naddr) {
     117                switch (find) {
     118                case iaf_net:
     119                        if (inet_naddr_compare_mask(&naddr->naddr, addr)) {
     120                                fibril_mutex_unlock(&addr_list_lock);
     121                                log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p",
     122                                    naddr);
     123                                return naddr;
     124                        }
     125                        break;
     126                case iaf_addr:
     127                        if (inet_naddr_compare(&naddr->naddr, addr)) {
     128                                fibril_mutex_unlock(&addr_list_lock);
     129                                log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p",
     130                                    naddr);
     131                                return naddr;
     132                        }
     133                        break;
    130134                }
    131135        }
    132 
     136       
    133137        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: Not found");
    134138        fibril_mutex_unlock(&addr_list_lock);
    135 
     139       
    136140        return NULL;
    137141}
     
    150154            name, ilink->svc_name);
    151155
    152         list_foreach(addr_list, link) {
    153                 inet_addrobj_t *naddr = list_get_instance(link,
    154                     inet_addrobj_t, addr_list);
    155 
     156        list_foreach(addr_list, addr_list, inet_addrobj_t, naddr) {
    156157                if (naddr->ilink == ilink && str_cmp(naddr->name, name) == 0) {
    157158                        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find_by_name_locked: found %p",
     
    198199        fibril_mutex_lock(&addr_list_lock);
    199200
    200         list_foreach(addr_list, link) {
    201                 inet_addrobj_t *naddr = list_get_instance(link,
    202                     inet_addrobj_t, addr_list);
    203 
     201        list_foreach(addr_list, addr_list, inet_addrobj_t, naddr) {
    204202                if (naddr->id == id) {
    205203                        fibril_mutex_unlock(&addr_list_lock);
     
    218216{
    219217        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);
     218        inet_naddr_addr(&addr->naddr, &lsrc_addr);
     219
     220        addr32_t lsrc_v4;
     221        addr128_t lsrc_v6;
     222        ip_ver_t lsrc_ver = inet_addr_get(&lsrc_addr, &lsrc_v4, &lsrc_v6);
     223
     224        addr32_t ldest_v4;
     225        addr128_t ldest_v6;
     226        ip_ver_t ldest_ver = inet_addr_get(ldest, &ldest_v4, &ldest_v6);
     227
     228        if (lsrc_ver != ldest_ver)
     229                return EINVAL;
     230
     231        int rc;
     232        addr48_t ldest_mac;
     233
     234        switch (ldest_ver) {
     235        case ip_v4:
     236                return inet_link_send_dgram(addr->ilink, lsrc_v4, ldest_v4,
     237                    dgram, proto, ttl, df);
     238        case ip_v6:
     239                /*
     240                 * Translate local destination IPv6 address.
     241                 */
     242                rc = ndp_translate(lsrc_v6, ldest_v6, ldest_mac, addr->ilink);
     243                if (rc != EOK)
     244                        return rc;
     245
     246                return inet_link_send_dgram6(addr->ilink, ldest_mac, dgram,
     247                    proto, ttl, df);
     248        default:
     249                assert(false);
     250                break;
     251        }
     252
     253        return ENOTSUP;
    227254}
    228255
     
    243270
    244271        i = 0;
    245         list_foreach(addr_list, link) {
    246                 inet_addrobj_t *addr = list_get_instance(link,
    247                     inet_addrobj_t, addr_list);
    248 
     272        list_foreach(addr_list, addr_list, inet_addrobj_t, addr) {
    249273                id_list[i++] = addr->id;
    250274        }
Note: See TracChangeset for help on using the changeset viewer.