DPDK :testpmd代码导读(一) - 基础功能

1、简介

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

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

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

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

一、testpmd的基础代码

包括testpmd的启动运行,参数解析,设备的检测和配置。

包括如下文件:

testpmd.c
parameters.c

二、UI相关代码

Testpmd提供了CLI的人机交互模式。在testpmd运行过程中,使用者可以使用CLI对被测设备进行配置,使能/去使能某些功能,从而可以方便直观的了解PMD各种功能的效果。

在dpdk的开发过程中,由于支持的功能越来越多,UI的代码由最初的集中在一个文件中发展到分裂为多个文件,新增的文件大多是将支持某个功能的代码集中放置在一个专门的文件中,为代码的维护和阅读带来了方便。

包括如下文件:

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

三、转发功能代码

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

转发模式的设计是一种简化问题的思路。简单的切换转发模式可以规避复杂的难以实现的配置。

包括以下文件,每个文件是一种单独的转发模式:

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

--------------------------------------------------------------------------------------------------------------------------------

2、基础代码导读

2.1 Main函数

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

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


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

2.2 rte_eal_init

rte_eal_init是一个比较庞大复杂的函数,由librte_eal提供,超过了本文的讨论范畴,未来如果有机会对eal lib进行解析,可以进一步详细讨论。目前我们只需要知道这个函数提供的功能主要是对DPDK运行环境的初始化包括对CPU和内存进行初始化,以及对设备的查找。

当此函数执行完成后,所有DPDK能够驱动的设备都会被查找到,后续将会针对这些设备进行操作。

详细流程请如下: 

rte_eal_init详细流程

另外,为了避免过分扩大讨论范围,下面在碰到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、 转发引擎的配置。这里仅仅是提一下,后续的文章才会详细说明。

640?wx_fmt=png

2.6 start_port

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

640?wx_fmt=png

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

技术探索者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值