0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用DPDK和NVIDIA DOCA库开发应用程序

星星科技指导员 来源:NVIDIA 作者:Anuradha Karuppiah 2022-04-11 17:02 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在这篇文章中,我将带您了解 FRR DOCA 数据平面插件的创建过程,并向您展示如何使用全新的 DOCAflow 库卸载 PBR 规则。在上一篇文章中,您了解了使用 DPDK rte_flow 库创建 FRR 数据平面插件,以加速 BlueField 上的 PBR 规则。

向 Zebra 添加 DOCA 数据平面插件

我仍然使用 DPDK API 进行硬件初始化,但随后使用 DOCAflow API 来设置数据平面流管道。为此,我必须将 DPDK (libdpdk.pc)和 DOCAflow(doca-flow.pc)共享库链接到 DOCA 数据平面插件。

root@dpu-arm:~# export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/mellanox/dpdk/lib/aarch 
64-linux-gnu/pkgconfig 
root@dpu-arm:~# pkg-config --libs doca-flow 
-ldoca_flow 
root@dpu-arm:~# pkg-config --cflags doca-flow 
-DALLOW_EXPERIMENTAL_API -include rte_config.h -mcpu=cortex-a72 -DALLOW_EXPERIMENTAL_API -I/opt/mellanox/dpdk/include/dpdk -I/opt/mellanox/dpdk/include/dpdk/../aarch64-linux-gnu/dpdk -I/opt/mellanox/dpdk/include/dpdk -I/usr/include/libnl3 
root@dpu-arm:~# 

我在 FRR makefile (configure.ac)中为 DPDK 和 DOCAflow添加了pkg check-and-define宏。

if test "$enable_dp_doca" = "yes"; then 
 PKG_CHECK_MODULES([DOCA], [libdpdk doca-flow], [ 
 AC_DEFINE([HAVE_DOCA], [1], [Enable DOCA backend]) 
 DOCA=true 
 ], [ 
 AC_MSG_ERROR([configuration specifies --enable-dp-doca but DOCA libs were not found]) 
 ]) 
fi

我将 DPDK 和 DOCAflow库及cflags都包含在zebra-dp-doca make宏(zebra/subdir.am)中。

zebra_zebra_dplane_doca_la_CFLAGS = $(DOCA_CFLAGS) 
zebra_zebra_dplane_doca_la_LIBADD = $(DOCA_LIBS) 

使用/etc/frr/daemons启动 FRR 服务时,可以启用 DOCA 数据平面插件。

zebra_options= " -M dplane_doca -A 127.0.0.1"

硬件初始化和端口映射

使用 DPDK API 、rte_eal_initrte_eth_dev_info_get初始化硬件,并设置 Zebra 接口到 DPDK 端口映射。此工作流与上一节中的 DPDK 数据平面插件相同。

root@dpu-arm:~# vtysh -c "show dplane doca port" 
Total ports: 6 cores: 8 
Port Device IfName IfIndex sw,domain,port 
0 0000:03:00.0 p0 4 0000:03:00.0,0,65535 
1 0000:03:00.0 pf0hpf 6 0000:03:00.0,0,4095 
2 0000:03:00.0 pf0vf0 15 0000:03:00.0,0,4096 
3 0000:03:00.0 pf0vf1 16 0000:03:00.0,0,4097 
4 0000:03:00.1 p1 5 0000:03:00.1,1,65535 
5 0000:03:00.1 pf1hpf 7 0000:03:00.1,1,20479 
root@dpu-arm:~#

DOCAflow初始化

为了使用doca-flow编写 PBR 规则,我必须初始化doca-flowdoca-flow-port数据库。此初始化是在使用rte_eal_init初始化硬件后完成的。

我使用doca_flow_init通过配置流和队列计数来初始化doca-flow库。

struct doca_flow_cfg  flow_cfg; 

memset(&flow_cfg, 0, sizeof(flow_cfg)); 
flow_cfg.total_sessions = ZD_DOCA_FLOW_MAX; 
flow_cfg.queues = doca_ctx->nb_cores;  doca_flow_init (&flow_cfg, &err); 

当我使用 DPDK 设置硬件端口时,我必须使用dpdk_port-id将它们安装到doca-flow-port数据库中。

struct doca_flow_port_cfg  port_cfg; 

 memset(&port_cfg, 0, sizeof(port_cfg)); 
port_cfg.port_id = dpdk_port_id; 
port_cfg.type = DOCA_FLOW_PORT_DPDK_BY_ID; 
snprintf(port_id_str, ZD_PORT_STR_MAX, "%u", port_cfg.port_id); 
port_cfg.devargs = port_id_str; 

