DOCA Simple Forward VNF 应用指南
本指南提供了在 NVIDIA® BlueField® DPU 之上实现的 Simple Forward。
Simple forward 是一个转发应用程序,它利用 DOCA Flow API 从单个 RX 端口接收 VXLAN、GRE 或 GTP 流量,并将其传输到单个 TX 端口。
对于在给定端口的 RX 队列上接收的每个数据包,DOCA Simple Forward 检查数据包的密钥,该密钥由 5 元组组成。如果找到数据包与现有流匹配,则不创建新流。否则,将创建一个包含 FORWARDING 组件的新流。最后,如果未设置“rx-only”模式,则数据包将转发到出口端口的 TX 队列。
FORWARDING 组件类型取决于运行应用程序时传递的标志。例如,如果提供了 hairpinq
标志,则 FORWARDING 组件将是 hairpin。否则,它将被 RSS 到软件,因此每个 VXLAN、GTP 或 GRE 数据包都将在 RX 队列上接收。
Simple forward 应与双端口一起运行。通过使用流量生成器,RX 端口接收 VXLAN、GRE 或 GTP 数据包,并且转发将它们转发回流量生成器。
下图说明了 simple forward 的数据包流。它接收来自线路的流量,并将其传递到另一个端口。

Simple forward 首先初始化 DPDK,之后应用程序处理传入的数据包。
下图说明了初始化过程。

Init_DPDK
– EAL 初始化,从命令行解析参数并注册信号。启动端口 –
mbuf_create
、dev_configure
、rx/tx/hairpin 队列设置并启动端口。Simple_fwd INIT
– 创建流表,构建默认转发管道。
下图说明了如何处理数据包。

