testpmd

 

 

 

 

estPMD
TestPMD 的本质是一个使用 DPDK 库实现的 DPDK Application,作用是在以太网端口之间转发数据包。通过 TestPMD 运行时的命令行,我们可用于配置端口(Port)之间的数据包转发和网卡(Network Interface)支持的其他功能。此外,我们还可以用 TestPMD 来尝试一些不同的驱动程序的功能,例如:RSS、过滤器和 Intel Ethernet Flow Director(以太网流量控制器)。

TestPMD 支持两种配置场景:

TestPMD 把两个以太网端口连接到外部的流量发生器

 

 

 

 

TestPMD 的转发模式
io mode(输入/输出模式):通常也被称为 IO 模式,是最常用的转发模式,也是 TestPMD 启动时的默认模式。在该模式下,CPU 从一个端口接收数据包(Rx),并将其发送到另一个端口(Tx)。如果需要的话,一个端口可同时用于接收和发送。
rxonly mode(收包模式):在此模式下,TestPMD 会轮询 Rx 端口的数据包,然后直接释放而不发送,以这种方式充当数据包接收器。
txonly mode(发包模式):在此模式下,TestPMD 生成 64Byte 的 IP 数据包,并从 Tx 端口发送出去。不接收数据包,仅作为数据包的发送源。
mac mode:在转发报文前修改报文的 src MAC 地址和 dst MAC 地址。默认的行为是将 src MAC 地址设置为转发接口的 MAC 地址,将 dst MAC 地址设置为预设的 MAC 地址,可以通过 eth-peer 或 eth-peers-configfile 命令参数,在程序启动时配置预设 MAC 地址。目前还不支持对 src MAC 地址进行预设。
macswap mode:MAC 交换转发模式,在转发报文之前交换报文的 src MAC 地址和 dst MAC 地址。
flowgen mode:多数据流生成模式,根据不同的 dst IP 地址生成一组数据流,同时终结接收到的流量。
csum mode:根据报文的 offload 标记,通过硬件或软件方法修改报文的 checksum 字段。
icmpecho mode:接收一组报文,查找是否有 ICMP echo 请求,如果有,就回应 ICMP echo reply。
ieee1588 mode:演示对 Rx 和 Tx 基于 L2 IEEE1588 V2 PTP 时间同步特性,需要配置 CONFIG_RTE_LIBRTE_IEEE1588=y。
softnic mode:演示软网卡的转发操作,在此模式下,报文转发和 I/O 模式相似,区别在于实际上报文只在 loopback 软网卡接口上转发。因此,portmask 参数只能设置为软网卡端口。各种基于 softnic 固件(DPDK packet framework script)指定的自定义 NIC 软件网卡可以在此模式下进行测试,除此之外,还可以通过 CLI 使能,生成 5 级的 QoS 调度器作为默认的选项。用户可以修改默认的调度器或者通过 CLI 指定新的 QoS 调度器,此模式需要配置 CONFIG_RTE_LIBRTE_PMD_SOFTNIC=y。
noisy mode:噪音环境模拟,模拟多个真实客户机器的行为,接收和发送 VNF(Virtual Network Function)报文。

 

在目录app/test-pmd下存放了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、 转发引擎的配置。这里仅仅是提一下,后续的文章才会详细说明

 

2.6 start_port

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

 

 

testpmd 参数介绍:

DPDK(Data Plane Development Kit)的`testpmd`命令是一个用于测试和调试DPDK应用程序的工具。它允许你在DPDK运行时环境中执行不同的操作,如流量生成、统计信息收集等。以下是一些常见的`testpmd`命令参数及其含义:

1. `-c` 或 `--coremask`: 指定DPDK应用程序将运行在哪些CPU核心上。例如,`-c 0x3`将应用程序绑定到核心0和1上。

2. `-n` 或 `--numa`: 指定应用程序在哪个NUMA节点上运行。例如,`-n 1`将应用程序绑定到NUMA节点1上。

3. `-m` 或 `--socket-mem`: 指定每个NUMA节点的内存分配。例如,`-m 1024,1024`表示每个NUMA节点都分配1024MB的内存。

4. `-d` 或 `--devargs`: 指定用于初始化设备的参数。例如,`-d 0000:01:00.0`指定使用PCI设备0000:01:00.0。

5. `-i` 或 `--interactive`: 启用交互式模式,允许在运行时输入命令。

6. `--nb-cores`: 指定要使用的核心数量。

7. `--txd` 和 `--rxd`: 分别指定发送队列和接收队列的数量。

8. `--portmask`: 指定要使用的以太网端口。例如,`--portmask=0x3`将使用端口0和1。

9. `--burst`: 指定发送数据包的突发大小。

10. `--rxdpkt`: 指定每个接收队列的缓冲区数量。

11. `--txqflags`: 指定发送队列的标志。例如,`--txqflags=0xf00`设置发送队列的标志。

12. `--txqsctl`: 指定发送队列的静态流控参数。

13. `--rxq`: 指定接收队列的参数,如队列大小和队列标志。

14. `--txpt`: 指定发送队列的包传输速率。

15. `--disable-hw-vlan`: 禁用硬件VLAN处理。

16. `--forward-mode`: 指定数据包转发模式,如io、mac、ipv4等。

17. `--tx-offloads` 和 `--rx-offloads`: 分别指定发送和接收队列的硬件特性。

这只是一些常见的`testpmd`参数,还有更多参数可以根据你的需求使用。要查看完整的参数列表和详细说明,可以运行`testpmd`命令时使用`--help`选项,例如:`testpmd --help`。

 

DPDK `testpmd` 命令的参数相当多,包含了一系列用于配置和控制测试与调试的选项。以下是一些常见的 `testpmd` 参数及其含义。请注意,这只是一部分参数,实际使用中可能会根据需要选择不同的参数组合。

1. `-c` 或 `--coremask`: 指定 DPDK 应用程序将运行在哪些 CPU 核心上。

2. `-n` 或 `--numa`: 指定应用程序在哪个 NUMA 节点上运行。

3. `-m` 或 `--socket-mem`: 指定每个 NUMA 节点的内存分配。

4. `-d` 或 `--devargs`: 指定用于初始化设备的参数。

5. `-i` 或 `--interactive`: 启用交互式模式,允许在运行时输入命令。

6. `--nb-cores`: 指定要使用的核心数量。

7. `--burst`: 指定发送数据包的突发大小。

8. `--txd` 和 `--rxd`: 分别指定发送队列和接收队列的数量。

9. `--portmask`: 指定要使用的以太网端口。

10. `--forward-mode`: 指定数据包转发模式,如 io、mac、ipv4 等。

11. `--tx-offloads` 和 `--rx-offloads`: 分别指定发送和接收队列的硬件特性。

12. `--no-flush-rx`: 禁用接收队列的刷新操作。

13. `--txpkts`: 指定要发送的数据包数量。

14. `--rxq`: 指定接收队列的参数,如队列大小和队列标志。

15. `--nb-pkts`: 指定要从接收队列中接收的数据包数量。

16. `--txpt`: 指定发送队列的包传输速率。

17. `--txqflags`: 指定发送队列的标志。

18. `--disable-hw-vlan`: 禁用硬件 VLAN 处理。

19. `--port-topology`: 指定端口的拓扑结构。

20. `--pkt-filter-mode`: 指定数据包过滤模式。

21. `--rxpt`: 指定接收队列的包传输速率。

22. `--txpkts`, `--txbytes`, `--txduration`: 指定发送数据包的条件。

23. `--pkt-filter-mode`: 指定数据包过滤模式。

24. `--tx-split`: 指定发送队列中的分裂比例。

25. `--ipv4`, `--ipv6`, `--vlan`, `--vxlan`, `--geneve`, `--mpls`: 启用或禁用协议处理。

26. `--mcast-fwd-mode`: 指定组播数据包的转发模式。

27. `--flow-isolate-all`: 启用或禁用流隔离。

28. `--tx-checksum`: 启用或禁用发送队列的校验和计算。

29. `--showportstats`: 显示端口统计信息。

30. `--showportxstats`: 显示端口扩展统计信息。

31. `--showportfwdstats`: 显示端口转发统计信息。

32. `--showpmdstats`: 显示 PMD 统计信息。

33. `--showcfg`: 显示 DPDK 配置信息。

34. `--mbcache`: 指定 Mempool 缓存大小。

35. `--record-core-cycles`: 记录每个核心的 CPU 周期。

36. `--forward-reclaim`: 启用或禁用转发数据包后的内存回收。

37. `--stats-period`: 指定统计信息显示的时间间隔。

38. `--tx-first`: 指定首次发送数据包的延迟。

39. `--tx-loop`: 启用或禁用发送队列的循环模式。

40. `--rxqstats`: 显示接收队列的统计信息。

41. `--txqstats`: 显示发送队列的统计信息。

42. `--pkt-filter-mode`: 指定数据包过滤模式。

43. `--eth-peer`: 设置以太网对等体 MAC 地址。

44. `--port-topology`: 指定端口的拓扑结构。

45. `--rss`: 配置 RSS(接收侧扩展散列)。

46. `--ddp`: 使用 DDP(动态设备配置文件)。

47. `--hairpin`: 启用或禁用发射环模式。

48. `--ptypes`: 显示数据包类型。

49. `--print-event-info`: 打印事件信息。

50. `--set-default`: 设置默认参数值。

这只是一部分 `testpmd` 命令的参数。要查看完整的参数列表和详细说明,可以在命令行中输入 `testpmd --help` 或 `testpmd -h`。

 

 

 

 

参考引用:

testpmk 介绍:https://blog.51cto.com/u_15127581/3676521

testpmd 代码导读: https://zhuanlan.zhihu.com/p/621181620

posted @ 2023-10-03 15:04  redrobot  阅读(1074)  评论(0编辑  收藏  举报