1 Mbuf库

Mbuf库提供了分配和释放缓冲区(mbufs)的功能,DPDK应用程序可以使用这些mbufs来存储消息缓冲。 消息缓冲存储在内存池中,使用Mempool库。

数据结构rte_mbuf通常用来承载网络数据包buffers,但它实际上可以是任何数据(控制数据、事件……)。rte_mbuf头部结构尽可能小,目前仅使用个cache line,最常用的字段位于第一个cache line。

2 数据包缓冲区的设计

为了存储数据包数据(包括协议头),考虑了两种方法:

  • 在单个存储buffer中嵌入元数据,后面跟着数据包数据固定大小区域

  • 为元数据和数据包数据分别使用独立的存储buffer。

第一种方法的优点是它只需要一个操作即可分配/释放数据包的整个内存。 另一方面,第二种方法更加灵活,可以将元数据结构的分配与数据包数据的buffer分配完全分开。

DPDK选择了第一种方法。 元数据包含控制信息,例如消息类型,长度,到数据开头的偏移量以及用于允许缓冲区链接的附加mbuf结构的指针。

用于承载网络数据包的消息缓冲可以处理需要由多个缓冲区存储来保证据包完整的情况。许多mbuf组成的巨型帧就是这种情况,这些mbuf通过它们的next字段链接在一起。

对于新分配的mbuf,消息缓冲区中数据开始的区域为缓冲区开始之后的RTE_PKTMBUF_HEADROOM字节,该字节与缓存对齐。 消息缓冲区可用于在系统中不同实体之间承载控制信息、数据包、事件等。 消息缓冲也可以使用其buffer指针来指向其他消息缓冲或其他数据结构。

例1:只有一段的mbuf

例2:有三段的mbuf

Buffer管理器实现了一组相当标准的Buffer访问功能来操纵网络数据包。

3 存储在内存池中的缓冲区

缓冲区管理器使用Mempool库来申请buffer。 因此它确保数据包头均衡分布在channels和ranks上并进行L3处理(channel和rank的概念查看mempool库里的介绍)。 mbuf包含一个字段,用于表示它从哪个池中申请出来。当调用rte_pktmbuf_free(m)时,mbuf将被其所在的内存池回收。

4 构造函数

数据包mbuf构造函数由API提供。rte_pktmbuf_init()函数初始化mbuf结构中的某些字段,一旦创建,这些字段就不会被用户修改(mbuf类型,源池,缓冲区起始地址等)。此函数在池创建时作为rte_mempool_create()函数的回掉函数给出。

5 分配和释放mbufs

分配一个新mbuf需要用户指定从哪个池中申请。对于任何新分配的mbuf,它包含一个长度为0的段。缓冲区到数据的偏移量被初始化,以便使得buffer具有一些字节headroom(RTE_PKTMBUF_HEADROOM字节)。

释放mbuf意味着将其返回到其所在的内存池。当mbuf的内容存储在一个池中(作为一个空闲的mbuf)时,mbuf的内容不会被修改。 由构造函数初始化的字段不需要在mbuf分配时重新初始化。

释放包含多个段的数据包mbuf时,所有这些段都会被释放并返回其所在的内存池。

6 操作mbufs

该库提供了一些用于处理数据包mbuf中的数据的功能。 例如:

  • 获取数据长度

  • 获取指向数据开始的指针
  • 在数据之前添加数据
  • 数据后追加数据
  • 删除缓冲区开头的数据(rte_pktmbuf_adj())
  • 删除缓冲区末尾的数据(rte_pktmbuf_trim())有关详细信息,请参阅《 DPDK API参考》。

7 元数据

部分信息由网络驱动程序检索并存储在mbuf中,以使得处理更加简单。 例如,VLAN,RSS哈希结果(请参阅轮询模式驱动程序)和一个指示校验和是否由硬件计算的标志。

mbuf还包含输入端口(它来自何处)以及链中mbuf段的数量。

对于链接的mbuf,只有链的第一个mbuf存储此元信息。

例如,IEEE1588数据包的时间戳机制,VLAN标记和IP校验和计算在RX端就是这种情况。

在TX端,如果应用程序支持,则也可以将某些处理委托给硬件。 例如,PKT_TX_IP_CKSUM标志允许卸载IPv4校验和的计算。

以下示例说明了如何在封装了vxlan的tcp数据包上配置不同的TX卸载:out_eth/out_ip/out_udp/vxlan/in_eth/in_ip/in_tcp/payload

  • 计算out_ip的校验和:
mb->l2_len = len(out_eth)
mb->l3_len = len(out_ip)
mb->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CSUM
set out_ip checksum to 0 in the packet

配置DEV_TX_OFFLOAD_IPV4_CKSUM支持在硬件计算。

  • 计算out_ip 和 out_udp的校验和:
