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函数时,也不会深入讨论。留待日后有机会讨论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