DPDK-收包完整过程

本文详细介绍了DPDK收包的完整过程,包括DMA如何搬运数据包,以及DPDK的双环形缓冲区结构。首先阐述了DMA在Linux中的工作原理,接着分析了DPDK的特殊之处——双环形缓冲区设计,以及收包接口`rte_eth_rx_burst`的工作流程。文章适合对DPDK感兴趣的后台开发人员阅读。
摘要由CSDN通过智能技术生成

本篇博客作为自己了解dpdk收包过程的一个记录。在写时发现已经有很多写DPDK收包过程的博客了,但还是决定自己写一遍。

DPDK收包分为两个阶段,首先是DMA将数据包从网卡搬运到内存,然后是调用dpdk提供的接口rte_eth_rx_burst去取。但是具体是怎么做的呢?简单大致的过程如图1所示。

图1,dpdk收包大致过程

本文将按如下顺序进行展开。首先会简单介绍dma的环形缓存区,接着会介常规linux dma的收发包过程,然后会结合源码介绍dpdk的双环形缓存区设计,最后结合源码给出dpdk收包的过程。

1、DMA搬运数据包过程

网卡DMA控制器通过环形队列与CPU交互,环形队列由一组控制寄存器和一块物理上连续的缓存构成。主要的控制寄存器有Base, Size, Head和Tail。通过设置Base寄存器,可以将分配的一段物理连续的内存地址作为环形队列的起始地址,通告给DMA控制器。同样通过Size寄存器,可以通告内存快的大小。Head寄存器往往对软件只读,它表示硬件当前访问的描述符单元。而Tail寄存器则由软件来填写更新,通知DMA控制器当前已准备好被硬件访问的描述符单元。这一段话来自《深入浅出DPDK》的描述。

图2,网卡的收发描述符

下面我们结合图3先简单看下Linux中DMA收包的过程,后面再给出dpdk的收包过程。

图3,linxu dma收发包过程

详细过程如下:

1、cpu填充地址到接收侧描述符,也就是将存放sk_buff的地址物理地址填写到Rx ring;

2、网卡读取接收侧描述符获取缓冲区地址;

3、网卡收到数据包后,根据2中读到的缓冲区地址,将数据包的内容通过dma写到缓冲区;

4、网卡回写接收侧描述符更新状态,表示数据包已写完;

5、cpu读取接收侧描述符以确定数据包接收完毕;

6、cpu读取包内容做转发判断;

7、cpu填充更改包内容,做发送准备,比如调换ip地址和mac地址;

8、cpu读取发送侧描述符,检查是否有发送完成标志;

9、cpu将准备发送的缓冲区地址填写到发送侧描述符,也就是将sk_buff的地址填写到Tx ring;

10、网卡读取发送侧描述符中的地址;

11、网卡根据描述符中地址,读取缓冲区的数据内容进行发送;

12、网卡写发送侧描述符,更新发送已完成标记。

上述步骤1-6为接收过程,步骤7-12为发送过程。步骤1-12这段描述也copy自《深入浅出DPDK》。

但是,这里我要补充的是,图2中的rxd和txd就是我们图1中介绍的环形缓冲区,分别叫做Rx ring和Tx ring,也统一叫做DMA ring buffer。

DMA ring buffer的创建在驱动初始化阶段,这块内存由网卡与处理器共享,详细描述见《Linux设备驱动程序》第15章内存直接访问。这也就解释了为啥cpu可以写和读Rx/Tx ring中的描述符,网卡也可以。

2、DPDK收包

在上文描述了linux dma收包过程,那么使用dpdk收包会有啥不同呢?要弄清楚dpdk的收包过程,需要先清楚dpdk的双环形缓存区设计。

2.1 DPDK双环形缓冲区结构

dpdk收包会用到两个ring,一个是rx ring,一个是sw ring,rx ring存放的是数据包的dma地址,sw ring存放的是rte_mbuf的地址,rx ring和sw ring是一一映射的。

图4,rx_ring和sw_ring的映射关系

如图4所以,rx_ring里面的每个描述符中的地址填的是rte_mbuf的buf data地址,而rx_ring的每个描述符存放的是rte_mbuf的地址,也就是说当dma拿到dma_addr1后,然后将数据包写到dma_addr1指向的地址,实际是写到了rte_mbuf的data buffer里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值