testpmd代码导读(一) – 基础功能

作者简介:陆文卓

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

一、简介

Testpmd是dpdk自带的测试工具,也可以被看做一个APP。当运行testpmd时,可以展示和验证网卡支持的各种PMD相关功能。

同时对于基于dpdk的上层开发者来说,testpmd也是一个进行代码开发的很好的参考,熟悉testpmd对开发工作往往能够起到事半功倍的效果。

Testpmd的使用指南可以在dpdk官方网站上下载,http://core.dpdk.org/doc/。本文对使用不再赘述,将会专注于代码的导读。

在目录app/test-pmd下存放了testpmd的代码,按照其承担的功能可以分为三大部分。

1.testpmd的基础代码
包括testpmd的启动运行,参数解析,设备的检测和配置。
包括如下文件,

3.转发功能代码
为了方便对PMD功能的测试,testpmd中预设了若干种不同的转发模式。不同的转发模式意味着testpmd对收到的包进行了不同的处理,然后将其发送甚至是丢弃。

转发模式的设计是一种简化问题的思路。简单的切换转发模式可以规避复杂的难以实现的配置。
包括以下文件,每个文件是一种单独的转发模式,

二、基础代码导读

2.1 Main函数
和所有应用程序一样,可以从main函数入手了解程序的实现。

下面的流程图梳理了testpmd的执行过程。

下面的章节将会对这个流程中比较复杂的点进行解读。当然,交互处理和转发功能相关的部分会在未来后续的文章中解读。

2.2 rte_eal_init
rte_eal_init是一个比较庞大复杂的函数,由librte_eal提供,超过了本文的讨论范畴,未来如果有机会对eal lib进行解析,可以进一步详细讨论。目前我们只需要知道这个函数提供的功能主要是对DPDK运行环境的初始化包括对CPU和内存进行初始化,以及对设备的查找。当此函数执行完成后,所有DPDK能够驱动的设备都会被查找到,后续将会针对这些设备进行操作。

另外,为了避免过分扩大讨论范围,下面在碰到rte函数时,也不会深入讨论。留待日后有机会讨论rte时。

需要特别提到的是,如我们所知,当启动testpmd这个应用时,使用者可以提供一些参数。实际上,这些参数分为两部分。两部分之间由“—”分隔。

前一部分称为eal command-line options。这一部分由eal使用,主要包括指定使用的CPU,内存的大小,甚至是指定具体的需要使用的设备(黑名单或白名单的方式)。因此rte_eal_init能够对CPU和内存进行适当的初始化。

后一部分称为testpmd command-line options。这一部分由testpmd自行处理,下面章节将会进行说明。

2.3 set_def_fwd_config
进行转发相关的默认配置。
包括:
1, set_default_fwd_lcores_config
实际上是对配置的逻辑core的信息进行记录,包括socket相关的信息。

在这里,testpmd记录了所有配置的逻辑core,但默认的用于转发的core数目是1。也就是说其他配置的core是不会被使用的。这么实现的原因是testpmd有参数指定使用的core数目,这个参数的处理是在后面的代码中。因此在这个阶段不能确定core的数目,先将其设为1(毫无疑问,运行testpmd至少占用1个core,1无论如何是可以满足的。)。后续如果有参数指定core的数目,将会更新,如果没有指定,则默认只有1个。

2, set_def_peer_eth_addrs
设置了一个默认的以太网地址,用于转发时填写以太帧头的目的地址。

实际上,是不是需要使用这个地址是有转发的模式决定的,某些转发模式下,这个地址是无用的。

3, set_default_fwd_ports_config
简单的将前面解析出来的port的信息记录下来。主要是明确有几个port,以便后续的处理。

2.4 launch_args_parse
testpmd的参数解析。如前所述,这里处理后一部分testpmd command-line options。

这个函数对参数进行字符串的匹配,以获取配置信息。在这一阶段,获取的信息只是记录下来,以供后续的处理。这里的信息包括CPU的数量,port的数量,queue的数量,各种feature的使能等。

这段代码仅仅是从字符串中摘出所需信息,比较容易理解,需要了解细节的使用者可以直接参考代码。

2.5 init_config
当参数解析完成后,可以根据参数进行初始配置。

在这里实现的几大块功能,包括:
1、 运行DPDK的逻辑core的配置
2、 收发包所需要的mbuf的配置
3、 设备的设置。在这里是将配置信息存放在适当的地方,下面进行使能设备的时候才会将其真正的设置到硬件中,使其生效。
4、 转发引擎的配置。这里仅仅是提一下,后续的文章才会详细说明。

2.6 start_port
当上述准备工作完成后,就可以将设备驱动起来了。

2.7 续
关于CLI的交互和转发引擎的介绍,敬请期待后续的文章。


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

登录后才可以评论

SDNLAB君 发表于18-11-01
1