selftests/xsk: Introduce XDP prog load based on existing AF_XDP socket
authorMaciej Fijalkowski <maciej.fijalkowski@intel.com>
Wed, 29 Jun 2022 14:34:56 +0000 (16:34 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 30 Jun 2022 20:49:05 +0000 (22:49 +0200)
Currently, xsk_setup_xdp_prog() uses anonymous xsk_socket struct which
means that during xsk_create_bpf_link() call, xsk->config.xdp_flags is
always 0. This in turn means that from xdpxceiver it is impossible to
use xdpgeneric attachment, so since commit 3b22523bca02 ("selftests,
xsk: Fix bpf_res cleanup test") we were not testing SKB mode at all.

To fix this, introduce a function, called xsk_setup_xdp_prog_xsk(), that
will load XDP prog based on the existing xsk_socket, so that xsk
context's refcount is correctly bumped and flags from application side
are respected. Use this from xdpxceiver side so we get coverage of
generic and native XDP program attach points.

Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Magnus Karlsson <magnus.karlsson@intel.com>
Link: https://lore.kernel.org/bpf/20220629143458.934337-3-maciej.fijalkowski@intel.com
tools/testing/selftests/bpf/xdpxceiver.c
tools/testing/selftests/bpf/xsk.c
tools/testing/selftests/bpf/xsk.h

index 019c567b6b4e255728e52604e46423d9e602878a..c024aa91ea02623766165d60c95e93c896c5954b 100644 (file)
@@ -1130,7 +1130,7 @@ static void thread_common_ops(struct test_spec *test, struct ifobject *ifobject)
        if (!ifindex)
                exit_with_error(errno);
 
-       ret = xsk_setup_xdp_prog(ifindex, &ifobject->xsk_map_fd);
+       ret = xsk_setup_xdp_prog_xsk(ifobject->xsk->xsk, &ifobject->xsk_map_fd);
        if (ret)
                exit_with_error(-ret);
 
index fa13d2c445174906f1a29dced29587f6a839dbbf..db911127720ea4378615c32b783c959fbfbf66e0 100644 (file)
@@ -880,6 +880,11 @@ static int __xsk_setup_xdp_prog(struct xsk_socket *_xdp, int *xsks_map_fd)
        return err;
 }
 
+int xsk_setup_xdp_prog_xsk(struct xsk_socket *xsk, int *xsks_map_fd)
+{
+       return __xsk_setup_xdp_prog(xsk, xsks_map_fd);
+}
+
 static struct xsk_ctx *xsk_get_ctx(struct xsk_umem *umem, int ifindex,
                                   __u32 queue_id)
 {
index 915e7135337c506b2fdcdb273944ae6f730ae749..997723b0bfb26c2a83603f333a49b2fa0b65d826 100644 (file)
@@ -269,6 +269,7 @@ struct xsk_umem_config {
        __u32 flags;
 };
 
+int xsk_setup_xdp_prog_xsk(struct xsk_socket *xsk, int *xsks_map_fd);
 int xsk_setup_xdp_prog(int ifindex, int *xsks_map_fd);
 int xsk_socket__update_xskmap(struct xsk_socket *xsk, int xsks_map_fd);