一.環境與編譯
pdump庫是在16.07版本引入的,提供了一個抓包調試功能。在$(RTE_SDK)/app
目錄下就有一個dpdk-pdump
的工具。配置這個這個工具可以用於抓取指定接口、隊列的數據包。
1.1 庫及依賴
Pdump依賴於libpcap庫及libpcap-dev
等相關庫,要預先安裝。
1.2 編譯選項
Pdump依賴於基於libpcap的PMD驅動,需要開啟兩個設置,來生成運行pdump工具
CONFIG_RTE_LIBRTE_PMD_PCAP=y ($(RTE_SDK)/config/common_base文件)
CONFIG_RTE_LIBRTE_PDUMP=y ($(RTE_SDK)/config/common_base文件)
1.3 編譯dpdk-pdump
這里以17.02版本為例說明。按照官方文檔,在$(RTE_SDK)
目錄下,
- 設置編譯的目錄
export RTE_SDK=XXX
,XXX就是dpdk的源碼包的目錄 - 設置編譯后的安裝目錄(主要就是拷貝生成的庫,頭文件等)
export DESTDIR=XXX
,這個安裝目錄可以自行設置。推薦自己建一個目錄,好找就行,生成的pdump工具就在這個目錄里。 - 執行編譯安裝
make install T=x86_64-native-linuxapp-gcc
;這里的T是指編譯的TARGET,根據機器和編譯器選擇組合,具體可參考官方文檔——《Getting started Guide For Linux》
二. 測試與使用
在編譯安裝后,就會在安裝目錄的bin目錄中發現dpdk-pdump
可執行文件。可以拷貝出來后續運行。
2.1 運行原理
dpdk-pdump
使用時,作為secondary進程依附於primary進程。primary進程中啟動server端,初始化pdump抓包框架任務;dpdk-pdump
進程是作為client端向primary進程發送開始/停止抓包請求,然后primary進程拷貝一份數據包到ring中,secondary進程從ring中讀取出來,並保存為pcap文件。因此,可以看出在primary進程中需要初始化pdump server。
2.2 簡單示例
- 在示例中,使用l3fd來當primary進程,但是需要做些小修改,在
rte_eal_init()
后,初始化pdump框架,添加如下代碼:
#ifdef RTE_LIBRTE_PDUMP
/* initialize packet capture framework */
rte_pdump_init(NULL);
#endif
然后編譯l3fd生成l3fd可執行文件,就以官方例子參數運行。
- 運行
dpdk-pdump
,作為secondary進程,依附於前面啟動的l3fd。執行如下參數命令:./dpdk-pdump -- --pdump 'port=0,queue=*,rx-dev=/tmp/rx.pcap'
這里需要注意port的取值,一定是DPDK綁定的網卡,如綁定了3張網卡,那port取值范圍就是0-2,對應於每個網卡。自然,也可以使用PCI號來傳參,指明抓哪個網卡。Dev=/tmp/rx.pcap
就指明了最后抓的包存放的路徑。
更詳細的dpdp-pdump
運行參數可以根據情況設置,格式如下:
usage: %s [EAL options] -- --pdump "
"'(port=<port id> | device_id=<pci id or vdev name>),"
"(queue=<queue_id>),"
"(rx-dev=<iface or pcap file> |"
" tx-dev=<iface or pcap file>,"
"[ring-size=<ring size>default:16384],"
"[mbuf-size=<mbuf data size>default:2176],"
"[total-num-mbufs=<number of mbufs>default:65535]'\n"
"[--server-socket-path=<server socket dir>"
"default:/var/run/.dpdk/ (or) ~/.dpdk/]\n"
"[--client-socket-path=<client socket dir>"
"default:/var/run/.dpdk/ (or) ~/.dpdk/]\n"
注意:參數中注意單引號那個字符,還有指定server-socket-path的路徑時的”\n”字符。