重定向

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
參考