DOCA 文档 v2.10.0

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 的数据包流。它接收来自线路的流量,并将其传递到另一个端口。

system-design-diagram-version-1-modificationdate-1734469920023-api-v2.png

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

下图说明了初始化过程。

initialization-process-illustration-version-1-modificationdate-1734469919727-api-v2.png

  1. Init_DPDK – EAL 初始化,从命令行解析参数并注册信号。

  2. 启动端口 – mbuf_createdev_configure、rx/tx/hairpin 队列设置并启动端口。

  3. Simple_fwd INIT – 创建流表,构建默认转发管道。

下图说明了如何处理数据包。

packet-processing-illustration-version-1-modificationdate-1734469919420-api-v2.png

  1. 根据数据包的信息,找到键值(例如,源/目标 IP、源/目标端口等)。

  2. 遍历内部流表,检查键是否存在。

    • 如果存在,则更新内部计数器

    • 如果不存在,则将新流表添加到 DPU

  3. 将数据包转发到另一个端口。

此应用程序利用以下 DOCA 库

有关更多信息,请参阅其各自的编程指南。

信息

有关如何安装 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 文件中设置所需的标志,而不是在编译命令行中提供它们

  1. 编辑 /opt/mellanox/doca/applications/meson_options.txt 中的以下标志

    • enable_all_applications 设置为 false

    • enable_simple_fwd_vnf 设置为 true

  2. 运行以下编译命令

    复制
    已复制!
                

    cd /opt/mellanox/doca/applications/ meson /tmp/build ninja -C /tmp/build

    信息

    doca_simple_fwd_vnf/tmp/build/simple_fwd_vnf/ 下创建。

故障排除

有关应用程序编译遇到的任何问题,请参阅 DOCA 故障排除

先决条件

  1. 应在系统上手动将 FLEX 配置文件号设置为 3,以便应用程序构建 GRE、标准 VXLAN 和 GRE 管道。

    1. 从 DPU 将 FLEX 配置文件号设置为 3。

      复制
      已复制!
                  

      sudo mlxconfig -d <pcie_address> s FLEX_PARSER_PROFILE_ENABLE=3

    2. 执行 BlueField 系统重启,以使 mlxconfig 设置生效。

      信息

      也可以从 BlueField 重置固件。有关更多信息,请参阅 DOCA Linux 安装指南的“升级固件”部分的步骤 3.b。

  2. 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 应用程序以源代码形式提供。因此,在执行应用程序之前需要进行编译。

  1. 应用程序使用说明

    复制
    已复制!
                

    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 level for 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 thread do aging

    信息

    可以使用 -h(或 --help)选项将此用法打印到命令行

    复制
    已复制!
                

    ./doca_simple_fwd_vnf -- -h

    信息

    有关更多信息,请参阅“命令行标志”部分。

  2. 在 BlueField 上运行应用程序的 CLI 示例

    复制
    已复制!
                

    ./doca_simple_fwd_vnf -a auxiliary:mlx5_core.sf.4 -a auxiliary:mlx5_core.sf.5 -- -l 60

    注意

    必须根据 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 eswitch set pci/0000:03:00.1 mode legacy echo none > /sys/class/net/p0/compat/devlink/encap echo none > /sys/class/net/p1/compat/devlink/encap /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.0 mode switchdev /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.1 mode switchdev

    如果封装模式设置为 basic,则应用程序在初始化时会失败。

    注意

    -a auxiliary:mlx5_core.sf.4 -a auxiliary:mlx5_core.sf.5 标志对于应用程序的正确使用是强制性的。

    1. 修改此标志会导致意外行为,因为仅支持 2 个端口。

    2. SF 编号是任意的且可配置的。

    注意

    SF 编号必须与所需的 SF 设备匹配。

  3. 在主机上运行应用程序的 CLI 示例

    复制
    已复制!
                

    ./doca_simple_fwd_vnf -a 04:00.3 -a 04:00.4 -- -l 60

    注意

    设备标识符必须与所需的网络设备匹配。

    信息

    有关更多信息,请参阅 DOCA 虚拟功能用户指南中的“在主机上运行 DOCA 应用程序”部分。

  4. 该应用程序还支持基于 JSON 的部署模式,其中所有命令行参数都通过 JSON 文件提供

    复制
    已复制!
                

    ./doca_simple_fwd_vnf --json [json_file]

    例如

    复制
    已复制!
                

    ./doca_simple_fwd_vnf --json ./simple_fwd_params.json

    注意

    在执行之前,请确保使用的 JSON 文件包含正确的配置参数,尤其是部署所需的 PCIe 地址。

命令行标志

标志类型

短标志

长标志/JSON 键

描述

JSON 内容

DPDK 标志

a

devices

将 PCIe 设备添加到要探测的设备列表中。

复制
已复制!
            

