2

我正在尝试运行密件抄送中提供的本教程 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 程序。

我错过了什么吗?

先感谢您。

4

2 回答 2

2

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

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

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

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

例如,关于程序运行的模式,您可以检查一下bpftool net

于 2019-08-07T09:30:53.267 回答
2

如果您从源代码构建密件抄送

自 commit 以来d147588, bcc 具有硬件卸载支持。要使用密件抄送卸载程序,您需要三件事:

  • XDP_FLAGS_HW_MODE位 ( 1U << 3) 应在传递给的标志中设置attach_xdp()
  • 您要卸载程序的接口的名称应BPF()device=参数一起提供。它将允许密件抄送将地图卸载到适当的设备。如果您没有地图,则没有必要。
  • 接口的名称也应该被赋予load_func,同样使用参数device=,这样 bcc 就可以告诉内核在哪里卸载程序。

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

sudo ./xdp_drop_count.py -H $ETHNAME

对于旧版本的密件抄送

旧版本的 bcc不支持硬件卸载。您可以使用bpftoolor 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
于 2019-09-06T14:40:37.973 回答