50

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

 5 years ago
source link: https://www.sdnlab.com/23023.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

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

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

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

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

206.jpg

转发引擎的配置

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

lofwd

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

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

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

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

201.jpg

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

Macfwd

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

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

202.jpg

Rxonly

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

其主函数pkt_burst_receive的流程如下:

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

204.jpg

Macswap

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

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

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

205-1.jpg

其他

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK