Logo

Linux 核心

6.16.0-rc4

快速搜尋

目錄

  • 開發過程
  • 提交補丁
  • 行為準則
  • 維護者手冊
  • 所有開發過程文件
  • 核心 API
  • 驅動程式 API
  • 子系統
    • 核心子系統
    • 人機介面
    • 網路介面
      • 網路
      • NetLabel
      • InfiniBand
      • ISDN
      • MHI
    • 儲存介面
    • 其他子系統
  • 鎖機制
  • 許可規則
  • 編寫文件
  • 開發工具
  • 測試指南
  • Hacking 指南
  • 跟蹤
  • 故障注入
  • 熱補丁
  • Rust
  • 管理
  • 構建系統
  • 報告問題
  • 使用者空間工具
  • 使用者空間 API
  • 韌體
  • 韌體和裝置樹
  • CPU 架構
  • 未分類文件
  • 翻譯

本頁

  • 顯示原始檔

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 錯誤)而捕獲的資料包。此類陷阱可以由多個裝置驅動程式共享,其描述必須新增到下表

通用資料包陷阱列表¶

名稱

型別

描述

source_mac_is_multicast

drop

捕獲裝置因多播源 MAC 而決定丟棄的入站資料包

vlan_tag_mismatch

drop

捕獲裝置在 VLAN 標籤不匹配時決定丟棄的入站資料包:入口橋接埠未配置 PVID 且資料包未標記或優先順序標記

ingress_vlan_filter

drop

捕獲裝置決定丟棄的入站資料包,如果它們被標記了未在入口橋接埠上配置的 VLAN

ingress_spanning_tree_filter

drop

捕獲裝置決定丟棄的入站資料包,如果入口橋接埠的 STP 狀態不是“轉發”

port_list_is_empty

drop

捕獲裝置決定丟棄的資料包,如果它們需要泛洪(例如,未知單播,未註冊多播)且沒有埠可以泛洪這些資料包

port_loopback_filter

drop

捕獲裝置決定丟棄的資料包,如果在第 2 層轉發後,唯一應該傳輸這些資料包的埠是接收它們的埠

blackhole_route

drop

捕獲裝置決定丟棄的資料包,如果它們命中了黑洞路由

ttl_value_is_too_small

exception

捕獲裝置應轉發的單播資料包,其 TTL 已遞減到 0 或更小

tail_drop

drop

捕獲裝置決定丟棄的資料包,因為它們無法排入已滿的傳輸佇列

non_ip

drop

捕獲裝置決定丟棄的資料包,因為它們需要進行第 3 層查詢,但不是 IP 或 MPLS 資料包

uc_dip_over_mc_dmac

drop

捕獲裝置決定丟棄的資料包,因為它們需要路由且具有單播目的 IP 和多播目的 MAC

dip_is_loopback_address

drop

捕獲裝置決定丟棄的資料包,因為它們需要路由且其目的 IP 是環回地址(即,127.0.0.0/8 和 ::1/128)

sip_is_mc

drop

捕獲裝置決定丟棄的資料包,因為它們需要路由且其源 IP 是多播(即,224.0.0.0/8 和 ff::/8)

sip_is_loopback_address

drop

捕獲裝置決定丟棄的資料包,因為它們需要路由且其源 IP 是環回地址(即,127.0.0.0/8 和 ::1/128)

ip_header_corrupted

drop

捕獲裝置決定丟棄的資料包,因為它們需要路由且其 IP 頭部已損壞:錯誤的校驗和、錯誤的 IP 版本或過短的 Internet 頭部長度 (IHL)

ipv4_sip_is_limited_bc

drop

捕獲裝置決定丟棄的資料包,因為它們需要路由且其源 IP 是受限廣播(即,255.255.255.255/32)

ipv6_mc_dip_reserved_scope

drop

捕獲裝置決定丟棄的 IPv6 資料包,因為它們需要路由且其 IPv6 多播目的 IP 具有保留範圍(即,ffx0::/16)

ipv6_mc_dip_interface_local_scope

drop

捕獲裝置決定丟棄的 IPv6 資料包,因為它們需要路由且其 IPv6 多播目的 IP 具有介面本地範圍(即,ffx1::/16)

mtu_value_is_too_small

exception

捕獲裝置應路由但大於出口介面 MTU 的資料包

unresolved_neigh

exception

捕獲路由後沒有匹配 IP 鄰居的資料包

mc_reverse_path_forwarding

exception

捕獲在多播路由期間未能透過反向路徑轉發 (RPF) 檢查的多播 IP 資料包

reject_route

exception

捕獲命中斷開路由(即,“不可達”,“禁止”)的資料包

