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

目录
相关文章
|
架构师 测试技术 网络性能优化
dpdk课程学习之练习笔记七(vpp环境搭建及plugin demo测试)
dpdk课程学习之练习笔记七(vpp环境搭建及plugin demo测试)
1017 0
|
网络性能优化
1. VPP源码分析(内存管理之mheap)
1.1. mheap 1.1.1. mheap_t first_free_elt_uoffset_by_bin: User offsets for head of doubly-linked list of free objects of this size.
7062 1
|
11月前
|
存储 算法 网络安全
Intel QAT 加速的数据压缩和 TLS 加解密技术 | 龙蜥大讲堂 102 期
Intel QAT(QuickAssist Technology)加速的数据压缩和TLS加解密技术,由Intel网络与边缘事业部唐志军分享。课程涵盖QAT简介、数据压缩、安全应用及价值主张,重点介绍QAT在CPU密集型任务中的加速作用,如对称/非对称加密、数据压缩等。通过QAT,可大幅提升性能,节省CPU资源,优化存储和网络传输效率,适用于网络安全、虚拟机迁移、大数据处理等场景。
754 0
|
网络性能优化 调度
|
存储 缓存 Unix
从原理到实践:掌握DPDK内存池技术(上)
从原理到实践:掌握DPDK内存池技术
|
负载均衡 网络协议 网络性能优化
配置 Cisco 基于策略的路由 (PBR)
【8月更文挑战第31天】
781 0
配置 Cisco 基于策略的路由 (PBR)
|
存储 测试技术 网络安全
冲破内核限制:使用DPDK提高网络应用程序的性能(下)
冲破内核限制:使用DPDK提高网络应用程序的性能
|
Ubuntu Linux 网络性能优化
VPP安装
VPP安装
739 0
|
编译器 Linux 网络性能优化
VPP使用DPDK纳管主机网卡
VPP使用DPDK纳管主机网卡
|
缓存 Linux API
冲破内核限制:使用DPDK提高网络应用程序的性能(上)
冲破内核限制:使用DPDK提高网络应用程序的性能

热门文章

最新文章