2

当我将 xdp 与 eBPF 一起使用时,我想我可以使用 ip link 来设置模式。

例如,

ip link set dev eno1 xdpoffload obj xdp.o sec .text

我想知道 xdpoffload 或通用或本机模式是如何在代码中实现的。

所以我在看其他代码,我发现了类似的东西:

attach_xdp(device, fn, flags)

我假设标志是设置模式标志的位置?

如果有人能告诉我这是否属实,如果是,我可以使用哪些数字来选择该选项,那就太好了。

非常感谢您提前。

4

1 回答 1

5

ip link获得 XDP 模式并确实设置了标志。你可以看到ip/iplink_xdp.c

    if (!force)
        xdp.flags |= XDP_FLAGS_UPDATE_IF_NOEXIST;
    if (generic)
        xdp.flags |= XDP_FLAGS_SKB_MODE;
    if (drv)
        xdp.flags |= XDP_FLAGS_DRV_MODE;
    if (offload)
        xdp.flags |= XDP_FLAGS_HW_MODE;

可用的值并不多,它们位于来自 Linux UAPI 的标头中if_link.h

#define XDP_FLAGS_UPDATE_IF_NOEXIST (1U << 0)
#define XDP_FLAGS_SKB_MODE      (1U << 1)
#define XDP_FLAGS_DRV_MODE      (1U << 2)
#define XDP_FLAGS_HW_MODE       (1U << 3)
#define XDP_FLAGS_MODES         (XDP_FLAGS_SKB_MODE | \
                     XDP_FLAGS_DRV_MODE | \
                     XDP_FLAGS_HW_MODE)
#define XDP_FLAGS_MASK          (XDP_FLAGS_UPDATE_IF_NOEXIST | \
                     XDP_FLAGS_MODES)

所以基本上,三种模式:generic/SKB ( xdpgeneric)、native/driver ( xdp) 和硬件卸载 ( xdpoffload)。这将由ip-link(8)手册页确认:

xdp object | pinned | off

设置(或取消设置)一个 XDP(“eXpress 数据路径”)BPF 程序以在驱动程序级别的每个数据包上运行。ip link输出将指示xdp网络设备的标志。如果驱动程序没有原生 XDP 支持,内核将回退到更慢、独立于驱动程序的“通用”XDP 变体。在这种ip link情况下,输出将指示xdpgeneric而不是xdp仅指示。如果驱动程序确实有原生 XDP 支持,但程序是在下面加载的,xdpgeneric object | pinned那么内核将使用通用 XDP 变体而不是原生 XDP 变体。xdpdrv具有相反的效果,即请求禁用对通用 XDP 变体的自动回退,如果驱动程序不支持 XDP,则应返回错误。xdpdrv还禁用硬件卸载。xdpoffloadin ip link 输出表明程序已卸载到硬件,也可用于请求“卸载”模式,就像xdpgeneric它强制程序专门安装在 apater 的 HW/FW 中一样。

一旦命令行参数被解析,xdp对象就会被发送到内核并通过 netlink 消息附加到选定的 XDP 钩子上。然后在内核中,根据从用户空间传递的标志来处理程序。

(您可以使用交叉引用git grepgit log -S来跟踪标志,例如,在源存储库中。)

于 2019-07-23T22:31:54.300 回答