Changeset View
Changeset View
Standalone View
Standalone View
head/sys/net/if_stf.c
Show First 20 Lines • Show All 361 Lines • ▼ Show 20 Lines | stf_encapcheck(const struct mbuf *m, int off, int proto, void *arg) | ||||
/* stf interface makes single side match only */ | /* stf interface makes single side match only */ | ||||
return 32; | return 32; | ||||
} | } | ||||
static int | static int | ||||
stf_getsrcifa6(struct ifnet *ifp, struct in6_addr *addr, struct in6_addr *mask) | stf_getsrcifa6(struct ifnet *ifp, struct in6_addr *addr, struct in6_addr *mask) | ||||
{ | { | ||||
struct rm_priotracker in_ifa_tracker; | |||||
struct ifaddr *ia; | struct ifaddr *ia; | ||||
struct in_ifaddr *ia4; | struct in_ifaddr *ia4; | ||||
struct in6_ifaddr *ia6; | struct in6_ifaddr *ia6; | ||||
struct sockaddr_in6 *sin6; | struct sockaddr_in6 *sin6; | ||||
struct in_addr in; | struct in_addr in; | ||||
if_addr_rlock(ifp); | if_addr_rlock(ifp); | ||||
CK_STAILQ_FOREACH(ia, &ifp->if_addrhead, ifa_link) { | CK_STAILQ_FOREACH(ia, &ifp->if_addrhead, ifa_link) { | ||||
if (ia->ifa_addr->sa_family != AF_INET6) | if (ia->ifa_addr->sa_family != AF_INET6) | ||||
continue; | continue; | ||||
sin6 = (struct sockaddr_in6 *)ia->ifa_addr; | sin6 = (struct sockaddr_in6 *)ia->ifa_addr; | ||||
if (!IN6_IS_ADDR_6TO4(&sin6->sin6_addr)) | if (!IN6_IS_ADDR_6TO4(&sin6->sin6_addr)) | ||||
continue; | continue; | ||||
bcopy(GET_V4(&sin6->sin6_addr), &in, sizeof(in)); | bcopy(GET_V4(&sin6->sin6_addr), &in, sizeof(in)); | ||||
IN_IFADDR_RLOCK(&in_ifa_tracker); | |||||
LIST_FOREACH(ia4, INADDR_HASH(in.s_addr), ia_hash) | LIST_FOREACH(ia4, INADDR_HASH(in.s_addr), ia_hash) | ||||
if (ia4->ia_addr.sin_addr.s_addr == in.s_addr) | if (ia4->ia_addr.sin_addr.s_addr == in.s_addr) | ||||
break; | break; | ||||
IN_IFADDR_RUNLOCK(&in_ifa_tracker); | |||||
if (ia4 == NULL) | if (ia4 == NULL) | ||||
continue; | continue; | ||||
ia6 = (struct in6_ifaddr *)ia; | ia6 = (struct in6_ifaddr *)ia; | ||||
*addr = sin6->sin6_addr; | *addr = sin6->sin6_addr; | ||||
*mask = ia6->ia_prefixmask.sin6_addr; | *mask = ia6->ia_prefixmask.sin6_addr; | ||||
if_addr_runlock(ifp); | if_addr_runlock(ifp); | ||||
▲ Show 20 Lines • Show All 358 Lines • Show Last 20 Lines |