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和相对应位置。
关系图如下:
单向箭头表示被包含,双向表示被引用
插件结构体和feature结构体相对简单,在此不在多说