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

2024-06-02 13:04

本文主要是介绍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 - 

这篇关于DPDK基础组件一(mbuf、ring、pktmbuf_pool)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024042

相关文章

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine