原創翻譯,轉載請註明出處。安全
DPDK的librte_pdump庫,提供了在DPDK框架下抓包的功能。這個庫經過徹底複製Rx和Tx的mbuf到一個新的內存池,所以它下降應用程序的性能,因此只推薦在調試的時候使用。
pdump庫提供了以下的API來初始化這個抓包框架,使能或者中止抓包,以及清理退出抓包框架。 併發
1.操做流程
librte_pdump庫是客戶端/服務端的工做模式。服務端負責開啓或者中止抓包,客戶端負責請求開啓或中止抓包。
抓包框架在初始化的時候,建立了線程和服務端的socket,並把socket放在線程中處理。應用程序在調用這個框架的初始化的時候,經過傳入默認的路徑參數,app
如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
服務端會發送請求迴應給客戶端關於請求處理的狀態。在收到服務端的迴應後,客戶端的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 工具,能夠參考它來開發本身的抓包工具。
線程