doca_port =  doca_flow_port_start (&port_cfg, &err);

使用 doca-flow API 编写 PBR 规则

通过一系列用于匹配、动作、转发和监控属性的数据结构来对 DOCA 流进行编程

struct doca_flow_match  match, match_mask; 
struct  doca_flow_actions  actions; 
struct  doca_flow_fwd  fwd; 
struct doca_flow_monitor  monitor;

流匹配

这被指定为匹配和匹配掩码。匹配掩码是可选的,如果未指定,则由doca-flow库自动填充。

memset(&match, 0, sizeof(match)); 
memset(&match_mask, 0, sizeof(match_mask));  

match.out_src_ip.type = DOCA_FLOW_IP4_ADDR; 
match.out_src_ip.ipv4_addr = src_ip; 
match_mask.out_src_ip.ipv4_addr = src_ip_mask; 

match.out_dst_ip.type = DOCA_FLOW_IP4_ADDR; 
match.out_dst_ip.ipv4_addr = dst_ip; 
match_mask.out_src_ip.ipv4_addr = dst_ip_mask; 
 
match.out_l4_type = ip_proto;  
 
match.out_src_port = RTE_BE16 (l4_src_port); 
match_mask.out_src_port = UINT16_MAX; 

match.out_dst_port = RTE_BE16 (l4_dst_port); 
match_mask.out_dst_port = UINT16_MAX; 

我跳过了填充etheth-mask等字段。这是因为doca-flow库可以基于其他匹配字段dst_ipsrc_ip自动将此类字段填充到RTE_ETHER_TYPE_IPV4RTE_ETHER_TYPE_IPV6

流动作

为了路由数据包,我必须将目标 MAC 地址更改为网关( leaf2 ) MAC ,减少 TTL ,并更改源 MAC 地址。这一点最初在上一篇文章中讨论,使用 NVIDIA BlueField DPU 和 DPDK 开发应用程序.

memset(&actions, 0, sizeof(actions));   actions.dec_ttl = true; 
 memcpy(actions.mod_src_mac, uplink_mac, DOCA_ETHER_ADDR_LEN); 
 memcpy(actions.mod_dst_mac, gw_mac, DOCA_ETHER_ADDR_LEN); 

流转发

然后,我将输出端口设置为上行链路。

memset(&fwd, 0, sizeof(fwd)); 
 
fwd.type = DOCA_FLOW_FWD_PORT; 
fwd.port_id = out_port_id; 

流监控

我设置了流量计数器进行故障排除。

memset(&monitor, 0, sizeof(monitor));  monitor.flags |= DOCA_FLOW_MONITOR_COUNT; 

DOCA流管道和入口

流程创建分为两步:

创建流管道。

将流条目添加到流管道。

第一步是为查找阶段创建软件模板。第二步使用模板在硬件中的流进行编程。

当您必须对许多类似的流进行编程时,管道非常有用。对于这种情况,可以设置单个匹配模板(管道),并指示在创建流条目时必须更新哪个匹配字段(例如,第 4 层目标端口)。后续的流条目只需要 填充与管道(第 4 层目标端口)不同的匹配字段。

对于 PBR ,每个流模式都是唯一的,所以我使用已经填充的流属性为每个 PBR 规则创建了一个单独的管道和条目。

struct doca_flow_pipe_cfg  pipe_cfg;  

pipe_cfg.name = "pbr"; 
pipe_cfg.port = in_dport->doca_port; 
pipe_cfg.match = &match; 
pipe_cfg.match_mask = &match_mask; 
pipe_cfg.actions = &actions; 
pipe_cfg.monitor = &monitor; 
pipe_cfg.is_root = true;  

flow_pipe =  doca_flow_create_pipe (&pipe_cfg, &fwd, NULL, &err); 
flow_entry =  doca_flow_pipe_add_entry (0, flow_pipe, &match, &actions, &monitor, &fwd, &err);

流删除

流管道和条目创建 API 返回管道和流指针,这些指针必须被缓存以供后续删除。

 doca_flow_pipe_rm_entry( 0, flow_entry); 
 doca_flow_destroy_pipe (port_id, flow_pipe); 

流统计

在创建流时,我设置了DOCA_FLOW_MONITOR_COUNT标志。我使用doca_flow_query查询了流统计数据。

struct  doca_flow_query query ; 

// hit counters – query.total_pkts and query.total_bytes 
memset(&query, 0, sizeof(query)); 
 doca_flow_query (flow_entry, &query); 

验证硬件加速

FRR-PBR 规则配置和流量生成与dpdk-plugin相同。流量按预期由 DPU 硬件转发,并可使用流计数器进行验证。

