100

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

 5 years ago
source link: https://www.sdnlab.com/22521.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.

作者简介:陆文卓

一、简介

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

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

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

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

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

Java
config.c (这个文件名可能有些误导。实际上,这个文件中包含的是UI相关的配置和显示的代码。) cmdline.c bpf_cmd.c cmdline_flow.c cmdline_mtr.c cmdline_tm.c
1
2
3
4
5
6
config.c(这个文件名可能有些误导。实际上,这个文件中包含的是UI相关的配置和显示的代码。)
cmdline.c
bpf_cmd.c
cmdline_flow.c
cmdline_mtr.c
cmdline_tm.c

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

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

Java
csumonly.c flowgen.c icmpecho.c ieee1588fwd.c iofwd.c macfwd.c macswap.c rxonly.c softnicfwd.c txonly.c
1
2
3
4
5
6
7
8
9
10
csumonly.c
flowgen.c
icmpecho.c
ieee1588fwd.c
iofwd.c
macfwd.c
macswap.c
rxonly.c
softnicfwd.c
txonly.c

二、基础代码导读

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

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

testpmd-1.0.png

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

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、 转发引擎的配置。这里仅仅是提一下,后续的文章才会详细说明。

testpmd-2.0.png

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

testpmd-3.jpg

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK