首页 > 其他分享 > testpmd

testpmd

时间:2023-10-03 15:11:07浏览次数:39  
标签:testpmd 报文 MAC 地址 mode 转发

 

 

 

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

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

 

 

 

参考引用:

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

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

标签:testpmd,报文,MAC,地址,mode,转发
From: https://www.cnblogs.com/rebrobot/p/17741153.html

相关文章