網路功能表示器¶
本文件描述了表示器網路裝置的語義和用法,用於控制 SmartNIC 上的內部交換。 有關物理(多埠)交換機上密切相關的埠表示器,請參閱Documentation/networking/switchdev.rst。
動機¶
自 2010 年代中期以來,網絡卡已開始提供比傳統 SR-IOV 方法(及其簡單的基於 MAC/VLAN 的交換模型)更復雜的虛擬化功能。 這導致人們希望將軟體定義網路(例如 OpenVSwitch)解除安裝到這些 NIC,以指定每個功能的網路連線。 由此產生的設計通常被稱為 SmartNIC 或 DPU。
網路功能表示器將標準的 Linux 網路堆疊引入虛擬交換機和 IOV 裝置。 正如 Linux 控制的交換機的每個物理埠都有一個單獨的 netdev 一樣,虛擬交換機的每個虛擬埠也有一個單獨的 netdev。 當系統啟動時,並且在配置任何解除安裝之前,來自虛擬功能的所有資料包都會透過表示器出現在 PF 的網路堆疊中。 因此,PF 始終可以與虛擬功能自由通訊。 PF 可以配置表示器、上行鏈路或任何其他網路裝置之間的標準 Linux 轉發(路由、橋接、TC 分類器)。
因此,表示器既是控制平面物件(表示管理命令中的功能),又是資料平面物件(虛擬管道的一端)。 作為虛擬連結端點,表示器可以像任何其他網路裝置一樣進行配置;在某些情況下(例如,連結狀態),被表示者將遵循表示器的配置,而在其他情況下,有單獨的 API 來配置被表示者。
定義¶
本文件使用術語“switchdev 功能”來指代對裝置上的虛擬交換機具有管理控制權的 PCIe 功能。 通常,這將是一個 PF,但可以想象的是,NIC 可以配置為將這些管理許可權授予 VF 或 SF(子功能)。 根據 NIC 的設計,多埠 NIC 可能對整個裝置具有單個 switchdev 功能,或者可能對每個物理網路埠具有單獨的虛擬交換機,因此具有單獨的 switchdev 功能。 如果 NIC 支援巢狀交換,則每個巢狀交換機可能具有單獨的 switchdev 功能,在這種情況下,每個 switchdev 功能應僅為其直接管理的(子)交換機上的埠建立表示器。
“被表示者”是表示器所代表的物件。 因此,例如,在 VF 表示器的情況下,被表示者是相應的 VF。
表示器做什麼?¶
表示器有三個主要作用。
它用於配置被表示者看到的網路連線,例如鏈路啟動/關閉、MTU 等。例如,以管理方式啟動表示器應導致被表示者看到鏈路啟動/載波接通事件。
它為未命中虛擬交換機中任何解除安裝的快速路徑規則的流量提供慢速路徑。 在表示器網路裝置上傳輸的資料包應傳遞給被表示者;被表示者傳輸的未能匹配任何交換規則的資料包應在表示器網路裝置上接收。 (也就是說,存在一個將表示器連線到被表示者的虛擬管道,其概念類似於 veth 對。)這允許軟體交換機實現(例如 OpenVSwitch 或 Linux 網橋)在表示者和網路的其餘部分之間轉發資料包。
它充當切換規則(例如 TC 過濾器)可以引用被表示者的控制代碼,從而允許解除安裝這些規則。
2) 和 3) 的組合意味著行為(除了效能)應該相同,無論 TC 過濾器是否已解除安裝。 例如,VF 表示器上的 TC 規則在軟體中應用於在該表示器網路裝置上接收的資料包,而在硬體解除安裝中,它將應用於被表示者 VF 傳輸的資料包。 相反,映象出口重定向到 VF 表示器在硬體中對應於直接傳遞到被表示者 VF。
哪些功能應具有表示器?¶
基本上,對於裝置內部交換機上的每個虛擬埠,都應該有一個表示器。 一些供應商選擇省略上行鏈路和物理網路埠的表示器,這可以簡化使用(上行鏈路網路裝置實際上成為物理埠的表示器),但不能推廣到具有多個埠或上行鏈路的裝置。
因此,以下所有專案都應具有表示器
屬於 switchdev 功能的 VF。
本地 PCIe 控制器上的其他 PF 及其所屬的任何 VF。
裝置上外部 PCIe 控制器上的 PF 和 VF(例如,對於 SmartNIC 內的任何嵌入式片上系統)。
具有其他特性的 PF 和 VF,包括網路塊裝置(例如由遠端/分散式儲存支援的 vDPA virtio-blk PF),如果(且僅當)它們的網路訪問是透過虛擬交換機埠實現的。 [1] 請注意,即使被表示者沒有網路裝置,此類功能也可能需要表示器。
屬於上述任何 PF 或 VF 的子功能 (SF),如果它們在交換機上具有自己的埠(而不是使用其父 PF 的埠)。
裝置上任何加速器或外掛,其與網路的介面是透過虛擬交換機埠,即使它們沒有相應的 PCIe PF 或 VF。
這允許透過表示器 TC 規則控制 NIC 的整個交換行為。
將虛擬埠與 PCIe 虛擬功能或其網路裝置混淆是一種常見的誤解。 雖然在簡單情況下,VF 網路裝置和 VF 表示器之間存在 1:1 的對應關係,但更高階的裝置配置可能不會遵循此規則。 PCIe 功能不透過內部交換機進行網路訪問(即使是透過硬體實現功能提供的任何服務間接進行網路訪問),也_不應_具有表示器(即使它具有網路裝置)。 此類功能沒有交換機虛擬埠可供表示器配置,也沒有虛擬管道的另一端。 表示器代表虛擬埠,而不是 PCIe 功能或“終端使用者”網路裝置。
如何建立表示器?¶
附加到 switchdev 功能的驅動程式例項應為交換機上的每個虛擬埠建立一個純軟體網路裝置,該裝置具有某種形式的核心內對 switchdev 功能自身網路裝置或驅動程式私有資料 (netdev_priv()) 的引用。 這可以透過在探測時列舉埠、動態響應執行時埠的建立和銷燬或兩者的組合來實現。
表示器網路裝置的操作通常涉及透過 switchdev 功能進行操作。 例如,ndo_start_xmit() 可能會透過附加到 switchdev 功能的硬體 TX 佇列傳送資料包,資料包元資料或佇列配置會將其標記為傳遞給被表示者。
如何識別表示器?¶
表示器網路裝置_不應_直接引用 PCIe 裝置(例如,透過 net_dev->dev.parent / SET_NETDEV_DEV()),無論是被表示者還是 switchdev 功能。 相反,驅動程式應使用 SET_NETDEV_DEVLINK_PORT 宏在註冊網路裝置之前將 devlink 埠例項分配給網路裝置;核心使用 devlink 埠來提供 phys_switch_id 和 phys_port_name sysfs 節點。 (一些舊式驅動程式直接實現 ndo_get_port_parent_id() 和 ndo_get_phys_port_name(),但這已被棄用。)有關此 API 的詳細資訊,請參閱Documentation/networking/devlink/devlink-port.rst。
預計使用者空間將使用此資訊(例如,透過 udev 規則)來為網路裝置構造適當的資訊性名稱或別名。 例如,如果 switchdev 功能是 eth4,則 phys_port_name 為 p0pf1vf2 的表示器可能會被重新命名為 eth4pf1vf2rep。
對於不對應於 PCIe 功能(例如加速器和外掛)的命名錶示器,目前還沒有既定的約定。
表示器如何與 TC 規則互動?¶
表示器上的任何 TC 規則都適用於(在軟體 TC 中)該表示器網路裝置接收的資料包。 因此,如果規則的傳遞部分對應於虛擬交換機上的另一個埠,則驅動程式可以選擇將其解除安裝到硬體,將其應用於被表示者傳輸的資料包。
同樣,由於針對表示器的 TC 映象出口操作(在軟體中)會透過表示器傳送資料包(從而間接將其傳遞給被表示者),因此硬體解除安裝應將其解釋為傳遞給被表示者。
作為一個簡單的示例,如果 PORT_DEV 是物理埠表示器,REP_DEV 是 VF 表示器,則以下規則
tc filter add dev $REP_DEV parent ffff: protocol ipv4 flower \
action mirred egress redirect dev $PORT_DEV
tc filter add dev $PORT_DEV parent ffff: protocol ipv4 flower skip_sw \
action mirred egress mirror dev $REP_DEV
將意味著來自 VF 的所有 IPv4 資料包都將傳送到物理埠,並且在物理埠上接收到的所有 IPv4 資料包都將被傳遞到 VF 以及 PORT_DEV。 (請注意,如果沒有第二個規則上的 skip_sw,VF 將獲得兩個副本,因為在 PORT_DEV 上接收到的資料包將再次觸發 TC 規則,並將資料包映象到 REP_DEV。)
在沒有單獨埠和上行鏈路表示器的裝置上,PORT_DEV 將改為 switchdev 功能自身的上行鏈路網路裝置。
當然,這些規則可以(如果 NIC 支援)包括資料包修改操作(例如 VLAN 推送/彈出),這些操作應由虛擬交換機執行。
隧道封裝和解封裝要複雜得多,因為它們涉及第三個網路裝置(在元資料模式下執行的隧道網路裝置,例如使用 ip link add vxlan0 type vxlan external 建立的 VxLAN 裝置),並且需要將 IP 地址繫結到底層裝置(例如 switchdev 功能上行鏈路網路裝置或埠表示器)。 TC 規則,例如
tc filter add dev $REP_DEV parent ffff: flower \
action tunnel_key set id $VNI src_ip $LOCAL_IP dst_ip $REMOTE_IP \
dst_port 4789 \
action mirred egress redirect dev vxlan0
tc filter add dev vxlan0 parent ffff: flower enc_src_ip $REMOTE_IP \
enc_dst_ip $LOCAL_IP enc_key_id $VNI enc_dst_port 4789 \
action tunnel_key unset action mirred egress redirect dev $REP_DEV
其中 LOCAL_IP 是繫結到 PORT_DEV 的 IP 地址,REMOTE_IP 是同一子網上的另一個 IP 地址,意味著 VF 傳送的資料包應進行 VxLAN 封裝並透過物理埠傳送出去(驅動程式必須透過查詢導致 PORT_DEV 的 LOCAL_IP 的路由來推斷出這一點,並且還要執行 ARP/鄰居表查詢以找到要在外部乙太網幀中使用的 MAC 地址),而 UDP 埠為 4789 的物理埠上接收到的 UDP 資料包應解析為 VxLAN,如果它們的 VSID 與 $VNI 匹配,則應解封裝並轉發到 VF。
如果這一切看起來很複雜,只需記住 TC 解除安裝的“黃金法則”:硬體應確保與資料包透過慢速路徑處理、遍歷軟體 TC(除了忽略任何 skip_hw 規則並應用任何 skip_sw 規則)並透過表示器網路裝置傳輸或接收時相同的最終結果。
配置被表示者的 MAC¶
被表示者的鏈路狀態透過表示器控制。 以管理方式將表示器設定為啟動或關閉應導致被表示者上的載波接通或關閉。
在表示器上設定 MTU 應導致將相同的 MTU 報告給被表示者。 (在允許配置單獨且不同的 MTU 和 MRU 值的硬體上,表示器 MTU 應對應於被表示者的 MRU,反之亦然。)
目前,沒有辦法使用表示器來設定被表示者的站永久 MAC 地址; 可用於執行此操作的其他方法包括
舊式 SR-IOV (
ip link set DEVICE vf NUM mac LLADDR)devlink 埠功能(請參閱 devlink-port(8) 和 Documentation/networking/devlink/devlink-port.rst)