一、VPP技术
思科开源软件VPP(Vector Packet Processing)技术是一种高性能的网络数据包处理软件,主要用于加速网络数据包的处理和路由。
VPP是由Cisco开发的一个开源项目,主要使用C语言编写。它的特点包括高性能、灵活性、可扩展性和可编程性。VPP可以在非常高的速度下处理数据包,支持多种协议,如IPv4、IPv6、ARP、VLAN、GRE和MPLS等。此外,VPP的模块化设计允许通过添加和删除功能模块来实现灵活的功能扩展,同时提供了丰富的API和工具,使用户能够以编程的方式扩展其功能。
VPP的主要应用场景包括:
1、云计算和数据中心网络:VPP可以与虚拟化和容器化技术结合使用,加速云计算平台中的网络数据包处理。
2、网络功能虚拟化(NFV):VPP可以作为网络功能虚拟化架构中的虚拟网络功能(VNF)组件,使网络功能的部署和管理更加灵活高效。
3、边缘计算和物联网:VPP可以在边缘设备上使用,处理海量的网络数据包,提供高效的边缘计算和物联网应用支持。
4、高性能路由:VPP可以在高性能路由器和交换机中使用,提供高性能、可扩展和可编程的路由功能。
VPP的性能优势主要源于其采用的向量报文处理技术。与传统的标量报文处理相比,向量报文处理采用了“分类”的思想,将一批报文分为一类,用一个图结点表示。这种处理方式可以显著提高处理效率,减少处理延迟,并降低CPU的负载。
总的来说,思科的开源软件VPP技术是一种高性能、灵活、可扩展和可编程的网络数据包处理软件,适用于多种应用场景,包括云计算、NFV、边缘计算和高性能路由等。
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软件框架包含基础设施层VPP INFRA、矢量处理库VLIB、网络层VNET、插件集Plugins。
1、VPP Infra:提供一些基本的通用的功能函数库:包括内存管理、向量操作、hash、timer等;
2、VLIB:主要提供基本的应用管理库:buffer管理、graph node管理、线程、CLI、trace等;
3、VNET:提供网络资源能力:比如设备、L2-4功能、session管理、控制管理、流量管理等;
4、Plugins:主要为实现一些功能,在程序启动的时候加载,一般情况下会在插件中加入一些node节点去实现相关功能。
5、vppInfra:提供一些基本的通用的功能函数库:包括内存管理、向量操作、hash、timer等;
6、VLIB:主要提供基本的应用管理库:buffer管理、graph node管理、线程、CLI、trace等;
7、VNET:提供网络资源能力:比如设备、L2-4功能、session管理、控制管理、流量管理等;
8、Plugins:主要为实现一些功能,在程序启动的时候加载,一般情况下会在插件中加入一些node节点去实现相关功能。
(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
此次学习使用的是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。
在pktdump_node.c,接收数据包并打印输出。
在pktdump.c的VLIB_PLUGIN_REGISTER中,描述了插件的VPP版本号以及描述等信息。
在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联系起来。
通过命令行来触发VLIB_CLI_COMMAND (ck_sample_command, static)事件。
文章摘选自CSDN,作者:当当响
原文链接:
https://blog.csdn.net/zhpCSDN921011/article/details/124661782