当前位置: 首页 > news >正文

【DPDK学习路径】八、轮询

        前面我们已经了解了如何使用DPDK创建线程并绑定核心,以及如何申请内存池并创建 RX/TX 队列。

        接下来我们将了解DPDK的核心内容之一:以轮询的方式从网卡中收取报文。

        下面直接给出一个实例,此实例使用核心1及核心2创建了两个线程用于报文处理,其中在核心1上运行的线程接收网卡0的消息,而在核心2上运行的线程接收网卡1的消息。在这里,从网卡上获取报文的方式为轮询,具体的接口为 rte_eth_rx_burst,而所谓的报文处理,就是简单地打印报文消息。

#include <arpa/inet.h>#include <rte_eal.h>
#include <rte_mbuf.h>
#include <rte_ethdev.h>#include<rte_errno.h>#define NB_SOCKETS 10
#define MEMPOOL_CACHE_SIZE 250static unsigned nb_mbuf = 512;
static int numa_on = 0;
static struct rte_mempool * pktmbuf_pool[NB_SOCKETS];static int
init_mem(unsigned nb_mbuf){unsigned lcore_id;int socketid;char mbuf_pool_name[64];for(lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++){if (rte_lcore_is_enabled(lcore_id) == 0){continue;}if(numa_on){socketid = rte_lcore_to_socket_id(lcore_id);}else{socketid = 0;}if(socketid >= NB_SOCKETS){rte_exit(EXIT_FAILURE, "Socket %d of lcore %u is out of range %d\n",socketid, lcore_id, NB_SOCKETS);}if(pktmbuf_pool[socketid] == NULL){snprintf(mbuf_pool_name, sizeof(mbuf_pool_name), "mbuf_pool_%d", socketid);pktmbuf_pool[socketid] = rte_pktmbuf_pool_create(mbuf_pool_name, nb_mbuf,MEMPOOL_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, socketid);if(pktmbuf_pool[socketid] == NULL){rte_exit(EXIT_FAILURE, "Cannot init mbuf pool on socket %d\n", socketid);}else{printf("Allocated mbuf pool on socket %d\n", socketid);}}}return 0;
}#define MAX_RX_QUEUE_PER_PORT 1
#define MAX_TX_QUEUE_PER_PORT 1
#define RX_RING_SIZE 128
#define TX_RING_SIZE 512
#define BURST_SIZE 128static const struct rte_eth_conf dev_conf_default = {.rxmode = {.max_rx_pkt_len = ETHER_MAX_LEN}
};static void
init_port(void)
{int nb_port = 0;int portid = 0;int ret = 0;nb_port = rte_eth_dev_count_avail();if(!nb_port){rte_exit(EXIT_FAILURE, "No support eth found\n");}printf("nb_port = %d\n", nb_port);for(portid=0;portid < nb_port;portid++){ret = rte_eth_dev_configure(portid, MAX_RX_QUEUE_PER_PORT, MAX_TX_QUEUE_PER_PORT, &dev_conf_default);if (ret < 0) {rte_exit(EXIT_FAILURE, "Cannot configure device: err=%d, port=%u\n", ret, portid);}ret = rte_eth_rx_queue_setup(portid, 0, RX_RING_SIZE, rte_eth_dev_socket_id(portid), NULL, pktmbuf_pool[0]);if (ret < 0) {rte_exit(EXIT_FAILURE, "rte_eth_rx_queue_setup:err=%d, port=%u\n", ret, portid);}ret = rte_eth_tx_queue_setup(portid, 0, TX_RING_SIZE, rte_eth_dev_socket_id(portid), NULL);if (ret < 0) {rte_exit(EXIT_FAILURE, "rte_eth_tx_queue_setup:err=%d, port=%u\n", ret, portid);}ret = rte_eth_dev_start(portid);if (ret < 0) {rte_exit(EXIT_FAILURE, "rte_eth_dev_start:err=%d, port=%u\n", ret, portid);}rte_eth_promiscuous_enable(portid);}
}static void
pkt_process(struct rte_mbuf *mbuf){struct ether_hdr *eth = rte_pktmbuf_mtod(mbuf, struct ether_hdr *);if(eth->ether_type == rte_cpu_to_be_16(ETHER_TYPE_IPv4)){struct ipv4_hdr *iphdr = rte_pktmbuf_mtod_offset(mbuf, struct ipv4_hdr *,sizeof(struct ether_hdr));//udpif(iphdr->next_proto_id == IPPROTO_UDP){struct udp_hdr *udphdr = (struct udp_hdr *)(iphdr + 1);uint16_t length = ntohs(udphdr->dgram_len);*(char*)(udphdr + length) = '\0';//这个操作有必要吗?struct in_addr addr;addr.s_addr = iphdr->src_addr;printf("src:%s:%d,",inet_ntoa(addr),ntohs(udphdr->src_port));addr.s_addr = iphdr->dst_addr;printf("dst:%s:%d, %s\n",inet_ntoa(addr),ntohs(udphdr->dst_port),(char*)(udphdr + 1));}}rte_pktmbuf_free(mbuf);
}static int
main_loop(__attribute__((unused)) void *dummy)
{struct rte_mbuf *mbufs[BURST_SIZE];int num_recvd = 0;unsigned target_lcore_id_1 = 1;unsigned target_lcore_id_2 = 2;int portid = 0;unsigned lcore_id = rte_lcore_id();int i;if(lcore_id != target_lcore_id_1 && lcore_id != target_lcore_id_2){return 0;}//核1接收port0的消息//核2接收port1的消息if(lcore_id == target_lcore_id_1){portid = 0;}else if(lcore_id == target_lcore_id_2){portid = 1;}else{return 0;}while(1){num_recvd = rte_eth_rx_burst(portid, 0, mbufs, BURST_SIZE);if(num_recvd > BURST_SIZE){rte_exit(EXIT_FAILURE, "rte_eth_rx_burst failed\n");}for(i = 0; i < num_recvd; i++){pkt_process(mbufs[i]);}}return 0;
}int main(int argc, char *argv[]) {unsigned lcore_id;// init ealif(rte_eal_init(argc, argv) < 0){rte_exit(EXIT_FAILURE, "Error with eal init\n");}// alloc memoryinit_mem(nb_mbuf);// create tx queue and rx queueinit_port();// main_looprte_eal_mp_remote_launch(main_loop, NULL, CALL_MASTER);RTE_LCORE_FOREACH_SLAVE(lcore_id) {if (rte_eal_wait_lcore(lcore_id) < 0){return -1;}}// freefor(int i = 0; i < NB_SOCKETS; i++){rte_mempool_free(pktmbuf_pool[i]);}return 0;
}

相关文章:

【DPDK学习路径】八、轮询

前面我们已经了解了如何使用DPDK创建线程并绑定核心&#xff0c;以及如何申请内存池并创建 RX/TX 队列。 接下来我们将了解DPDK的核心内容之一&#xff1a;以轮询的方式从网卡中收取报文。 下面直接给出一个实例&#xff0c;此实例使用核心1及核心2创建了两个线程用于报文处理&…...

Mac环境下,简单反编译APK

一、下载jadx包 https://github.com/skylot/jadx/releases/tag/v1.4.7 下载里面的这个&#xff1a;下载后&#xff0c;找个干净的目录解压&#xff0c;我是放在Downloads下面 二、安装及启动 下载和解压 jadx&#xff1a; 下载 jadx-1.4.7.zip 压缩包。将其解压到你希望的目…...

027、工具_redis-benchmark

redis-benchmark可以为Redis做基准性能测试 1.-c -c(clients)选项代表客户端的并发数量(默认是50)。 2.-n -n(num)选项代表客户端请求总量(默认是100000)。 例如redis-benchmark-c100-n20000代表100各个客户端同时请求Redis,一 共执行20000次。 redis-benchmark会…...

京准电钟 | 对比GPS,北斗卫星授时的场景有哪些?

京准电钟 | 对比GPS&#xff0c;北斗卫星授时的场景有哪些&#xff1f; 京准电钟 | 对比GPS&#xff0c;北斗卫星授时的场景有哪些&#xff1f; 对比国外的GPS&#xff0c;我国北斗卫星授时由于其高精度和稳定性&#xff0c;在各个领域都有广泛的应用场景。 以下是一些单北斗卫…...

电脑桌面提醒做事的app 好用的桌面提醒app

在快节奏的现代生活中&#xff0c;我们每天都要通过电脑处理大量的工作事项。然而&#xff0c;繁忙的工作节奏有时会导致我们遗忘某些重要任务&#xff0c;从而带来不必要的损失。为了避免这种情况&#xff0c;选择一款好用的桌面提醒app显得尤为重要。 想象一下&#xff0c;你…...

ICC2:如何获取get_xx -filter后可用的属性有哪些?

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 report_attribute -app -class cell $instname 这种直接告诉你指定cell有哪些属性&#xff0c;以及对应的值是什么 或者直接用list_attribute也可以 list_attribute -help可以…...

SSL协议在实际生活中有哪些应用实例?

SSL协议的实际应用案例 SSL&#xff08;Secure Sockets Layer&#xff09;协议是一种网络通信协议&#xff0c;用于在客户端和服务器之间建立加密链接&#xff0c;以确保数据在传输过程中的安全性。尽管SSL协议已被TLS&#xff08;Transport Layer Security&#xff09;协议所取…...

Python连接到Jira实例、登录、查询、修改和创建bug

Python连接到Jira实例、登录、查询、修改和创建bug 首先&#xff0c;你需要安装jira Python库 pip install jira1. 连接到Jira并登录 from jira import JIRA from jira.exceptions import JIRAError# Jira服务器地址&#xff0c;用户名和密码 jira_server https://your-jir…...

等保测评考试初级题大题部分

主机安全问答&#xff1a; 在主机安全测评前期调研活动中&#xff0c;收集信息的内容&#xff08;至少写出六项&#xff09;&#xff1f; 在选择主机测评对象时应该注意哪些要点&#xff1f; 主机安全回答&#xff1a; 至少需要收集服务器主机的设备名称、型号、所属网络区…...

【前端面试】动态表单篇

问题&#xff1a;什么是动态表单&#xff1f; 动态表单是一种可以根据用户的输入或者选择&#xff0c;动态改变其结构和元素的表单。比如&#xff0c;当用户在一个下拉列表中选择不同的选项时&#xff0c;表单中可能会出现不同的输入框、复选框、单选按钮等。 问题&#xff1a…...

Mybatis save、saveOrUpdate、update的区别

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 1. save方法 Mybatis的save方法用于插入一条新的记录。当数据库中不存在相同的记录时&#xff0c;会执行插入操作&#xff1b;如果已经存在相同的记录&#xff0c;则会抛出异常。 int result sqlSession.insert(&…...

立创·天空星开发板-GD32F407VE-Timer

本文以 立创天空星开发板-GD32F407VET6-青春版 作为学习的板子&#xff0c;记录学习笔记。 立创天空星开发板-GD32F407VE-Timer 定时器基本定时器示例 定时器 定时器是嵌入式系统中常用的一种外设&#xff0c;它可以产生一定的时间间隔、延时、定时等功能&#xff0c;广泛应用于…...

赚流量卷,晚点删

自己封装ajax方法 import ajax from /libs/ajax; import qs from "qs"; import Config from /config; import { getProtocolAndHostname } from /libs/util;const AjaxPlugin {}; // const baseUrl process.env.NODE_ENV development ? Config.baseUrl.dev : Co…...

36、matlab矩阵特征值、特征向量和奇异值

1、名词说明 1)特征值 特征值&#xff08;Eigenvalues&#xff09;是矩阵的一个重要概念&#xff0c;在线性代数中起着非常重要的作用。给定一个nn的方阵A&#xff0c;如果存在一个非零向量v&#xff0c;使得矩阵A作用于向量v后&#xff0c;得到的结果与向量v成比例&#xff…...

