xdpoffload 附加失败:参数无效

xdpoffload attach failed: Invalid argument

当我尝试在 XDP 卸载模式下附加 BPF 程序时,我得到 Invalid argument。如果通过代码或使用 bpftool 附加,我会得到同样的错误。这是我使用 netlink:

附加的方式
err = netlink.LinkSetXdpFdWithFlags(link, objects.CollectIpsProg.FD(), 8)

并使用 bpftool:

# bpftool prog loadall collect_ips.o /sys/fs/bpf/collect_ips type xdp
# bpftool net attach xdpoffload id 106 dev public
Error: interface xdpoffload attach failed: Invalid argument

我在驱动程序模式下加载程序没有任何问题,其中 4 传递给 LinkSetXdpFdWithFlags

我的 NIC,Mellanox MT28800 系列 [ConnectX-5 Ex],应该支持硬件卸载。

我的主 XDP 程序调用了两个不同的 tail 程序。我用 BPF_MAP_TYPE_RINGBUF, BPF_MAP_TYPE_PROG_ARRAY, and BPF_MAP_TYPE_ARRAY.

Mellanox 卡支持一些硬件卸载(例如,流量控制规则),但据我所知不支持 BPF 程序的卸载。唯一支持 BPF 卸载的以太网适配器是 Netronome's cards.


一种检查方法是在 Linux 源代码中 grep 查找 XDP_SETUP_PROG_HW BPF netdev 命令:

$ git grep XDP_SETUP_PROG_HW
drivers/net/ethernet/netronome/nfp/nfp_net_common.c:    case XDP_SETUP_PROG_HW:
drivers/net/netdevsim/bpf.c:    if (bpf->command == XDP_SETUP_PROG_HW && !ns->bpf_xdpoffload_accept) {
drivers/net/netdevsim/bpf.c:    if (bpf->command == XDP_SETUP_PROG_HW) {
drivers/net/netdevsim/bpf.c:    case XDP_SETUP_PROG_HW:
include/linux/netdevice.h:      XDP_SETUP_PROG_HW,
net/core/dev.c: xdp.command = mode == XDP_MODE_HW ? XDP_SETUP_PROG_HW : XDP_SETUP_PROG;

该命令用于告诉驱动程序通过 ndo_bpf 回调函数将 BPF 程序卸载到硬件。