我正在尝试运行密件抄送中提供的本教程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程序。
我想念什么吗?
谢谢。
答案 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