root@dpu-arm:~# vtysh -c "show dplane doca pbr flow" 
Rules if pf0vf0 
 Seq 1 pri 300 
 SRC IP Match: 172.20.0.8/32 
 DST IP Match: 172.30.0.8/32 
 IP protocol Match: 17 
 DST Port Match: 53 
 Tableid: 10000 
 Action: nh: 192.168.20.250 intf: p0 
 Action: mac: 00:00:5e:00:01:fa 
 DOCA flow: installed 0xffff28005150 
 DOCA stats: packets 202 bytes 24644 
root@dpu-arm:~# 

还可以使用硬件条目进行验证:

root@dpu-arm:~# ~/mlx_steering_dump/mlx_steering_dump_parser.py -p `pidof zebra` - 
f /tmp/dpdkDump 
domain 0xe294002, table 0xaaab07648b10, matcher 0xffff28012c30, rule 0xffff28014040 
 match: outer_l3_type: 0x1, outer_ip_dst_addr: 172.30.0.8, outer_l4_type: 0x2, metadata_reg_c_0: 0x00030000, outer_l4_dport: 0x0035, outer_ip_src_addr: 172.20.0.8 
 action: MODIFY_HDR(hdr(dec_ip4_ttl)), rewrite index 0x0 & VPORT, num 0xffff & CTR(hits(352), bytes(42944)), index 0x806200

通过使用doca-flow,FRR 现在具有了第二个数据平面插件,可用于 PBR 规则的硬件加速。

程序开发要点

在本系列文章中,您了解了如何使用rte_flow或doca_flow通过四个步骤对 DPU 网络应用程序进行硬件加速:

将 DOCA / DPDK 库链接到应用程序。

初始化硬件。

设置应用程序到硬件端口的映射。

用于引导流量的流编程。

随着越来越多的元素卸载到DPU 上,及源代码行( SLOC )的增加,开发过程可能会变得复杂。而这正是 DOCA 抽象库可以帮助解决的:

DOCA 附带了几个内置库,如doca-dpi、 gRPC 、 Firefly 时间同步等。这些库支持应用程序的快速即插即用。

DOCA 构建(如doca_pipe)使您能够模板化管道,消除样板代码并优化流插入。

即将推出的 DOCA 库,如硬件加速的 LPM (最长前缀匹配),使构建交换机管道变得更容易。这与您在本系列文章中看到的示例应用程序 FRR 尤其相关, FRR 通常用于使用 BGP 构建 LPM 路由表(或 RIB )。

借助 DOCA ,您还可以在融合加速器上的 GPU 和 DPU 上实现令人激动的开发体验。

关于作者

