资源简介
使用dpdk的模式抓取网卡上的数据包,使用多线程安全,无锁队列
代码片段和文件信息
#include “jz_dpdk_api.h“
#include “ini/iniparser.h“
/**************************宏********************************/
#define NUM_MBUFS_ 8191
#define MBUF_CACHE_SIZE_ 512
#define RX_RING_SIZE_ 128
#define TX_RING_SIZE_ 512
/**************************全局变量**************************/
int rx_number = 0;
uint64_t total_pkts[512] = {0};
uint64_t last_total_pkts[512] = {0};
uint64_t total_pkts_bytes[512] = {0};
uint64_t last_total_pkts_bytes[512] = {0};
uint64_t last_time = 0;
static const struct rte_eth_conf port_conf_default =
{
.rxmode = {
.max_rx_pkt_len = ETHER_MAX_LEN
.mq_mode = ETH_MQ_RX_RSS
}
.rx_adv_conf = {
.rss_conf = {
.rss_key = NULL
.rss_hf = ETH_RSS_IP
}
}
};
/**************************函数声明*************************/
static int config_init(const char *filename);
static int port_init(int portstruct rte_mempool *mbuf_pool);
static void recv_pkt_init(void);
/**************************接口实现*************************/
int jz_dpdk_init(int argcchar **argv)
{
const char *filename = “conf.ini“;
// 0.配置文件读取
rx_number = config_init(filename);
if( rx_number < 1)
{
printf(“错误:读取配置文件[conf.ini] 失败!\n“);
return -1;
}
// 1. DPDK EAL初始化
if( rte_eal_init(argcargv) < 0 )
{
printf(“错误:EAL初始化失败!\n“);
return -1;
}
else
{
printf(“EAL初始化成功。\n“);
}
// 2. 检测至少有一个端口(即网口)
if( rte_eth_dev_count() != 1)
{
printf(“错误:只能有一个端口(网口)。\n“);
return -1;
}
// 3. 内存池的创建
struct rte_mempool *mbuf_pool = rte_pktmbuf_pool_create(“JZ_MBUF_POOL“
NUM_MBUFS_ * rte_eth_dev_count() MBUF_CACHE_SIZE_ 0
RTE_MBUF_DEFAULT_BUF_SIZE rte_socket_id());
if( NULL == mbuf_pool )
{
printf(“错误:创建内存池失败。\n“);
return -1;
}
else
{
printf(“创建内存池成功。\n“);
}
// 4. 对端口进行初始化
int port = 0;
for (; port < rte_eth_dev_count(); port++)
{
if( port_init(port mbuf_pool) < 0)
{
printf(“错误:端口初始化失败。\n“);
return -1;
}
else
{
printf(“端口初始化成功。\n“);
}
}
recv_pkt_init();
printf(“\n恭喜:jz_dpdk 初始化成功!\n“);
return 0;
}
int jz_dpdk_recv_pkts(uint8_t port_iduint16_t queue_idstruct rte_mbuf *pkts[]const uint16_t nb_pkts)
{
uint16_t nb_rx = rte_eth_rx_burst(port_id queue_id pkts nb_pkts);
if( nb_rx > 0)
{
total_pkts[queue_id] += nb_rx;
uint16_t i;
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 7571 2018-06-20 16:45 jz_dpdk17.5\jz_dpdk_api.c
文件 2183 2018-06-20 16:45 jz_dpdk17.5\jz_dpdk_api.h
文件 2096 2018-06-20 15:04 jz_dpdk17.5\makefile
文件 622 2018-06-20 15:18 jz_dpdk17.5\Makefile.txt
目录 0 2018-06-20 16:55 jz_dpdk17.5
----------- --------- ---------- ----- ----
12472 5
- 上一篇:二维数据集788个点
- 下一篇:汉字滚动Verilog设计
评论
共有 条评论