Ignore:
File:
1 edited

Legend:

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

    ra1a101d rfeeac0d  
    4242#include <stdlib.h>
    4343#include <str.h>
    44 
    4544#include "sroute.h"
    4645#include "inetsrv.h"
    4746#include "inet_link.h"
    48 #include "inet_util.h"
    4947
    5048static FIBRIL_MUTEX_INITIALIZE(sroute_list_lock);
     
    9189}
    9290
    93 /** Find address object matching address @a addr.
     91/** Find static route object matching address @a addr.
    9492 *
    9593 * @param addr  Address
     
    9795inet_sroute_t *inet_sroute_find(inet_addr_t *addr)
    9896{
    99         uint32_t mask;
    100         inet_sroute_t *best;
    101 
    102         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find(%x)", (unsigned)addr->ipv4);
    103 
    104         fibril_mutex_lock(&sroute_list_lock);
    105 
    106         best = NULL;
    107 
    108         list_foreach(sroute_list, link) {
    109                 inet_sroute_t *sroute = list_get_instance(link,
    110                     inet_sroute_t, sroute_list);
    111 
     97        uint16_t addr_af = inet_addr_get(addr, NULL, NULL);
     98       
     99        inet_sroute_t *best = NULL;
     100        uint8_t best_bits = 0;
     101       
     102        fibril_mutex_lock(&sroute_list_lock);
     103       
     104        list_foreach(sroute_list, sroute_list, inet_sroute_t, sroute) {
     105                uint8_t dest_bits;
     106                uint16_t dest_af = inet_naddr_get(&sroute->dest, NULL, NULL,
     107                    &dest_bits);
     108               
     109                /* Skip comparison with different address family */
     110                if (addr_af != dest_af)
     111                        continue;
     112               
    112113                /* Look for the most specific route */
    113                 if (best != NULL && best->dest.bits >= sroute->dest.bits)
     114                if ((best != NULL) && (best_bits >= dest_bits))
    114115                        continue;
    115 
    116                 mask = inet_netmask(sroute->dest.bits);
    117                 if ((sroute->dest.ipv4 & mask) == (addr->ipv4 & mask)) {
    118                         fibril_mutex_unlock(&sroute_list_lock);
    119                         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: found %p",
     116               
     117                if (inet_naddr_compare_mask(&sroute->dest, addr)) {
     118                        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: found candidate %p",
    120119                            sroute);
    121                         return sroute;
     120                       
     121                        best = sroute;
     122                        best_bits = dest_bits;
    122123                }
    123124        }
    124 
    125         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: Not found");
    126         fibril_mutex_unlock(&sroute_list_lock);
    127 
    128         return NULL;
     125       
     126        if (best == NULL)
     127                log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: Not found");
     128       
     129        fibril_mutex_unlock(&sroute_list_lock);
     130       
     131        return best;
    129132}
    130133
     
    141144        fibril_mutex_lock(&sroute_list_lock);
    142145
    143         list_foreach(sroute_list, link) {
    144                 inet_sroute_t *sroute = list_get_instance(link,
    145                     inet_sroute_t, sroute_list);
    146 
     146        list_foreach(sroute_list, sroute_list, inet_sroute_t, sroute) {
    147147                if (str_cmp(sroute->name, name) == 0) {
    148148                        fibril_mutex_unlock(&sroute_list_lock);
     
    170170        fibril_mutex_lock(&sroute_list_lock);
    171171
    172         list_foreach(sroute_list, link) {
    173                 inet_sroute_t *sroute = list_get_instance(link,
    174                     inet_sroute_t, sroute_list);
    175 
     172        list_foreach(sroute_list, sroute_list, inet_sroute_t, sroute) {
    176173                if (sroute->id == id) {
    177174                        fibril_mutex_unlock(&sroute_list_lock);
     
    201198
    202199        i = 0;
    203         list_foreach(sroute_list, link) {
    204                 inet_sroute_t *sroute = list_get_instance(link,
    205                     inet_sroute_t, sroute_list);
    206 
     200        list_foreach(sroute_list, sroute_list, inet_sroute_t, sroute) {
    207201                id_list[i++] = sroute->id;
    208202        }
Note: See TracChangeset for help on using the changeset viewer.