VPP 源码学习总结

news2024/11/20 10:20:41

当我们在VPP/plugins目录下注册了自己的node后, 肯定有一个node.func(), 那这个函数是如何执行到的呢:

1. 首先我们要看一下这个插件注册的时候做了什么, 假设node 如下:

编译成功后, 我们可以从函数vlib_plugin_early_init() 中分析, 初始化时,怎么把这个node加到全局链表中的。

TODO: 大概就是, 在so 目录下去遍历所有so文件,根据注册的名字用头插法把相关node 加入链表中, 并为其分配相关的维护逻辑。

2. vpp初始化的前两步把插件,加载完了(维护起来了), 那下边我们看下VPP是怎么在后台一直去轮询的呢? 

由于亿图脑图目前不能保存,节点限制, 先把已经总结放这里(新标签中打开图片可以放大)。

下图主要以vpp的main()为入口,学习vpp如果调用我注册的node的处理函数的。

前边马上就要找到调用我们注册的node了, 下边我们看一下dispatch_node()函数。

在调用的地方我们要注意框起来的这两个参数:

因为我们注册的NODE是VLIB_NODE_TYPE_INTERNAL类型的, 这里就是了, 我们看下dispatch_node()源码:

static_always_inline u64
dispatch_node (vlib_main_t * vm,
	       vlib_node_runtime_t * node,
	       vlib_node_type_t type,     // internal 类型的
	       vlib_node_state_t dispatch_state,   // polling 状态 的。
	       vlib_frame_t * frame, u64 last_time_stamp)
{
  uword n, v;
  u64 t;
  vlib_node_main_t *nm = &vm->node_main;
  vlib_next_frame_t *nf;

  if (CLIB_DEBUG > 0)
    {
      vlib_node_t *n = vlib_get_node (vm, node->node_index);
      ASSERT (n->type == type);
    }

  /* Only non-internal nodes may be disabled. */
  if (type != VLIB_NODE_TYPE_INTERNAL && node->state != dispatch_state)
    {
      ASSERT (type != VLIB_NODE_TYPE_INTERNAL);
      return last_time_stamp;
    }

  if ((type == VLIB_NODE_TYPE_PRE_INPUT || type == VLIB_NODE_TYPE_INPUT) // 这里些时进不来
      && dispatch_state != VLIB_NODE_STATE_INTERRUPT)
    {
      u32 c = node->input_main_loops_per_call;
      /* Only call node when count reaches zero. */
      if (c)
	{
	  node->input_main_loops_per_call = c - 1;
	  return last_time_stamp;
	}
    }

  /* Speculatively prefetch next frames. */
  if (node->n_next_nodes > 0) // 这里是预取, 先不用管
    {
      nf = vec_elt_at_index (nm->next_frames, node->next_frame_index);
      CLIB_PREFETCH (nf, 4 * sizeof (nf[0]), WRITE);
    }

  vm->cpu_time_last_node_dispatch = last_time_stamp;

  if (1 /* || vm->thread_index == node->thread_index */ ) // 这里一定能进来。
    {
      vlib_main_t *stat_vm;

      stat_vm = /* vlib_mains ? vlib_mains[0] : */ vm;

      vlib_elog_main_loop_event (vm, node->node_index, 
				 last_time_stamp,
				 frame ? frame->n_vectors : 0,
				 /* is_after */ 0);

      /*
       * Turn this on if you run into
       * "bad monkey" contexts, and you want to know exactly
       * which nodes they've visited... See ixge.c...
       */
      if (VLIB_BUFFER_TRACE_TRAJECTORY && frame) // 这里前宏没有定义 , 进不来
	{
	  int i;
	  u32 *from;
	  from = vlib_frame_vector_args (frame);
	  for (i = 0; i < frame->n_vectors; i++)
	    {
	      vlib_buffer_t *b = vlib_get_buffer (vm, from[i]);
	      add_trajectory_trace (b, node->node_index);
	    }
	  n = node->function (vm, node, frame); 
	}
      else // 最后走到了这里。
	n = node->function (vm, node, frame);  // 这里调用的我们加的internal node的执行函数。

    /* 因为上层调用的时候 , 是处理所有的internal类型的node, 这里的node 就包含了我们注册的
Node.  node->function () 就是调用的我们注册的函数 yb_sample_node_fn() , 上层调用是一个
while() 循环, 所以这些node会一直在后台循环处理, 这样只要有包到我们这个node,
 就会添加进调度链表,并进行处理。*/

从这个流程上, 就大概知道我们注册的node是如何被调用起来的了。 以后有更多的细节要学习, 可以根据这个流程去找具体的实现逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1624222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu20.04开机运行java的sh脚本

用到了 rc.local 1、修改 /usr/lib/systemd/system/rc-local.service 在最下面添加 [Install] WantedBymulti-user.target 2、 系统没有 rc.local&#xff0c;需要手动创建 cd /etc vi rc.local在里面写入 /opt/start.sh chmod x /etc/rc.local # 添加可执行权限 chmod x…

三分钟设计自己的工厂!基于昇腾AI处理器昇思MindSpore打造的智能化工大模型为化工研发效率带来10+倍提升

前言&#xff1a;华为与大连化物所深度合作&#xff0c;联合推出智能化工大模型&#xff0c;AI赋能化工领域&#xff0c;拥抱科学创新&#xff0c;提供了数据驱动化工研发的新范式。 2024年3月22日&#xff0c;在北京国家会议中心召开的昇思人工智能框架峰会上发布了由华为AI4…

mysql的约束和表关系

根据查询的结果&#xff0c;复制出一个新表 create table newTable AS select * from oldTable; create table newPeople AS select * from day2_test.people; 约束 引入&#xff1a;如果某一列如id列&#xff0c;有重复的数据&#xff0c;无法准确定位&#xff0c;有的列有空…

【JVM】java内存区域

目录 一、运行时数据区域 1、方法区 2、堆 3、虚拟机栈 4、本地方法栈 5、程序计数器 6、运行时常量池 二、HotSpot虚拟机的对象 1、对象的创建 指针碰撞&#xff1a; 空闲列表&#xff1a; 2、对象的内存布局 对象头 实例数据 对齐填充 3、对象的访问定位 句…

SNETCracker--超级弱口令检查工具简介

一、简介 SNETCracker 超级弱口令检查工具是一款Windows平台的弱口令审计工具&#xff0c;支持批量多线程检查&#xff0c;可快速发现弱密码、弱口令账号&#xff0c;密码支持和用户名结合进行检查&#xff0c;大大提高成功率&#xff0c;支持自定义服务端口和字典。 二、SNE…

C++认知

如何成为一名合格的C/C开发者 C/C 的当前应用领域 C 的应用领域目前有三大类&#xff0c;第一类就是我们目前见到的各种桌面应用软件&#xff0c;尤其 Windows 桌面软件&#xff0c;如 QQ、安全类杀毒类软件&#xff08;如金山的安全卫士&#xff0c;已开源&#xff0c;其代码…

点燃营销力量!利用淘宝商品关键词搜索电商API接口引爆销售

随着电子商务的快速发展&#xff0c;利用API接口引爆销售已成为许多企业的关键策略。淘宝作为中国最大的电商平台&#xff0c;其商品关键词搜索API接口极具潜力。联讯数据将详细介绍淘宝商品关键词搜索电商API接口的功能与应用&#xff0c;并探讨如何通过该接口点燃营销力量&am…

队列的实现(c语言实现)

队列的定义 队列&#xff08;Queue&#xff09;是一种特殊的线性数据结构&#xff0c;它遵循先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的原则。这意味着最早被添加到队列中的元素将是最先被移除的元素。队列的主要操作包括入队&#xff08;enqueue…

openGauss学习笔记-271 openGauss性能调优-TPCC性能调优测试指导-测试MOT-TPCC性能

文章目录 openGauss学习笔记-271 openGauss性能调优-TPCC性能调优测试指导-测试MOT-TPCC性能271.1 TPC-C简介271.2 系统级优化271.3 BenchmarkSQL&#xff1a;开源TPC-C工具271.4 运行基准271.5 结果报告 openGauss学习笔记-271 openGauss性能调优-TPCC性能调优测试指导-测试MO…

Apifox接口调试工具

1、Apifox简介 Apifox 是集 API 文档、API 调试、API Mock、API 自动化测试多项实用功能为一体的 API 管理平台&#xff0c;定位为 Postman Swagger Mock JMeter。旨在通过一套系统、一份数据&#xff0c;解决多个工具之间的数据同步问题。只需在 Apifox 中定义 API 文档&a…

【题解】牛客挑战赛 71 - A 和的期望

原题链接 https://ac.nowcoder.com/acm/problem/264714 思路分析 快速幂求逆元 费马小定理&#xff1a; a MOD − 1 ≡ 1 ( m o d M O D ) a^{\text{MOD}-1} \equiv 1 \pmod{MOD} aMOD−1≡1(modMOD)&#xff0c;可以转换为 a ⋅ a MOD − 2 ≡ 1 ( m o d M O D ) ① a \cd…

部署zabbix代理服务器

一、准备环境 1.1 关闭防火墙 二、代理服务器 2.1 设置zabbix下载源 2.2 编辑resolv配置文件&#xff0c;加入本机IP 2.3 安装zabbix数据库 2.4 开机自启服务&#xff0c;mysql重定义 2.5 添加数据库用户以及zabbix数据库信息 2.6 导入数据库 2.7 编辑zabbix配置文件 vim /etc/…

【文章转载】Lance Martin的关于RAG的笔记

转载自微博黄建同学 从头开始学习 RAG&#xff0c;看Lance Martin的这篇笔记就行了&#xff0c;包含了十几篇论文和开源实现&#xff01; —— 这是一组简短的&#xff08;5-10 分钟视频&#xff09;和笔记&#xff0c;解释了我最喜欢的十几篇 RAG 论文。我自己尝试实现每个想…

开源协议与商业许可:选择与遵循

文章目录 开源协议MIT许可证&#xff08;MIT License&#xff09;BSD许可证&#xff08;BSD License&#xff09;Apache许可证 2.0&#xff08;Apache License 2.0&#xff09;GNU宽松通用公共许可证&#xff08;GNU Lesser General Public License&#xff0c;LGPL&#xff09…

线上论坛自动化测试

文章目录 前言一、测试用例设计二、自动化测试1.登录功能2.注册功能3.发布帖子4.删除帖子5.修改帖子6.帖子详情7.个人中心8.通过suite套件总测试 前言 对论坛项目进行测试用例编写&#xff0c;通过 Selenium JUnit 单元测试框架对项目的功能进行自动化测试。 论坛项目的部分…

Hive主要介绍

Hive介绍 hive是基于 Hadoop平台操作 HDFS 文件的插件工具 可以将结构化的数据文件映射为一张数据库表 可以将 HQL 语句转换为 MapReduce 程序 1.hive 是由驱动器组成&#xff0c;驱动器主要由4个组件组成&#xff08;解析器、编译器、优化器、执行器&#xff09; 2.hive本身不…

CHARLS轻松发二区,只用了COX回归模型 | CHARLS CLHLS CFPS 公共数据库周报(4.3)...

零基础CHARLS发论文&#xff0c;不容错过&#xff01; 长期回放更新指导&#xff01;适合零基础&#xff0c;毕业论文&#xff0c;赠送2011-2020年CHARLS清洗后的数据全套代码&#xff01; CHARLS公共数据库 CHARLS数据库简介中国健康与养老追踪调查(China Health and Retireme…

揭秘神器:智能私信破局获客难!

在数字营销的海洋中&#xff0c;每个企业都如同一艘努力航行的船&#xff0c;希望能在广阔的客户蓝海中获得丰收。然而&#xff0c;现实却往往充满挑战&#xff0c;尤其是当面对如何吸引并维系客户这一核心难题时。传统的获客手段逐渐显得力不从心&#xff0c;而智能科技的介入…

项目十一:爬取热搜榜(小白实战级)

首先&#xff0c;恭喜各位也恭喜自已学习爬虫基础到达圆满级&#xff0c;今后的自已python爬虫之旅会随着网络发展而不断进步。回想起来&#xff0c;我学过请求库requests模块、解析库re模块、lmxl模块到数据保存的基本应用方法&#xff0c;这一次的学习python爬虫之旅收获很多…

三 SpringMVC返回数据以及RESTFul设计标准

SpringMVC返回数据 一 控制页面跳转 1.1 快速使用 开发模式回顾在 Web 开发中&#xff0c;有两种主要的开发模式&#xff1a;前后端分离和混合开发。前后端分离模式&#xff1a;[重点]指将前端的界面和后端的业务逻辑通过接口分离开发的一种方式。开发人员使用不同的技术栈和…