DPDK VPP简单入门及源码plugin实例分析

2023-10-12 17:20

本文主要是介绍DPDK VPP简单入门及源码plugin实例分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、VPP技术

大多通用操作系统的网络协议栈一直都在内核中实现。其实网络协议栈只是一个应用,而不是操作系统的范畴,没有人规定网络协议栈一定是要早内核实现的。这些操作系统的开发者们将一切和具体业务无关的东西都塞进了操作系统内核。于是出现了pfring/netmap/dpdk等机制,做法是by pass掉内核协议栈,虽然方便,但是性能很差。

所以,通用操作系统参考通信行业将数据面、控制面、管理面分离的做法,把网络协议栈(数据平面)从操作系统剥离出来了,让操作系统去做控制的事情。

当网络协议栈,从内核态转移到用户态之后。很多之前利用内核协议栈做的功能,比如交换、路由、防火墙、NAT等功能,自然也能转到用户态去做。

但是,DPDK框架本身提供的能力还是比较有限的,要使用DPDK实现防火墙等功能,必须重新实现TCP/IP协议栈,确实不是一件容易的事情。

1. FD.io

FD.io (Fast data – Input/Output) 是许多项目和库的一个集合,基于DPDK并逐渐演化,支持在通用硬件平台上部署灵活和可变的业务。FD.io支持多个平台上(x86、ARM和PowerPC)和部署在不同的环境中(裸机、虚拟机和容器)。

FD.io的一个关键项目是VPP(Vector Packet Processing:矢量报文处理)。VPP是高度模块化的项目,新开发的功能模块很容易被集成进VPP,而不影响VPP底层的代码框架。

2. VPP

VPP(Vector Packet Processing,矢量数据包处理)其实就是一个用户态协议栈,也就是一个通用的数据平面。VPP主要有两个功能:框架可扩展;成熟的交换/路由功能

VPP运行于用户空间,支持多种收包方式,常用的是DPDK。通俗来说,*DPDK是lib,VPP是应用*;或者,*VPP用DPDK收包,DPDK是VPP的一个插件*

在这里插入图片描述

二、VPP软件架构

1. 基础架构

VPP软件框架包含基础设施层VPP INFRA、矢量处理库VLIB、网络层VNET、插件集Plugins。(越往核心越底层

在这里插入图片描述
VPP Infra:提供一些基本的通用的功能函数库:包括内存管理、向量操作、hash、timer等;

VLIB:主要提供基本的应用管理库:buffer管理、graph node管理、线程、CLI、trace等;

VNET:提供网络资源能力:比如设备、L2-4功能、session管理、控制管理、流量管理等;

Plugins:主要为实现一些功能,在程序启动的时候加载,一般情况下会在插件中加入一些node节点去实现相关功能。

2. 源码结构

目录名称描述说明
build-data构建元数据
build-root构建输出目录
doxygen文档生成器配置
dpdkDPDK补丁与构建基础设施
src\examplesVPP示例代码
src\pluginsVPP的捆绑插件目录
src\svm共享虚拟内存分配库(shared virtual memory)
src\vlibVPP的应用程序库
src\vlibmemoryVPP内存管理
src\vlibsocketVPP Socket I/O
src\vlib-apiVPP API库
src\vnetVPP网络
src\vppVPP应用程序
src\vpp-apiVPP应用程序API绑定
src\vppinfraVPP核心库
src\tests独立测试(不属于测试套件)
test单元测试和Python测试工具

3. VPP图节点调度

在这里插入图片描述
(1) VPP中的图节点分为四种类型(四种IO机制)

VLIB_NODE_TYPE_INTERNAL:被调用图的内部节点,负责处理数据包。

VLIB_NODE_TYPE_INPUT:收包逻辑节点,每次main loop循环迭代之前都会被调用。

VLIB_NODE_TYPE_PRE_INPUT:调用输入节点之前的图节点,用作例如在处理输入数据包前清空网卡。

VLIB_NODE_TYPE_PROCESS:节点可挂起也可恢复,类似实现了单个线程中的多任务调度机制。

(2) 主要结构体

vlib_node_main_t:图节点柱结构,记录图节点的全局信息。

vlib_node_t:记录图节点的相关静态信息。

vlib_node_runtime_t:图节点调度实际使用的结构体,由vlib_node_t结构体中的信息和私有信息组成。

vlib_frame_t:保存图节点要处理的数据的内存地址信息。

vlib_pending_frame_t:记录运行节点的索引、数据包索引和下一个数据包的索引。

vlib_next_frame_t:记录图节点要处理的下一条的数据。

(3) 图节点调度流程

​ vlib_main_loop函数负责调度图节点。vpp的函数调用更像是一种各个节点之间相互连接,通过决定下一跳节点的路径在确定整个代码的执行路径。同样这种方式的函数调用提供了很低的耦合性,所以基于这种方式的二次开发不用太多考虑各个模块之间的相互影响,自定义的节点根据格式给出相应的回调函数来插入自定义的功能。

三、VPP配置文件

/etc/vpp/startup.cfg:
在这里插入图片描述

四、VPP插件框架

VPP插件的流程“三步走”:

init_plugin ------->> example.c把node加入到链当中
set command ------->> example_node.c
function -------->> example_node.c

1. 插件模板目录结构

此次学习使用的是vpp18.01.2版本,仍然使用makefile形式编译,并未更新至VPP19版本以上使用cmake。
在这里插入图片描述

2. 源码分析

生成模板插件中的部分文件引用了VPP库中几个关键性目录中文件。整个VPP的软件框架主要分为四个层面,依次执行顺序是:VPP Infra -> VLIB -> VNET -> Plugins,所以程序编码中,会以VLIB宏为基础执行,再是VNET相关的宏。

(1) 注册节点:VLIB_REGISTER_NODE

在pktdump_node.c的VLIB_REGISTER_NODE中注册了内部节点ck_sample。

在这里插入图片描述

(2) 节点功能实现函数:VLIB_NODE_FN

在pktdump_node.c,接收数据包并打印输出。
在这里插入图片描述

(3) 注册插件名称以及描述:VLIB_PLUGIN_REGISTER

在pktdump.c的VLIB_PLUGIN_REGISTER中,描述了插件的VPP版本号以及描述等信息。
在这里插入图片描述

(4) 注册节点初始化1:VLIB_INIT_FUNCTION

在pktdump.c的VLIB_INIT_FUNCTION函数中,实例化ck_sample_main_t结构体,赋值各个参数。
在这里插入图片描述

(5) 注册节点初始化2:VNET_FEATURE_INIT

因为VLIB与VNET是层级调用关系,所以在pktdump.c的VNET_FEATURE_INIT初始化,让其在ethernet-input节点运行之前运行。这一步中,将VLIB中定义的功能函数通过.node_name以及.arc_name联系起来。
在这里插入图片描述

(6) 注册节点的CLI命令及激活:VLIB_CLI_COMMAND

通过命令行来触发VLIB_CLI_COMMAND (ck_sample_command, static)事件。
在这里插入图片描述

(7) 流程图归纳

在这里插入图片描述

五、VPP流程概览

在这里插入图片描述

六、VPP数据结构概览

在这里插入图片描述

参考链接:

推荐一个零声学院dpdk免费公开课,个人觉得老师讲得不错,分享给大家:

https://course.0voice.com/v1/course/intro?courseId=4&agentId=0

这篇关于DPDK VPP简单入门及源码plugin实例分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/197298

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re