net/af_xdp: make compatible with libbpf >= 0.7.0

libbpf v0.7.0 deprecates the bpf_prog_load function. Use meson to detect
if libbpf >= v0.7.0 is linked and if so, use the recommended replacement
functions bpf_object__open_file and bpf_object__load.

Signed-off-by: Ciara Loftus <ciara.loftus@intel.com>
This commit is contained in:
Ciara Loftus 2022-02-17 14:45:24 +00:00 committed by Ferruh Yigit
parent 744fd41269
commit 8d3d9c7251
3 changed files with 48 additions and 5 deletions

View File

@ -7,6 +7,7 @@
#else
#include <bpf/xsk.h>
#endif
#include <bpf/bpf.h>
#include <linux/version.h>
#include <poll.h>
@ -58,3 +59,41 @@ tx_syscall_needed(struct xsk_ring_prod *q __rte_unused)
return 1;
}
#endif
#ifdef RTE_NET_AF_XDP_LIBBPF_OBJ_OPEN
static int load_program(const char *prog_path, struct bpf_object **obj)
{
struct bpf_program *prog;
int err;
*obj = bpf_object__open_file(prog_path, NULL);
err = libbpf_get_error(*obj);
if (err)
return -1;
err = bpf_object__load(*obj);
if (err)
goto out;
prog = bpf_object__next_program(*obj, NULL);
if (!prog)
goto out;
return bpf_program__fd(prog);
out:
bpf_object__close(*obj);
return -1;
}
#else
static int load_program(const char *prog_path, struct bpf_object **obj)
{
int ret, prog_fd;
ret = bpf_prog_load(prog_path, BPF_PROG_TYPE_XDP, obj, &prog_fd);
if (ret)
return -1;
return prog_fd;
}
#endif

View File

@ -22,6 +22,11 @@ if cc.has_header('linux/if_xdp.h')
cflags += ['-DRTE_NET_AF_XDP_SHARED_UMEM']
ext_deps += xdp_dep
ext_deps += bpf_dep
bpf_ver_dep = dependency('libbpf', version : '>=0.7.0',
required: false, method: 'pkg-config')
if bpf_ver_dep.found()
cflags += ['-DRTE_NET_AF_XDP_LIBBPF_OBJ_OPEN']
endif
else
build = false
reason = 'missing dependency, libbpf'

View File

@ -15,7 +15,6 @@
#include <linux/ethtool.h>
#include <linux/sockios.h>
#include "af_xdp_deps.h"
#include <bpf/bpf.h>
#include <rte_ethdev.h>
#include <ethdev_driver.h>
@ -1176,13 +1175,13 @@ xsk_umem_info *xdp_umem_configure(struct pmd_internals *internals,
static int
load_custom_xdp_prog(const char *prog_path, int if_index, struct bpf_map **map)
{
int ret, prog_fd = -1;
int ret, prog_fd;
struct bpf_object *obj;
ret = bpf_prog_load(prog_path, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
if (ret) {
prog_fd = load_program(prog_path, &obj);
if (prog_fd < 0) {
AF_XDP_LOG(ERR, "Failed to load program %s\n", prog_path);
return ret;
return -1;
}
/*