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

相关文章

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

python操作redis基础

《python操作redis基础》Redis(RemoteDictionaryServer)是一个开源的、基于内存的键值对(Key-Value)存储系统,它通常用作数据库、缓存和消息代理,这篇文章... 目录1. Redis 简介2. 前提条件3. 安装 python Redis 客户端库4. 连接到 Re

golang 对象池sync.Pool的实现

《golang对象池sync.Pool的实现》:本文主要介绍golang对象池sync.Pool的实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收的压力,下面就来介绍一下,感兴趣的可以了解... 目录sync.Pool的用法原理sync.Pool 的使用示例sync.Pool 的使用场景注意sync.

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

PyQt6中QMainWindow组件的使用详解

《PyQt6中QMainWindow组件的使用详解》QMainWindow是PyQt6中用于构建桌面应用程序的基础组件,本文主要介绍了PyQt6中QMainWindow组件的使用,具有一定的参考价值,... 目录1. QMainWindow 组php件概述2. 使用 QMainWindow3. QMainW

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4