mb->l2_len = len(out_eth)
mb->l3_len = len(out_ip)
mb->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CSUM | PKT_TX_UDP_CKSUM
set out_ip checksum to 0 in the packet
set out_udp checksum to pseudo header using rte_ipv4_phdr_cksum()

配置DEV_TX_OFFLOAD_IPV4_CKSUM 和 DEV_TX_OFFLOAD_UDP_CKSUM支持在硬件上计算。

  • 计算in_ip的校验和:
mb->l2_len = len(out_eth + out_ip + out_udp + vxlan + in_eth)
mb->l3_len = len(in_ip)
mb->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CSUM
set in_ip checksum to 0 in the packet

这以情况1类似,但是l2_len不同。 配置DEV_TX_OFFLOAD_IPV4_CKSUM支持硬件计算。 注意,只有外部L4校验和为0时才可以工作。

  • 计算in_ip 和 in_tcp的校验和:
mb->l2_len = len(out_eth + out_ip + out_udp + vxlan + in_eth)
mb->l3_len = len(in_ip)
mb->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CSUM | PKT_TX_TCP_CKSUM
在报文中设置in_ip校验和为0
使用rte_ipv4_phdr_cksum()将in_tcp校验和设置为伪头

这与情况2类似,但是l2_len不同。 配置DEV_TX_OFFLOAD_IPV4_CKSUM 和 DEV_TX_OFFLOAD_TCP_CKSUM支持硬件实现。 注意,只有外部L4校验和为0才能工作。

  • segment inner TCP:
mb->l2_len = len(out_eth + out_ip + out_udp + vxlan + in_eth)
mb->l3_len = len(in_ip)
mb->l4_len = len(in_tcp)
mb->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CKSUM | PKT_TX_TCP_CKSUM | PKT_TX_TCP_SEG;
在报文中设置in_ip校验和为0
将in_tcp校验和设置为伪头部,而不使用IP载荷长度

配置DEV_TX_OFFLOAD_TCP_TSO支持硬件实现。 注意,只有L4校验和为0时才能工作。

  • 计算out_ip, in_ip, in_tcp的校验和:
mb->outer_l2_len = len(out_eth)
mb->outer_l3_len = len(out_ip)
mb->l2_len = len(out_udp + vxlan + in_eth)
mb->l3_len = len(in_ip)
mb->ol_flags |= PKT_TX_OUTER_IPV4 | PKT_TX_OUTER_IP_CKSUM | PKT_TX_IP_CKSUM | PKT_TX_TCP_CKSUM;
设置 out_ip 校验和为0
设置 in_ip 校验和为0
使用rte_ipv4_phdr_cksum()设置in_tcp校验和为伪头部

配置DEV_TX_OFFLOAD_IPV4_CKSUM, DEV_TX_OFFLOAD_UDP_CKSUM 和 DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM支持硬件实现。

Flage标记的意义在mbuf API文档(rte_mbuf.h)中有详细描述。 更多详细信息还可以参阅testpmd 源码(特别是csumonly.c)。

8 直接及间接 Buffers

直接缓冲区是完全独立且独立的缓冲区。 间接缓冲区的行为类似于直接缓冲区,但事实上,缓冲区指针和其中的数据偏移量引用了另一个直接缓冲区中的数据。 这在需要复制或分段数据包的情况下很有用,因为间接缓冲区提供跨越多个缓冲区重用相同数据包数据的手段。

当使口 rte_pktmbuf_attach() 函数将缓冲区附加到直接缓冲区时,该缓冲区变成间接缓冲区。每个缓冲区有一个引用计数器字段,每当直接缓冲区附加一个间接缓冲区时,直接缓冲区上的应用计数器递增。 类似的,每当间接缓冲区被分裂时,直接缓冲区上的引用计数器递减。 如果生成的引用计数器为0,则直接缓冲区将被释放,因为它不再使用。

处理间接缓冲区时需要注意几件事情。 首先,间接缓冲区从不附加到另一个间接缓冲区。 尝试将缓冲区A附加到间接缓冲区B(且B附加到C上了),rte_pktmbuf_attach()将自动把A附加到C上,从而有效地克隆了B。其次,为了使缓冲区变成间接缓冲区,其引用计数必须等于1,也就是说它不能被另一个间接缓冲区引用。最后,不能将间接缓冲区重新链接到直接缓冲区(除非这个间接缓冲区已经被分离了)。

虽然可以使用推荐的rte_pktmbuf_attach()和rte_pktmbuf_detach()函数直接调用附加/分离操作, 但建议使用更高级的rte_pktmbuf_clone()函数,该函数负责正确初始化间接缓冲区,并可以进行克隆具有多个段的缓冲区。

