VPP主要结构体

从今天开始,主要从VPP代码层面分析VPP的结构,因为刚开始分析,难免有不准确的地方,希望各位大拿能提出指正

全局结构体

vlib_main_t:

记录全局信息,比如一些统计数据,Node Graph,命令行接口,注册的functions,是整个VPP的入口

Node Graph相关结构体

主要用于记录node graph相关信息

vlib_node_main_t:

节点图主结构,记录全局节点图的数据信息

 

vlib_node_t:

单个节点的主结构,包括节点的处理功能函数,名称,节点类型等,主要保存一些相对静态信息

 

vlib_node_registration_t:

注册node节点时使用,保存节点业务逻辑的函数地址,节点类型,节点状态,节点名称等

 

vlib_node_runtime_t

实际在调度node过程中使用的结构,主要记录在处理过程中的信息变动

 

vlib_frame_t:

保存每个node对应的要处理的数据的内存地址信息

 

vlib_pending_frame_t
记录运行节点的索引,数据包索引,以及下一个数据包的索引

vlib_next_frame_t

主要用于获取node要处理的吓一跳数据

插件结构体

插件主要是结合一些节点信息为实现一些业务功能提供的

以下介绍的插件主要用于在VPP启动时静态加载的,还要动态加载的plugin结构体,后续文章会介绍

Plugin_main_t(在/src/lib/unix目录)

用于记录全局所有静态插件信息,如:插件路径,插件信息,依赖的全局节点图信息等,在VPP启动加载插件时使用

 

Plugin_config_t

记录单个插件配置状态信息

 

Plugin_info_t

记录插件的信息:包括名字,文件名等,主要用于在VPP启动时加载插件动态库

 

Feature结构体

Feature和插件的关系:

插件是结合一些节点信息提供业务功能,在VPP启动时通过加载动态so库来加载

Feature是在VPP启动时通过INIT链表进行加载

在VPP的实现中,每个feature包含一个node,每个node归属于一个ARC的集合

通过feature和插件方式,可以实现不改变源代码,在VPP中动态加载业务节点

 

vnet_feature_main_t

Feature的主结构体,包含注册的ARC和feature列表等

 

vnet_feature_arc_registration_t

arc中的feature按照代码指定的顺序串接起来。arc结构将记录这组feature的起始node和结束node。系统初始化时完成每个feature的连接

 

vnet_feature_registration_t

feature结构体,一个feature包含一个node,通过该结构体指定node和归属的arc和相对应位置。

关系图如下:

单向箭头表示被包含,双向表示被引用

VPP 软件架构 vpp架构详解_FD.io

插件结构体和feature结构体相对简单,在此不在多说