ipv4_lpm_miss

exception

捕獲未匹配任何路由的單播 IPv4 資料包

ipv6_lpm_miss

exception

捕獲未匹配任何路由的單播 IPv6 資料包

non_routable_packet

drop

捕獲裝置決定丟棄的資料包,因為它們不應該被路由。例如,IGMP 查詢可以由裝置在第 2 層泛洪併到達路由器。此類資料包不應被路由,而應被丟棄

decap_error

exception

捕獲裝置因解封裝失敗(例如,資料包過短,VXLAN 頭部中的保留位設定)而決定丟棄的 NVE 和 IPinIP 資料包

overlay_smac_is_mc

drop

捕獲裝置因其覆蓋源 MAC 是多播而決定丟棄的 NVE 資料包

ingress_flow_action_drop

drop

捕獲在處理入口流動作丟棄期間丟棄的資料包

egress_flow_action_drop

drop

捕獲在處理出口流動作丟棄期間丟棄的資料包

stp

control

捕獲 STP 資料包

lacp

control

捕獲 LACP 資料包

lldp

control

捕獲 LLDP 資料包

igmp_query

control

捕獲 IGMP 組成員查詢資料包

igmp_v1_report

control

捕獲 IGMP 版本 1 組成員報告資料包

igmp_v2_report

control

捕獲 IGMP 版本 2 組成員報告資料包

igmp_v3_report

control

捕獲 IGMP 版本 3 組成員報告資料包

igmp_v2_leave

control

捕獲 IGMP 版本 2 離開組資料包

mld_query

control

捕獲 MLD 多播監聽器查詢資料包

mld_v1_report

control

捕獲 MLD 版本 1 多播監聽器報告資料包

mld_v2_report

control

捕獲 MLD 版本 2 多播監聽器報告資料包

mld_v1_done

control

捕獲 MLD 版本 1 多播監聽器完成資料包

ipv4_dhcp

control

捕獲 IPv4 DHCP 資料包

ipv6_dhcp

control

捕獲 IPv6 DHCP 資料包

arp_request

control

捕獲 ARP 請求資料包

arp_response

control

捕獲 ARP 響應資料包

arp_overlay

control

捕獲已解封裝的到達覆蓋網路的 NVE ARP 資料包。例如,當需要解析的地址是本地地址時,這是必需的

ipv6_neigh_solicit

control

捕獲 IPv6 鄰居請求資料包

ipv6_neigh_advert

control

捕獲 IPv6 鄰居通告資料包

ipv4_bfd

control

捕獲 IPv4 BFD 資料包

ipv6_bfd

control

捕獲 IPv6 BFD 資料包

ipv4_ospf

control

捕獲 IPv4 OSPF 資料包

ipv6_ospf

control

捕獲 IPv6 OSPF 資料包

ipv4_bgp

control

捕獲 IPv4 BGP 資料包

ipv6_bgp

control

捕獲 IPv6 BGP 資料包

ipv4_vrrp

control

捕獲 IPv4 VRRP 資料包

ipv6_vrrp

control

捕獲 IPv6 VRRP 資料包

ipv4_pim

control

捕獲 IPv4 PIM 資料包

ipv6_pim

control

捕獲 IPv6 PIM 資料包

uc_loopback

control

捕獲需要透過其接收的相同第 3 層介面路由的單播資料包。此類資料包由核心路由,但也可能導致核心生成 ICMP 重定向資料包

local_route

control

捕獲命中文地路由並需要本地交付的單播資料包

external_route

control

捕獲應透過不屬於同一裝置(例如,交換 ASIC)的外部介面(例如,管理介面)路由的資料包,如同入口介面一樣

ipv6_uc_dip_link_local_scope

control

捕獲需要路由且目的 IP 地址具有鏈路本地範圍(即,fe80::/10)的單播 IPv6 資料包。該陷阱允許裝置驅動程式避免程式設計鏈路本地路由,但仍接收用於本地交付的資料包

ipv6_dip_all_nodes

control

捕獲目的 IP 地址是“所有節點地址”(即,ff02::1)的 IPv6 資料包

ipv6_dip_all_routers

control

捕獲目的 IP 地址是“所有路由器地址”(即,ff02::2)的 IPv6 資料包

ipv6_router_solicit

control

捕獲 IPv6 路由器請求資料包

ipv6_router_advert

control

捕獲 IPv6 路由器通告資料包

ipv6_redirect

control

捕獲 IPv6 重定向訊息資料包

ipv4_router_alert

control

捕獲需要路由且包含路由器警報選項的 IPv4 資料包。此類資料包需要本地交付給設定了 IP_ROUTER_ALERT 套接字選項的原始套接字

