接触fd.io/vpp有大概一年半的时间了,在vpp框架基础上也做过不少项目。端口镜像及流镜像抓包功能;基于dpdk acl/ring/meter模块实现vpp的qos功能;基于dpdk模块优化实现ipv4 报文重组功能;gre、IPsec等overlay隧道等等。对Vpp的框架也有一些了解但谈不上深入。因为公司业务调整,最近也要换一份工作,后面很有可能不再基于vpp二次开发。今天参考vpp官网文档,也做一个简单的总结吧。
VPP:(the vector packet processor)是一个可扩展框架,可提供开箱即用的交换机/路由器功能。是Linux基金会下开源项目FD.io的一个子项目,由思科贡献的开源版本,目前是FD.io的最核心的项目。
VPP是一个模块化和可扩展的软件框架,用于创建网络数据面应用程序。更重要的是,VPP代码为现代通用处理器平台(x86、ARM、PowerPC等)而生,并把重点放在优化软件和硬件接口上,以便用于实时的网络输入输出操作和报文处理。
为了提高性能,vpp数据平面是由转发节点的有向图组成,这些节点在每次调用时处理多个数据包。这种模式支持各种微处理器优化:流水线处理和预取功能降低依赖数据的读取延迟,固有的I-cache阶段行为,向量指令。除了硬件输入和硬件输出节点,整个转发图都是可移植的代码。模块化设计框架允许任何人“插入”新的图形节点,而不需要更改核心/内核代码。
VPP一次从网卡的硬件队列Rx ring收到多个数据包,组成一个Packet vector,借助于报文处理图Packet processing graph来实现数据面转发业务处理流程。图中graph node把业务流程分解为一个个先后连接的业务node,每个业务node完成特定功能后流转到下个node处理。基于这种graph node的组织方式,使我们可以根据业务需求,通过plugin方式插入新的node节点或重新排列graph node,扩展非常方便,不会影响原有核心处理流程。
基于vector packet处理可以有效解决i-cache的抖动问题;向量报文进行预取可以解决读时延问题。多报文处理有效提升性能。
1、VPP Infra ( VPP infrastructure layer 基础结构层)
提供一些基本的通用的功能函数库:包括内存管理,向量操作,hash, timer、pool、bimap等
2、Vlib (vector processing library)
主要提供基本的应用管理库:buffer管理,graph node管理,线程,CLI,trace等
3、Vnet (vpp network stack)
提供网络资源能力:比如设备,L2,L3,L4功能,session管理,控制管理,流量管理等。
4、 Plugins
主要为实现一些功能,在程序启动的时候加载,一般情况下会在插件中加入一些node节点去实现相关功能,比如qos、nat等。
vpp给开发者提供了一套工具,自动生成plugins框架,并将其添加到vpp框架中。我们可以使用extras/emacs目录下的脚本文件make-plugin.sh来自动生成plugins文件和
大概介绍一下生成文件及流程,具体的可以查询开发者文档。
$ yum intall emacs #需要提前安装emacs工具
$ cd ./src/plugins #进入plugins目录下
$ ../../extras/emacs/make-plugin.sh #执行make-plugin.sh 脚本文件
<snip>
Loading /scratch/vpp-docs/extras/emacs/tunnel-c-skel.el (source)...
Loading /scratch/vpp-docs/extras/emacs/tunnel-decap-skel.el (source)...
Loading /scratch/vpp-docs/extras/emacs/tunnel-encap-skel.el (source)...
Loading /scratch/vpp-docs/extras/emacs/tunnel-h-skel.el (source)...
Loading /scratch/vpp-docs/extras/emacs/elog-4-int-skel.el (source)...
Loading /scratch/vpp-docs/extras/emacs/elog-4-int-track-skel.el (source)...
Loading /scratch/vpp-docs/extras/emacs/elog-enum-skel.el (source)...
Loading /scratch/vpp-docs/extras/emacs/elog-one-datum-skel.el (source)...
Plugin name: myplugin #plugin 目录名称
Dispatch type [dual or qs]: dual # node.c 文件种是否生成处理函数。
(Shell command succeeded with no output)
OK...
$ cd ./myplugin #进入myplugin目录查看生成的文件
$ ls
CMakeLists.txt myplugin.c myplugin_periodic.c setup.pg
myplugin_all_api_h.h myplugin.h myplugin_test.c
myplugin.api myplugin_msg_enum.h node.c
本章节主要介绍vppapigen 生成编译所需要的头文件。以上面plugin目录文件,通过myplugin.api文件生成编译所需要的c文件与h文件。
[root@localhost myplugin]# ../../tools/vppapigen/vppapigen --includedir /root/vpp/src --outputdir . --input myplugin.api --output myplugin.api.h
[root@localhost myplugin]# ls
CMakeLists.txt myplugin.api.c myplugin.api.h myplugin.api_types.h myplugin.h myplugin_test.c setup.pg
myplugin.api myplugin.api_enum.h myplugin.api_test.c myplugin.c myplugin_periodic.c node.c
总结:
本文主要介绍了vpp基本的软件架构,以及plugin文件生成工具使用及vppapigen工具的简单使用。
本文分享自 DPDK VPP源码分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!