samples/bpf: xdp_fwd explain bpf_fib_lookup return codes
authorJesper Dangaard Brouer <brouer@redhat.com>
Thu, 8 Aug 2019 16:17:47 +0000 (18:17 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 9 Aug 2019 16:05:03 +0000 (18:05 +0200)
Make it clear that this XDP program depend on the network
stack to do the ARP resolution.  This is connected with the
BPF_FIB_LKUP_RET_NO_NEIGH return code from bpf_fib_lookup().

Another common mistake (seen via XDP-tutorial) is that users
don't realize that sysctl net.ipv{4,6}.conf.all.forwarding
setting is honored by bpf_fib_lookup.

Reported-by: Anton Protopopov <a.s.protopopov@gmail.com>
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Reviewed-by: David Ahern <dsahern@gmail.com>
Acked-by: Yonghong Song <yhs@fb.com>
Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
samples/bpf/xdp_fwd_kern.c

index a43d6953c0548ce9d8cf900420976f70934d9f16..701a30f258b17d34f804ec358db976b8175511f5 100644 (file)
@@ -103,8 +103,23 @@ static __always_inline int xdp_fwd_flags(struct xdp_md *ctx, u32 flags)
        fib_params.ifindex = ctx->ingress_ifindex;
 
        rc = bpf_fib_lookup(ctx, &fib_params, sizeof(fib_params), flags);
-
-       if (rc == 0) {
+       /*
+        * Some rc (return codes) from bpf_fib_lookup() are important,
+        * to understand how this XDP-prog interacts with network stack.
+        *
+        * BPF_FIB_LKUP_RET_NO_NEIGH:
+        *  Even if route lookup was a success, then the MAC-addresses are also
+        *  needed.  This is obtained from arp/neighbour table, but if table is
+        *  (still) empty then BPF_FIB_LKUP_RET_NO_NEIGH is returned.  To avoid
+        *  doing ARP lookup directly from XDP, then send packet to normal
+        *  network stack via XDP_PASS and expect it will do ARP resolution.
+        *
+        * BPF_FIB_LKUP_RET_FWD_DISABLED:
+        *  The bpf_fib_lookup respect sysctl net.ipv{4,6}.conf.all.forwarding
+        *  setting, and will return BPF_FIB_LKUP_RET_FWD_DISABLED if not
+        *  enabled this on ingress device.
+        */
+       if (rc == BPF_FIB_LKUP_RET_SUCCESS) {
                /* Verify egress index has been configured as TX-port.
                 * (Note: User can still have inserted an egress ifindex that
                 * doesn't support XDP xmit, which will result in packet drops).