fwd是fowarding转发的缩写,就是testpmd中具体描述转发行为的动作,它从输入报文解析、端口转发、输出报文封装三个角度进行转发行为的描述。
更具体的说,fwd是一个可以在testpmd中使用show config fwd进行检查的配置,在此配置中,首先会描述当前的转发模式、当前的端口、核以及流数目,当前的NUMA的节点与内存行为模式,rx到tx之间的链路转发关系等信息。

fwd可以具体分为下面这些模式:
模式命令 | 行为描述 | 使用场景与效果 |
|---|
set fwd io | IO模式,从RX端口收到的报文,不做任何修改直接从TX端口转发。注意这种转发是静态配置的,无法修改。 | 网卡性能测试、驱动稳定性 一般为port N --> port N+1之间做IO互联,单独一个的自己连自己 |
set fwd mac | 二层交换模拟,收到报文后,将源mac替换为发送端口的mac,目的mac替换为对端端口的mac | 模拟二层网关或交换机的行为,验证mac地址学习/重写逻辑 |
set fwd macswap | mac交换,直接交换报文的源mac与目的mac地址 | 环路测试,二层环回 |
set fwd csum | 校验和重算/验证,在收到报文后,根据配置使用硬件或软件重新计算IP、TCP、UDP的校验和 | 验证网卡的checksum offload功能是否正常 |
set fwd tso | 大报文分段,允许发送超过MTU的超大TCP报文,由网卡硬件将其分割成多个符合MTU的小报文发送 | 测试网卡TSO性能,验证大文件传输性能 |
set fwd lro | 大报文合并,将接收端的多个小的TCP段合并成一个大的报文传递给应用层 | 验证网卡的LRO功能,测试高带宽低小包率下的接收性能 |
set fwd flowgen | 流生成,主动生成具有不同五元组的UDP报文流,并递增序列号 | 性能压力测试,验证RSS |
set fwd txonly | 只发不收 | 验证Tx压力 |
set fwd rxonly | 只收不发 | 验证Rx压力 |
set fwd icmpecho | 模拟ping服务 | 用于响应ping |
set fwd ieee1588 | 时间戳处理,用于处理IEEE 1588 PTP报文,提取接收时间戳并在发送报文中插入硬件时间戳 | 测试网卡的时钟同步 |
set fwd shared_rxq | 多核共享Rx | 测试驱动在共享队列模式下的并法性能和锁竞争情况 |
实际上,真实网络世界中对转发的要求会更加的多样,比如简单直白的物理口自接口的802.1Q划分功能,DPDK就几乎无法实现(只能进行软件分流处理,没有一个独立的自接口struct概念),同时类似2544协议一类的检测协议也是DPDK无法完成的。
DPDK的可塑性在于,可以通过定义PMD的软件报文处理流程来进行接收报文的处理。具体来说,就是可以通过源代码的修改实现DPDK下的任意状态机。