根据数据包的信息,找到键值(例如,源/目标 IP、源/目标端口等)。
遍历内部流表,检查键是否存在。
如果存在,则更新内部计数器
如果不存在,则将新流表添加到 DPU
将数据包转发到另一个端口。
有关如何安装 BlueField 相关软件的详细信息,请参阅 DOCA Linux 安装指南。
DOCA 参考应用程序的安装包含应用程序的源代码以及匹配的编译说明。这允许“按原样”编译应用程序,并提供修改源代码,然后编译应用程序新版本的能力。
有关应用程序以及开发和编译技巧的更多信息,请参阅 DOCA 参考应用程序页面。
应用程序的源代码可以在应用程序的目录下找到:/opt/mellanox/doca/applications/simple_fwd_vnf/
。
编译所有应用程序
所有 DOCA 应用程序都在单个 meson 项目下定义。因此,默认情况下,编译包括所有应用程序。
要一起构建所有应用程序,请运行
cd /opt/mellanox/doca/applications/
meson /tmp/build
ninja -C /tmp/build
doca_simple_fwd_vnf
在 /tmp/build/simple_fwd_vnf/
下创建。
仅编译 Simple Forward 应用程序
要直接仅构建 simple forward 应用程序
cd /opt/mellanox/doca/applications/
meson /tmp/build -Denable_all_applications=false
-Denable_simple_fwd_vnf=true
ninja -C /tmp/build
doca_simple_fwd_vnf
在 /tmp/build/simple_fwd_vnf/
下创建。
或者,用户可以在 meson_options.txt
文件中设置所需的标志,而不是在编译命令行中提供它们
编辑
/opt/mellanox/doca/applications/meson_options.txt
中的以下标志将
enable_all_applications
设置为false
将
enable_simple_fwd_vnf
设置为true
运行以下编译命令
cd /opt/mellanox/doca/applications/ meson /tmp/build ninja -C /tmp/build
信息doca_simple_fwd_vnf
在/tmp/build/simple_fwd_vnf/
下创建。
故障排除
有关应用程序编译遇到的任何问题,请参阅 DOCA 故障排除。
先决条件
应在系统上手动将 FLEX 配置文件号设置为 3,以便应用程序构建 GRE、标准 VXLAN 和 GRE 管道。
从 DPU 将 FLEX 配置文件号设置为 3。
sudo mlxconfig -d <pcie_address> s FLEX_PARSER_PROFILE_ENABLE=
3
执行 BlueField 系统重启,以使
mlxconfig
设置生效。信息也可以从 BlueField 重置固件。有关更多信息,请参阅 DOCA Linux 安装指南的“升级固件”部分的步骤 3.b。
Simple Forward 应用程序基于 DOCA Flow。因此,用户需要分配巨页。
$ echo
'2048'
| sudo tee -a /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages $ sudo mkdir /mnt/huge $ sudo mount -t hugetlbfs -o pagesize=2M nodev /mnt/huge
应用程序执行
simple forward 应用程序以源代码形式提供。因此,在执行应用程序之前需要进行编译。
应用程序使用说明
Usage: doca_simple_forward_vnf [DPDK Flags] -- [DOCA Flags] [Program Flags] DOCA Flags: -h, --help Print a help synopsis -v, --version Print program version information -l, --log-level Set the (numeric) log level
for
the program <10
=DISABLE,20
=CRITICAL,30
=ERROR,40
=WARNING,50
=INFO,60
=DEBUG,70
=TRACE> --sdk-log-level Set the SDK (numeric) log levelfor
the program <10
=DISABLE,20
=CRITICAL,30
=ERROR,40
=WARNING,50
=INFO,60
=DEBUG,70
=TRACE> -j, --json <path> Parse all command flags from an input json file Program Flags: -t, --stats-timer <time> Set interval to dump stats information -q, --nr-queues <num> Set queues number -r, --rx-only Set rx only -o, --hw-offload Set PCI address of the RXP engine to use -hq, --hairpinq Set forwarding to hairpin queue -a, --age-thread Start threaddo
aging信息可以使用
-h
(或--help
)选项将此用法打印到命令行./doca_simple_fwd_vnf -- -h
信息有关更多信息,请参阅“命令行标志”部分。
在 BlueField 上运行应用程序的 CLI 示例
./doca_simple_fwd_vnf -a auxiliary:mlx5_core.sf.
4
-a auxiliary:mlx5_core.sf.5
-- -l60
注意必须根据 BlueField 可扩展功能用户指南 启用 SF。
在特定物理端口上创建 SF 之前,务必验证相应 PF FDB 上的封装模式。默认模式为
basic
。要检查封装模式,请运行cat
/sys/class/net/p0/compat/devlink/encap在这种情况下,在创建 SF 之前,通过运行以下命令禁用 PF FDB 上的封装:
/opt/mellanox/iproute2/sbin/devlink dev eswitch
set
pci/0000:03:00.0 mode legacy /opt/mellanox/iproute2/sbin/devlink dev eswitchset
pci/0000:03:00.1 mode legacyecho
none > /sys/class/net/p0/compat/devlink/encapecho
none > /sys/class/net/p1/compat/devlink/encap /opt/mellanox/iproute2/sbin/devlink dev eswitchset
pci/0000:03:00.0 mode switchdev /opt/mellanox/iproute2/sbin/devlink dev eswitchset
pci/0000:03:00.1 mode switchdev如果封装模式设置为
basic
,则应用程序在初始化时会失败。注意-a auxiliary:mlx5_core.sf.4 -a auxiliary:mlx5_core.sf.5
标志对于应用程序的正确使用是强制性的。修改此标志会导致意外行为,因为仅支持 2 个端口。
SF 编号是任意的且可配置的。
注意SF 编号必须与所需的 SF 设备匹配。
在主机上运行应用程序的 CLI 示例
./doca_simple_fwd_vnf -a
04
:00.3
-a04
:00.4
-- -l60
注意设备标识符必须与所需的网络设备匹配。
信息有关更多信息,请参阅 DOCA 虚拟功能用户指南中的“在主机上运行 DOCA 应用程序”部分。
该应用程序还支持基于 JSON 的部署模式,其中所有命令行参数都通过 JSON 文件提供
./doca_simple_fwd_vnf --json [json_file]
例如
./doca_simple_fwd_vnf --json ./simple_fwd_params.json
注意在执行之前,请确保使用的 JSON 文件包含正确的配置参数,尤其是部署所需的 PCIe 地址。
命令行标志
标志类型 | 短标志 | 长标志/JSON 键 | 描述 | JSON 内容 |
DPDK 标志 |
|
| 将 PCIe 设备添加到要探测的设备列表中。 |
|
通用标志 |
|
| 打印帮助概要 | N/A |
|
| 打印程序版本信息 | N/A | |
|
| 设置应用程序的日志级别
|
| |
N/A |
| 设置程序的日志级别
|
| |
|
| 从输入 JSON 文件解析所有命令标志 | N/A | |
程序标志 |
|
| 设置转储统计信息的时间间隔。 |
|
|
| 设置队列数量。 |
| |
|
| 设置为仅 RX。设置后,数据包将不会发送到 TX 队列。 |
| |
|
| 设置要使用的 RXP 引擎的 HW 卸载。 |
| |
|
| 将转发设置为 hairpin 队列。 |
| |
|
| 启动处理老化流的专用线程。 |
|
有关支持的标志和执行模式的更多信息,请参阅 DOCA Arg Parser。
故障排除
有关 DOCA 应用程序的安装或执行遇到的任何问题,请参阅 DOCA 故障排除。
解析应用程序参数。
初始化参数解析器资源并注册 DOCA 通用参数。
doca_argp_init();
注册应用程序参数。
register_simple_fwd_params();
解析参数。
doca_argp_start();
解析 DPDK 标志并调用处理程序以调用
rte_eal_init()
函数。解析应用程序参数。
DPDK 初始化。
dpdk_init();
调用
rte_eal_init()
以使用提供的 EAL 标志初始化 EAL 资源。DPDK 端口初始化和启动。
dpdk_queues_and_ports_init();
初始化 DPDK 端口。
使用
rte_pktmbuf_pool_create
创建 mbuf 池。驱动程序初始化 – 使用
rte_eth_dev_configure
配置队列数量。Rx/Tx 队列初始化 – 使用
rte_eth_rx_queue_setup
和rte_eth_tx_queue_setup
初始化队列。Rx hairpin 队列初始化 – 使用
rte_eth_rx_hairpin_queue_setup
初始化队列。使用
rte_eth_dev_start
启动端口。
Simple forward 初始化。
simple_fwd_init();
simple_fwd_create_ins
– 使用simple_fwd_ft_create
创建流表。simple_fwd_init_ports_and_pipes
– 使用simple_fwd_init_doca_port
初始化 DOCA 端口,并为每个端口构建默认管道。
主循环。
simple_fwd_process_pkts();
在循环中使用
rte_eth_rx_burst
接收数据包。使用
simple_fwd_process_offload
处理数据包。通过调用
rte_eth_tx_burst
在另一个端口上传输数据包。或者,如果rx_only
设置为true
,则释放数据包 mbuf。
处理数据包。
simple_fwd_process_offload();
使用
simple_fwd_pkt_info
解析数据包的rte_mbuf
。使用
simple_fwd_handle_packet
处理数据包。如果数据包的密钥与现有流条目不匹配,则使用simple_fwd_handle_new_flow
创建新的流条目和 PIPE。否则,增加数据包总数计数器。
Simple forward 销毁。
simple_fwd_destroy();
Simple forward 关闭端口并清理流资源。
DPDK 端口和队列销毁。
dpdk_queues_and_ports_fini();
DPDK 完成。
dpdk_fini();
调用
rte_eal_destroy()
以销毁初始化的 EAL 资源。参数解析器销毁。
doca_argp_destroy();
通过调用
rte_eal_cleanup()
函数释放 DPDK 资源。
/opt/mellanox/doca/applications/simple_fwd_vnf/
/opt/mellanox/doca/applications/simple_fwd_vnf/simple_fwd_params.json