Changeset View
Changeset View
Standalone View
Standalone View
head/sys/netinet6/in6_src.c
Show First 20 Lines • Show All 910 Lines • ▼ Show 20 Lines | |||||
in6_selecthlim(struct inpcb *inp, struct ifnet *ifp) | in6_selecthlim(struct inpcb *inp, struct ifnet *ifp) | ||||
{ | { | ||||
if (inp && inp->in6p_hops >= 0) | if (inp && inp->in6p_hops >= 0) | ||||
return (inp->in6p_hops); | return (inp->in6p_hops); | ||||
else if (ifp) | else if (ifp) | ||||
return (ND_IFINFO(ifp)->chlim); | return (ND_IFINFO(ifp)->chlim); | ||||
else if (inp && !IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) { | else if (inp && !IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) { | ||||
struct nhop6_basic nh6; | struct nhop_object *nh; | ||||
struct in6_addr dst; | struct in6_addr dst; | ||||
uint32_t fibnum, scopeid; | uint32_t fibnum, scopeid; | ||||
int hlim; | int hlim; | ||||
fibnum = inp->inp_inc.inc_fibnum; | fibnum = inp->inp_inc.inc_fibnum; | ||||
in6_splitscope(&inp->in6p_faddr, &dst, &scopeid); | in6_splitscope(&inp->in6p_faddr, &dst, &scopeid); | ||||
if (fib6_lookup_nh_basic(fibnum, &dst, scopeid, 0, 0, &nh6)==0){ | nh = fib6_lookup(fibnum, &dst, scopeid, 0, 0); | ||||
hlim = ND_IFINFO(nh6.nh_ifp)->chlim; | if (nh != NULL) { | ||||
hlim = ND_IFINFO(nh->nh_ifp)->chlim; | |||||
return (hlim); | return (hlim); | ||||
} | } | ||||
} | } | ||||
return (V_ip6_defhlim); | return (V_ip6_defhlim); | ||||
} | } | ||||
/* | /* | ||||
* XXX: this is borrowed from in6_pcbbind(). If possible, we should | * XXX: this is borrowed from in6_pcbbind(). If possible, we should | ||||
▲ Show 20 Lines • Show All 290 Lines • Show Last 20 Lines |