前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vpp 软件架构介绍

vpp 软件架构介绍

作者头像
dpdk-vpp源码解读
发布2023-03-07 17:04:59
2.9K0
发布2023-03-07 17:04:59
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析

接触fd.io/vpp有大概一年半的时间了,在vpp框架基础上也做过不少项目。端口镜像及流镜像抓包功能;基于dpdk acl/ring/meter模块实现vpp的qos功能;基于dpdk模块优化实现ipv4 报文重组功能;gre、IPsec等overlay隧道等等。对Vpp的框架也有一些了解但谈不上深入。因为公司业务调整,最近也要换一份工作,后面很有可能不再基于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的抖动问题;向量报文进行预取可以解决读时延问题。多报文处理有效提升性能。

  • Vpp 分层实现

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 add plugins

vpp给开发者提供了一套工具,自动生成plugins框架,并将其添加到vpp框架中。我们可以使用extras/emacs目录下的脚本文件make-plugin.sh来自动生成plugins文件和

大概介绍一下生成文件及流程,具体的可以查询开发者文档。

代码语言:javascript
复制
$ 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
  • vpp api机制介绍 下图是Vpp和vat交互流程: (api详细介绍参考资料: https://segmentfault.com/a/1190000019613730)

本章节主要介绍vppapigen 生成编译所需要的头文件。以上面plugin目录文件,通过myplugin.api文件生成编译所需要的c文件与h文件。

代码语言:javascript
复制
[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工具的简单使用。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档