网上看了别人写的feature机制介绍,感觉一头雾水,果然要想理解还是要自己通过代码

下面谈谈我对feature机制的理解,主要还是介绍我使用feature的经验

在了解feature之前,需要先明白vpp的node是如何工作的

创建一个plugins 名字为testdual

通过node.c文件可以看到,该插件注册了一个node

.n_next_nodes的值表示当前节点的下一个节点有多少个

.next_nodes表示下一个节点的候选项

接着分析数据包在node.c里面是如何转发数据包的

vpp里面通过这种赋值的方式设置数据包转发的下一个节点,这里在VPPnode节点分析里写的很清楚,建议看明白

上面这种属于vpp在初始化的时候会根据注册节点的说明给节点之间的关系建立连接,属于静态的

既然是静态的,就表示node之间的连接是固定,不够灵活,为了解决node节点的灵活穿插,引入了feature机制

当然从思想上也很好理解,数据包是在内存池里的,node使用的只是指向数据包的指针,数据包在不同node之间转发本质上也是把数据包的指针存放到不同node的frame里,无论是feature还是直接在注册node时指定下一个node本质上都是记录下当前node的下一个node有哪些候选项

下面来看看feature机制如何实现的

1.首先提出一个问题,上面注册的node只表明了下一个node是什么,那么它的上一个node是谁呢?

在生成的代码 testdual.c 中

这里是注册了一个feature

.arc_name表示该feature属于哪个arc,arc的概念相当于一个group,里面有多个feature

.node_name表示该feature控制的node

.runs_before表示testdual这个node的优先级比ethernet-input高

另外还有个.runs_after 表示比某个node优先级低,为什么要有优先级后面讲

这里来看一下testdual节点未enable时device-input节点的下一个节点有哪些

device-input表示数据包收到后起始node

可以看到图中没有testdual节点

接着enable testdual节点

可以的看到testdual被加入到了device-input节点后面

2.vpp是怎么实现把testdual加入到device-input节点后面的?

前面已经提到注册了feature

我们来看看 testdual enable-disable local0这个命令做了什么

调用了testdual_enable_disable_command_fn函数

可以看出通过vnet_feature_enable_disable函数把上面注册的feature使能,testdual节点才会挂载到device-input节点后面去

3.vnet_feature_enable_disable函数做了什么?

函数第一个参数是arc的name,第二个参数是node的name,第三个参数是网卡的index,第四个参数是enable or disable

通过这个函数控制feature是否生效

这里为什么要有sw_if_index呢?

feature机制有些特殊,假如有两个网卡A和B,如果feature只enable了网卡A,那么B网卡收的包不会根据feature机制进行

device-input明明是node的name这里为什么是arc的name?

通过vpp源码src/vnet/devices/devices.c

arc也是需要创建的,同时需要指明起始node和终止node

4.feature为什么要指明顺序?

feature注册里面为什么会有.runs_before和.runs_after

我们再创建一个插件testqs,同时把它也enable

可以看到testdual和testqs节点都在device-input

问题来了,如果数据包到达device-input节点,那么它是转发给testdual节点呢还是testqs节点呢

这里就牵涉到同一个arc中feature的优先级了

我们可以通过命令 show features verbose看看

可以看出 在arc device-input中,testqs的优先级比testdual优先级高

如果我想testdual在testqs前面怎么办呢

修改代码,在testdual feature的注册中修改为

可以看到

当然也可以在testqs节点注册feature的地方改

关于feature的排序问题,通过before和after把同一个arc内的feature按照自己想要的顺序依次排列,再通过show features verbose查看是否跟预期一致

5.如何把testdual节点变成feature节点

这里会有疑惑,这个问题是什么意思

上面虽然注册了feature,也通过命令把testdual节点添加到了device-input节点后面,但是如果添加一个节点testqs通过feature把testqs排在testdual节点后面,经过测试会发现数据包走到testdual节点后仍然送到了interface-output节点,而不是testqs节点

这里涉及到了feature机制的本质,feature本质上是在原来静态连接node的关系下,把feature注册的那个节点根据排序添加到某个节点的后面,但是代码中转发数据包的逻辑并没有改变

查看testdual/node.c文件

代码中的逻辑仍然是把数据包送到interface_output节点

那么如何把testdual变成feature节点呢

只需要修改代码为(这里用testqs代码举例说明,testdual生成的代码改起来不好解释)

原来的代码是

只需要把代码改造为

vnet_feature_next_u16函数的意思是获取数据包下一个feature node的index

这样数据包就可以灵活的根据feature转发到指定的节点

下面介绍一下feature到底改变了什么

原本testdual节点的下一个节点只有interface-output节点

testqs feature enable以后等价于

虽然没有直接写出testdual后面跟testqs节点,但是作用确实如此,vnet_feature_next_u16函数获取的next_index就是TESTDUAL_NEXT_TESTQS的值

相比较于原来静态的node连接方式,feature disable以后testdual节点后面就没有testqs节点了

额外补充一点