【网络编程】基于TCP的服务器端/客户端

TCP是Transmission Control Protocol(传输控制协议)简写。因为TCP套接字是面向连接的&#xff0c;因此又称为基于流的套接字。 把协议分为多个层次&#xff0c;设计更容易&#xff0c;通过标准化操作设计开放式系统 网络层介绍 链路层 链路层是物理连接领域标准化的结果&…...

企业中的绩效管理

背景 企业中为何需要绩效管理&#xff0c;企业绩效管理为何比较难&#xff0c;这在企业管理中是非常难&#xff0c;同样也是非常有价值的命题&#xff0c;那么首先应该对这个命题有清晰的认知&#xff0c;特别是要想明白为何企业需要绩效管理&#xff0c;应该先明白企业。 企…...

C++面试八股文:static和const的关键字有哪些用法?

100编程书屋_孔夫子旧书网 某日二师兄参加XXX科技公司的C工程师开发岗位第7面&#xff1a; 面试官&#xff1a;C中&#xff0c;static和const的关键字有哪些用法? 二师兄&#xff1a;satic关键字主要用在以下三个方面&#xff1a;1.用在全局作用域&#xff0c;修饰的变量或者…...

Qt飞机大战小游戏

Gitee地址 &#xff1a;plane-game: 基于Qt的飞机大战小游戏 GitHub地址&#xff1a; https://github.com/a-mo-xi-wei/plane-game...

Flarum 安装和使用教程

随着开源社区的日益繁荣&#xff0c;人们对社区品质的要求也越来越高。传统的 BBS 论坛模式已经难以满足现代用户对美观、便捷、互动性的需求。搭建一个现代化的高品质社区&#xff0c;成为许多网站管理者的迫切需求和共同挑战。 今天就给大家安利一款现代化的、优雅的开源论坛…...

Java老人护理上门服务类型系统小程序APP源码

&#x1f338; 老人上门护理服务系统&#xff1a;温暖与专业并存 &#x1f338; 一、&#x1f3e0; 走进老人上门护理服务系统 随着社会的快速发展&#xff0c;我们越来越关注老年人的生活质量。老人上门护理服务系统应运而生&#xff0c;它结合了现代科技与人性化服务&#…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

EEG-fNIRS联合成像在跨频率耦合研究中的创新应用

摘要 神经影像技术对医学科学产生了深远的影响&#xff0c;推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下&#xff0c;基于神经血管耦合现象的多模态神经影像方法&#xff0c;通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里&#xff0c;本研…...