原创翻译,转载请注明出处。
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 工具,可以参考它来开发自己的抓包工具。