Commit 831fb31b authored by Florian Westphal's avatar Florian Westphal
Browse files

ipv6: make ipv6_anycast_destination logic usable without dst_entry



nft_fib_ipv6 uses ipv6_anycast_destination(), but upcoming patch removes
the dst_entry usage in favor of fib6_result.

Move the 'plen > 127' logic to a new helper and call it from the
existing one.

Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
parent 7a135bf9
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -252,15 +252,22 @@ static inline bool ipv6_unicast_destination(const struct sk_buff *skb)
	return rt->rt6i_flags & RTF_LOCAL;
}

static inline bool __ipv6_anycast_destination(const struct rt6key *rt6i_dst,
					      u32 rt6i_flags,
					      const struct in6_addr *daddr)
{
	return rt6i_flags & RTF_ANYCAST ||
	       (rt6i_dst->plen < 127 &&
	       !(rt6i_flags & (RTF_GATEWAY | RTF_NONEXTHOP)) &&
	       ipv6_addr_equal(&rt6i_dst->addr, daddr));
}

static inline bool ipv6_anycast_destination(const struct dst_entry *dst,
					    const struct in6_addr *daddr)
{
	const struct rt6_info *rt = dst_rt6_info(dst);

	return rt->rt6i_flags & RTF_ANYCAST ||
		(rt->rt6i_dst.plen < 127 &&
		 !(rt->rt6i_flags & (RTF_GATEWAY | RTF_NONEXTHOP)) &&
		 ipv6_addr_equal(&rt->rt6i_dst.addr, daddr));
	return __ipv6_anycast_destination(&rt->rt6i_dst, rt->rt6i_flags, daddr);
}

int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,