eBPF Talk: 踩坑 XDP on Mellanox
文章目录
对 XDP 了解得越多,对 XDP 的信心越是膨胀。最近在 XDP on Mellanox 上踩了个坑,让我对 XDP 的认识又有了新的提升:就是需要保持对技术的敬畏之心,不要过于自信。
P.S. Mellanox 网卡使用 mlx5_core 驱动。
使用 metadata 将信息从 XDP 传到 tc-bpf
掌握了 XDP metadata 技术,就可以将信息从 XDP 传到 tc-bpf,从而实现 XDP 与 tc-bpf 的配合工作。
是,也不是。
以上,的确可以使用 metadata 将信息从 XDP 传到 tc-bpf。
不过,XDP on Mellanox 上,该方式是否真的可行?
bpf_xdp_adjust_meta()
失败了
在 XDP on Mellanox 上,调用 bpf_xdp_adjust_meta()
失败了,返回 -524
T_T,这是我在 XDP 程序里在每条代码逻辑分支上使用 bpf_printk()
打 log 才发现的。
|
|
?_?,为什么 XDP on Mellanox 上,bpf_xdp_adjust_meta()
失败了?
真相
真相就是 Mellanox mlx5_core 驱动不支持 XDP metadata。
参考上文,看下 mlx5_core 驱动里在执行 XDP 程序前,是如何准备 struct xdp_buff
的。
|
|
?_?,为什么 5.15 kernel 里不支持 XDP metadata,而 6.0+ kernel 里支持了呢?
- net/mlx5e: Add support for using xdp->data_meta since 5.18 kernel
好吧,mlx5_core 驱动从 5.18 kernel 开始才支持 XDP metadata。
真相:如果不支持 XDP metadata,xdp->data_meta = xdp->data + 1
,最终在 xdp_data_meta_unsupported()
里判断为不支持 metadata,从而导致 bpf_xdp_adjust_meta()
返回 -524。
奇葩小需求:非要将信息从 XDP on Mellanox 传到 tc-bpf 呢?
在 Mellanox 驱动不支持 XDP metadata 的情况下,如何将信息从 XDP on Mellanox 传到 tc-bpf 呢?
一个大胆且实用的办法:使用 struct iphdr
IP 头里的 version
字段。
已知需要处理的流量是 IPv4,那么 version
字段固定是 4,就这么处理:
- 在 XDP 程序里,将
version
字段的值设置为非 4/6 的值,比如 0。 - 在 tc-bpf 程序里,判断
version
字段的值是否为 0,如果是,说明这是需要特殊处理的流量,然后将version
字段的值设置为 4。
因为在 XDP on Mellanox 到 tc-bpf 的路径上,网络包不会被修改,所以在这两个地方都不需要计算 IP 头部的 checksum。
小结
即使是网卡驱动,也在不断地支持 XDP 一些特性,比如 XDP metadata。
所以,不能拿着 XDP generic mode 的知识去对待 XDP native mode,它们之间还是有所区别的。
不要过于自信,保持对技术的敬畏之心。
文章作者 Leon Hwang
上次更新 2024-04-03