Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet6/in6.c
Show First 20 Lines • Show All 1,544 Lines • ▼ Show 20 Lines | CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { | ||||
} | } | ||||
} | } | ||||
return ((struct in6_ifaddr *)ifa); | return ((struct in6_ifaddr *)ifa); | ||||
} | } | ||||
/* | /* | ||||
* find the interface address corresponding to a given IPv6 address. | * find the interface address corresponding to a given IPv6 address. | ||||
* ifaddr is returned referenced. | * ifaddr is returned referenced if @referenced flag is set. | ||||
*/ | */ | ||||
struct in6_ifaddr * | struct in6_ifaddr * | ||||
in6ifa_ifwithaddr(const struct in6_addr *addr, uint32_t zoneid) | in6ifa_ifwithaddr(const struct in6_addr *addr, uint32_t zoneid, bool referenced) | ||||
{ | { | ||||
struct rm_priotracker in6_ifa_tracker; | struct rm_priotracker in6_ifa_tracker; | ||||
struct in6_ifaddr *ia; | struct in6_ifaddr *ia; | ||||
IN6_IFADDR_RLOCK(&in6_ifa_tracker); | IN6_IFADDR_RLOCK(&in6_ifa_tracker); | ||||
CK_LIST_FOREACH(ia, IN6ADDR_HASH(addr), ia6_hash) { | CK_LIST_FOREACH(ia, IN6ADDR_HASH(addr), ia6_hash) { | ||||
if (IN6_ARE_ADDR_EQUAL(IA6_IN6(ia), addr)) { | if (IN6_ARE_ADDR_EQUAL(IA6_IN6(ia), addr)) { | ||||
if (zoneid != 0 && | if (zoneid != 0 && | ||||
zoneid != ia->ia_addr.sin6_scope_id) | zoneid != ia->ia_addr.sin6_scope_id) | ||||
continue; | continue; | ||||
if (referenced) | |||||
ifa_ref(&ia->ia_ifa); | ifa_ref(&ia->ia_ifa); | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
IN6_IFADDR_RUNLOCK(&in6_ifa_tracker); | IN6_IFADDR_RUNLOCK(&in6_ifa_tracker); | ||||
return (ia); | return (ia); | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 1,017 Lines • Show Last 20 Lines |