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