重定向

XDP_REDIRECT

支持的映射

XDP_REDIRECT 支持以下映射类型

  • BPF_MAP_TYPE_DEVMAP

  • BPF_MAP_TYPE_DEVMAP_HASH

  • BPF_MAP_TYPE_CPUMAP

  • BPF_MAP_TYPE_XSKMAP

有关这些映射的更多信息,请参阅具体映射文档。

流程

XDP_REDIRECT 通过以下函数实现的三步流程工作

  1. bpf_redirect() 和 bpf_redirect_map() 辅助函数将查找重定向目标并将其(以及一些其他元数据)存储在每个 CPU 的 struct bpf_redirect_info 中。

  2. 当程序返回 XDP_REDIRECT 返回码时,驱动将调用 xdp_do_redirect(),该函数将使用 struct bpf_redirect_info 中的信息,实际将帧排入特定于映射类型的批量队列结构中。

  3. 在退出其 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
参考