vpp提供了函数也可以实现feature这种灵活控制的节点

模板就是这样的,通过vlib_node_add_next函数可以把某个node添加到另一个node的后面

vpp之feature机制介绍相关推荐

  1. 线程安全的集合类、CopyOnWrite机制介绍(转)

    看过并发编程的书,这两种机制都有所了解,但不扎实其实.看到别人的博客描述的很精辟,于是转过来,感谢! 原文链接:https://blog.csdn.net/yen_csdn/article/detai ...

  2. Binder通信机制介绍

    1.Binder通信机制介绍 这篇文章会先对比Binder机制与Linux的通信机制的差别,了解为什么Android会另起炉灶,采用Binder.接着,会根据 Binder的机制,去理解什么是Serv ...

  3. Java异常处理及异常机制介绍

    Java异常处理及异常机制介绍 当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述. JAVA中用2种方法处理异常: 1.在发生异 ...

  4. bboss session自定义session id生成机制介绍

    bboss session自定义session id生成机制介绍 1.bboss session自定义session id生成接口 package org.frameworkset.security. ...

  5. Qt插件机制介绍及实现

    Qt插件机制介绍及实现 创建应用程序主窗口 创建Qt项目 编辑项目文件ImageView.pro mainwindow.cpp main.cpp mainwindow.cpp 编译运行 插件接口 实现 ...

  6. 怪物猎人物语稀有9星_怪物猎人崛起武器怎么锻造 武器锻造机制介绍

    在游戏中玩家会对武器进行一个锻造处理,使威力上升,那么怪物猎人崛起武器怎么锻造呢?还不知道的玩家快来看小编带来的武器锻造机制介绍吧. 在游戏中玩家会对武器进行一个锻造处理,使威力上升,那么怪物猎人崛起 ...

  7. linux系统内存dump机制介绍(一)--kdump

    本文来自 网易云社区 . kdump的原理介绍 按照linux系统的设计哲学,内核只提供dump内存的机制,用户想要dump什么样的内存,dump多少内存是属于策略问题,由用户来决定. 在真实的使用场 ...

  8. TCP长连接,心跳机制介绍

    TCP长连接,心跳机制介绍 长连接 为何要长连接 心跳 心跳为何设置在服务器端 心跳维持长连接 TCP keep-alive的三个参数 参数的具体意义 心跳的使用场景 长连接 TCP经过三次握手建立连 ...

  9. 以太零MPOS共识机制介绍

    1.共识机制介绍 共识机制是区块链技术的重要组成部分.它就像一本法典,维系着区块链世界的正常运转,让陌生人之间在没有第三方作为信用背书的情况下发生的一切交易变成可能.目前主流的区块链共识机制包括POW ...

  10. 【SemiDrive源码分析】【X9芯片启动流程】21 - MailBox 核间通信机制介绍(代码分析篇)之 Mailbox for Linux 篇

    [SemiDrive源码分析][X9芯片启动流程]21 - MailBox 核间通信机制介绍(代码分析篇)之 Mailbox for Linux 篇 一.Mailbox for Linux 驱动框架分 ...

最新文章

  1. mysql更改数据库数据存储目录_MySQL更改数据库数据存储目录
  2. pycharm 报错 out of memory 解决方法
  3. backbone js学习笔记之第三篇Model (续)
  4. oracle控制文件的损坏或完全丢失的恢复办法
  5. apache默认网站
  6. 使用Xcap发送网络数据包
  7. Java 9中的HTTP / 2支持简介
  8. nginx怎么升级php的版本号,nginx 升级指南,最详细的nginx升级步骤
  9. deepin启动盘无法引导安装_deepin 无法启动问题解决
  10. ZOJ1003 Crashing Balloon【水题】
  11. cs架构嵌入bs_CS架构与BS架构
  12. telnet linux 退格键无法生效
  13. KNN代码学习:将iris.csv处理成bunch格式
  14. vscode插件快餐教程(3) - Diagnostic
  15. RW08-7B(七管)收音机焊接
  16. latex中公式编辑,一行多个公式
  17. IrfanView 看图软件下载及汉化
  18. WinXW_android
  19. Pycharm更换清华、阿里、豆瓣软件源提高依赖包下载速度
  20. [附源码]Python计算机毕业设计Django海滨学院学生大创项目申报与审批系统

热门文章

  1. cisco命令防ping_如何使用Cisco命令阻止访问特定网站
  2. 想对可以使用的adblock插件感谢!!
  3. 汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用
  4. imx8 uuu烧录
  5. 京东发布《未来科技趋势白皮书》,101页详解5大关键技术(附PDF下载)
  6. Java jdk 1.8版本安装包
  7. 基于分布式光纤侦听技术的岛礁近岸防卫监测
  8. lstm 做航迹预测预测_用lstm预测酒店收入的第一步
  9. php varbinary,php – 无法从MSSQL中获取varbinary数据
  10. Galaxy+note3+android+5.0,三星NOTE3 SM-N9008S原厂刷机包5.0Rom固件ZCSCQD1线刷包