• 大小: 5KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-22
  • 语言: 其他
  • 标签: dpdk  

资源简介

使用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


评论

共有 条评论

相关资源