10.鏈路綁定PMD
除了用于物理和虛擬硬件的輪詢模式驅(qū)動程序(PMD)之外,DPDK還包括一個純軟件庫,可將多個物理PMD綁定在一起以創(chuàng)建單個邏輯PMD。

Link Bonding PMD庫(librte_pmd_bond)支持綁定相同速度和雙工的rte_eth_dev端口組,以提供類似于Linux綁定驅(qū)動程序中的功能,以允許將多個(從屬)NIC聚合到服務(wù)器和交換機中的單個邏輯接口。然后,新的聚合的PMD將根據(jù)指定的操作模式處理這些接口,以支持冗余鏈路,容錯和/或負載均衡等功能。
librte_pmd_bond庫導(dǎo)出一個C語言API,包括用于創(chuàng)建綁定設(shè)備的API,以及配置和管理綁定設(shè)備及其從屬設(shè)備的API。
注意:鏈路綁定PMD庫默認情況下在構(gòu)建配置文件中啟用,可以通過設(shè)置CONFIG_RTE_LIBRTE_PMD_BOND = n并重新編譯DPDK來禁用該庫。
10.1.鏈路綁定模式概述
目前,Link Bonding PMD庫支持以下網(wǎng)卡綁定模式。
10.1.1.輪詢(模式0)

輪詢模式通過從第一個可用從設(shè)備到最后一個的順序來傳輸數(shù)據(jù)包,以提供負載平衡和容錯。數(shù)據(jù)包是從設(shè)備批量出隊,然后以循環(huán)方式提供服務(wù)。這種模式不能保證接收到數(shù)據(jù)包仍然有序,下行流需要能夠處理亂序數(shù)據(jù)包。
10.1.2.主動備份(模式1)

在此模式下,在任何時間只有一個從設(shè)備處于活動狀態(tài),當且僅當當前活躍從設(shè)備發(fā)生故障時,不同的從設(shè)備才會激活,從而為故障設(shè)備提供容錯。單個邏輯綁定接口的MAC地址只能在一個NIC(端口)上外部可見,以避免網(wǎng)絡(luò)交換混淆。
10.1.3.平衡策略

此模式提供傳輸負載均衡(基于所選傳輸策略)和容錯。默認策略(layer2)使用基于報文流的源和目標MAC地址的簡單計算以及綁定設(shè)備可用活動從設(shè)備的數(shù)量,將數(shù)據(jù)包分類到特定從設(shè)備進行傳輸。額外支持的備用傳輸策略是L2 + L3,這將IP源和目標地址用于傳輸從端口的計算,最終需要支持的策略是L3 + L4層,這使用IP源和目標地址以及TCP / UDP源和目的端口進行計算。
注意:報文的著色差異用于識別由所選擇的傳輸策略計算的不同流分類
10.1.4.廣播策略

這種模式通過在所有從設(shè)備端口上傳輸數(shù)據(jù)來實現(xiàn)容錯。
10.1.5.鏈路聚合802.3AD

此模式根據(jù)802.3ad規(guī)范提供了動態(tài)鏈路聚合。它使用所選擇的均衡傳輸策略來協(xié)商和監(jiān)視共享相同速度和雙工設(shè)置的聚合組,以平衡出口流量。
這種模式的DPDK實現(xiàn)對應(yīng)用程序提供了一些額外的要求。
- 需要調(diào)用rte_eth_tx_burst和rte_eth_rx_burst,間隔時間小于100ms。
- 對rte_eth_tx_burst的調(diào)用必須至少具有2xN的緩沖區(qū)大小,其中N是從設(shè)備數(shù)。這是LACP幀所需的空間。另外LACP數(shù)據(jù)包也包含在統(tǒng)計信息中,但不會返回給應(yīng)用程序。
10.1.6.傳輸負載均衡策略

