Changeset View
Changeset View
Standalone View
Standalone View
head/sys/netinet6/nd6_rtr.c
Show First 20 Lines • Show All 778 Lines • ▼ Show 20 Lines | #endif | ||||
/* | /* | ||||
* Release the list reference. | * Release the list reference. | ||||
*/ | */ | ||||
defrouter_rele(dr); | defrouter_rele(dr); | ||||
} | } | ||||
struct nd_defrouter * | struct nd_defrouter * | ||||
defrouter_lookup_locked(struct in6_addr *addr, struct ifnet *ifp) | defrouter_lookup_locked(const struct in6_addr *addr, struct ifnet *ifp) | ||||
{ | { | ||||
struct nd_defrouter *dr; | struct nd_defrouter *dr; | ||||
ND6_LOCK_ASSERT(); | ND6_LOCK_ASSERT(); | ||||
TAILQ_FOREACH(dr, &V_nd6_defrouter, dr_entry) | TAILQ_FOREACH(dr, &V_nd6_defrouter, dr_entry) | ||||
if (dr->ifp == ifp && IN6_ARE_ADDR_EQUAL(addr, &dr->rtaddr)) { | if (dr->ifp == ifp && IN6_ARE_ADDR_EQUAL(addr, &dr->rtaddr)) { | ||||
defrouter_ref(dr); | defrouter_ref(dr); | ||||
return (dr); | return (dr); | ||||
} | } | ||||
return (NULL); | return (NULL); | ||||
} | } | ||||
struct nd_defrouter * | struct nd_defrouter * | ||||
defrouter_lookup(struct in6_addr *addr, struct ifnet *ifp) | defrouter_lookup(const struct in6_addr *addr, struct ifnet *ifp) | ||||
{ | { | ||||
struct nd_defrouter *dr; | struct nd_defrouter *dr; | ||||
ND6_RLOCK(); | ND6_RLOCK(); | ||||
dr = defrouter_lookup_locked(addr, ifp); | dr = defrouter_lookup_locked(addr, ifp); | ||||
ND6_RUNLOCK(); | ND6_RUNLOCK(); | ||||
return (dr); | return (dr); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,191 Lines • ▼ Show 20 Lines | restart: | ||||
IN6_IFADDR_RUNLOCK(&in6_ifa_tracker); | IN6_IFADDR_RUNLOCK(&in6_ifa_tracker); | ||||
ND6_RUNLOCK(); | ND6_RUNLOCK(); | ||||
ND6_ONLINK_UNLOCK(); | ND6_ONLINK_UNLOCK(); | ||||
} | } | ||||
static int | static int | ||||
nd6_prefix_onlink_rtrequest(struct nd_prefix *pr, struct ifaddr *ifa) | nd6_prefix_onlink_rtrequest(struct nd_prefix *pr, struct ifaddr *ifa) | ||||
{ | { | ||||
struct sockaddr_dl sdl; | struct sockaddr_dl_short sdl; | ||||
struct rtentry *rt; | struct rtentry *rt; | ||||
struct sockaddr_in6 mask6; | struct sockaddr_in6 mask6; | ||||
u_long rtflags; | u_long rtflags; | ||||
int error, a_failure, fibnum, maxfib; | int error, a_failure, fibnum, maxfib; | ||||
/* | /* | ||||
* in6_ifinit() sets nd6_rtrequest to ifa_rtrequest for all ifaddrs. | * in6_ifinit() sets nd6_rtrequest to ifa_rtrequest for all ifaddrs. | ||||
* ifa->ifa_rtrequest = nd6_rtrequest; | * ifa->ifa_rtrequest = nd6_rtrequest; | ||||
*/ | */ | ||||
bzero(&mask6, sizeof(mask6)); | bzero(&mask6, sizeof(mask6)); | ||||
mask6.sin6_len = sizeof(mask6); | mask6.sin6_len = sizeof(mask6); | ||||
mask6.sin6_addr = pr->ndpr_mask; | mask6.sin6_addr = pr->ndpr_mask; | ||||
rtflags = (ifa->ifa_flags & ~IFA_RTSELF) | RTF_UP; | rtflags = (ifa->ifa_flags & ~IFA_RTSELF) | RTF_UP; | ||||
bzero(&sdl, sizeof(struct sockaddr_dl)); | bzero(&sdl, sizeof(struct sockaddr_dl_short)); | ||||
sdl.sdl_len = sizeof(struct sockaddr_dl); | sdl.sdl_len = sizeof(struct sockaddr_dl_short); | ||||
sdl.sdl_family = AF_LINK; | sdl.sdl_family = AF_LINK; | ||||
sdl.sdl_type = ifa->ifa_ifp->if_type; | sdl.sdl_type = ifa->ifa_ifp->if_type; | ||||
sdl.sdl_index = ifa->ifa_ifp->if_index; | sdl.sdl_index = ifa->ifa_ifp->if_index; | ||||
if(V_rt_add_addr_allfibs) { | if(V_rt_add_addr_allfibs) { | ||||
fibnum = 0; | fibnum = 0; | ||||
maxfib = rt_numfibs; | maxfib = rt_numfibs; | ||||
} else { | } else { | ||||
▲ Show 20 Lines • Show All 567 Lines • Show Last 20 Lines |