3. VPP源码分析(graph node(1))
2.1. 与结点相关的结构体
2.1.1. 全局结构体
vlib_main_t:每个线程一份,记录着线程使用到的全局数据信息.
比如:
/* Node graph main structure. */
vlib_node_main_t node_main;/* Command line interface. */
vlib_cli_main_t cli_main;/* Packet trace buffer. */
vlib_trace_main_t trace_main;......
2.1.2. Node相关结构体
vlib_node_t:结点的主结构,包括结点的处理功能函数,名称,结点类型等,主要保存一些相对静态信息
vlib_node_main_t:Node graph相关的全局信息,nodes数组、vlib_next_frame_t、vlib_pending_frame_t等数据
vlib_node_registration_t:注册node结点时使用,保存结点业务逻辑的函数地址,结点类型,结点状态,结点名称等
vlib_node_runtime_t:实际在调度node过程中使用的结构,主要记录在处理过程中的信息变动
vlib_frame_t:每个node都有一个对应的vlib_frame_t,用来保存供node使用的数据集合(标量、矢量)
vlib_next_frame_t:主要是node内部逻辑使用,用于定位该node的下一结点所对应的frame地址
vlib_pending_frame_t:当一个node处理完数据包,则填充该待处理帧管理表数据结,调度框架便能在下一次调度时找到需要接收该数据包的下一个node
2.2. vlib_node_type_t
VLIB_NODE_TYPE_INTERNAL
/* An internal node on the call graph (could be output).
Internal nodes (including output nodes) move data from node to node (or out of the graph for output nodes). */VLIB_NODE_TYPE_INPUT
/* Nodes which input data into the processing graph.
Input nodes are called for each iteration of main loop. */VLIB_NODE![1](https://yqfile.alicdn.com/de8130d739704d7c949da6337f99d6d070e55b4f.png)
_TYPE_PRE_INPUT
/* Nodes to be called before all input nodes.
Used, for example, to clean out driver TX rings before processing input. */VLIB_NODE_TYPE_PROCESS/* "Process" nodes which can be suspended and later resumed.A lightweight cooperative multi-tasking thread model. Context switching costs a setjmp/longjump pair. */
2.2.1. VLIB_NODE_TYPE_INPUT结点
以dpdk-input结点为例:
2.2.1.1. dpdk burst收包
DPDK收到的数据包保存在rte_mbuf中,通过rx_vectors按queue_id进行索引。
dpdk_rx_burst将返回收到的包个数n_buffers。
2.2.1.2. 得到to_next指针
to_next指针指向下一结点frame的起始vector地址,用于存放数据包的索引值。
该宏主要调用以下两个函数:
nf = vlib_node_runtime_get_next_frame(vm, node, next_index);
f = vlib_get_frame(vm, nf->frame_index);
首先,在vlib_node_runtime_t node中的next_frames数组中根据next_index找到下一结点相关的vlib_next_frame_t信息。
找到vlib_next_frame_t后,便可从其中保存的frame_index域找到下一结点对应的vlib_frame_t _f结构体。
并通过计算:
u32 _n = _f->n_vectors;
(to_next) = vlib_frame_vector_args(_f) + _n * sizeof ((to_next)[0]);
返回未使用的vector的起始地址
2.2.1.3. 从DPDK rte_mbuf到vlib_buffer_t
为了方便管理,VPP自定义了vlib_buffer_t类型的缓冲区,其与rte_mbuf的关系如下:
#define MBUF_SIZE (2048 + sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
vlib_buffer_t存放在rte_mbuf的headroom中,通过此方法将DPDK与VPP的内存管理机制管理起来
- 从xd->rx_vectors得到rte_mbuf指针后,vlib_buffer_from_rte_mbuf再换算成vlib_buffer指针
- 使用vlib_get_buffer_index函数得到每个vlib_buffer指针相对于buffer_mem_start的offset值
即作了归一化后的包索引值,将指针值表示成索引值
这些包索引值将保存在to_next所指向的next_frame中的vector中
2.2.1.4. 验证处理结果
vlib_validate_buffer_enqueue_x1(vm, node, next_index, to_next, n_left_to_next, bi0, next0);
当next0 != next_index时,说明该包被正确处理,该宏将do nothing
否则,说明本来该包应去next_index但是发生错误,使得next0 != next_index。该宏会将该错误包索引pi0发往到next0实际的下一个结点
2.2.1.5. vlib_pending_frame_t的添加
完成包处理后下一结点的frame已填充好包索引信息,说明可以进行调度处理需要添加到vlib_pending_frame_t待处理帧管理表中
vlib_put_next_frame(vm, node, next_index, n_left_to_next);
主要登记的信息包括:
下一结点frame索引、下一结点runtime_index、下一结点next_frame_index
3. VPP源码分析(graph node(1))相关推荐
- 6 VPP源码分析 (VPP中的多线程)
VPP支持多线程模式,其中区分为main线程和worker线程,这两种线程都运行vlib_main_or_worker_loop函数作为线程主函数,主要区别在于执行时的is_main参数. 主线程可以 ...
- elasticSearch6源码分析(7)node
1.node概述 Any time that you start an instance of Elasticsearch, you are starting a node. A collection ...
- JUC AQS ReentrantLock源码分析
Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还 ...
- HashMap源码分析
文章目录 简介 继承关系 存储结构 源码分析 属性 Node节点 TreeNode HashMap 构造方法 put 添加方法 待更新 简介 在我们使用数据存储的时候都会有数据结构这种东西,但是传统的 ...
- 深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)
events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中 ...
- Kubernetes Node Controller源码分析之配置篇
2019独角兽企业重金招聘Python工程师标准>>> Author: xidianwangtao@gmail.com Kubernetes Node Controller源码分析之 ...
- Django源码分析7:migrate命令的浅析
django源码分析 本文环境python3.5.2,django1.10.x系列 django源码分析-migrate命令分析 Django项目中提供了,通过migrations操作数据库的结构的命 ...
- celery源码分析-wroker初始化分析(上)
celery源码分析 本文环境python3.5.2,celery4.0.2,django1.10.x系列 celery与Django的配合使用 首先,在安装有django的环境中创建一个django ...
- celery源码分析:multi命令分析
celery源码分析 本文环境python3.5.2,celery4.0.2,django1.10.x系列 celery简介 celery是一款异步任务框架,基于AMQP协议的任务调度框架.使用的场景 ...
最新文章
- 让VB菜鸟最快写出自己的外挂.通杀所有游戏
- 深度剖析Kubernetes API Server三部曲 - part 1
- Android性能优化
- 基于 Java NIO 实现简单的 HTTP 服务器
- tensorflow神经网络结构可视化
- 真人拳皇项目第六次Scrum总结——史经浩
- C++ function bind以及lamda表达式
- breakcontinue
- python 循环语句 for while range
- C语言 位段(位域)总结
- 当post 的字段很多,post的字段并不完全修改(有的值是前端input的值,有的任保留原来原来数据库的值),...
- AngularJs(Part 3)--注册服务
- supervisor来管理和监控进程
- Tomcat下ajax请求路径总结
- 基于单片机的人体心率脉搏检测系统
- Java代理模式——CGLIB动态代理
- HAL库的学习 ——FLASH的使用
- 自动驾驶是一门怎样的生意?盘点5家创业公司商业落地的3条逻辑...
- iOS开发——设置支持的iOS设备(512m内存以上设备)
- android 动态更改主题,Android应用动态修改主题的方法示例
热门文章
- win10风格美化以及新建系统后优化
- 喜欢熬夜的人注意!出现3大迹象时,说明身体极度危险!
- php urledcode_php慎用urldecode函数
- pg 定时删除_定时删除网站文件
- linux安装运行jmeter,Linux下安装运行Jmeter程序
- mysql密码登陆过程_mysql单实例忘记密码如何登陆过程
- css flex布局 padding,css三栏布局的三种实现方式(圣杯布局、双飞翼布局、Flex布局)...
- 检测鼠标是否双击_Rhino细分建模分享 Part3 鼠标简易结构设计
- python读取压缩文件的指定后缀的文件_python打包压缩、读取指定目录下的指定类型文件...
- 大学计算机实验报告2,大学计算机基础实验报告2.doc