Skip to content

Commit

Permalink
bpf: Handle ipv6 gateway in bpf_ipv4_fib_lookup
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
David Ahern authored and David S. Miller committed Apr 8, 2019
1 parent 5c9f7c1 commit 6f5f68d
Showing 1 changed file with 14 additions and 3 deletions.
17 changes: 14 additions & 3 deletions net/core/filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down

0 comments on commit 6f5f68d

Please sign in to comment.