XDP 卸载模式标志集不适用于 bcc

XDP offloaded mode flags set is not working with bcc

我正在尝试 运行 密件抄送中提供的本教程 XDP 代码。

我使用的代码是这个脚本:bcc/examples/networking/xdp/xdp_drop_count.py.

据我了解,XDP 标志的工作方式如下(来自 ):

#define XDP_FLAGS_SKB_MODE (1U << 1)
#define XDP_FLAGS_DRV_MODE (1U << 2)
#define XDP_FLAGS_HW_MODE (1U << 3)

所以,这是否意味着如果我将标志位更改为

flags |= 1 << 3

我应该能够在硬件加速模式(卸载)下运行这段代码?

我有一张支持XDP HW加速模式的网卡,当我附加一个只有一行代码的简单程序时,它工作正常:

return XDP_PASS;

并使用 ip link set dev interface xdpoffload 等以卸载模式附加它

所以我已经确认我的 NIC 能够加载卸载的 XDP 程序但是当我尝试上面的操作时,它给了我一个错误:

bpf: Attaching prog to enp4s0np1: Invalid argumentTraceback (most recent call last) :
File "xdp_drop_count.py", line 132, in <module>
b. attach_xdp(device, fn, flags)
File "usr/lib/python2.7/dist-packages/bcc/__init__.py", line 723, in attach_xdp % (dev, errstr))
Exception : Failed to attach BPF to device enp4s0np1: No such file or directory

此外,当我将标志设置为:

flags |= 1 << 2

我不确定这是否真的 运行在驱动程序模式下运行 XDP 程序。

我是不是漏掉了什么?

提前致谢。

对于要作为 XDP 程序附加的 BPF 程序,在系统上加载时需要先将其卸载到 NIC。

在您的情况下,bcc 提供的 b.load_func() 不支持在将程序传递给内核时卸载程序的任何选项。因此,当您稍后使用 XDP_FLAGS_HW_MODE 调用 b.attach_xdp() 时,该函数失败,因为它无法找到 NIC 上卸载的任何程序。

目前没有使用 bcc 卸载程序的解决方法。正如 pchaigno 提到的,该函数根本不提供指示应卸载程序的选项。

添加对卸载程序到 bcc 的支持应该不会太难,所以它应该在将来可用(特别是如果 pchaigno 想添加它的话:p)。您仍然需要在程序中用常规数组替换 per-CPU 数组,因为目前卸载不支持前者。

关于您的程序 运行 的模式,您可以通过 bpftool net 进行检查。

如果您从源构建密件抄送

自提交 d147588 以来,bcc 具有硬件卸载支持。 要使用 bcc 卸载程序,您需要三样东西:

  • 应该在传递给 attach_xdp() 的标志中设置 XDP_FLAGS_HW_MODE 位 (1U << 3)。
  • 您要将程序卸载到的接口的名称应该通过 device= 参数提供给 BPF()。它将允许 bcc 将地图卸载到适当的设备。没有地图就不需要了。
  • 接口名称也应提供给 load_func,同样带有参数 device=,以便 bcc 告诉内核卸载程序的位置。

请注意,使用最新的密件抄送来源,xdp_drop_count.py 脚本已更新为在您传递 -H 选项时为您完成所有这些工作:

sudo ./xdp_drop_count.py -H $ETHNAME

对于旧版本的密件抄送

旧版本的 bcc 不支持硬件卸载。您可以改用 bpftoolip (>v4.16),例如:

sudo ip link set dev $ETHNAME xdpoffload obj prog.o sec .text
sudo bpftool prog load prog.o /sys/fs/bpf/prog type xdp dev $ETHNAME