此模式提供自適應(yīng)傳輸負載均衡。它根據(jù)計算的負載動態(tài)地更改發(fā)送從設(shè)備。以100ms的間隔收集統(tǒng)計數(shù)據(jù),每10ms調(diào)度一次。
10.2.實現(xiàn)細節(jié)
librte_pmd_bond綁定設(shè)備與DPDK API參考中描述的以太網(wǎng)PMD導(dǎo)出的以太網(wǎng)設(shè)備API兼容。
鏈路綁定庫支持在EAL初始化期間的應(yīng)用程序啟動時使用 –vdev 選項以及通過C語言 API接口 rte_eth_bond_create函數(shù)以編程方式創(chuàng)建綁定的設(shè)備。
綁定設(shè)備支持使用接口rte_eth_bond_slave_add / rte_eth_bond_slave_remove實現(xiàn)動態(tài)添加和移除。
在將從設(shè)備添加到綁定設(shè)備后,從設(shè)備使用rte_eth_dev_stop停止,然后使用rte_eth_dev_configure進行重新配置,也可以使用rte_eth_tx_queue_setup / rte_eth_rx_queue_setup重新配置RX和TX隊列,并配置用于配置綁定設(shè)備的參數(shù)。如果啟用綁定設(shè)備的RSS,則此模式也將在新從站上啟用并進行配置。
設(shè)置用于將設(shè)備綁定到RSS的多隊列模式,使其完全具有RSS功能,因此所有從設(shè)備都與其配置同步。此模式旨在提供用于客戶端應(yīng)用程序?qū)崿F(xiàn)的從站上的RSS配置。
綁定設(shè)備存儲其自己的RSS設(shè)置版本,即RETA,RSS散列函數(shù)和RSS密鑰,用于設(shè)置其從設(shè)備。 這就是為了將綁定裝置的RSS配置的含義定義為整個綁定(作為一個單元)的所需配置,而不指向任何從屬內(nèi)部。需要確保一致性并使其更具錯誤性。
用于綁定設(shè)備的RSS散列函數(shù)集,是所有綁定從站支持的RSS哈希函數(shù)的最大集合。RETA大小是其所有RETA大小的GCD,因此即使從屬RETA的大小不同,它也可以輕松地用作提供預(yù)期行為的模式。如果沒有為綁定設(shè)備設(shè)置RSS鍵,則在從站上不更改,并且使用設(shè)備的默認密鑰。
所有設(shè)置都通過綁定端口API進行管理,并始終沿一個方向傳播(從綁定到從站)。
10.2.1.鏈路狀態(tài)改變中斷與輪詢
鏈路綁定設(shè)備支持鏈路狀態(tài)更改回調(diào)的注冊,使用rte_eth_dev_callback_register接口,當綁定設(shè)備的狀態(tài)發(fā)生更改時,將調(diào)用此函數(shù)進行處理。例如,在具有3個從設(shè)備的綁定設(shè)備中,當所有從設(shè)備變?yōu)椴换钴S時,鏈路狀態(tài)變?yōu)镈OWN,當一個從設(shè)備變?yōu)榛顒訝顟B(tài)時,鏈路狀態(tài)將變?yōu)閁P。當單個從設(shè)備更改狀態(tài)并且不滿足先前的條件時,沒有回調(diào)通知。如果用戶希望監(jiān)視單個從設(shè)備,則它們必須直接向該從設(shè)備注冊回調(diào)。
鏈路綁定庫還支持不實現(xiàn)鏈路狀態(tài)改變中斷處理的設(shè)備,這是通過使用接口rte_eth_bond_link_monitoring_set設(shè)置的周期輪詢設(shè)備鏈路狀態(tài)來實現(xiàn)的,默認輪詢間隔為10ms。當設(shè)備作為從設(shè)備添加到綁定設(shè)備時,使用RTE_PCI_DRV_INTR_LSC標志確定設(shè)備是支持中斷還是通過輪詢來監(jiān)視鏈路狀態(tài)。
10.2.2.要求與限制
目前的實現(xiàn)只支持相同速度和雙工的設(shè)備作為從設(shè)備提供給同一個綁定設(shè)備。綁定設(shè)備從添加到綁定設(shè)備的第一個活動從設(shè)備上繼承這些屬性,然后添加到綁定設(shè)備的所有其他從設(shè)備必須支持這些參數(shù)。
綁定設(shè)備本身啟動之前,必須至少一個從設(shè)備。
為了有效地使用綁定設(shè)備動態(tài)RSS配置功能,還需要所有的從設(shè)備都應(yīng)該是具有RSS能力和支持的,至少有一個通用的散列函數(shù)可用于它們。只有當所有從設(shè)備支持相同的密鑰大小時才可以更改RSS密鑰。
為了防止從設(shè)備對于如何處理數(shù)據(jù)包產(chǎn)生矛盾,一旦將設(shè)備添加到綁定設(shè)備,RSS配置應(yīng)通過綁定設(shè)備API進行管理,而不是直接在從設(shè)備上進行管理。
像所有其他PMD一樣,PMD導(dǎo)出的所有功能都是無鎖功能,假定不會在不同邏輯核心上并行調(diào)用以操作同一目標對象。
還應(yīng)該注意的是,PMD接收功能在它們已經(jīng)到達綁定設(shè)備之后不應(yīng)該直接在從設(shè)備上被調(diào)用,因為直接從從設(shè)備讀取的數(shù)據(jù)包將不再可用于綁定設(shè)備讀取。
10.2.3.配置
鏈路綁定設(shè)備使用rte_eth_bond_create API創(chuàng)建,該API需要傳入唯一的設(shè)備名稱,綁定模式和套接字ID來分配綁定設(shè)備的資源。綁定設(shè)備的其他可配置參數(shù)是其從設(shè)備,主從,用戶定義的MAC地址,如果設(shè)備處于平衡XOR模式還需要定義要使用的傳輸策略。
10.2.3.1.從設(shè)備
綁定設(shè)備支持相同速度和雙工的設(shè)備,最大數(shù)目為RTE_MAX_ETHPORTS。每個以太網(wǎng)設(shè)備可以作為從設(shè)備添加到最多一個綁定設(shè)備上。從設(shè)備在被加入綁定設(shè)備時被重新配置為綁定設(shè)備的配置。
綁定還保證將從設(shè)備的MAC地址返回到其原始值。
10.2.3.2.主從
主從關(guān)系用于定義綁定設(shè)備處于主動備份模式(模式1)時使用的默認端口。當且僅當當前主端口關(guān)閉時,才會使用不同的端口。如果用戶沒有指定主端口,則默認為添加到綁定設(shè)備的第一個端口。
10.2.3.3.MAC地址
綁定設(shè)備可以配置用戶指定的MAC地址,該地址將由某些或所有從設(shè)備根據(jù)操作模式繼承。如果設(shè)備處于主動備份模式,則只有主設(shè)備具有用戶指定的MAC,所有其他從設(shè)備將保留其原始MAC地址。在模式0,2,3,4中,所有從站設(shè)備都配置了綁定設(shè)備的MAC地址。
如果未定義用戶定義的MAC地址,則綁定設(shè)備將默認使用主從站MAC地址。
10.2.3.4.均衡XOR模式傳輸策略
對于在均衡XOR模式下運行的綁定設(shè)備,有3種支持的傳輸策略。層2,層2 + 3,層3 + 4。
- Layer 2:默認的傳輸策略是以太網(wǎng)基于MAC地址的均衡策略。它對包的源MAC地址和目的MAC地址使用簡單的XOR計算,然后計算該值的模數(shù),以計算需要輸出數(shù)據(jù)包的從設(shè)備。
- Layer2+3:以太網(wǎng)MAC地址和基于IP地址的均衡策略使用源/目的MAC地址和數(shù)據(jù)包的源/目的IP地址組合來決定數(shù)據(jù)包將被傳輸?shù)膹脑O(shè)備端口。
- Layer3+4:IP地址和UDP基于端口的均衡策略使用源/目的IP地址和數(shù)據(jù)包的數(shù)據(jù)包的源/目的UDP端口的組合來決定數(shù)據(jù)包將被傳輸?shù)膹脑O(shè)備端口。
所有這些策略都支持802.1Q VLAN以太網(wǎng)報文,還支持IPv4,IPv6和UDP協(xié)議進行負載分擔。
10.3.使用鏈路綁定設(shè)備
librte_pmd_bond庫支持兩種設(shè)備創(chuàng)建模式,庫導(dǎo)出完整的C API或使用EAL命令行在應(yīng)用程序啟動時靜態(tài)配置鏈路綁定設(shè)備。使用EAL選項,可以透明地使用鏈接綁定功能,而不需要庫API的具體知識,例如,可以使用這種功能來將綁定功能(如主動備份)添加到不了解鏈接的現(xiàn)有應(yīng)用程序上。
10.3.1.程序中使用輪詢模式驅(qū)動
使用librte_pmd_bond庫API,可以在任何應(yīng)用程序內(nèi)動態(tài)創(chuàng)建和管理鏈路綁定設(shè)備。鏈路綁定設(shè)備使用rte_eth_bond_create API創(chuàng)建,該API需要唯一的設(shè)備名稱,用于初始化設(shè)備的鏈路綁定模式,以及最后將要分配設(shè)備資源的套接字ID。在成功創(chuàng)建綁定設(shè)備之后,必須使用通用的以太網(wǎng)設(shè)備配置API rte_eth_dev_configure來配置,然后使用rte_eth_tx_queue_setup/rte_eth_rx_queue_setup將要使用的RX和TX隊列進行設(shè)置。
可以使用rte_eth_bond_slave_add/rte_eth_bond_slave_remove API對鏈路綁定設(shè)備動態(tài)添加和刪除從設(shè)備,但在使用rte_eth_dev_start啟動鏈路綁定設(shè)備之前,必須至少添加一個從設(shè)備。
綁定設(shè)備的鏈路狀態(tài)由其從設(shè)備的鏈路狀態(tài)決定,如果所有從設(shè)備鏈路狀態(tài)都關(guān)閉,或者所有從設(shè)備都從鏈路綁定設(shè)備中刪除,則綁定設(shè)備的鏈路狀態(tài)為DOWN。
還可以使用提供的rte_eth_bond_mode_set/get,rte_eth_bond_primary_set/get,rte_eth_bond_mac_set/reset和rte_eth_bond_xmit_policy_set/get來配置/查詢綁定設(shè)備的控制參數(shù)的配置。
10.3.2.在EAL命令行中使用鏈路綁定設(shè)備
鏈路綁定設(shè)備可以在應(yīng)用程序啟動時使用--vdev EAL命令行選項創(chuàng)建。 設(shè)備名稱必須以net_bonding前綴開頭,后跟數(shù)字或字母。每個設(shè)備的名稱必須是唯一的。每個設(shè)備可以有多個選項,以逗號分隔列表排列??梢远啻握{(diào)用--vdev選項來安排多個設(shè)備定義。
設(shè)備名稱和綁定選項必須用逗號分隔,如下所示:
$RTE_TARGET/app/testpmd -l 0-3 -n 4 --vdev 'net_bonding0,bond_opt0=..,bond opt1=..'--vdev 'net_bonding1,bond _opt0=..,bond_opt1=..'
10.3.2.1.鏈路綁定EAL選項
只要遵守以下兩個規(guī)則,可以對多種定義方式組合使用:
- 提供了一種獨特的設(shè)備名稱,格式為net_bondingX,其中X可以是數(shù)字和/或字母的任意組合,名稱不大于32個字符。
- 為每個綁定設(shè)備定義提供至少一個從設(shè)備。
- 提供了所創(chuàng)建的綁定設(shè)備的操作模式。
不同的選項包括:
- 模式:定義設(shè)備的綁定模式的整數(shù)值。目前支持模式0,1,2,3,4,5(循環(huán),主動備份,平衡,廣播,鏈路聚合,傳輸負載均衡)。
- 從設(shè)備:定義將作為從設(shè)備添加到綁定設(shè)備的PMD設(shè)備??梢远啻芜x擇此選項,每個設(shè)備要作為從設(shè)備添加。物理設(shè)備應(yīng)使用其PCI地址指定,格式為 domain:bus:devid.function。
- 主設(shè)備:定義主從端口的可選參數(shù)用于主動備份模式,以便在數(shù)據(jù)TX / RX可用時選擇主從機。 當主端口未被用戶定義時,主端口也用于選擇要使用的MAC地址。如果未指定該設(shè)備,則默認為添加到設(shè)備的第一個從設(shè)備。主設(shè)備必須是綁定設(shè)備的從設(shè)備。
- Socket_id:可選參數(shù),用于選擇NUMA設(shè)備上將分配綁定設(shè)備資源的哪個套接字。
- Mac:可選參數(shù),選擇鏈路綁定設(shè)備的MAC地址,這將覆蓋主設(shè)備的值。
- xmit_policy:綁定設(shè)備處于均衡模式時定義傳輸策略的可選參數(shù)。如果沒有用戶指定,則默認為l2(第2層)轉(zhuǎn)發(fā),其他可用的傳輸策略為l23(第2層+3層)和l34層(3 + 4層)。
- lsc_poll_period_ms:可選參數(shù),用于定義不支持lsc中斷的設(shè)備以毫秒為單位的輪詢間隔,檢查設(shè)備鏈路狀態(tài)的變化。
- ups delay:可選參數(shù),增加了設(shè)備鏈路狀態(tài)傳播的延遲(以毫秒為單位),默認情況下該參數(shù)為零。
- down_delay:可選參數(shù),以毫秒為單位,將設(shè)備鏈路狀態(tài)DOWN的傳播延遲,默認情況下,該參數(shù)為零。
10.3.2.2.使用實例
以輪詢模式創(chuàng)建一個綁定設(shè)備,兩個從設(shè)備由其PCI地址指定:
$RTE_TARGET/app/testpmd -l 0-3 -n 4 --vdev 'net_bonding0,mode=0,
slave=0000:00a:00.01,slave=0000:004:00.00' -- --port-topology=chained
以輪詢模式創(chuàng)建一個綁定設(shè)備,其中兩個從站由其PCI地址和覆蓋MAC地址指定:
$RTE_TARGET/app/testpmd -l 0-3 -n 4 --vdev 'net_bonding0,mode=0,
slave=0000:00a:00.01,slave=0000:004:00.00,mac=00:1e:67:1d:fd:1d' -- --port-topology=chained
在平衡模式下創(chuàng)建一個綁定設(shè)備,其中兩個從站由其PCI地址指定,第3 + 4層傳輸策略:
$RTE_TARGET/app/testpmd -l 0-3 -n 4 --vdev 'net_bonding0,mode=2,
slave=0000:00a:00.01,slave=0000:004:00.00,xmit_policy=l34' -- --port-topology=chained