向VPP中添加新结点,改变数据走向

简介:

注册新结点

向VPP中注册新结点的方式比较简单,使用VPP中定义好的VLIB_REGISTER_NODE宏来声明我们的新结点,新结点中的处理函数需要自己去实现

VLIB_REGISTER_NODE(node_name_node, static)

VLIB_REGISTER_NODE本质上是新建一个vlib_node_registration_t类型,VPP会在初始化的时候往node表中注册该结点信息,这里该变量名为node_name_node的数据结构并定义为static属性
所以如果想在不同.c文件中引用该变量,需要去掉static关键字,并在.h文件中加上node_name_node的声明
1

结点中定义的next_nodes定义了通过该结点后数据应到底何结点,这里可以根据结点的用途自由选取需要的结点名

使用feature机制

早期的VPP本身的node框架比较固定,各个node之间逻辑连接已经固化,为此新版本增加了feature机制
这里feature机制本质上来说还是结点,只不过该结点可以在运行的时候通过命令进行配置是否打开或关闭,从而影响数据流的走向

选择合适的arc类

对新加入的结点进行管理,新的feature(即我们新建的结点)必须属于某个arc类,并作用于某个interface实体。
通过set interface feature <intfc> <feature_name> arc <arc_name> [disable]命令来开启或关闭该feature功能。
通常arc类的名字对应为其起点结点的名字,使用命令开启关闭feature功能能动态的改变数据的流向。
如果选择按照feature机制来加入结点的话需要注意以下几点:
VPP提供的arc类比较多,我们需要自己选择合适的arc来插入我们的结点:
1.nsh-output:
2.mpls-output:
3.mpls-input:
4.ip6-drop:
5.ip6-punt:
6.ip6-local:
7.ip6-output:
8.ip6-multicast:
9.ip6-unicast:
10.ip4-drop:
11.ip4-punt:
12.ip4-local:
13.ip4-output:
14.ip4-multicast:
15.ip4-unicast:
16.ethernet-output:
17.interface-output:
18.device-input:

在arc类上登记feature结点

2

arc_name:为我们选定的feature结点要插入的地方
node_name:为我们自己新注册的结点名
runs_before:说明新结点必须比某个feature结点先执行,通过新结点后的流可能流入下个feature结点也可能到达其他路径

关联feature结点及其通过函数

VLIB_NODE_FUNCTION_MULTIARCH(ip4_gtpu_bypass_node, ip4_gtpu_bypass)

不使用feature机制

不使用feature机制的话,结点间的关系相对来说更加静态,只能在编译的时候确定结点间的关系,不能在运行的时候进行改变,可以插入节点的地方只能由系统提供的几个接口
向这些入口登记函数后,后续的数据流将传到你定义的结点
可能还有其他的一些插入结点的函数,这里只列出常用到的几个函数:

L1

vnet_hw_interface_rx_redirect_to_node (vnet_main_t *vnm, u32 hw_if_index, u32 node_index)
将某个hw interface的rx数据重定向到某个结点,node_index为结点的index索引

L2、L3

ethernet_register_input_type (vlib_main_t *vm, ethernet_type_t type, u32 node_index)
将在"ethernet-input"结点后插入特定type的结点,
这里type包括ethernet_type(0x806, ARP)、ethernet_type (0x8100, VLAN)、ethernet_type (0x800, IP4)等二、三层协议
具体支持的相关协议见src/vnet/ethernet/types.def文件。

L4

ip4_register_protocol (u32 protocol, u32 node_index)
将在"ip4-local"结点后插入特定protocol的结点,这里protocol包括ip_protocol (6, TCP)、ip_protocol (17, UDP)等四层协议。
具体支持的相关协议见src/vnet/ip/protocols.def文件。

L5

udp_register_dst_port (vlib_main_t * vm, udp_dst_port_t dst_port, u32 node_index, u8 is_ip4)
将在"ip4-udp-lookup"结点后插入特定dst_port的结点,这里dst_port包括ip_port (WWW, 80)等五层应用端口。
具体支持的相关端口见src/vnet/ip/ports.def文件。

目录
相关文章
|
3月前
|
Linux API 芯片
设备树知识小全(五):根节点兼容性
设备树知识小全(五):根节点兼容性
21 0
数据结构与算法__08--霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成
霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成
数据结构与算法__01--单链表无顺序添加时,节点对象形成封闭环问题,无法添加同一个对象导致遍历输出时一直执行输出
单链表无顺序添加时,节点对象形成封闭环问题,无法添加同一个对象导致遍历输出时一直执行输出
|
JSON 算法 JavaScript
我让虚拟DOM的diff算法过程动起来了
去年写了一篇文章[手写一个虚拟DOM库,彻底让你理解diff算法]介绍虚拟`DOM`的`patch`过程和`diff`算法过程,当时使用的是双端`diff`算法,今年看到了`Vue3`使用的已经是快速`diff`算法,所以也想写一篇来记录一下,但是肯定已经有人写过了,所以就在想能不能有点不一样的,上次的文章主要是通过画图来一步步展示`diff`算法的每一种情况和过程,所以就在想能不能改成动画的形式,于是就有了这篇文章。当然目前的实现还是基于双端`diff`算法的,后续会补充上快速`diff`算法。
68 0
|
机器学习/深度学习 算法 计算机视觉
【物理应用】基于El-centro地震波作用下隔震与非隔震支座下的顶层位移、速度、加速度的对比情况附matlab代码
【物理应用】基于El-centro地震波作用下隔震与非隔震支座下的顶层位移、速度、加速度的对比情况附matlab代码
【物理应用】基于El-centro地震波作用下隔震与非隔震支座下的顶层位移、速度、加速度的对比情况附matlab代码
|
设计模式 JavaScript API
node - 事件(循环,驱动,发射器)
node - 事件(循环,驱动,发射器)
|
测试技术 API
使用交互函数充当 check 进行二分
使用交互函数充当 check 进行二分
|
关系型数据库 MySQL 网络安全
【技术贴】安装MYSQL最后一步出现错误,提示"终结点映射器中没有更多的终结点可用的解决"!
【技术贴】安装MYSQL最后一步出现错误,提示"终结点映射器中没有更多的终结点可用的解决"!   能看到这句话证明你的mYSQL已经ok了。   问题分析 这是因为你在安装MySQL的某一步中勾选了“Add firewall exception for this port”(为防火墙添加例外),但是你的Windows的防火墙或者防火墙服务被你优化关闭了(比如我 就没有开过windows防火墙),所以会有这个提示。
1606 0
|
网络协议 区块链 Go
剥开比原看代码02:比原启动后去哪里连接别的节点
作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 比原启动后去哪里连接别的节点 最开始我对于这个问题一直有个疑惑:区块链是一个分布式的网络,那么一个节点启动后,它怎么知道去哪里找别的节点从而加入网络呢? 看到代码之后,我才明白,原来在代码中硬编码了一些种子地址,这样在启动的时候,可以先通过种子地址加入网络。
1341 0