ipv6_router_alert

control

捕獲需要路由且在其逐跳擴充套件頭部中包含路由器警報選項的 IPv6 資料包。此類資料包需要本地交付給設定了 IPV6_ROUTER_ALERT 套接字選項的原始套接字

ptp_event

control

捕獲 PTP 時間關鍵事件訊息(Sync, Delay_req, Pdelay_Req 和 Pdelay_Resp)

ptp_general

control

捕獲 PTP 一般訊息(Announce, Follow_Up, Delay_Resp, Pdelay_Resp_Follow_Up, management 和 signaling)

flow_action_sample

control

捕獲在處理流動作取樣期間取樣的資料包(例如,透過 tc 的取樣動作)

flow_action_trap

control

捕獲在處理流動作陷阱期間記錄的資料包(例如,透過 tc 的陷阱動作)

early_drop

drop

捕獲因 RED (Random Early Detection) 演算法而丟棄的資料包(即,早期丟棄)

vxlan_parsing

drop

捕獲因 VXLAN 頭部解析錯誤而丟棄的資料包,這可能是由於資料包截斷或 I 標誌未設定。

llc_snap_parsing

drop

捕獲因 LLC+SNAP 頭部解析錯誤而丟棄的資料包

vlan_parsing

drop

捕獲因 VLAN 頭部解析錯誤而丟棄的資料包。可能包括意外的資料包截斷。

pppoe_ppp_parsing

drop

捕獲因 PPPoE+PPP 頭部解析錯誤而丟棄的資料包。這可能包括會話 ID 為 0xFFFF(保留且不可用)、PPPoE 長度大於接收幀長度或此類頭部上的任何常見錯誤

mpls_parsing

drop

捕獲因 MPLS 頭部解析錯誤而丟棄的資料包,可能包括意外的頭部截斷

arp_parsing

drop

捕獲因 ARP 頭部解析錯誤而丟棄的資料包

ip_1_parsing

drop

捕獲因第一個 IP 頭部解析錯誤而丟棄的資料包。此資料包陷阱可能包括未透過 IP 校驗和檢查、頭部長度檢查(至少 20 位元組)、可能因資料包截斷而導致總長度欄位超出接收資料包長度等的資料包

ip_n_parsing

drop

捕獲因解析最後一個 IP 頭部(IP over IP 隧道中的內部頭部)錯誤而丟棄的資料包。此處執行與 ip_1_parsing 陷阱相同的常見錯誤檢查

gre_parsing

drop

捕獲因 GRE 頭部解析錯誤而丟棄的資料包

udp_parsing

drop

捕獲因 UDP 頭部解析錯誤而丟棄的資料包。此資料包陷阱可能包括校驗和錯誤、檢測到不正確的 UDP 長度(小於 8 位元組)或檢測到頭部截斷。

tcp_parsing

drop

捕獲因 TCP 頭部解析錯誤而丟棄的資料包。這可能包括 TCP 校驗和錯誤、SYN、FIN 和/或 RESET 的不當組合等。

ipsec_parsing

drop

捕獲因 IPSEC 頭部解析錯誤而丟棄的資料包

sctp_parsing

drop

捕獲因 SCTP 頭部解析錯誤而丟棄的資料包。這意味著使用了埠號 0 或頭部被截斷。

dccp_parsing

drop

捕獲因 DCCP 頭部解析錯誤而丟棄的資料包

gtp_parsing

drop

捕獲因 GTP 頭部解析錯誤而丟棄的資料包

esp_parsing

drop

捕獲因 ESP 頭部解析錯誤而丟棄的資料包

blackhole_nexthop

drop

捕獲裝置因其命中黑洞下一跳而決定丟棄的資料包

dmac_filter

drop

捕獲裝置決定丟棄的入站資料包,因為目的 MAC 未在 MAC 表中配置且介面不在混雜模式

eapol

control

捕獲 IEEE 802.1X 中指定的“可擴充套件認證協議區域網”(EAPOL)資料包

locked_port

drop

捕獲裝置決定丟棄的資料包,因為它們未能透過鎖定橋接埠檢查。即,透過鎖定埠接收且其 {SMAC, VID} 不對應指向該埠的 FDB 條目的資料包

驅動程式特定資料包陷阱¶

裝置驅動程式可以註冊驅動程式特定資料包陷阱,但這些必須清晰地記錄。此類陷阱可能對應於裝置特定異常,並有助於除錯由這些異常引起的資料包丟棄。以下列表包含指向各種裝置驅動程式註冊的驅動程式特定陷阱描述的連結

  • netdevsim devlink 支援

  • mlxsw devlink 支援

  • prestera devlink 支援

