向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文件。

目录
相关文章
|
4月前
LabVIEW使用调用节点与通过引用调用节点调用VI时的差别
LabVIEW使用调用节点与通过引用调用节点调用VI时的差别
49 1
|
4月前
|
Linux API 芯片
设备树知识小全(五):根节点兼容性
设备树知识小全(五):根节点兼容性
57 0
|
存储 人工智能 Java
第一个动态结构:链表
大家好,我是王有志。今天我们一起学习线性表中的第二种数据结构:链表,也是真正意义上的第一个动态数据结构。
102 0
第一个动态结构:链表
|
JavaScript 前端开发
手搓一个node切换源小工具!
目前已经有一款工具了nrm 也是做切换源的 例如tabao源,腾讯源,下载依赖包的时候能加速,那有这么多的源nrm可以帮我们管理起来随时切换。
131 0
手搓一个node切换源小工具!
|
C语言
labview节点公式节点反馈节点表达节点属性节点
labview节点公式节点反馈节点表达节点属性节点
251 0
|
Java 数据库连接 Maven
头秃了,使用@AutoConfigureBefore调整配置顺序竟没生效?
前言 如何自定义一个starter? 分享一个经典的误区 源码分析自动配置类如何排序? 准备自己的自动配置类 将自动配置类设置在spring.factories 如何指定自动配置类的执行顺序? 总结
|
XML JavaScript 前端开发
你真的知道DOM吗?(上)----(节点层次,DOM集合,Node类型)
你真的知道DOM吗?(上)----(节点层次,DOM集合,Node类型)
119 0
数据结构与算法__08--霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成
霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成
数据结构与算法__01--单链表无顺序添加时,节点对象形成封闭环问题,无法添加同一个对象导致遍历输出时一直执行输出
单链表无顺序添加时,节点对象形成封闭环问题,无法添加同一个对象导致遍历输出时一直执行输出