当我将 xdp 与 eBPF 一起使用时,我想我可以使用 ip link 来设置模式。
例如,
ip link set dev eno1 xdpoffload obj xdp.o sec .text
Run Code Online (Sandbox Code Playgroud)
我想知道 xdpoffload 或通用或本机模式是如何在代码中实现的。
所以我正在查看其他代码,我发现了类似的内容:
attach_xdp(device, fn, flags)
Run Code Online (Sandbox Code Playgroud)
我认为 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;
Run Code Online (Sandbox Code Playgroud)
可用的值并不多,它们位于来自 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)
Run Code Online (Sandbox Code Playgroud)
基本上,三种模式:通用/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 变体而不是本机 XDP 变体。xdpdrv与请求禁用通用 XDP 变体的自动回退效果相反,并且如果驱动程序不支持 XDP,则应返回错误。xdpdrv还禁用硬件卸载。xdpoffload在 ip link 输出中表示程序已卸载到硬件,也可用于请求“卸载”模式,就像xdpgeneric强制程序专门安装在设备的硬件/固件中一样。
一旦命令行参数被解析,xdp对象就会被发送到内核并通过 netlink 消息附加到选定的 XDP 挂钩。然后在内核中,根据从用户空间传递过来的标志来处理程序。
(您可以使用交叉引用器或git grep等git log -S来跟踪标志,例如在源存储库中。)
| 归档时间: |
|
| 查看次数: |
2075 次 |
| 最近记录: |