bpf: Handle ipv6 gateway in bpf_ipv4_fib_lookup
Update bpf_ipv4_fib_lookup to handle an ipv6 gateway. Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5c9f7c1dfc
commit
6f5f68d05e
1 changed files with 14 additions and 3 deletions
|
@ -4639,15 +4639,26 @@ static int bpf_ipv4_fib_lookup(struct net *net, struct bpf_fib_lookup *params,
|
|||
return BPF_FIB_LKUP_RET_UNSUPP_LWT;
|
||||
|
||||
dev = nhc->nhc_dev;
|
||||
if (nhc->nhc_gw_family)
|
||||
params->ipv4_dst = nhc->nhc_gw.ipv4;
|
||||
|
||||
params->rt_metric = res.fi->fib_priority;
|
||||
|
||||
/* xdp and cls_bpf programs are run in RCU-bh so
|
||||
* rcu_read_lock_bh is not needed here
|
||||
*/
|
||||
neigh = __ipv4_neigh_lookup_noref(dev, (__force u32)params->ipv4_dst);
|
||||
if (likely(nhc->nhc_gw_family != AF_INET6)) {
|
||||
if (nhc->nhc_gw_family)
|
||||
params->ipv4_dst = nhc->nhc_gw.ipv4;
|
||||
|
||||
neigh = __ipv4_neigh_lookup_noref(dev,
|
||||
(__force u32)params->ipv4_dst);
|
||||
} else {
|
||||
struct in6_addr *dst = (struct in6_addr *)params->ipv6_dst;
|
||||
|
||||
params->family = AF_INET6;
|
||||
*dst = nhc->nhc_gw.ipv6;
|
||||
neigh = __ipv6_neigh_lookup_noref_stub(dev, dst);
|
||||
}
|
||||
|
||||
if (!neigh)
|
||||
return BPF_FIB_LKUP_RET_NO_NEIGH;
|
||||
|
||||
|
|
Loading…
Reference in a new issue