Anuradha Karuppiah 是 NVIDIA 网络的首席软件工程师。 Anuradha 使用 FRR (自由范围路由软件套件)设计和实现 EVPN 解决方案。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    5496

    浏览量

    109102
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    利用NVIDIA Cosmos开放世界基础模型加速物理AI开发

    NVIDIA 最近发布了 NVIDIA Cosmos 开放世界基础模型(WFM)的更新,旨在加速物理 AI 模型的测试与验证数据生成。借助 NVIDIA Omniverse 和 Co
    的头像 发表于 12-01 09:25 508次阅读

    NVIDIA推出全新BlueField-4 DPU

    全新 NVIDIA BlueField DPU 具有 800Gb/s 的吞吐量,其集成的 NVIDIA ConnectX-9 SuperNIC 和 NVIDIA DOCA 微服务为 A
    的头像 发表于 11-03 14:48 599次阅读

    PYQT 应用程序框架及开发工具

    特点,已成为嵌入式领域的重要开发工具 PyQt 是一个创建 GUI 应用程序的工具包。它是 Python 编程语言和 Qt 的成功融合。因为可用的类有很多,他们被分成几个模块。QtCore 模块
    发表于 10-29 07:15

    利用NVIDIA DOCA GPUNetIO技术提升MoE模型推理性能

    在第三届 NVIDIA DPU 中国黑客松竞赛中,我们见证了开发者与 NVIDIA 网络技术的深度碰撞。在 23 支参赛队伍中,有 5 支队伍脱颖而出,展现了在 AI 网络、存储和安全等领域的创新突破。
    的头像 发表于 09-23 15:25 687次阅读

    NVIDIA Omniverse Extension开发秘籍

    NVIDIA Omniverse 是一个模块化平台,使用高级 API 和微服务来构建由 OpenUSD 和 NVIDIA RTX 提供支持的 3D 应用。OpenUSD 功能强大的 3D 框架与 NVIDIA RTX 用于视觉渲
    的头像 发表于 08-22 15:52 3399次阅读
    <b class='flag-5'>NVIDIA</b> Omniverse Extension<b class='flag-5'>开发</b>秘籍

    NVIDIA DOCA 3.0版本的亮点解析

    NVIDIA DOCA 框架已发展成为新一代 AI 基础设施的重要组成部分。从初始版本到备受期待的 NVIDIA DOCA 3.0 发布,每个版本都扩展了
    的头像 发表于 07-04 14:27 962次阅读
    <b class='flag-5'>NVIDIA</b> <b class='flag-5'>DOCA</b> 3.0版本的亮点解析

    第三届NVIDIA DPU黑客松开启报名

    碰撞的绝佳机会。本次竞赛采用开放式主题,参与者将通过 NVIDIA DOCA 软件框架构建创新的加速应用程序,充分挖掘 NVIDIA BlueField DPU 在 AI、网络、存储和
    的头像 发表于 05-27 10:16 744次阅读

    NVIDIA将为每家AI工厂提供网络安全

    NVIDIA DOCA Argus 框架可检测 AI 工作负载中的威胁并对之做出响应,同时与企业安全系统无缝集成,从而提供实时洞察。
    的头像 发表于 05-07 15:11 799次阅读
    <b class='flag-5'>NVIDIA</b>将为每家AI工厂提供网络安全

    MCP:连接AI与应用程序的开放标准!

    作者:算力魔方创始人/英特尔创新大使刘力 扩展AI大模型的方式有两种,第一种是通过训练增强AI大模型自身的能力;第二种是让AI大模型与其它现有的应用程序(例如:数据、浏览器、Gmail等)相互协作
    的头像 发表于 03-21 18:21 1890次阅读
    MCP:连接AI与<b class='flag-5'>应用程序</b>的开放标准!

    AWTK-WEB 快速入门(5) - C 语言 WebSocket 应用程序

    导读WebSocket可以实现双向通信,适合实时通信场景。本文介绍一下使用C语言开发AWTK-WEB应用程序,并用WebSocket与服务器通讯。用AWTKDesigner新建一个应用程序先安装
    的头像 发表于 02-19 11:49 899次阅读
    AWTK-WEB 快速入门(5) - C 语言 WebSocket <b class='flag-5'>应用程序</b>

    基于HPM_SDK_ENV开发应用程序的升级处理

    基于HPM_SDK_ENV开发应用程序的方式HPM_SDK_ENV是先楫半导体MCU的Windows集成开发环境,其包含HPM_SDK,工具链,依赖工具(cmake,ninja,openocd等
    的头像 发表于 02-08 13:38 1447次阅读
    基于HPM_SDK_ENV<b class='flag-5'>开发</b><b class='flag-5'>应用程序</b>的升级处理

    利用NVIDIA DPF引领DPU加速云计算的未来

    越来越多的企业开始采用加速计算,从而满足生成式 AI、5G 电信和主权云的需求。NVIDIA 推出了 DOCA 平台框架(DPF),该框架提供了基础构建模块来释放 NVIDIA BlueField
    的头像 发表于 01-24 09:29 1279次阅读
    利用<b class='flag-5'>NVIDIA</b> DPF引领DPU加速云计算的未来

    AWTK-WEB 快速入门(4) - JS Http 应用程序

    导读XMLHttpRequest改变了Web应用程序与服务器交换数据的方式,fetch是其继任者。本文介绍一下如何使用JS语言开发AWTK-WEB应用程序,并用fetch访问远程数据。用AWTKDesigner新建一个应用程
    的头像 发表于 01-22 11:31 736次阅读
    AWTK-WEB 快速入门(4) - JS Http <b class='flag-5'>应用程序</b>

    从Delphi、C++ Builder和Lazarus连接到MySQL数据

    平台。 基于 MyDAC 的应用程序可以直接连接到 MySQL 服务器或通过 MySQL 客户端工作。MySQL 数据访问组件旨在帮助程序员更快、更轻松地开发 MySQL 数据
    的头像 发表于 01-20 13:47 1329次阅读
    从Delphi、C++ Builder和Lazarus连接到MySQL数据<b class='flag-5'>库</b>

    简述NVIDIA Isaac的重要更新

    在 2025 CES,NVIDIA 宣布了对NVIDIA Isaac的重要更新。NVIDIA Isaac 是一个由加速、应用框架和 AI 模型组成的平台,可加速 AI 机器人的
    的头像 发表于 01-17 09:57 1759次阅读
    简述<b class='flag-5'>NVIDIA</b> Isaac的重要更新