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 不支持硬件卸载。您可以改用 bpftool
或 ip
(>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
我正在尝试 运行 密件抄送中提供的本教程 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 不支持硬件卸载。您可以改用 bpftool
或 ip
(>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