Devlink 陷阱¶
背景¶
能夠解除安裝核心資料路徑並執行橋接和路由等功能的裝置,也必須能夠將特定資料包傳送到核心(即 CPU)進行處理。
例如,一個充當多播感知橋的裝置必須能夠將 IGMP 組成員報告發送到核心,以便橋模組處理。如果不處理此類資料包,橋模組將永遠無法填充其 MDB。
再舉一個例子,考慮一個充當路由器並收到 TTL 為 1 的 IP 資料包的裝置。在路由該資料包時,裝置必須將其傳送到核心,以便核心也能路由它並生成一個 ICMP 超時錯誤資料報。如果不讓核心自己路由此類資料包,traceroute 等工具將無法工作。
將某些資料包傳送到核心進行處理的基本能力稱為“資料包陷阱”。
概述¶
devlink-trap 機制允許有能力的裝置驅動程式向 devlink 註冊其支援的資料包陷阱,並將陷阱資料包報告給 devlink 以進行進一步分析。
收到陷阱資料包後,devlink 將執行每個陷阱的資料包和位元組計數,並可能透過 netlink 事件將資料包報告給使用者空間,同時提供所有元資料(例如,陷阱原因、時間戳、輸入埠)。這對於丟棄陷阱(參見陷阱型別)特別有用,因為它允許使用者進一步瞭解否則不可見的資料包丟棄。
下圖提供了 devlink-trap 的一般概述
Netlink event: Packet w/ metadata
Or a summary of recent drops
^
|
Userspace |
+---------------------------------------------------+
Kernel |
|
+-------+--------+
| |
| drop_monitor |
| |
+-------^--------+
|
| Non-control traps
|
+----+----+
| | Kernel's Rx path
| devlink | (non-drop traps)
| |
+----^----+ ^
| |
+-----------+
|
+-------+-------+
| |
| Device driver |
| |
+-------^-------+
Kernel |
+---------------------------------------------------+
Hardware |
| Trapped packet
|
+--+---+
| |
| ASIC |
| |
+------+
陷阱型別¶
devlink-trap 機制支援以下資料包陷阱型別
drop:陷阱資料包被底層裝置丟棄。資料包僅由devlink處理,而不注入到核心的 Rx 路徑。陷阱動作(參見陷阱動作)可以更改。
exception:陷阱資料包因異常(例如,TTL 錯誤,缺少鄰居條目)而未按底層裝置預期轉發,並被捕獲到控制平面進行解析。資料包由devlink處理並注入到核心的 Rx 路徑。不允許更改此類陷阱的動作,因為它很容易破壞控制平面。
control:陷阱資料包被裝置捕獲,因為這些是控制資料包,是控制平面正常執行所必需的。例如,ARP 請求和 IGMP 查詢資料包。資料包注入到核心的 Rx 路徑,但不報告給核心的丟棄監視器。不允許更改此類陷阱的動作,因為它很容易破壞控制平面。
陷阱動作¶
devlink-trap 機制支援以下資料包陷阱動作
trap:資料包的唯一副本傳送到 CPU。
drop:資料包被底層裝置丟棄,不傳送副本到 CPU。
mirror:資料包被底層裝置轉發,並將副本傳送到 CPU。
通用資料包陷阱¶
通用資料包陷阱用於描述捕獲定義明確的資料包或由於定義明確的條件(例如,TTL 錯誤)而捕獲的資料包。此類陷阱可以由多個裝置驅動程式共享,其描述必須新增到下表
名稱 |
型別 |
描述 |
|
|
捕獲裝置因多播源 MAC 而決定丟棄的入站資料包 |
|
|
捕獲裝置在 VLAN 標籤不匹配時決定丟棄的入站資料包:入口橋接埠未配置 PVID 且資料包未標記或優先順序標記 |
|
|
捕獲裝置決定丟棄的入站資料包,如果它們被標記了未在入口橋接埠上配置的 VLAN |
|
|
捕獲裝置決定丟棄的入站資料包,如果入口橋接埠的 STP 狀態不是“轉發” |
|
|
捕獲裝置決定丟棄的資料包,如果它們需要泛洪(例如,未知單播,未註冊多播)且沒有埠可以泛洪這些資料包 |
|
|
捕獲裝置決定丟棄的資料包,如果在第 2 層轉發後,唯一應該傳輸這些資料包的埠是接收它們的埠 |
|
|
捕獲裝置決定丟棄的資料包,如果它們命中了黑洞路由 |
|
|
捕獲裝置應轉發的單播資料包,其 TTL 已遞減到 0 或更小 |
|
|
捕獲裝置決定丟棄的資料包,因為它們無法排入已滿的傳輸佇列 |
|
|
捕獲裝置決定丟棄的資料包,因為它們需要進行第 3 層查詢,但不是 IP 或 MPLS 資料包 |
|
|
捕獲裝置決定丟棄的資料包,因為它們需要路由且具有單播目的 IP 和多播目的 MAC |
|
|
捕獲裝置決定丟棄的資料包,因為它們需要路由且其目的 IP 是環回地址(即,127.0.0.0/8 和 ::1/128) |
|
|
捕獲裝置決定丟棄的資料包,因為它們需要路由且其源 IP 是多播(即,224.0.0.0/8 和 ff::/8) |
|
|
捕獲裝置決定丟棄的資料包,因為它們需要路由且其源 IP 是環回地址(即,127.0.0.0/8 和 ::1/128) |
|
|
捕獲裝置決定丟棄的資料包,因為它們需要路由且其 IP 頭部已損壞:錯誤的校驗和、錯誤的 IP 版本或過短的 Internet 頭部長度 (IHL) |
|
|
捕獲裝置決定丟棄的資料包,因為它們需要路由且其源 IP 是受限廣播(即,255.255.255.255/32) |
|
|
捕獲裝置決定丟棄的 IPv6 資料包,因為它們需要路由且其 IPv6 多播目的 IP 具有保留範圍(即,ffx0::/16) |
|
|
捕獲裝置決定丟棄的 IPv6 資料包,因為它們需要路由且其 IPv6 多播目的 IP 具有介面本地範圍(即,ffx1::/16) |
|
|
捕獲裝置應路由但大於出口介面 MTU 的資料包 |
|
|
捕獲路由後沒有匹配 IP 鄰居的資料包 |
|
|
捕獲在多播路由期間未能透過反向路徑轉發 (RPF) 檢查的多播 IP 資料包 |
|
|
捕獲命中斷開路由(即,“不可達”,“禁止”)的資料包 |
|
|
捕獲未匹配任何路由的單播 IPv4 資料包 |
|
|
捕獲未匹配任何路由的單播 IPv6 資料包 |
|
|
捕獲裝置決定丟棄的資料包,因為它們不應該被路由。例如,IGMP 查詢可以由裝置在第 2 層泛洪併到達路由器。此類資料包不應被路由,而應被丟棄 |
|
|
捕獲裝置因解封裝失敗(例如,資料包過短,VXLAN 頭部中的保留位設定)而決定丟棄的 NVE 和 IPinIP 資料包 |
|
|
捕獲裝置因其覆蓋源 MAC 是多播而決定丟棄的 NVE 資料包 |
|
|
捕獲在處理入口流動作丟棄期間丟棄的資料包 |
|
|
捕獲在處理出口流動作丟棄期間丟棄的資料包 |
|
|
捕獲 STP 資料包 |
|
|
捕獲 LACP 資料包 |
|
|
捕獲 LLDP 資料包 |
|
|
捕獲 IGMP 組成員查詢資料包 |
|
|
捕獲 IGMP 版本 1 組成員報告資料包 |
|
|
捕獲 IGMP 版本 2 組成員報告資料包 |
|
|
捕獲 IGMP 版本 3 組成員報告資料包 |
|
|
捕獲 IGMP 版本 2 離開組資料包 |
|
|
捕獲 MLD 多播監聽器查詢資料包 |
|
|
捕獲 MLD 版本 1 多播監聽器報告資料包 |
|
|
捕獲 MLD 版本 2 多播監聽器報告資料包 |
|
|
捕獲 MLD 版本 1 多播監聽器完成資料包 |
|
|
捕獲 IPv4 DHCP 資料包 |
|
|
捕獲 IPv6 DHCP 資料包 |
|
|
捕獲 ARP 請求資料包 |
|
|
捕獲 ARP 響應資料包 |
|
|
捕獲已解封裝的到達覆蓋網路的 NVE ARP 資料包。例如,當需要解析的地址是本地地址時,這是必需的 |
|
|
捕獲 IPv6 鄰居請求資料包 |
|
|
捕獲 IPv6 鄰居通告資料包 |
|
|
捕獲 IPv4 BFD 資料包 |
|
|
捕獲 IPv6 BFD 資料包 |
|
|
捕獲 IPv4 OSPF 資料包 |
|
|
捕獲 IPv6 OSPF 資料包 |
|
|
捕獲 IPv4 BGP 資料包 |
|
|
捕獲 IPv6 BGP 資料包 |
|
|
捕獲 IPv4 VRRP 資料包 |
|
|
捕獲 IPv6 VRRP 資料包 |
|
|
捕獲 IPv4 PIM 資料包 |
|
|
捕獲 IPv6 PIM 資料包 |
|
|
捕獲需要透過其接收的相同第 3 層介面路由的單播資料包。此類資料包由核心路由,但也可能導致核心生成 ICMP 重定向資料包 |
|
|
捕獲命中文地路由並需要本地交付的單播資料包 |
|
|
捕獲應透過不屬於同一裝置(例如,交換 ASIC)的外部介面(例如,管理介面)路由的資料包,如同入口介面一樣 |
|
|
捕獲需要路由且目的 IP 地址具有鏈路本地範圍(即,fe80::/10)的單播 IPv6 資料包。該陷阱允許裝置驅動程式避免程式設計鏈路本地路由,但仍接收用於本地交付的資料包 |
|
|
捕獲目的 IP 地址是“所有節點地址”(即,ff02::1)的 IPv6 資料包 |
|
|
捕獲目的 IP 地址是“所有路由器地址”(即,ff02::2)的 IPv6 資料包 |
|
|
捕獲 IPv6 路由器請求資料包 |
|
|
捕獲 IPv6 路由器通告資料包 |
|
|
捕獲 IPv6 重定向訊息資料包 |
|
|
捕獲需要路由且包含路由器警報選項的 IPv4 資料包。此類資料包需要本地交付給設定了 IP_ROUTER_ALERT 套接字選項的原始套接字 |
|
|
捕獲需要路由且在其逐跳擴充套件頭部中包含路由器警報選項的 IPv6 資料包。此類資料包需要本地交付給設定了 IPV6_ROUTER_ALERT 套接字選項的原始套接字 |
|
|
捕獲 PTP 時間關鍵事件訊息(Sync, Delay_req, Pdelay_Req 和 Pdelay_Resp) |
|
|
捕獲 PTP 一般訊息(Announce, Follow_Up, Delay_Resp, Pdelay_Resp_Follow_Up, management 和 signaling) |
|
|
捕獲在處理流動作取樣期間取樣的資料包(例如,透過 tc 的取樣動作) |
|
|
捕獲在處理流動作陷阱期間記錄的資料包(例如,透過 tc 的陷阱動作) |
|
|
捕獲因 RED (Random Early Detection) 演算法而丟棄的資料包(即,早期丟棄) |
|
|
捕獲因 VXLAN 頭部解析錯誤而丟棄的資料包,這可能是由於資料包截斷或 I 標誌未設定。 |
|
|
捕獲因 LLC+SNAP 頭部解析錯誤而丟棄的資料包 |
|
|
捕獲因 VLAN 頭部解析錯誤而丟棄的資料包。可能包括意外的資料包截斷。 |
|
|
捕獲因 PPPoE+PPP 頭部解析錯誤而丟棄的資料包。這可能包括會話 ID 為 0xFFFF(保留且不可用)、PPPoE 長度大於接收幀長度或此類頭部上的任何常見錯誤 |
|
|
捕獲因 MPLS 頭部解析錯誤而丟棄的資料包,可能包括意外的頭部截斷 |
|
|
捕獲因 ARP 頭部解析錯誤而丟棄的資料包 |
|
|
捕獲因第一個 IP 頭部解析錯誤而丟棄的資料包。此資料包陷阱可能包括未透過 IP 校驗和檢查、頭部長度檢查(至少 20 位元組)、可能因資料包截斷而導致總長度欄位超出接收資料包長度等的資料包 |
|
|
捕獲因解析最後一個 IP 頭部(IP over IP 隧道中的內部頭部)錯誤而丟棄的資料包。此處執行與 ip_1_parsing 陷阱相同的常見錯誤檢查 |
|
|
捕獲因 GRE 頭部解析錯誤而丟棄的資料包 |
|
|
捕獲因 UDP 頭部解析錯誤而丟棄的資料包。此資料包陷阱可能包括校驗和錯誤、檢測到不正確的 UDP 長度(小於 8 位元組)或檢測到頭部截斷。 |
|
|
捕獲因 TCP 頭部解析錯誤而丟棄的資料包。這可能包括 TCP 校驗和錯誤、SYN、FIN 和/或 RESET 的不當組合等。 |
|
|
捕獲因 IPSEC 頭部解析錯誤而丟棄的資料包 |
|
|
捕獲因 SCTP 頭部解析錯誤而丟棄的資料包。這意味著使用了埠號 0 或頭部被截斷。 |
|
|
捕獲因 DCCP 頭部解析錯誤而丟棄的資料包 |
|
|
捕獲因 GTP 頭部解析錯誤而丟棄的資料包 |
|
|
捕獲因 ESP 頭部解析錯誤而丟棄的資料包 |
|
|
捕獲裝置因其命中黑洞下一跳而決定丟棄的資料包 |
|
|
捕獲裝置決定丟棄的入站資料包,因為目的 MAC 未在 MAC 表中配置且介面不在混雜模式 |
|
|
捕獲 IEEE 802.1X 中指定的“可擴充套件認證協議區域網”(EAPOL)資料包 |
|
|
捕獲裝置決定丟棄的資料包,因為它們未能透過鎖定橋接埠檢查。即,透過鎖定埠接收且其 {SMAC, VID} 不對應指向該埠的 FDB 條目的資料包 |
驅動程式特定資料包陷阱¶
裝置驅動程式可以註冊驅動程式特定資料包陷阱,但這些必須清晰地記錄。此類陷阱可能對應於裝置特定異常,並有助於除錯由這些異常引起的資料包丟棄。以下列表包含指向各種裝置驅動程式註冊的驅動程式特定陷阱描述的連結
通用資料包陷阱組¶
通用資料包陷阱組用於聚合邏輯相關的資料包陷阱。這些組允許使用者批次操作,例如設定所有成員陷阱的陷阱動作。此外,如果每個陷阱的統計資訊過於狹窄,devlink-trap 可以報告每個組的聚合資料包和位元組統計資訊。這些組的描述必須新增到下表
名稱 |
描述 |
|
包含裝置在第 2 層轉發(即橋接)期間丟棄的資料包陷阱 |
|
包含裝置在第 3 層轉發期間丟棄的資料包陷阱 |
|
包含裝置在第 3 層轉發期間發生異常(例如,TTL 錯誤)的資料包陷阱 |
|
包含裝置因入隊決策而丟棄的資料包陷阱 |
|
包含裝置在隧道封裝/解封裝期間丟棄的資料包陷阱 |
|
包含裝置在 ACL 處理期間丟棄的資料包陷阱 |
|
包含 STP 資料包陷阱 |
|
包含 LACP 資料包陷阱 |
|
包含 LLDP 資料包陷阱 |
|
包含多播偵聽所需的 IGMP 和 MLD 資料包陷阱 |
|
包含 DHCP 資料包陷阱 |
|
包含鄰居發現數據包(例如,ARP,IPv6 ND)陷阱 |
|
包含 BFD 資料包陷阱 |
|
包含 OSPF 資料包陷阱 |
|
包含 BGP 資料包陷阱 |
|
包含 VRRP 資料包陷阱 |
|
包含 PIM 資料包陷阱 |
|
包含單播環回資料包陷阱(即, |
|
包含路由後應本地交付,但不匹配更具體資料包陷阱(例如, |
|
包含應透過不屬於同一裝置(例如,交換 ASIC)的外部介面(例如,管理介面)路由的資料包陷阱,如同入口介面一樣 |
|
包含各種 IPv6 控制資料包(例如,路由器通告)的陷阱 |
|
包含 PTP 時間關鍵事件訊息(Sync, Delay_req, Pdelay_Req 和 Pdelay_Resp)的陷阱 |
|
包含 PTP 一般訊息(Announce, Follow_Up, Delay_Resp, Pdelay_Resp_Follow_Up, management 和 signaling)的陷阱 |
|
包含裝置在 ACL 處理期間取樣的資料包陷阱 |
|
包含裝置在 ACL 處理期間捕獲(記錄)的資料包陷阱 |
|
包含裝置在解析期間標記為錯誤的資料包陷阱 |
|
包含 IEEE 802.1X 中指定的“可擴充套件認證協議區域網”(EAPOL)資料包的陷阱 |
資料包陷阱限速器¶
如前所述,底層裝置可以將某些資料包捕獲到 CPU 進行處理。在大多數情況下,底層裝置能夠處理的資料包速率比 CPU 能夠處理的速率高出幾個數量級。
因此,為了防止底層裝置使 CPU 過載,裝置通常包含資料包陷阱限速器,能夠將捕獲的資料包限制在 CPU 可以處理的速率。
devlink-trap 機制允許有能力的裝置驅動程式向 devlink 註冊其支援的資料包陷阱限速器。裝置驅動程式可以在其初始化期間選擇將這些限速器與支援的資料包陷阱組(參見通用資料包陷阱組)關聯起來,從而向用戶空間公開其預設控制平面策略。
裝置驅動程式應透過實現相關的回撥,允許使用者空間更改限速器的引數(例如,速率,突發大小)以及限速器與陷阱組之間的關聯。
如果可能,裝置驅動程式應實現一個回撥,允許使用者空間檢索因違反配置策略而被限速器丟棄的資料包數量。
測試¶
有關核心基礎設施的測試,請參見 tools/testing/selftests/drivers/net/netdevsim/devlink_trap.sh。應為任何新功能新增測試用例。
裝置驅動程式應將其測試重點放在裝置特定功能上,例如支援的資料包陷阱的觸發。