DPDK:testpmd代码导读(三)-常用转发引擎

导读

在testpmd基础介绍中提到,testpmd实现了多种不同的转发引擎。每种转发引擎实现了不同的收发包的行为。在使用testpmd时,使用者对转发引擎需要有足够的了解,才能正确的预期testpmd的收发包行为,并正确的为testpmd灌注所需的数据包。

对于开发者来说,不同的转发引擎也是有益的参考。开发者可以结合所需的功能,参考恰当的转发引擎代码,快速的开发代码以及调试bug。

如testpmd基础介绍所述,为了简化实现和简化配置,testpmd没有实现复杂、动态的转发配置,而是实现若干种比较固定的转发引擎,每种转发引擎的行为是固定的,无法配置修改。测试者需要根据自己的需求选择合适的转发引擎。坏处也是明显的,每种转发引擎的行为基本上是一个黑盒子,测试者只能根据名称对其行为作个大致的猜测。因此,本篇文章会对每种引擎的行为进行描述和解释,以方便使用者查阅。

在testpmd基础介绍中提到,转发引擎包括若干种,下面的章节将一一介绍。以下罗列了testpmd中所有的转发引擎,大致按照常用的程度排序。默认使用的是iofwd,而macfwd,rxonly和txonly也是经常使用的。
 

iofwd.c
macfwd.c
rxonly.c
txonly.c
macswap.c
csumonly.c
flowgen.c
icmpecho.c
ieee1588fwd.c
softnicfwd.c

转发引擎的配置

在描述具体的转发引擎前,先简单的描述一下转发引擎的配置方法。

如前所述,testpmd支持若干种转发引擎,而启动testpmd后,默认使用iofwd,如果需要改变转发引擎,可以使用CLI“setfwd …”来变更当前使用的转发引擎。

 lofwd

Iofwd是最简单的转发引擎,所实现的功能是将收到的包原封不动的转发出去。大部分情况下,此转发引擎可以用来测试网卡的收发功能是否正常工作。

但是也需要注意到,网卡不一定默认支持这种最简单的收发包。比较常见的情况是,当收包时,网卡可能会丢弃目的MAC地址非本端口的包,而发包时,源MAC地址非本端口的包可可能被丢弃而不是发送。

由于这是一个非常简单的转发引擎,当iofwd不能正常工作时,原因可以从两方面看,网卡不能正常的收包,和网卡不能正常的发包。在进一步确定问题时,使用者可以将收发独立开来分别检查,这就需要用到rxonly和txonly两个转发引擎。下面会对其进行具体说明。

Iofwd代码比较简单,主要的函数是pkt_burst_io_forward,如下:

640?wx_fmt=png

注:DPDK主要采用polling mode。也就是说,当使用CLI——start开始转发后,会有一个或多个线程反复执行pkt_burst_io_forward,所以应用程序会一直进行转发,直到使用CLI——stop显式的停止。下面的转发引擎的使用也是类似,不再赘述。

Macfwd

Macfwd比iofwd要复杂一些,主要区别是macfwd在收到包后,会对包进行处理后再转发。由于这些包处理都集中在层二,所以这种转发模式被称为macfwd。

Macfwd的主要处理函数是pkt_burst_mac_forward,流程如下所示:


 

640?wx_fmt=png

Rxonly

Rxonly的功能非常简单,仅仅接受包,然后将其释放。其用途也很比较确定,一般用来测试网卡的收包功能是否正常。

其主函数pkt_burst_receive的流程如下:

640?wx_fmt=png

Txonly

前面说的rxonly只收包,显然,txonly和其相反,只实现了发包功能。可以想见,当转发引擎设置为txonly后,如果再向这块网卡发送数据包,由于没有软件取走数据包,这些数据包将会堆积在网卡硬件的缓存中,直到缓存被堆满后开始丢包。

Txonly在发包时,不依赖也不关心网卡收到的包,所发送的包是由软件自己生成的。理论上来说,txonly可以作为一个发包器使用。但txonly只是一个功能简单的小软件,没有提供协议栈编辑的功能,要想编辑所发送包的内容,必须通过修改代码,将数据包的内容以二进制的形式写在代码中。由于使用不方便,txonly一般仅仅用于简单的发包测试。如果手头没有合适的发包器,txonly也可以临时替代一下。需要注意的是txonly只实现了UDP包的发送,如果需要发送其他类型的包,不要忘记对IP和UDP头相关代码的修改。

当执行txonly应用程序时,会先进行一些准备工作——预先设置IP头和UDP头的内容,在函数setup_pkt_udp_ip_headers中实现。这部分内容非常简单,就是对UDP和IP头的数据结构进行填充,这里就不过多说明了。

当启动发送后,执行txonly中的主要处理函数pkt_burst_transmit进行发包,流程如下图所示:


 

640?wx_fmt=png

Macswap


Macswap和macfwd非常相像。如名字所揭示的那样,macswap也是对收到的包进行层二的改动。这个改动是和简单的,就是将层二包头里的源mac地址和目的mac地址相互交换

这个简单的改动可以规避网卡某些特性对收发包的限制。例如,如果网卡不支持混杂模式,则包的目的mac地址必须填对。而如果网卡的发送方向有anti-spoofing的功能,则要求发包的源mac地址必须填对。在这个场景下,如果是一个端口自收自发,则可以使用macswap模式,使转发功能工作。

Macswap的主要处理函数是pkt_burst_mac_swap,流程如下所示:

640?wx_fmt=png

 除了上面描述的五种转发引擎,其他在简介章节提到的转发引擎都比较复杂,也不常用。限于篇幅,本文不再描述。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术探索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值