Ignore:
File:
1 edited

Legend:

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

    rfeeac0d ra1a101d  
    4242#include <stdlib.h>
    4343#include <str.h>
     44
    4445#include "sroute.h"
    4546#include "inetsrv.h"
    4647#include "inet_link.h"
     48#include "inet_util.h"
    4749
    4850static FIBRIL_MUTEX_INITIALIZE(sroute_list_lock);
     
    8991}
    9092
    91 /** Find static route object matching address @a addr.
     93/** Find address object matching address @a addr.
    9294 *
    9395 * @param addr  Address
     
    9597inet_sroute_t *inet_sroute_find(inet_addr_t *addr)
    9698{
    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)
     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
     112                /* Look for the most specific route */
     113                if (best != NULL && best->dest.bits >= sroute->dest.bits)
    111114                        continue;
    112                
    113                 /* Look for the most specific route */
    114                 if ((best != NULL) && (best_bits >= dest_bits))
    115                         continue;
    116                
    117                 if (inet_naddr_compare_mask(&sroute->dest, addr)) {
    118                         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: found candidate %p",
     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",
    119120                            sroute);
    120                        
    121                         best = sroute;
    122                         best_bits = dest_bits;
     121                        return sroute;
    123122                }
    124123        }
    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;
     124
     125        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: Not found");
     126        fibril_mutex_unlock(&sroute_list_lock);
     127
     128        return NULL;
    132129}
    133130
     
    144141        fibril_mutex_lock(&sroute_list_lock);
    145142
    146         list_foreach(sroute_list, sroute_list, inet_sroute_t, sroute) {
     143        list_foreach(sroute_list, link) {
     144                inet_sroute_t *sroute = list_get_instance(link,
     145                    inet_sroute_t, sroute_list);
     146
    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, sroute_list, inet_sroute_t, sroute) {
     172        list_foreach(sroute_list, link) {
     173                inet_sroute_t *sroute = list_get_instance(link,
     174                    inet_sroute_t, sroute_list);
     175
    173176                if (sroute->id == id) {
    174177                        fibril_mutex_unlock(&sroute_list_lock);
     
    198201
    199202        i = 0;
    200         list_foreach(sroute_list, sroute_list, inet_sroute_t, sroute) {
     203        list_foreach(sroute_list, link) {
     204                inet_sroute_t *sroute = list_get_instance(link,
     205                    inet_sroute_t, sroute_list);
     206
    201207                id_list[i++] = sroute->id;
    202208        }
Note: See TracChangeset for help on using the changeset viewer.