DPDK基础组件一(mbuf、ring、pktmbuf_pool)

一、rte_mbuf

此部分转自:https://zhuanlan.zhihu.com/p/616314276

1.mbuf结构

mbuf是报文中的描素的结构体,是整个转发过程中最核心的数据结构之一。主要针对于mbuf的常用API与基本原理做一个简单的介绍。

  1. mbuf:报文内存存储结构,存储在mempool中
  2. mempool:使用环形缓冲区保存空闲对象
struct rte_mbuf {void *buf_addr; /**< Virtual address of segment buffer. */uint16_t data_off;uint32_t pkt_len; /**< Total pkt len: sum of all segments. */uint16_t data_len; /**< Amount of data in segment buffer. */uint16_t buf_len......
}

 rte_mbuf 结构通常承载网络数据包缓冲区,但它实际上可以是任何数据(控制数据、事件……)。 rte_mbuf 头结构保持尽可能小,目前只使用两个缓存行,最常用的字段位于两个缓存行中的第一个。原则上将基础性、频繁访问的数据放在第一个Cache Line字节,将功能性扩展的数据放在第二个Cache Line字节。

Mbuf报头包含包处理所需的所有数据,对于单个Mbuf存发不下的巨型帧(JumboFrame),Mbuf还有指向下一个Mbuf结构的指针来形成帧链表结构。所有应用都应该使用Mbuf结构来传输网络帧。

对于网络帧的封装和处理有两种方式:
1.将元数据嵌入单个内存缓冲区中,该结构后跟固定大小的数据包数据区域。
2.为元数据结构和数据包数据使用单独的内存缓冲区。

前者的好处是高效,它只需要一个指令来分配/释放数据包的整个内存,缺点是因为缓存长度固定而网络帧的大小不一,大部分帧只能填0(padding)的方式填满整个缓存,较为浪费内存空间。后者的优先相对灵活自由,数据帧的大小可以任意,同时对元数据和网络帧的缓存可以分开申请及释放,当然了缺点就是效率低。无法保证数据存储存在一个Cache Line中,可能造成Hit Miss。为了高效,DPDK选择了第一种方法。网络帧的元数据的一部分内容由DPDK网卡驱动写入。这些内容包含VLAN标签、RSS哈希值、网络帧入口端口号以及巨型帧所占的mbuf个数等等。对于巨型帧,网络帧元数据仅出现在第一个帧的Mbuf结构中,其他的帧该信息为空。

headroom: 保留区域headroom:一般用来存放用户自己针对于mbuf的一些描述信息,
一般保留给用户使用,可以通过修改mbuf头文件,来实现headroom的大小;data_off 的默认值就是mbuf的headroom的大小;默认就是128。
如果要定义超过这个范围的私有字段,请自行修改 RTE_PKTMBUF_HEADROOM
数据字段:data。 
data区域一般指的是地址区间在 buf_addr + data_off 到 buf_add + data_off + data_len 即,
data_len就是这段数据的长短,这个data_len一般都是通过mbuf的几个基本操作,
或者通过赋值来实现的。
tailroom: 一般指的是,data_len还未包含的东西。默认其实data_len是0。
所以说默认来说tailroom应该是占了很大的空间的;

 报文数据永远是存放在data中的

如上图,包含了一个Mbuf的基本组成,其中Mbuf头部大小为两个Cache Line,在Mbuf头部和实际的数据包之间还有一段控制头信息(headroom),用来存储和系统中其他实体交互的信息,比如控制信息、帧内容、事件等,headroom的长度由RTE_PKTMBUF_HEADROOM控制。

headroom的起始地址保存在Mbuf的buf_addr 指针中,数据帧的起始指针可以通过调用rte_pktmbuf_mtod获得。

 

数据帧的长度可通过调用rte_pktmbuf_pktlen(Mbuf)或者rte_pktmbuf_datalen(Mbuf)获得,但这只限于单帧Mbuf。巨型帧的单帧长度只由rte_pktmbuf_datalen(Mbuf)返回,而rte_pktmbuf_pktlen(Mbuf)用于访问巨型帧所有帧长度的总和,如图上所示。

除此之外Mbuf提供可操作的API有,具体的使用方法可以参考(mbuf/rte_mbuf.h)的注释内容和用法以及使用手册:

