1. 概述
dpdk不僅提供針對物理和虛擬網卡的pmd驅動(Poll Mode Drivers),還提供兩個純軟件的pmd驅動,libpcap pmd就是其中之一。Libpcap pmd使用libpcap庫讀寫報文,讀寫的源可以是文件,也可以是使用Linux內核驅動的物理網卡。
在沒有或不方便配置物理網卡的機器上,使用libpcap pmd可以幫助dpdk應用開發人員進行功能性測試或代碼調試;更重要的是,EAL(Environment Abstart Layer)之上的dpdk應用程序對於其底層用的是真實網卡pmd,還是libpcap pmd,是透明的,開發人員無需修改代碼就可以使用libpcap pmd帶來的便利。
2. 編譯與配置
2.1 編譯
Dpdk默認的配置文件里沒有打開libpcap pmd支持。如果是Linux下編譯,需要修改<dpdk>/config/common_linuxapp,將其中的
CONFIG_RTE_LIBRTE_PMD_AF_PACKET=n
改為
CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y。
另外,還需要安裝libpcap開發包,在ubuntu上安裝的命令是
sudo apt-get install libpcap-dev
然后重新編譯dpdk即可。
2.2 使用
所有dpdk應用程序都運行在EAL之上,而EAL提供了—vdev選項,可能通過它來指定使用libpcap pmd。格式如下:
app -c f -n 4 --vdev='eth_pcap0,stream_opt0=..,stream_opt1=..' --vdev='eth_pcap1,stream_opt0=..'
可以配置多個偽設備(pseudo-ethernet device),每個設備的名稱必須以eth_pcap開頭,然后跟數字或字母。每個設備都可以配置多個流選項(stream options),流選項之前使用逗號隔開,不能有空格符。
2.2.1 流選項
流選項包括:
- rx_pcap 將一個pcap文件設為Rx流,參數為pcap文件路徑。Libpcap pmd驅動會讀取文件中的每個包,就好像從實際網口讀一樣。這個pcap文件必須存在且有效。如 rx_pcap=/home/dev/test.pcap
- tx_pcap 將一個pcap文件設為Tx流。此文件將會自動創建和重寫。
- rx_iface 將一個使用Linux內核驅動的物理網口設為Rx流。如rx_iface=eth0
- tx_iface 將一個使用Linux內核驅動的物理網口設為Tx流。
- iface 映射一個物理網口,libpcap pmd驅動將從此口讀寫報文。如 iface=eth0
由上可見,libpcap pmd不僅支持將pcap文件模擬為Rx/Tx的功能,也支持Linux驅動的普通網卡。在使用中我們可以隨意組合,比如Rx設為eth0,而Tx設為tx.pcap,或者兩者都是eth0或pcap文件。
2.2.2 命令舉例
Testpmd:
./testpmd -c 3 -n 4 --vdev='eth_pcap0,rx_pcap=/home/zzq/tcp.pcap,tx_pcap=/home/zzq/tx0.pcap' --vdev='eth_pcap1,rx_pcap=/home/zzq/tcp.pcap,tx_pcap=/home/zzq/tx1.pcap' -- --port-topology=chained --no-flush-rx -i --nb-ports=2
據之前的官方文檔中說,testpmd在開始報文轉發前會從每個Rx口收512個報文並丟棄,而使用libpcap pmd時,可以通過—no-flush-rx選項來禁用這個特性。另外,據我試用,--nb-ports=2將port數設為2,否則多個port之間會有影響,不利於測試。
運行后,eth_pcap1的Tx對應文件將保存eth_pcap0的Rx對應文件中的報文,eth_pcap0的Tx對應文件將保存eth_pcap1的Rx對應文件中的報文。Rx對應的文件都只會讀取一輪。
L2fwd:
./l2fwd -c 3 -n 4 --vdev='eth_pcap0,rx_pcap=/home/zzq/tcp.pcap,tx_pcap=/home/zzq/tx0.pcap' --vdev='eth_pcap1,rx_pcap=/home/zzq/tcp.pcap,tx_pcap=/home/zzq/tx1.pcap' -- -p 3
再強調一下:--vdev的值字符串,即單引號括起來的內容中,不能有空格,否則會出錯。
