19.Librte_pdump庫
librte_pdump庫為DPDK中的數據包捕獲提供了一個框架。該庫將Rx和Tx mbufs的完整復制到新的mempool,因此會降低應用程序的性能,故建議只使用該庫進行調試。
該庫提供以下API來初始化數據包捕獲框架,啟用或禁用數據包捕獲,或者對其進行反初始化:
- rte_pdump_init():初始化數據包捕獲框架。
- rte_pdump_enable():在給定的端口和隊列上進行數據包捕獲。注意:API中的過濾器選項是用于未來增強功能的占位符。
- rte_pdump_enable_by_deviceid():啟用在給定設備ID(vdev名稱或pci地址)和隊列上的數據包捕獲。 注意:API中的過濾器選項是用于未來增強功能的占位符。
- rte_pdump_disable():禁用給定端口和隊列上的數據包捕獲。
- rte_pdump_disable_by_deviceid():禁用給定設備ID(vdev名稱或pci地址)和隊列上的數據包捕獲。
- rte_pdump_uninit():反初始化數據包捕獲框架。
- rte_pdump_set_socket_dir():設置服務器和客戶端套接字路徑。注意:此API不是線程安全的。
19.1.操作
librte_pdump庫適用于客戶端/服務器型號。服務器負責啟用或禁用數據包捕獲,客戶端負責請求啟用或禁用數據包捕獲。
數據包捕獲框架作為程序初始化的一部分,在pthread中創建pthread和服務器套接字。調用框架初始化的應用程序將創建服務器套接字,可能是在應用程序傳入的路徑,也可能是默認路徑(root用戶的/var/run/.dpdk,非root用戶~/.dpdk)下創建。
請求啟用或禁用數據包捕獲的應用程序將在應用程序傳入的路徑下或默認路徑(root用戶的/var/run/.dpdk,非root用戶~/.dpdk)下創建客戶機套接字,用戶將請求發送到服務器。服務器套接字將監聽用于啟用或禁用數據包捕獲的客戶端請求。
19.2.實現細節
庫API rte_pdump_init()通過創建pthread和服務器套接字來初始化數據包捕獲框架。pthread上下文中的服務器套接字將監聽客戶端請求以啟用或禁用數據包捕獲。
庫API rte_pdump_enable()和rte_pdump_enable_by_deviceid()啟用數據包捕獲。每次調用這些API時,庫創建一個單獨的客戶端套接字,生成“pdump enable”請求,并將請求發送到服務器。在套接字上監聽的服務器將通過對給定的端口或設備ID和隊列組合的以太網Rx/TX注冊回調函數來接收請求并啟用數據包捕獲。然后,服務器將鏡像數據包到新的mempool并將它們入隊到客戶端傳遞給這些API的rte_ring。服務器還將響應發送回客戶端,以了解處理過的請求的狀態。從服務器收到響應后,客戶端套接字關閉。
庫API rte_pdump_disable()和rte_pdump_disable_by_deviceid()禁用數據包捕獲。每次調用這些API時,庫會創建一個單獨的客戶端套接字,生成“pdump disable”請求,并將請求發送到服務器。正在監聽套接字的服務器將通過對給定端口或設備ID和隊列組合的以太網RX和TX刪除回調函數來執行請求并禁用數據包捕獲。服務器還將響應發送回客戶端,以了解處理過的請求的狀態。從服務器收到響應后,客戶端套接字關閉。
庫API rte_pdump_uninit()通過關閉pthread和服務器套接字來初始化數據包捕獲框架。
庫API rte_pdump_set_socket_dir()根據API的類型參數將給定路徑設置為服務器套接字路徑或客戶端套接字路徑。如果給定路徑為NULL,則將選擇默認路徑(即root用戶的/var/run/.dpdk或非root用戶的~/.dpdk)。如果服務器套接字路徑與默認路徑不同,客戶端還需要調用此API來設置其服務器套接字路徑。
19.3.用例:抓包
DPDK應用程序/pdump工具是基于此庫開發的,用于捕獲DPDK中的數據包。用戶可以用它來開發自己的數據包捕獲工具。