我將使用一個小型儲存庫來儲存 DPDK 的進度和測試程序,DPDK 是一個對於快速資料包處理非常有用的核心旁路庫。
該存儲庫使用我的 DPDK Common 項目,以使事情變得更簡單。
警告- 隨著時間的推移,我仍在添加更多示例,並且我需要測試新功能/方法。
如果您想使用預設選項建立 DPDK,假設您有ninja
和meson
等要求,以下內容應該可以運作。
git clone https://github.com/DPDK/dpdk.git
cd dpdk/
meson build
cd build
ninja
sudo ninja install
sudo ldconfig
DPDK 中所有需要的頭檔都將儲存在/usr/local/include/
內。
您可以使用以下方式接收ninja
和meson
。
sudo apt update
sudo apt install python3 python3-pip
sudo pip3 install meson # Pip3 is used because 'apt' has an outdated version of Meson usually.
sudo apt install ninja-build
您可以使用git
和make
在此儲存庫中建置原始檔。
git clone --recursive https://github.com/gamemann/The-DPDK-Examples.git
cd The-DPDK-Examples/
make
預設情況下,可執行檔將在build/
目錄中建置。
此儲存庫中的所有 DPDK 應用程式都支援 DPDK 的 EAL 參數。這些可以在這裡找到。
例如,這對於指定要設定的 l 核和連接埠的數量很有用。
在此 DPDK 應用程式中,到達 UDP 目標連接埠 8080 的任何封包都將被丟棄。否則,如果封包的乙太網路標頭類型是IPv4 或VLAN,它將交換來源/目標MAC 和IP 位址以及UDP 來源/目標端口,然後將封包發送出TX 路徑(基本上是從封包的來源處轉送封包) 。
除了 EAL 參數之外,還特別為此應用提供了以下參數。
-p --portmask => The port mask to configure (e.g. 0xFFFF).
-P --portmap => The port map to configure (in '(x, y),(b,z)' format).
-q --queues => The amount of RX and TX queues to setup per port (default and recommended value is 1).
-x --promisc => Whether to enable promiscuous on all enabled ports.
-s --stats => If specified, will print real-time packet counter stats to stdout.
這是一個例子:
./dropudp8080 -l 0-1 -n 1 -- -q 1 -p 0xff -s
在此 DPDK 應用程式中,建立了一個簡單的路由雜湊表,其中鍵是目標 IP 位址,值是要轉送至的 MAC 位址。
路由按以下格式從/etc/l3fwd/routes.txt
檔案中讀取。
<ip address> <mac address in xx:xx:xx:xx:xx:xx>
下面是一個例子。
10.50.0.4 ae:21:14:4b:3a:6d
10.50.0.5 d6:45:f3:b1:a4:3d
處理封包時,我們確保它是 IPv4 或 VLAN 封包(在本例中,我們將封包資料偏移四個位元組,以便我們可以毫無問題地處理封包的其餘部分)。然後,我們以目標 IP 作為路由雜湊表上的鍵進行查找。如果查找成功,來源 MAC 位址將替換為目標 MAC 位址(封包將從它們到達的相同連接埠發出,因為我們建立了 TX 緩衝區和佇列),並且目標 MAC 位址將替換為 IP 的 MAC 位址是從上面提到的路由檔案分配的。否則,資料包將被丟棄,並且資料包丟棄計數器會遞增。
除了 EAL 參數之外,還特別為此應用提供了以下參數。
-p --portmask => The port mask to configure (e.g. 0xFFFF).
-P --portmap => The port map to configure (in '(x, y),(b,z)' format).
-q --queues => The amount of RX and TX queues to setup per port (default and recommended value is 1).
-x --promisc => Whether to enable promiscuous on all enabled ports.
-s --stats => If specified, will print real-time packet counter stats to stdout.
這是一個例子:
./simple_l3fwd -l 0-1 -n 1 -- -q 1 -p 0xff -s
在此應用程式中,如果來源 IP 等於或超過命令列中指定的每秒資料包數或每秒位元組數,則封包將被丟棄。否則,乙太網路和 IP 位址與 TCP/UDP 連接埠一起交換,並且封包從 TX 路徑轉送回。
資料包統計資訊也包含在-s
標誌中。
支援以下命令列選項。
-p --portmask => The port mask to configure (e.g. 0xFFFF).
-P --portmap => The port map to configure (in '(x, y),(b,z)' format).
-q --queues => The amount of RX and TX queues to setup per port (default and recommended value is 1).
-x --promisc => Whether to enable promiscuous on all enabled ports.
-s --stats => If specified, will print real-time packet counter stats to stdout.
--pps => The packets per second to limit each source IP to.
--bps => The bytes per second to limit each source IP to.
這是一個例子:
./ratelimit -l 0-1 -n 1 -- -q 1 -p 0xff -s
注意- 該應用程式透過我在 DPDK Common 專案中建立的自訂函數check_and_del_lru_from_hash_table()
支援 LRU 回收。使用此函數時,請確保在包含 DPDK Common 頭檔之前定義USE_HASH_TABLES
。
這是一個小型應用程序,為雜湊表實作手動 LRU 方法。一段時間以來,我一直在嘗試讓 LRU 表在這些庫中運作。但是,我在實際初始化表方面取得了零成功。
因此,我決定繼續使用這些函式庫並實現我自己的 LRU 功能。我基本上使用rte_hash_get_key_with_position()
函數來檢索要刪除的最舊的金鑰。但是,新條目似乎插入到最近刪除的位置,因此您必須不斷增加位置值直至表的最大條目數。也就是說,一旦位置值超過最大表條目數,您需要將其設定回 0。
不需要命令列選項,但仍支援 EAL 參數。不過,它們不會有什麼不同。
這是一個例子:
./ratelimit