由于间接缓冲区不应该实际保存任何数据,因此应该配置间接缓冲区的内存池以指示减少内存消耗。可以在几个示例应用程序中找到用于间接缓冲区的内存池初始化示例(以及用于间接缓冲区的用例示例),例如IPv4组播示例应用程序。

9 调试

在调试模式 (CONFIG_RTE_MBUF_DEBUG使能)下,mbuf库的功能在任何操作之前执行完整性检查(如缓冲区检查、类型错误等)。

10 用例

所有网络应用程序都应该使用mbufs来传输网络数据包。

参考:

dpdk官方编程指南:http://doc.dpdk.org/guides-20.02/prog_guide/mbuf_lib.html

DPDK Mbuf Library(学习笔记)的更多相关文章

  1. Query意图分析:记一次完整的机器学习过程(scikit learn library学习笔记)

    所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质. 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图.假设现在有一个O2O领域的 ...

  2. 动态链接库(Dynamic Link Library)学习笔记(附PE文件分析)

    转载:http://www.cnblogs.com/yxin1322/archive/2008/03/08/donamiclinklibrary.html 作者:EricYou 转载请注明出处   注 ...

  3. DPDK Mempool 库原理(学习笔记)

    1 前置知识点学习(了解) 从CPU到实际的存储节点,依据层级划分:Channel > DIMM > Rank > Chip > Bank > Row /Column 1 ...

  4. V-rep学习笔记:Reflexxes Motion Library 3

    路径规划 VS 轨迹规划 轨迹规划的目的是将输入的简单任务描述变为详细的运动轨迹描述.注意轨迹和路径的区别:Trajectory refers to a time history of positio ...

  5. V-rep学习笔记:Reflexxes Motion Library 2

    VREP中的simRMLMoveToPosition函数可以将静态物体按照设定的运动规律移动到指定的目标位置/姿态.If your object is dynamically enabled, it ...

  6. 【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]

    原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[DirectionalBlur] 方位模糊是一个按照指定角度循环位移并叠加纹理,最后平均颜色值并输出的一种特效. ...

  7. 【HLSL学习笔记】WPF Shader Effect Library算法解读之[Embossed]

    原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[Embossed] Embossed(浮雕效果)          浮雕效果主要有两个参数:Amount和Wid ...

  8. 【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl]

    原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[BandedSwirl] 因工作原因,需要在Silverlight中使用Pixel Shader技术,这对于我来 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

随机推荐

  1. windows 删除非法目录

    用PHP写错了路径,创建了非法目录,提示不存在该项目 复制下面 添加为批处理文件 DEL /F /A /Q \\?\%1RD /S /Q \\?\%1 将文件移入这个文件

  2. EVE模拟器的配置

    (注:本文整理自达叔的EVE模拟器使用说明https://blog.51cto.com/dashu666/1971728) 基础部署篇 所需要准备的东西: 1.VMWare (虚拟化软件,用来承载模拟 ...

  3. SpringCloudAlibaba实战教程系列

    一.简介 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开 ...

  4. css之单位

    css之单位 角度<angle> 用于<gradient>s和某些transform功能中 deg表示以度为单位的角度.一整圈就是360deg. 例如:0deg,90deg,1 ...

  5. sed命令的正则表达式实践

    1. 取系统ip [root@oldboy logs]# ifconfig eth3 eth3 Link encap:Ethernet HWaddr 08:00:27:4C:6F:AD inet ad ...

  6. 【Linux常见命令】vimdiff命令

    在类nuix平台,我们希望对文件之间的差异之间快速定位,希望能够很容易的进行文件合并……. 可以使用Vim提供的diff模式,通常称作vimdiff,就是这样一个能满足所有这些需求,甚至能够提供更多的 ...

  7. AWS访问慢的原因分析及解决方案

    中国区的用户在访问海外AWS服务器的时候会遇到访问很慢的情况,那如何快速访问海外AWS服务器,今天和大家一起聊一下这个话题. 首先,为什么中国的用户访问海外AWS会变慢? 我总结来下大概有以下几方面的 ...

  8. [bzoj5329] P4606 [SDOI2018]战略游戏

    P4606 [SDOI2018]战略游戏:广义圆方树 其实会了圆方树就不难,达不到黑,最多算个紫 那个转换到圆方树上以后的处理方法,画画图就能看出来,所以做图论题一定要多画图,并把图画清楚点啊!! 但 ...

  9. 设置 Linux 支持中文

    1.首先在 command 输入 locale,可以看到 Linux 下默认的系统语言的是英文 2.vim ~/.bashrc 打开这个文件,该文件夹相当于系统配置文件 3.打开后,将后三行命令输入到 ...

  10. 支付宝小程序云开发serverless----获取用户的user_id

    支付宝小程序云开发serverless----获取用户的user_id 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 开通云调 ...