Ignore:
File:
1 edited

Legend:

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

    r5a324d99 ra1a101d  
    4242#include <stdlib.h>
    4343#include <str.h>
     44
    4445#include "addrobj.h"
    4546#include "inetsrv.h"
    4647#include "inet_link.h"
    47 #include "ndp.h"
     48#include "inet_util.h"
    4849
    4950static inet_addrobj_t *inet_addrobj_find_by_name_locked(const char *, inet_link_t *);
     
    105106/** Find address object matching address @a addr.
    106107 *
    107  * @param addr Address
    108  * @oaram find iaf_net to find network (using mask),
    109  *             iaf_addr to find local address (exact match)
    110  *
     108 * @param addr  Address
     109 * @oaram find  iaf_net to find network (using mask),
     110 *              iaf_addr to find local address (exact match)
    111111 */
    112112inet_addrobj_t *inet_addrobj_find(inet_addr_t *addr, inet_addrobj_find_t find)
    113113{
    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;
     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;
    134130                }
    135131        }
    136        
     132
    137133        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: Not found");
    138134        fibril_mutex_unlock(&addr_list_lock);
    139        
     135
    140136        return NULL;
    141137}
     
    154150            name, ilink->svc_name);
    155151
    156         list_foreach(addr_list, addr_list, inet_addrobj_t, naddr) {
     152        list_foreach(addr_list, link) {
     153                inet_addrobj_t *naddr = list_get_instance(link,
     154                    inet_addrobj_t, addr_list);
     155
    157156                if (naddr->ilink == ilink && str_cmp(naddr->name, name) == 0) {
    158157                        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find_by_name_locked: found %p",
     
    199198        fibril_mutex_lock(&addr_list_lock);
    200199
    201         list_foreach(addr_list, addr_list, inet_addrobj_t, naddr) {
     200        list_foreach(addr_list, link) {
     201                inet_addrobj_t *naddr = list_get_instance(link,
     202                    inet_addrobj_t, addr_list);
     203
    202204                if (naddr->id == id) {
    203205                        fibril_mutex_unlock(&addr_list_lock);
     
    216218{
    217219        inet_addr_t lsrc_addr;
    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;
     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);
    254227}
    255228
     
    270243
    271244        i = 0;
    272         list_foreach(addr_list, addr_list, inet_addrobj_t, addr) {
     245        list_foreach(addr_list, link) {
     246                inet_addrobj_t *addr = list_get_instance(link,
     247                    inet_addrobj_t, addr_list);
     248
    273249                id_list[i++] = addr->id;
    274250        }
Note: See TracChangeset for help on using the changeset viewer.