《suricata中DPDK收发包源码分析1》中分析了整体的DPDK收发包框架代码,今天我们继续来深入了解一下一些细节方面的问题。
目录
Q2: DPDK库的初始化rte_eal_init在哪里调用的?
Q4: DPDK mbfu和suricata Packet是怎么转换的?
Q1:收发包线程模式在代码中是怎样确定的?
前面的文章《suricata中DPDK收发包线程模型和配置说明》中说的收包线程模型如下,那么这个收包模型在代码中是怎么确定的呢?
前面讲的DPDK的网口配置文件时,每个网口会指定收包线程数,我们指定的是2,即每个网口有两个收包线程,在RunModeSetLiveCaptureWorkers函数中会获取网卡总数,遍历所有网卡,然后遍历所有网卡配置的线程个数,所以总共启动的收包线程数就是网卡数*每个网卡配置的收包线程数,那怎么确定第一个收包线程只收取第一个网卡的0号队列的报文,第二个收包线程只收取第一个网卡的1号队列的报文,以及第三个线程,第四个线程以此类推呢?
前面讲到,DPDK调用rte_eth_rx_burst进行循环收包的函数是ReceiveDPDKLoop,rte_eth_rx_burst函数的前两个参数是port_id和queue_id,所以要控制每个线程收哪个网卡哪个队列的报文控制这两个参数就行了,这里的port_id和queue_id来自于DPDK的线程变量DPDKThreadVars,每个收包线程都有一个这样的变量:
typedef struct DPDKThreadVars_ {
/* counters */
uint64_t pkts;
ThreadVars *tv;
TmSlot *slot;
LiveDevice *livedev;
ChecksumValidationMode checksum_mode;
/* references to packet and drop counters */
uint16_t capture_dpdk_packets;
uint16_t capture_dpdk_rx_errs;
uint16_t capture_dpdk_imissed;
uint16_t capture_dpdk_rx_no_mbufs;
uint16_t capture_dpdk_ierrors;
uint16_t capture_dpdk_tx_errs;
unsigned int flags;
int threads;
/* for IPS */
DpdkCopyModeEnum copy_mode;
uint16_t out_port_id; //发送网口id
/* Entry in the peers_list */
uint64_t bytes;
uint64_t