Commit 1ba9a895 authored by David Ahern's avatar David Ahern Committed by David S. Miller
Browse files

ipv6: Only call rt6_check_neigh for nexthop with gateway



Change rt6_check_neigh to take a fib6_nh instead of a fib entry.
Move the check on fib_flags and whether the nexthop has a gateway
up to the one caller.

Remove the inline from the definition as well. Not necessary.

Signed-off-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 62720b12
Loading
Loading
Loading
Loading
+7 −9
Original line number Original line Diff line number Diff line
@@ -589,18 +589,14 @@ static inline int rt6_check_dev(struct fib6_info *rt, int oif)
	return 0;
	return 0;
}
}


static inline enum rt6_nud_state rt6_check_neigh(struct fib6_info *rt)
static enum rt6_nud_state rt6_check_neigh(const struct fib6_nh *fib6_nh)
{
{
	enum rt6_nud_state ret = RT6_NUD_FAIL_HARD;
	enum rt6_nud_state ret = RT6_NUD_FAIL_HARD;
	struct neighbour *neigh;
	struct neighbour *neigh;


	if (rt->fib6_flags & RTF_NONEXTHOP ||
	    !rt->fib6_nh.fib_nh_gw_family)
		return RT6_NUD_SUCCEED;

	rcu_read_lock_bh();
	rcu_read_lock_bh();
	neigh = __ipv6_neigh_lookup_noref(rt->fib6_nh.fib_nh_dev,
	neigh = __ipv6_neigh_lookup_noref(fib6_nh->fib_nh_dev,
					  &rt->fib6_nh.fib_nh_gw6);
					  &fib6_nh->fib_nh_gw6);
	if (neigh) {
	if (neigh) {
		read_lock(&neigh->lock);
		read_lock(&neigh->lock);
		if (neigh->nud_state & NUD_VALID)
		if (neigh->nud_state & NUD_VALID)
@@ -623,6 +619,7 @@ static inline enum rt6_nud_state rt6_check_neigh(struct fib6_info *rt)


static int rt6_score_route(struct fib6_info *rt, int oif, int strict)
static int rt6_score_route(struct fib6_info *rt, int oif, int strict)
{
{
	struct fib6_nh *nh = &rt->fib6_nh;
	int m;
	int m;


	m = rt6_check_dev(rt, oif);
	m = rt6_check_dev(rt, oif);
@@ -631,8 +628,9 @@ static int rt6_score_route(struct fib6_info *rt, int oif, int strict)
#ifdef CONFIG_IPV6_ROUTER_PREF
#ifdef CONFIG_IPV6_ROUTER_PREF
	m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->fib6_flags)) << 2;
	m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->fib6_flags)) << 2;
#endif
#endif
	if (strict & RT6_LOOKUP_F_REACHABLE) {
	if ((strict & RT6_LOOKUP_F_REACHABLE) &&
		int n = rt6_check_neigh(rt);
	    !(rt->fib6_flags & RTF_NONEXTHOP) && nh->fib_nh_gw_family) {
		int n = rt6_check_neigh(nh);
		if (n < 0)
		if (n < 0)
			return n;
			return n;
	}
	}