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

目录
相关文章
|
5月前
|
存储
数据结构学习记录——如何建立图(邻接矩阵、邻接表-图节点的结构、创建并初始化、插入变、完整图的建立)
数据结构学习记录——如何建立图(邻接矩阵、邻接表-图节点的结构、创建并初始化、插入变、完整图的建立)
63 0
【Leetcode -817.链表组件 -1019.链表中的下一个更大节点】
【Leetcode -817.链表组件 -1019.链表中的下一个更大节点】
46 0
|
6月前
|
Linux API 芯片
设备树知识小全(五):根节点兼容性
设备树知识小全(五):根节点兼容性
68 0
|
存储 人工智能 Java
第一个动态结构:链表
大家好,我是王有志。今天我们一起学习线性表中的第二种数据结构:链表,也是真正意义上的第一个动态数据结构。
112 0
第一个动态结构:链表
|
JavaScript 算法 前端开发
处理链表的本质,是处理链表结点之间的指针关系
处理链表的本质,是处理链表结点之间的指针关系
98 0
数据结构与算法__08--霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成
霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成
|
关系型数据库 MySQL 网络安全
【技术贴】安装MYSQL最后一步出现错误,提示"终结点映射器中没有更多的终结点可用的解决"!
【技术贴】安装MYSQL最后一步出现错误,提示"终结点映射器中没有更多的终结点可用的解决"!   能看到这句话证明你的mYSQL已经ok了。   问题分析 这是因为你在安装MySQL的某一步中勾选了“Add firewall exception for this port”(为防火墙添加例外),但是你的Windows的防火墙或者防火墙服务被你优化关闭了(比如我 就没有开过windows防火墙),所以会有这个提示。
1800 0