通用資料包陷阱組¶

通用資料包陷阱組用於聚合邏輯相關的資料包陷阱。這些組允許使用者批次操作,例如設定所有成員陷阱的陷阱動作。此外,如果每個陷阱的統計資訊過於狹窄,devlink-trap 可以報告每個組的聚合資料包和位元組統計資訊。這些組的描述必須新增到下表

通用資料包陷阱組列表¶

名稱

描述

l2_drops

包含裝置在第 2 層轉發(即橋接)期間丟棄的資料包陷阱

l3_drops

包含裝置在第 3 層轉發期間丟棄的資料包陷阱

l3_exceptions

包含裝置在第 3 層轉發期間發生異常(例如,TTL 錯誤)的資料包陷阱

buffer_drops

包含裝置因入隊決策而丟棄的資料包陷阱

tunnel_drops

包含裝置在隧道封裝/解封裝期間丟棄的資料包陷阱

acl_drops

包含裝置在 ACL 處理期間丟棄的資料包陷阱

stp

包含 STP 資料包陷阱

lacp

包含 LACP 資料包陷阱

lldp

包含 LLDP 資料包陷阱

mc_snooping

包含多播偵聽所需的 IGMP 和 MLD 資料包陷阱

dhcp

包含 DHCP 資料包陷阱

neigh_discovery

包含鄰居發現數據包(例如,ARP,IPv6 ND)陷阱

bfd

包含 BFD 資料包陷阱

ospf

包含 OSPF 資料包陷阱

bgp

包含 BGP 資料包陷阱

vrrp

包含 VRRP 資料包陷阱

pim

包含 PIM 資料包陷阱

uc_loopback

包含單播環回資料包陷阱(即,uc_loopback)。此陷阱是單獨列出的,因為在某些情況下,例如單臂路由器,它會不斷觸發。為了限制對 CPU 使用的影響,可以將具有低速率的資料包陷阱限速器繫結到該組,而不會影響其他陷阱

local_delivery

包含路由後應本地交付,但不匹配更具體資料包陷阱(例如,ipv4_bgp)的資料包陷阱

external_delivery

包含應透過不屬於同一裝置(例如,交換 ASIC)的外部介面(例如,管理介面)路由的資料包陷阱,如同入口介面一樣

ipv6

包含各種 IPv6 控制資料包(例如,路由器通告)的陷阱

ptp_event

包含 PTP 時間關鍵事件訊息(Sync, Delay_req, Pdelay_Req 和 Pdelay_Resp)的陷阱

ptp_general

包含 PTP 一般訊息(Announce, Follow_Up, Delay_Resp, Pdelay_Resp_Follow_Up, management 和 signaling)的陷阱

acl_sample

包含裝置在 ACL 處理期間取樣的資料包陷阱

acl_trap

包含裝置在 ACL 處理期間捕獲(記錄)的資料包陷阱

parser_error_drops

包含裝置在解析期間標記為錯誤的資料包陷阱

eapol

包含 IEEE 802.1X 中指定的“可擴充套件認證協議區域網”(EAPOL)資料包的陷阱

資料包陷阱限速器¶

如前所述,底層裝置可以將某些資料包捕獲到 CPU 進行處理。在大多數情況下,底層裝置能夠處理的資料包速率比 CPU 能夠處理的速率高出幾個數量級。

因此,為了防止底層裝置使 CPU 過載,裝置通常包含資料包陷阱限速器,能夠將捕獲的資料包限制在 CPU 可以處理的速率。

devlink-trap 機制允許有能力的裝置驅動程式向 devlink 註冊其支援的資料包陷阱限速器。裝置驅動程式可以在其初始化期間選擇將這些限速器與支援的資料包陷阱組(參見通用資料包陷阱組)關聯起來,從而向用戶空間公開其預設控制平面策略。

裝置驅動程式應透過實現相關的回撥,允許使用者空間更改限速器的引數(例如,速率,突發大小)以及限速器與陷阱組之間的關聯。

如果可能,裝置驅動程式應實現一個回撥,允許使用者空間檢索因違反配置策略而被限速器丟棄的資料包數量。

測試¶

有關核心基礎設施的測試,請參見 tools/testing/selftests/drivers/net/netdevsim/devlink_trap.sh。應為任何新功能新增測試用例。

裝置驅動程式應將其測試重點放在裝置特定功能上,例如支援的資料包陷阱的觸發。

©核心開發社群。| 由 Sphinx 5.3.0 & Alabaster 0.7.16 提供技術支援 | 頁面原始檔