rte_pktmbuf_datalen:获得帧数据长度
rte_pktmbuf_mtod:获得指向数据的指针
rte_pktmbuf_prepend:在帧数据前插入一段内容

m->data_off = (uint16_t)(m->data_off - len);
m->data_len = (uint16_t)(m->data_len + len);
m->pkt_len  = (m->pkt_len + len);


rte_pktmbuf_append:在帧数据后插入一段内容

tail = (char *)m_last->buf_addr + m_last->data_off + m_last->data_len;
m_last->data_len = (uint16_t)(m_last->data_len + len);
m->pkt_len  = (m->pkt_len + len);


rte_pktmbuf_adj:在帧数据前删除一段内容

m->data_len = (uint16_t)(m->data_len - len);
m->data_off = (uint16_t)(m->data_off + len);
m->pkt_len  = (m->pkt_len - len);


rte_pktmbuf_trim:在帧数据后截掉一段内容

m_last->data_len = (uint16_t)(m_last->data_len - len);
m->pkt_len  = (m->pkt_len - 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Latex中论文常用的符号、公式、引用格式

内容符号 波浪号 ~&#xff1a;$ \sim $加减号 &#xff1a;$ \pm$点 &#xff1a;$ \cdot $乘号 ∗&#xff1a;$ \ast $约等于 ≈&#xff1a;$ \approx $≤ : $ \le $≥ : $ \ge $ 数学表示 下箭头 ↓ \downarrow ↓ &#xff1a;$ \downarrow $上箭头 ↑ \uparrow ↑: $…

Web安全:软件开发的安全问题与解决方案

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

第三站:Java红——异常处理的热情与挑战

### 第三站&#xff1a;Java红——异常处理的热情与挑战 在Java编程的征途中&#xff0c;异常处理是无法绕过的“红色地带”&#xff0c;它充满了挑战&#xff0c;也饱含解决问题的热情。通过合理地使用异常处理机制&#xff0c;我们可以编写出更加健壮、容错性强的代码。本节…

jni调用so或dll区别

在Java中通过JNI&#xff08;Java Native Interface&#xff09;调用本地代码时&#xff0c;所使用的动态库文件扩展名&#xff08;如 .dll 对于Windows或 .so 对于Unix-like系统&#xff09;取决于你的操作系统和目标平台。 DLL&#xff08;Dynamic Link Library&#xff09;…

python数据预处理

PYTHON 最流行库&#xff1a;Numpy、Matplotlib 和 Pandas。Numpy 是满足所有数学运算所需要的库&#xff0c;由于代码是基于数学公式运行的&#xff0c;因此就会使用到它。Maplotlib&#xff08;具体而言&#xff0c;Matplotlib.pyplot&#xff09;则是满足绘图所需要的库。Pa…

使用redis的setnx实现分布式锁

在Redis中&#xff0c;SETNX 是 “Set If Not Exists”&#xff08;如果不存在&#xff0c;则设置&#xff09;的缩写。这是一个原子操作&#xff0c;用于设置一个键的值&#xff0c;前提是这个键不存在。如果键已经存在,.则不会执行任何操作。 封装方法trylock&#xff0c;用…

智能超越了科技,更是一个复杂系统

智能不仅仅是科技系统&#xff0c;更是一个复杂系统。智能是一个多学科领域&#xff0c;涉及计算机科学、人工智能、神经科学、心理学、社会学、人文艺术、宗教哲学等多个学科。科技系统只是智能的一部分&#xff0c;虽然它们在处理信息和执行任务方面非常强大&#xff0c;但它…

CCF-CSP认证 2023年3月01 田地丈量

矩形重叠面积公式&#xff1a; p1与p2表示矩形A的左下角和右上角&#xff0c;用p3和p4表示矩形B的左下角和右上角。 res!(p1.x > p4.x) || (p2.x < p3.x) || (p1.y > p4.y) || (p2.y < p3.y) //对矩阵不重叠求反 矩阵重叠面积 double Len Math.min(p2_x, p4_x…

深入解析Solon路由的Url大小写匹配策略与实际应用

在数字化时代的背景下&#xff0c;企业对于采购管理的需求日益增长。为了满足这一需求&#xff0c;我们通过采用Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;构建了一个从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理平台。 Solon路由器对ur…

小米员工自爆:35岁被裁后,投百份简历无人问津,一气之下把薪资由2W调为3W,简历改成英文,结果出乎意料

“35岁”&#xff0c;就像职场里一道无形的门槛&#xff0c;压得人喘不过气。一旦迈过这道坎&#xff0c;焦虑、迷茫、恐慌&#xff0c;接踵而至。 最近&#xff0c;我的朋友老张&#xff0c;就真切地体会到了这种“中年危机”。刚过36岁生日&#xff0c;他就收到了来自小米的裁…

从0到1写一个vue2项目,按需引入element-ui的引入,npm下载路由,配置路由,路由嵌套

从0到1写一个vue2项目&#xff0c;此篇内容有element-ui的按需引入&#xff0c;npm下载路由&#xff0c;配置路由&#xff0c;路由嵌套 项目是b站上找的项目链接在此https://www.bilibili.com/video/BV1QU4y1E7qo/?p8&spm_id_frompageDriver&vd_source2c599bf1d75e3f9…

Hive之聚合类开窗函数 + 滑动求和

为什么要写这样子一个主题文章呢&#xff0c;开窗函数毫无疑问&#xff0c;超级重要&#xff0c;但是很多人可能不会遇到一些稍微小众的业务需求&#xff0c;比如说滑动求和。这里带着业务&#xff0c;一并让大家熟悉一些&#xff0c;高阶函数的应用。 0&#xff0c;开窗函数和…

Docker搭建MySQL主从复制

Docker部署MySQL主从复制 文章目录 Docker部署MySQL主从复制一、构建MySQL镜像二、构建systemctl管理MySQL服务镜像三、运行容器四、登录容器4.1、配置master4.2、配置slave 五、授权从库六、更改UUID七、连接主数据库八、验证 一、构建MySQL镜像 我自己是使用的Dockerfile构建…

【JAVA SE】抽象类和接口

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;JAVA 个人主页&#xff1a;Celias blog~ 目录 引言 一、抽象类 1.1 抽象类的定义 1.2 抽象方法 1.3 抽象…

大厂边缘组VS小厂核心组,要怎么选?

有问必答 最近有粉丝提问&#xff1a;大厂边缘组VS小厂核心组&#xff0c;怎么选&#xff1f; 这确实是个好问题&#xff0c;读者老爷们可以先问下自己&#xff1a;如果有一份月薪2W在大厂边缘组打螺丝的Offer且不加班&#xff0c;另外还有一份月薪2W5&#xff0c;在小厂核心…

华为坤灵管理型交换机S300,S500,S310,S210,S220,S200 web端开局配置

一. 准备线缆 笔记本或没有COM口的电脑,需准备转接线,并安装好随线光盘的驱动,检查设备管理器中COM口是否正常 2.连接电脑与交换机的CONSOLE口 二&#xff0c;准备软件putty。 Download PuTTY: latest release (0.81) 配置步骤如下&#xff1a; 开启HTTP服务。设置https://1…

你知道SPI的原理以及实现?

1、什么是SPI&#xff1f; SPI&#xff08;Service Provider Interface&#xff09;&#xff0c;是JDK内置的一种服务提供发现机制&#xff0c;可以用来启用框架扩展和替换组件&#xff0c;主要是被框架的开发人员使用&#xff0c;比如 java.sql.Driver 接口&#xff0c;其他不…

【conda】解决conda activate无效的问题

conda activate 虚拟环境名字执行上述命令失效&#xff0c;提示如下信息&#xff1a; 经查询&#xff0c;原因是新版的 conda 不再使用 activate 来激活虚拟环境&#xff0c;而是改用&#xff1a; source activate 虚拟环境名退出虚拟环境还是&#xff1a; conda deactivate…

sqlite基本操作

简介 文章目录 简介1.数据库的安装2.数据库命令&#xff1a;API&#xff0c;创建表单代码 csprintf&#xff08;&#xff09;getchar和scanf&#xff08;&#xff09; 1.数据库的安装 sudo dpkg -i *.deb这个报错表明出现依赖问题 用这个命令后再试试sudo apt --fix-broken in…

Apache来源于北美印第安部落?

Apache HTTP服务器&#xff0c;通常简称为Apache&#xff0c;是一个由Apache软件基金会&#xff08;Apache Software Foundation&#xff0c;简称ASF&#xff09;维护的开源网页服务器软件。以下是Apache的前世今生的概述&#xff1a; 起源&#xff1a; Apache的起源可以追溯…