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
还禁用硬件卸载。xdpoffload
in ip link 输出表明程序已卸载到硬件,也可用于请求“卸载”模式,就像xdpgeneric
它强制程序专门安装在 apater 的 HW/FW 中一样。
一旦命令行参数被解析,xdp
对象就会被发送到内核并通过 netlink 消息附加到选定的 XDP 钩子上。然后在内核中,根据从用户空间传递的标志来处理程序。
(您可以使用交叉引用或git grep
等git log -S
来跟踪标志,例如,在源存储库中。)