AF_XDP TX 元資料

本文件描述了在使用 AF_XDP 傳輸資料包時如何啟用解除安裝。 有關如何在接收端訪問類似元資料的資訊,請參閱 XDP RX 元資料

總體設計

元資料的預留空間透過 tx_metadata_lenstruct xdp_umem_reg 中的 XDP_UMEM_TX_METADATA_LEN 標誌來完成。 因此,對於共享同一 umem 的每個套接字,元資料長度都是相同的。 元資料佈局是固定的 UAPI,請參閱 include/uapi/linux/if_xdp.h 中的 union xsk_tx_metadata。 因此,通常,上面的 tx_metadata_len 欄位應包含 sizeof(union xsk_tx_metadata)

請注意,在原始實現中,不需要 XDP_UMEM_TX_METADATA_LEN 標誌。 應用程式可能會嘗試先使用標誌建立一個 umem,如果失敗,則嘗試不帶標誌的另一個嘗試。

預留空間和元資料本身應位於 umem 幀中的 xdp_desc->addr 之前。 在一個幀中,元資料佈局如下

       tx_metadata_len
 /                         \
+-----------------+---------+----------------------------+
| xsk_tx_metadata | padding |          payload           |
+-----------------+---------+----------------------------+
                            ^
                            |
                      xdp_desc->addr

AF_XDP 應用程式可以請求大於 sizeof(struct xsk_tx_metadata) 的預留空間。 核心將忽略填充(並且仍將使用 xdp_desc->addr - tx_metadata_len 來定位 xsk_tx_metadata)。 對於不應攜帶任何元資料的幀(即,沒有 XDP_TX_METADATA 選項的幀),核心也會忽略元資料區域。

flags 欄位啟用特定的解除安裝

  • XDP_TXMD_FLAGS_TIMESTAMP:請求裝置將傳輸時間戳放入 union xsk_tx_metadatatx_timestamp 欄位中。

  • XDP_TXMD_FLAGS_CHECKSUM:請求裝置計算 L4 校驗和。 csum_start 指定應開始校驗和的位元組偏移量,csum_offset 指定裝置應儲存計算出的校驗和的位元組偏移量。

  • XDP_TXMD_FLAGS_LAUNCH_TIME:請求裝置在預定的時間(稱為啟動時間)安排資料包的傳輸。 啟動時間的值由 union xsk_tx_metadatalaunch_time 欄位指示。

除了上述標誌之外,為了觸發解除安裝,第一個資料包的 struct xdp_desc 描述符應在 options 欄位中設定 XDP_TX_METADATA 位。 另請注意,在多緩衝區資料包中,只有第一塊應該攜帶元資料。

軟體 TX 校驗和

出於開發和測試目的,可以傳遞 XDP_UMEM_TX_SW_CSUM 標誌到 XDP_UMEM_REG UMEM 註冊呼叫。 在這種情況下,當以 XDK_COPY 模式執行時,TX 校驗和在 CPU 上計算。 不要在生產環境中啟用此選項,因為它會 негативно 影響效能。

啟動時間

所請求的啟動時間的值應基於裝置的 PTP 硬體時鐘 (PHC) 以確保準確性。 AF_XDP 採用與 ETF 排隊規則不同的資料路徑,後者組織資料包並延遲其傳輸。 相反,AF_XDP 會立即將資料包傳遞給裝置驅動程式,而不會重新排列它們的順序或在傳輸之前保留它們。 由於驅動程式維護 FIFO 行為並且不執行資料包重新排序,因此具有啟動時間請求的資料包將阻塞同一 Tx 佇列中的其他資料包,直到它被髮送。 因此,建議為計劃用於未來傳輸的流量分配單獨的佇列。

在啟動時間解除安裝功能被停用的情況下,裝置驅動程式應該忽略啟動時間請求。 為了正確解釋和有意義的操作,啟動時間永遠不應設定為大於未來最遠可程式設計時間(視界)的值。 不同的裝置對啟動時間解除安裝功能有不同的硬體限制。

stmmac 驅動程式

對於 stmmac,TSO 和啟動時間 (TBS) 功能對於每個單獨的 Tx 佇列是互斥的。 預設情況下,驅動程式配置 Tx 佇列 0 以支援 TSO,其餘 Tx 佇列支援 TBS。 可以使用 tc-etf 命令呼叫驅動程式的 ndo_setup_tc() 回撥來啟用或停用啟動時間硬體解除安裝功能。

在增強型正常傳輸描述符中程式設計的啟動時間的值是一個 32 位值,其中最高有效 8 位表示以秒為單位的時間,其餘 24 位表示以 256 納秒為單位的時間。 程式設計的啟動時間與 PTP 時間(bits[39:8])進行比較,並在 256 秒後翻轉。 因此,dwmac4 和 dwxlgmac2 的啟動時間視界是未來的 128 秒。

igc 驅動程式

對於 igc,所有四個 Tx 佇列都支援啟動時間功能。 可以使用 tc-etf 命令呼叫驅動程式的 ndo_setup_tc() 回撥來啟用或停用啟動時間硬體解除安裝功能。 當進入 TSN 模式時,igc 驅動程式將重置裝置並建立一個預設的 Qbv 計劃,週期時間為 1 秒,所有 Tx 佇列始終保持開啟狀態。

在高階傳輸上下文描述符中程式設計的啟動時間的值是相對於佇列的 Qbv 傳輸視窗的開始時間的相對偏移量。 可以設定描述符的 Frst 標誌以安排資料包用於下一個 Qbv 週期。 因此,i225 和 i226 的啟動時間視界是佇列的 Qbv 傳輸視窗的下一個週期的結束時間。 例如,當 Qbv 週期時間設定為 1 秒時,啟動時間的視界範圍從 1 秒到 2 秒,具體取決於 Qbv 週期當前執行的位置。

查詢裝置功能

每個裝置都透過 netlink netdev 系列匯出其解除安裝功能。 請參閱 Documentation/netlink/specs/netdev.yaml 中的 xsk-flags 功能位掩碼。

  • tx-timestamp:裝置支援 XDP_TXMD_FLAGS_TIMESTAMP

  • tx-checksum:裝置支援 XDP_TXMD_FLAGS_CHECKSUM

  • tx-launch-time-fifo:裝置支援 XDP_TXMD_FLAGS_LAUNCH_TIME

有關如何查詢此資訊,請參閱 tools/net/ynl/samples/netdev.c

示例

有關處理 TX 元資料的示例程式,請參閱 tools/testing/selftests/bpf/xdp_hw_metadata.c。 另請參閱 https://github.com/fomichev/xskgen 以獲取更簡單的示例。