XDP卸载模式标志集不适用于密件抄送

时间:2019-08-07 01:35:19

标签: bpf ebpf bcc-bpf

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

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

据我所知,XDP标志的工作方式如下(来自that question):

#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加速模式的NIC卡,当我只用一个代码行附加一个简单程序时,它工作正常:

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程序。

我想念什么吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

目前,没有解决方法可用于通过bcc卸载程序。正如pchaigno所提到的,该函数根本没有提供表明程序应该卸载的选项。

不过,要增加对bcc卸载程序的支持应该不太困难,因此将来可能应该可以使用(特别是如果pchaigno感觉要添加它:p)。您仍然需要在程序中用常规数组替换每个CPU数组,因为当前不支持前者卸载。

关于程序的运行方式,例如,您可以使用bpftool net进行检查。

答案 1 :(得分:1)

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

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

  • 应该在传递给var patients = Context.Set<Patient>().AsNoTracking() .SelectMany(p => p.Forms) .Where(fp => fp.Phase.Type == 2) .Distinct(); 的标志中设置XDP_FLAGS_HW_MODE位(1U << 3)。
  • 您应使用attach_xdp()参数将要卸载程序的接口的名称指定给BPF()。它将允许密件抄送将地图卸载到适当的设备。如果没有地图,则没有必要。
  • 接口的名称也应使用参数device=指定给load_func,以便bcc告诉内核在哪里卸载程序。

请注意,使用最新的密件抄送源,device=脚本已更新,可以在您通过xdp_drop_count.py选项时为您完成所有操作:

-H

对于旧版本的密件抄送

较旧版本的密件抄送不支持硬件卸载。您可以改用sudo ./xdp_drop_count.py -H $ETHNAME bpftool(> v4.16),例如:

ip