当我将xdp与eBPF一起使用时,我想我可以使用ip链接来设置模式。
例如
ip link set dev eno1 xdpoffload obj xdp.o sec .text
我想知道 xdpoffload 或通用或本机模式是如何在代码中实现的。
所以我在查看其他代码,发现类似:
attach_xdp(device, fn, flags)
我假设标志是设置模式标志进入的地方?
如果有人能告诉我它是否属实,如果是,我可以使用哪些数字来选择选项,那就太好了。
提前非常感谢你。
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)
所以基本上,三种模式:通用/SKB(xdpgeneric
),本机/驱动程序(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 变体而不是本机变体。xdpdrv
有相反的情况 请求自动回退到通用 XDP 的效果 变体被禁用,如果驱动程序不支持XDP,则错误应该是 返回。xdpdrv
还会禁用硬件卸载。xdpoffload
IP 链接 输出指示程序已卸载到硬件,并且可以 也用于请求"卸载"模式,就像xdpgeneric
它强制一样 程序专门安装在 apater 的硬件/固件中。
解析命令行参数后,xdp
对象将发送到内核,并通过 netlink 消息附加到选定的 XDP 挂钩。然后在内核中,根据从用户空间传递的标志处理程序。
(您可以使用交叉引用器或git grep
、git log -S
等来跟踪标志,例如,在源存储库中。