注册新结点
向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的声明
结点中定义的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结点
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文件。