原創翻譯,轉載請注明出處。
DPDK的librte_pdump庫,提供了在DPDK框架下抓包的功能。這個庫通過完全復制Rx和Tx的mbuf到一個新的內存池,因此它降低應用程序的性能,所以只推薦在調試的時候使用。
pdump庫提供了如下的API來初始化這個抓包框架,使能或者停止抓包,以及清理退出抓包框架。
- rte_pdump_init(): 初始化抓包框架.
- rte_pdump_enable(): 在一個端口隊列開啟抓包.注意: 過濾選項將在以后實現,目前只是個占位的.
- rte_pdump_enable_by_deviceid(): 在一個設備ID(vdev名稱或者pci地址)和隊列抓包. 注意: 過濾選項將在以后實現,目前只是個占位的.
- rte_pdump_disable(): 在一個端口隊列停止抓包.
- rte_pdump_disable_by_deviceid(): 停止在一個設備ID(vdev名稱或者pci地址)和隊列抓包
- rte_pdump_uninit(): 清理退出抓包框架.
- rte_pdump_set_socket_dir(): 設置服務端或客戶端socket路徑.注意: 這個接口是非線程安全的.
1.操作流程
librte_pdump庫是客戶端/服務端的工作模式。服務端負責開啟或者停止抓包,客戶端負責請求開啟或停止抓包。
抓包框架在初始化的時候,創建了線程和服務端的socket,並把socket放在線程中處理。應用程序在調用這個框架的初始化的時候,通過傳入默認的路徑參數,
如root用戶下,/var/run/.dpdk,非root用戶 ~/.dpdk,就會創建客戶端socket,並發送請求到服務端。服務端會監聽客戶端的開啟或停止抓包請求。
2.實現細節
rte_pdump_init()初始化抓包框架並創建線程和服務端socket。socket在線程里監聽客戶端的開啟或停止抓包的請求。
rte_pdump_enable() 和 rte_pdump_enable_by_deviceid() 開啟抓包。每調用一次這些API,pdump庫就會創建一個獨立的客戶端socket,並發送"pdump enable"的請求到服務端。
服務端監聽到這個請求就會通過給定的端口或者設備ID以及隊列的組合在Ethernet RX 和TX注冊回調函數,之后服務端就會鏡像數據包到一個新的內存池,並將讓它們在客戶端傳入的rte_ring隊列上入隊。
服務端會發送請求回應給客戶端關於請求處理的狀態。在收到服務端的回應后,客戶端的socket就關閉了。
rte_pdump_disable() 和 rte_pdump_disable_by_deviceid()停止抓包。每調用一次這些API,pdump庫就會創建一個獨立的客戶端socket,並發送"pdump disable"的請求到服務端。
服務端監聽到這個請求就會通過給定的端口或者設備ID以及隊列的組合在Ethernet RX 和TX刪除回調函數,之后服務端就會鏡像數據包到一個新的內存池,並將讓它們在客戶端傳入的rte_ring隊列上入隊。
服務端會發送請求回應給客戶端關於請求處理的狀態。在收到服務端的回應后,客戶端的socket就關閉了。
rte_pdump_uninit(),結束抓包框架,並關閉線程和服務端的socket。
rte_pdump_set_socket_dir() 通過 type 這個參數來設置指定的路徑給服務端或者客戶端。如果給定的路徑是NULL,那么會使用默認的路徑,如:/var/run/.dpdk (root用戶)或者 ~/.dpdk (非root用戶)。
客戶端需要調用這個API去設置他們服務端socket的不同於默認路徑的路徑
3.使用舉例:
DPDK提供 app/pdump 工具,可以參考它來開發自己的抓包工具。