重定向¶
XDP_REDIRECT¶
支持的映射¶
XDP_REDIRECT 支持以下映射类型
BPF_MAP_TYPE_DEVMAP
BPF_MAP_TYPE_DEVMAP_HASH
BPF_MAP_TYPE_CPUMAP
BPF_MAP_TYPE_XSKMAP
有关这些映射的更多信息,请参阅具体映射文档。
流程¶
XDP_REDIRECT 通过以下函数实现的三步流程工作
bpf_redirect() 和 bpf_redirect_map() 辅助函数将查找重定向目标并将其(以及一些其他元数据)存储在每个 CPU 的 struct bpf_redirect_info 中。
当程序返回 XDP_REDIRECT 返回码时,驱动将调用 xdp_do_redirect(),该函数将使用 struct bpf_redirect_info 中的信息,实际将帧排入特定于映射类型的批量队列结构中。
在退出其 NAPI 轮询循环之前,驱动将调用 xdp_do_flush(),该函数将刷新所有不同的批量队列,从而完成重定向。请注意,xdp_do_flush() 必须在驱动中的
napi_complete_done()
之前调用,因为 XDP_REDIRECT 逻辑依赖于在单个 NAPI 实例中,直到 xdp_do_flush() 调用,以实现对所有内核内数据结构的 RCU 保护。
注意
并非所有驱动都支持在重定向后传输帧,即使支持,也并非所有都支持非线性帧。非线性 XDP 缓冲区/帧是指包含多个片段的缓冲区/帧。
调试丢包¶
可以使用以下方法调试 XDP_REDIRECT 的静默丢包
bpf_trace
perf_record
bpf_trace¶
以下 bpftrace 命令可用于捕获和计数所有 XDP 追踪点
sudo bpftrace -e 'tracepoint:xdp:* { @cnt[probe] = count(); }'
Attaching 12 probes...
^C
@cnt[tracepoint:xdp:mem_connect]: 18
@cnt[tracepoint:xdp:mem_disconnect]: 18
@cnt[tracepoint:xdp:xdp_exception]: 19605
@cnt[tracepoint:xdp:xdp_devmap_xmit]: 1393604
@cnt[tracepoint:xdp:xdp_redirect]: 22292200
注意
各种 xdp 追踪点可以在 source/include/trace/events/xdp.h
中找到
以下 bpftrace 命令可用于提取作为 err 参数一部分返回的 ERRNO
sudo bpftrace -e \
'tracepoint:xdp:xdp_redirect*_err {@redir_errno[-args->err] = count();}
tracepoint:xdp:xdp_devmap_xmit {@devmap_errno[-args->err] = count();}'
perf record¶
perf 工具也支持记录追踪点
perf record -a -e xdp:xdp_redirect_err \
-e xdp:xdp_redirect_map_err \
-e xdp:xdp_exception \
-e xdp:xdp_devmap_xmit