重定向

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 的结构 bpf_redirect_info 中。

  2. 当程序返回 XDP_REDIRECT 返回代码时,驱动程序将调用 xdp_do_redirect(),它将使用结构 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
参考