【VPP】 VPP之DPO
DPO,DATA PATH OBJECTS 数据路径对象,表示通过 VPP 的数据路径切换对数据包时所应用的操作。这意味着可以创建和操作的值(通过dpo_id_t的实例),并且具有某些行为(即,它具有执行某些操作的专门方法或函数)。
FIB 的工作是维护转发信息,以便交换机知道在哪个接口上转发数据包。使用 DPO,可以在 FIB 中添加条目,告诉 VPP 通过DPO将 数据包转发到选择的 VPP 节点。
1. DPO API
使用 DPO 的典型模式是首先创建自己的 DPO 类型,然后创建要与该类型一起使用的 DPO 函数的 API。该 API 的第一部分是用于创建 DPO 实例的构造函数,例如 xxxx_dpo_create:
dpo_type_t xxx_dpo_type;
void xxx_dpo_create (dpo_proto_t dproto, index_t aftr_index, dpo_id_t * dpo)
{
dpo_set (dpo, xxx_dpo_type, dproto, aftr_index);
}
dpo_set 函数采用协议常量,index_t 和dpo_id_t(标识特定DPO的结构)。如果需要也可以直接传入 xxx_dpo_type 来直接使用dpo_set。
构造函数采用一些参数,即要使用的协议,DPO的索引和要初始化的DPO的指针。
- DPO可以专门用于处理具有特定协议的数据包,因为您对它们执行的操作是专门的,并且
- DPO可以与多种协议类型一起使用,例如IPv4和IPv6。
还可以根据匹配的协议将数据包发送到不同的节点。这是通过 API 代码中的一些其他数据结构设置的,如下所示:
const static char *const xxx_ip4_nodes[] = {"xxx-encap",NULL,
};const static char *const xxx_ip6_nodes[] = {"xxx-decap",NULL,
};const static char *const *const xxx_nodes[DPO_PROTO_NUM] = {[DPO_PROTO_IP4] = xxx_ip4_nodes,[DPO_PROTO_IP6] = xxx_ip6_nodes,[DPO_PROTO_MPLS] = NULL
};
上面的代码基本上构造了一个表,将 DPO 协议映射到节点名称的数组。 该表并不一定要详尽(相对于DPO使用的所有协议),但是它应该涵盖您要与特定 DPO 类型一起使用的任何协议。
通过调用 dpo_register_new_type 函数,实际上为映射中指定的节点注册了 DPO 类型:
void xxx_dpo_module_init (void)
{
xxx_dpo_type = dpo_register_new_type (&xxx_dpo_vft, xxx_nodes);
}
如果编写自己的 DPO API,则需要在 VPP 插件的初始化代码中注册新的 DPO 类型。
在定义 DPO API 时,还定义了一个虚拟函数表结构(dpo_vft_t),该结构传递给上面显示的 dpo_register_new_type 调用。该表可能如下所示:
|
这些字段基本上是为 DPO 类型实现的方法。
2. 在转发中使用DPO
定义 DPO 类型和 API 后,就可以使用它来将数据包转发到 VPP 节点。为了将 DPO 挂接到 FIB,从而可以将数据包切换到节点,需要在插件代码中构造一个 DPO 实例,然后调用注册 FIB 条目的函数。
/* FIB prefix data structure, used below */
fib_prefix_t pfx = {
.fp_proto = FIB_PROTOCOL_IP6,
.fp_len = 128,
.fp_addr.ip6.as_u64[0] = addr->as_u64[0],
.fp_addr.ip6.as_u64[1] = addr->as_u64[1],
};
/* register FIB entry for DPO */
fib_table_entry_special_dpo_add (0,&pfx,/* if you're writing a plugin you use this,some other DPO code uses other constants */FIB_SOURCE_PLUGIN_HI,FIB_ENTRY_FLAG_EXCLUSIVE,&dpo);
- 构造一个DPO并将其放在dpo变量中,
- 声明用于交换的FIB前缀(fib_prefix_t)(可以是IP地址或MPLS标签),以及
- 使用DPO和FIB前缀将条目添加到FIB。
添加了该信息后,FIB 可以开始将数据包切换到 DPO 中指定的节点(在本例中为xxx-decap)。当数据包到达您的节点时,将像在您编写的任何其他 VPP 节点中一样对它们进行处理。
【VPP】 VPP之DPO相关推荐
- FD.io/VPP — VPP Agent — Quickstart
目录 文章目录 目录 部署架构 安装步骤 安装 ETCD 容器部署 VPP & VPP Agent 编译安装 VPP Agent Managing the VPP Agent etcdctl ...
- FD.io/VPP — VPP 的配置与运行
目录 文章目录 目录 配置 80-vpp.conf startup.conf 可以配置 VPP 的 Threading Modes 运行示例 non-DPDK 模式运行 VPP DPDK 模式运行 V ...
- FD.io/VPP — VPP Agent — 架构设计
目录 文章目录 目录 VPP Agent 的分层架构 KVScheduler VPP plugins VPP Agent 与 VPP Data Plane 的通信机制 VPP Agent 的软件架构 ...
- FD.io/VPP — VPP Agent — Telemetry Plugin
目录 文章目录 目录 Telemetry Plugin Telemetry Config Telemetry REST API Telemetry metrics VPP runtime VPP bu ...
- FD.io/VPP — VPP Agent — Overview
目录 文章目录 目录 VPP Agent VPP Agent 的设计理念 VPP Agent 的功能特性 VPP Agent VPP Agent: https://github.com/ligato/ ...
- FD.io/VPP — VPP 的安装部署
目录 文章目录 目录 源码编译安装 Troubleshooting 问题 1:Errors were encountered while processing 问题 2:NASM is not ins ...
- FD.io/VPP — VPP 的软件架构
目录 文章目录 目录 VPP 的分层架构 VPP INFRA(基础设施层) VLIB(矢量处理库层) VNET(网络协议栈层) Plugins(插件 APP 层) VPP 的软件架构 VPP TLDK ...
- FD.io/VPP — VPP 的实现原理解析
目录 文章目录 目录 VPP 的实现原理 Packet Vector(矢量数据报文) 标量报文处理方式 I-cache miss 问题 矢量数据报文处理方式 标量 v.s. 矢量报文的处理流程 Pac ...
- FD.io VPP配置文件详解
目录 VPP Configuration File - 'startup.conf' Introduction Command-line Arguments Configuration File Co ...
- FD.io/VPP — Overview
目录 文章目录 目录 FD.io VPP FD.io 官网:https://fd.io FD.io(Fast data – Input/Output)是 Linux 基金会下属的一个开源项目,成立于 ...
最新文章
- 人工智能从业者应该从哪里去寻找和阅读顶级论文?
- 线程的常用方法——currentThread方法||在main方法中直接调用run()方法,没有开启新的线程,以在run方法中的当前线程就是main线程||启动子线程,子线程会调用run方法
- 博客园 创始人 杜勇
- Oracle单行函数
- SpringCloudConfig(了解)
- 盲人编程_盲人如何编码
- xadmin 显示外键字段
- [原创]项目管理知识体系指南之 13项目干系人管理思维导图
- 【渝粤题库】陕西师范大学200161 文字学概论 作业
- 支付宝网页支付流程与实现
- 【ffmpeg】音频采集
- 电脑如何实现微信多开
- jquery foreach循环
- 关于计算机系统的基本组成
- 签证官的心思你不懂,所以才会被拒签
- 360可以修复服务器系统吗,可以通过360急救箱修复系统
- MATLAB遇到问题:错误使用mex的解决办法
- vue rsa加密 php解密,Vue项目中的RSA加解密
- 给正在排版毕业论文的你:高校毕业论文Latex格式排版模版
- canvas制作圆型印章