Testpmd代码导读(三)-常用转发引擎

作者简介:陆文卓,DPDK软件开发工程师,专注于PMD相关开发。

文章转载自DPDK与SPDK开源社区

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

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

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

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

转发引擎的配置

在描述具体的转发引擎前,先简单的描述一下转发引擎的配置方法。
如前所述,testpmd支持若干种转发引擎,而启动testpmd后,默认使用iofwd,如果需要改变转发引擎,可以使用CLI“setfwd …”来变更当前使用的转发引擎。(关于CLI的介绍可以参考前一篇“Testpmd代码导读(二)-用户接口”。)

lofwd

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

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

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

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

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

Macfwd

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

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

Rxonly

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

其主函数pkt_burst_receive的流程如下:

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进行发包,流程如下图所示:

Macswap

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

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

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

其他

除了上面描述的五种转发引擎,其他在简介章节提到的转发引擎都比较复杂,也不常用。限于篇幅,本文不再描述。将来有机会,会以单独的文章进行介绍。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/23023.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于19-03-06
0