DPDK如何抓包

原創翻譯,轉載請註明出處。安全

 

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放在線程中處理。應用程序在調用這個框架的初始化的時候,經過傳入默認的路徑參數,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 工具,能夠參考它來開發本身的抓包工具。










線程

相關文章
相關標籤/搜索