suricata中DPDK收发包源码分析2

《suricata中DPDK收发包源码分析1》中分析了整体的DPDK收发包框架代码,今天我们继续来深入了解一下一些细节方面的问题。

目录

Q1:收发包线程模式在代码中是怎样确定的?

Q2: DPDK库的初始化rte_eal_init在哪里调用的?

Q3: 对网卡进行DPDK相关接口的配置操作的代码在哪里?

Q4: DPDK mbfu和suricata Packet是怎么转换的?

Q5: 网卡的RSS对哈希是在哪里配置的?


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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值