Changeset 98abd40 in mainline for uspace/srv/net/inetsrv/sroute.c


Ignore:
Timestamp:
2013-07-06T21:57:22Z (11 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c8bb1633, cdc8a391
Parents:
b8e72fd1 (diff), 507c6f3 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes

File:
1 edited

Legend:

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

    rb8e72fd1 r98abd40  
    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);
     
    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, link) {
     105                inet_sroute_t *sroute = list_get_instance(link,
     106                    inet_sroute_t, sroute_list);
     107               
     108                uint8_t dest_bits;
     109                uint16_t dest_af = inet_naddr_get(&sroute->dest, NULL, NULL,
     110                    &dest_bits);
     111               
     112                /* Skip comparison with different address family */
     113                if (addr_af != dest_af)
     114                        continue;
     115               
    112116                /* Look for the most specific route */
    113                 if (best != NULL && best->dest.bits >= sroute->dest.bits)
     117                if ((best != NULL) && (best_bits >= dest_bits))
    114118                        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",
     119               
     120                if (inet_naddr_compare_mask(&sroute->dest, addr)) {
     121                        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: found candidate %p",
    120122                            sroute);
    121                         return sroute;
     123                       
     124                        best = sroute;
     125                        best_bits = dest_bits;
    122126                }
    123127        }
    124 
    125         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: Not found");
    126         fibril_mutex_unlock(&sroute_list_lock);
    127 
    128         return NULL;
     128       
     129        if (best == NULL)
     130                log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: Not found");
     131       
     132        fibril_mutex_unlock(&sroute_list_lock);
     133       
     134        return best;
    129135}
    130136
Note: See TracChangeset for help on using the changeset viewer.