diff options
Diffstat (limited to 'sys/net/if.c')
-rw-r--r-- | sys/net/if.c | 34 |
1 files changed, 12 insertions, 22 deletions
diff --git a/sys/net/if.c b/sys/net/if.c index 2e9ab953721..dfa550cd014 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if.c,v 1.206 2010/01/13 02:26:49 henning Exp $ */ +/* $OpenBSD: if.c,v 1.207 2010/01/13 02:29:51 henning Exp $ */ /* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */ /* @@ -875,32 +875,22 @@ if_congestion_clear(void *arg) struct ifaddr * ifa_ifwithaddr(struct sockaddr *addr, u_int rdomain) { - struct ifnet *ifp; - struct ifaddr *ifa; + struct ifaddr_item *ifai, key; -#define equal(a1, a2) \ - (bcmp((caddr_t)(a1), (caddr_t)(a2), \ - ((struct sockaddr *)(a1))->sa_len) == 0) + bzero(&key, sizeof(key)); + key.ifai_addr = addr; + key.ifai_rdomain = rtable_l2(rdomain); - rdomain = rtable_l2(rdomain); - TAILQ_FOREACH(ifp, &ifnet, if_list) { - if (ifp->if_rdomain != rdomain) - continue; - TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) { - if (ifa->ifa_addr->sa_family != addr->sa_family) - continue; - if (equal(addr, ifa->ifa_addr)) - return (ifa); - if ((ifp->if_flags & IFF_BROADCAST) && ifa->ifa_broadaddr && - /* IP6 doesn't have broadcast */ - ifa->ifa_broadaddr->sa_len != 0 && - equal(ifa->ifa_broadaddr, addr)) - return (ifa); - } - } + ifai = RB_FIND(ifaddr_items, &ifaddr_items, &key); + if (ifai) + return (ifai->ifai_ifa); return (NULL); } +#define equal(a1, a2) \ + (bcmp((caddr_t)(a1), (caddr_t)(a2), \ + ((struct sockaddr *)(a1))->sa_len) == 0) + /* * Locate the point to point interface with a given destination address. */ |