重定向¶
XDP_REDIRECT¶
支援的對映¶
XDP_REDIRECT 支援以下對映型別
BPF_MAP_TYPE_DEVMAPBPF_MAP_TYPE_DEVMAP_HASHBPF_MAP_TYPE_CPUMAPBPF_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