百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

使用 NVIDIA BlueField DPU 和 NVIDIA DOCA 库开发应用程序

qiyuwang 2024-11-22 19:50 39 浏览 0 评论

在这篇文章中,将带您了解 FRR DOCA 数据平面插件的创建过程,并向您展示如何使用全新的 DOCA flow 库卸载 PBR 规则。在上一篇文章中,您了解了使用 DPDK rte_flow 库创建 FRR 数据平面插件,以加速 BlueField 上的 PBR 规则。有关内容,请参见使用 NVIDIA BlueField DPU 和 DPDK 开发应用程序。

向 Zebra 添加 DOCA 数据平面插件

仍然使用 DPDK API 进行硬件初始化,但随后使用 DOCA flow API 来设置数据平面流管道。为此,必须将 DPDK (libdpdk.pc)和 DOCA flow(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 和 DOCA flow 添加了 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 和 DOCA flow 库及 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:~#

DOCA flow 初始化

为了使用 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 流管道和入口

流程创建分为两步:

  1. 创建流管道。
  2. 将流条目添加到流管道。

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

当您必须对许多类似的流进行编程时,管道非常有用。对于这种情况,可以设置单个匹配模板(管道),并指示在创建流条目时必须更新哪个匹配字段(例如,第 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_flowdoca_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 上实现令人激动的开发体验。

图 1. 融合加速器

你准备好让你的应用程序开发达到令人敬仰的高度了吗?报名参加 DOCA 提前进入开发商计划今天开始建设。

有关更多信息,请参阅以下参考资料:

  • 从 DOCA 1.2 起,NVIDIA BlueField DPU 平台将支持零信任安全保障
  • 用 NVIDIA DOCA 1.2 构建零信任安全基础
  • 通过免费的入门课程开始 DOCA 的 DPU 软件开发之旅
  • 白皮书发布:DOCA 简化 DPU 采用,为数据中心部署加速

相关推荐

# 安装打开 ubuntu-22.04.3-LTS 报错 解决方案

#安装打开ubuntu-22.04.3-LTS报错解决方案WslRegisterDistributionfailedwitherror:0x800701bcError:0x80070...

利用阿里云镜像在ubuntu上安装Docker

简介:...

如何将Ubuntu Kylin(优麒麟)19.10系统升级到20.04版本

UbuntuKylin系统使用一段时间后,有新的版本发布,如何将现有的UbuntuKylin系统升级到最新版本?可以通过下面的方法进行升级。1.先查看相关的UbuntuKylin系统版本情况。使...

Ubuntu 16.10内部代号确认为Yakkety Yak

在正式宣布Ubuntu16.04LTS(XenialXerus)的当天,Canonical创始人MarkShuttleworth还非常开心的在个人微博上宣布Ubuntu下个版本16.10的内...

如何在win11的wsl上装ubuntu(怎么在windows上安装ubuntu)

在Windows11的WSL(WindowsSubsystemforLinux)上安装Ubuntu非常简单。以下是详细的步骤:---...

Win11学院:如何在Windows 11上使用WSL安装Ubuntu

IT之家2月18日消息,科技媒体pureinfotech昨日(2月17日)发布博文,介绍了3中简便的方法,让你轻松在Windows11系统中,使用WindowsSubs...

如何查看Linux的IP地址(如何查看Linux的ip地址)

本头条号每天坚持更新原创干货技术文章,欢迎关注本头条号"Linux学习教程",公众号名称“Linux入门学习教程"。...

怎么看电脑系统?(怎么看电脑系统配置)

要查看电脑的操作系统信息,可以按照以下步骤操作,根据不同的操作系统选择对应的方法:一、Windows系统通过系统属性查看右键点击桌面上的“此电脑”(或“我的电脑”)图标,选择“属性”。在打开的...

如何查询 Linux 内核版本?这些命令一定要会!

Linux内核是操作系统的核心,负责管理硬件资源、调度进程、处理系统调用等关键任务。不同的内核版本可能支持不同的硬件特性、提供新的功能,或者修复了已知的安全漏洞。以下是查询内核版本的几个常见场景:...

深度剖析:Linux下查看系统版本与CPU架构

在Linux系统管理、维护以及软件部署的过程中,精准掌握系统版本和CPU架构是极为关键的基础操作。这些信息不仅有助于我们深入了解系统特性、判断软件兼容性,还能为后续的软件安装、性能优化提供重要依据。接...

504 错误代码解析与应对策略(504错误咋解决)

在互联网的使用过程中,用户偶尔会遭遇各种错误提示,其中504错误代码是较为常见的一种。504错误并非意味着网站被屏蔽,它实际上是指服务器在规定时间内未能从上游服务器获取响应,专业术语称为“Ga...

猎聘APP和官网崩了?回应:正对部分职位整改,临时域名可登录

10月12日,有网友反映猎聘网无法打开,猎聘APP无法登录。截至10月14日,仍有网友不断向猎聘官方微博下反映该情况,而猎聘官方微博未发布相关情况说明,只是在微博内对反映该情况的用户进行回复,“抱歉,...

域名解析的原理是什么?域名解析的流程是怎样的?

域名解析是网站正常运行的关键因素,因此网站管理者了解域名解析的原理和流程对于做好域名管理、解决常见解析问题,保障网站的正常运转十分必要。那么域名解析的原理是什么?域名解析的流程是怎样的?接下来,中科三...

Linux无法解析域名的解决办法(linux 不能解析域名)

如果由于误操作,删除了系统原有的dhcp相关设置就无法正常解析域名。  此时,需要手动修改配置文件:  /etc/resolv.conf  将域名解析服务器手动添加到配置文件中  该文件是DNS域名解...

域名劫持是什么?(域名劫持是什么)

域名劫持是互联网攻击的一种方式,通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的地址从而实现用户无法访问目标网站的目的。说的直白些,域名劫持,就是把互...

取消回复欢迎 发表评论: