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 调用。该表可能如下所示:

const static dpo_vft_t dslite_dpo_vft = {.dv_lock = dslite_dpo_lock,.dv_unlock = dslite_dpo_unlock,.dv_format = format_dslite_dpo,
};

这些字段基本上是为 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相关推荐

  1. FD.io/VPP — VPP Agent — Quickstart

    目录 文章目录 目录 部署架构 安装步骤 安装 ETCD 容器部署 VPP & VPP Agent 编译安装 VPP Agent Managing the VPP Agent etcdctl ...

  2. FD.io/VPP — VPP 的配置与运行

    目录 文章目录 目录 配置 80-vpp.conf startup.conf 可以配置 VPP 的 Threading Modes 运行示例 non-DPDK 模式运行 VPP DPDK 模式运行 V ...

  3. FD.io/VPP — VPP Agent — 架构设计

    目录 文章目录 目录 VPP Agent 的分层架构 KVScheduler VPP plugins VPP Agent 与 VPP Data Plane 的通信机制 VPP Agent 的软件架构 ...

  4. FD.io/VPP — VPP Agent — Telemetry Plugin

    目录 文章目录 目录 Telemetry Plugin Telemetry Config Telemetry REST API Telemetry metrics VPP runtime VPP bu ...

  5. FD.io/VPP — VPP Agent — Overview

    目录 文章目录 目录 VPP Agent VPP Agent 的设计理念 VPP Agent 的功能特性 VPP Agent VPP Agent: https://github.com/ligato/ ...

  6. FD.io/VPP — VPP 的安装部署

    目录 文章目录 目录 源码编译安装 Troubleshooting 问题 1:Errors were encountered while processing 问题 2:NASM is not ins ...

  7. FD.io/VPP — VPP 的软件架构

    目录 文章目录 目录 VPP 的分层架构 VPP INFRA(基础设施层) VLIB(矢量处理库层) VNET(网络协议栈层) Plugins(插件 APP 层) VPP 的软件架构 VPP TLDK ...

  8. FD.io/VPP — VPP 的实现原理解析

    目录 文章目录 目录 VPP 的实现原理 Packet Vector(矢量数据报文) 标量报文处理方式 I-cache miss 问题 矢量数据报文处理方式 标量 v.s. 矢量报文的处理流程 Pac ...

  9. FD.io VPP配置文件详解

    目录 VPP Configuration File - 'startup.conf' Introduction Command-line Arguments Configuration File Co ...

  10. FD.io/VPP — Overview

    目录 文章目录 目录 FD.io VPP FD.io 官网:https://fd.io FD.io(Fast data – Input/Output)是 Linux 基金会下属的一个开源项目,成立于 ...

最新文章

  1. 人工智能从业者应该从哪里去寻找和阅读顶级论文?
  2. 线程的常用方法——currentThread方法||在main方法中直接调用run()方法,没有开启新的线程,以在run方法中的当前线程就是main线程||启动子线程,子线程会调用run方法
  3. 博客园 创始人 杜勇
  4. Oracle单行函数
  5. SpringCloudConfig(了解)
  6. 盲人编程_盲人如何编码
  7. xadmin 显示外键字段
  8. [原创]项目管理知识体系指南之 13项目干系人管理思维导图
  9. 【渝粤题库】陕西师范大学200161 文字学概论 作业
  10. 支付宝网页支付流程与实现
  11. 【ffmpeg】音频采集
  12. 电脑如何实现微信多开
  13. jquery foreach循环
  14. 关于计算机系统的基本组成
  15. 签证官的心思你不懂,所以才会被拒签
  16. 360可以修复服务器系统吗,可以通过360急救箱修复系统
  17. MATLAB遇到问题:错误使用mex的解决办法
  18. vue rsa加密 php解密,Vue项目中的RSA加解密
  19. 给正在排版毕业论文的你:高校毕业论文Latex格式排版模版
  20. canvas制作圆型印章

热门文章

  1. 西宁-青海--茶卡盐湖-敦煌自由行攻略
  2. 若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年时有多少头母牛?
  3. 详细Http状态查询返回 HTTP 状态代码以响应请求
  4. 1001: 植树问题
  5. c语言程序设计作业心得,C语言程序设计实习心得体会
  6. 【数据存储】signed,unsigned到底怎么区分?如何计算?
  7. 【HISI系列】之HISI芯片码率控制使用说明
  8. 小学生c语言入门ppt,C语言入门至精完整版46759.ppt
  9. async和await的用法
  10. 广东户外徒步指南 持续更新