"devices": [ {"device": "sf", "id": "4","sft": true}, {"device": "sf", "id": "5","sft": true}, ]

通用标志

h

help

打印帮助概要

N/A

v

version

打印程序版本信息

N/A

l

log-level

设置应用程序的日志级别

  • DISABLE=10

  • CRITICAL=20

  • ERROR=30

  • WARNING=40

  • INFO=50

  • DEBUG=60

  • TRACE=70(需要使用 TRACE 日志级别支持进行编译)

复制
已复制!
            

"log-level": 60

N/A

sdk-log-level

设置程序的日志级别

  • DISABLE=10

  • CRITICAL=20

  • ERROR=30

  • WARNING=40

  • INFO=50

  • DEBUG=60

  • TRACE=70

复制
已复制!
            

"sdk-log-level": 40

j

json

从输入 JSON 文件解析所有命令标志

N/A

程序标志

t

stats-timer

设置转储统计信息的时间间隔。

复制
已复制!
            

"stats-timer": 2

q

nr-queues

设置队列数量。

复制
已复制!
            

"nr-queues": 4

r

rx-only

设置为仅 RX。设置后,数据包将不会发送到 TX 队列。

复制
已复制!
            

"rx-only": false

o

hw-offload

设置要使用的 RXP 引擎的 HW 卸载。

复制
已复制!
            

"hw-offload": false

hq

hairpinq

将转发设置为 hairpin 队列。

复制
已复制!
            

"hairpinq": false

a

age-thread

启动处理老化流的专用线程。

复制
已复制!
            

"age-thread": false

信息

有关支持的标志和执行模式的更多信息,请参阅 DOCA Arg Parser


故障排除

有关 DOCA 应用程序的安装或执行遇到的任何问题,请参阅 DOCA 故障排除

  1. 解析应用程序参数。

    1. 初始化参数解析器资源并注册 DOCA 通用参数。

      复制
      已复制!
                  

      doca_argp_init();

    2. 注册应用程序参数。

      复制
      已复制!
                  

      register_simple_fwd_params();

    3. 解析参数。

      复制
      已复制!
                  

      doca_argp_start();

      1. 解析 DPDK 标志并调用处理程序以调用 rte_eal_init() 函数。

      2. 解析应用程序参数。

  2. DPDK 初始化。

    复制
    已复制!
                

    dpdk_init();

    调用 rte_eal_init() 以使用提供的 EAL 标志初始化 EAL 资源。

  3. DPDK 端口初始化和启动。

    复制
    已复制!
                

    dpdk_queues_and_ports_init();

    1. 初始化 DPDK 端口。

    2. 使用 rte_pktmbuf_pool_create 创建 mbuf 池。

    3. 驱动程序初始化 – 使用 rte_eth_dev_configure 配置队列数量。

    4. Rx/Tx 队列初始化 – 使用 rte_eth_rx_queue_setuprte_eth_tx_queue_setup 初始化队列。

    5. Rx hairpin 队列初始化 – 使用 rte_eth_rx_hairpin_queue_setup 初始化队列。

    6. 使用 rte_eth_dev_start 启动端口。

  4. Simple forward 初始化。

    复制
    已复制!
                

    simple_fwd_init();

    1. simple_fwd_create_ins – 使用 simple_fwd_ft_create 创建流表。

    2. simple_fwd_init_ports_and_pipes – 使用 simple_fwd_init_doca_port 初始化 DOCA 端口,并为每个端口构建默认管道。

  5. 主循环。

    复制
    已复制!
                

    simple_fwd_process_pkts();

    1. 在循环中使用 rte_eth_rx_burst 接收数据包。

    2. 使用 simple_fwd_process_offload 处理数据包。

    3. 通过调用 rte_eth_tx_burst 在另一个端口上传输数据包。或者,如果 rx_only 设置为 true,则释放数据包 mbuf。

  6. 处理数据包。

    复制
    已复制!
                

    simple_fwd_process_offload();

    1. 使用 simple_fwd_pkt_info 解析数据包的 rte_mbuf

    2. 使用 simple_fwd_handle_packet 处理数据包。如果数据包的密钥与现有流条目不匹配,则使用 simple_fwd_handle_new_flow 创建新的流条目和 PIPE。否则,增加数据包总数计数器。

  7. Simple forward 销毁。

    复制
    已复制!
                

    simple_fwd_destroy();

    Simple forward 关闭端口并清理流资源。

  8. DPDK 端口和队列销毁。

    复制
    已复制!
                

    dpdk_queues_and_ports_fini();

  9. DPDK 完成。

    复制
    已复制!
                

    dpdk_fini();

    调用 rte_eal_destroy() 以销毁初始化的 EAL 资源。

  10. 参数解析器销毁。

    复制
    已复制!
                

    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

© 版权所有 2025 NVIDIA。 上次更新于 2025 年 2 月 12 日。