重定向¶
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 的结构 bpf_redirect_info 中。
当程序返回 XDP_REDIRECT 返回代码时,驱动程序将调用 xdp_do_redirect(),它将使用结构 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