首页 > 其他分享 >FD.io VPP自定义插件

FD.io VPP自定义插件

时间:2023-08-02 20:00:57浏览次数:43  
标签:... 插件 Loading vpp 自定义 src FD el emacs

Author [email protected]

Date Aug. 02, 2023

Description 自定义插件的方法

虽然VPP已经基本满足了路由转发需要,但是用它肯定还有其它原因:自定义扩展功能。

1. 环境及版本

$ sudo vppctl # 或者make run
DBGvpp# show version
vpp v23.06-release built by XXX on XXX at 2023-08-02T07:37:51

$ lsb_release -r
Release:        20.04

2. 创建插件

创建插件使用了一个自带的脚本,在此之前应该先安装emacs:sudo apt install -y emacs

进入到${VPP_HOME}/src/plugins目录下,然后执行下述命令就可以,需要填写插件名称(如myplugin,但有的博客说不建议使用r开头,没尝试过)以及调度类型。还没搞懂调度类型是啥,说是只有生成的node.c有所不同,且从qs改到dual非常简单。所以我选择了qs,可以查看这里看区别。

这个脚本自动创建了一个插件,而且这个插件是可以直接使用的,只需要编译运行就行了。

$ VPP_HOME="/usr/local/src/vpp"
$ cd ${VPP_HOME}/src/plugins
$ ../../extras/emacs/make-plugin.sh
Loading /etc/emacs/site-start.d/00debian.el (source)...
Loading /etc/emacs/site-start.d/50autoconf.el (source)...
Loading /etc/emacs/site-start.d/50cmake-data.el (source)...
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...
Loading debian-ispell...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...
Loading /usr/local/src/vpp/extras/emacs/all-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/plugin.el (source)...
Loading /usr/local/src/vpp/extras/emacs/cli-cmd-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/config-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/dual-loop-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/periodic-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/pipe-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/plugin-cmake-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/plugin-api-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/plugin-h-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/plugin-main-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/plugin-node-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/plugin-qsnode-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/plugin-test-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/plugin-periodic-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/plugin-setup-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/tunnel-c-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/tunnel-decap-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/tunnel-encap-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/tunnel-h-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/elog-4-int-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/elog-4-int-track-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/elog-enum-skel.el (source)...
Loading /usr/local/src/vpp/extras/emacs/elog-one-datum-skel.el (source)...
Plugin name: myplugin
Dispatch type [dual or qs]: qs
(Shell command succeeded with no output)

OK...

这个脚本执行完毕后,可以进入插件目录查看生成文件。不同的版本生成的文件可能有所不同。

$ cd ${VPP_HOME}/src/plugins/myplugin
$ ls
CMakeLists.txt      # 插件名称、编译代码、依赖库、api文件配置等
myplugin.api        # 主要是同vat客户端程序通信数据格式的接口定义,便于结构同步;可参考文章
myplugin.c          # 节点初始化VNET_FEATURE_INIT,注册消息队列到全局;注册CLI命令及其响应函数,同时启动定时扫描进程(见myplugin_periodic.c)
myplugin.h          #  
myplugin_periodic.c # 定义了扫描进程函数,相关事件触发机制,监听插件是否工作;
myplugin_test.c     # 定义API方式定义的客户端vat测试代码
node.c              # 完成结点注册VLIB_REGISTER_NODE以及插件功能实现函数VLIB_NODE_FN;
setup.pg            # 一些测试命令和配置

3. 编译、安装、查看以及卸载插件

编译,文档中给的make rebuild,但我的这样用就会失败,生成不了。此时再make build就会重新编译所有的内容,太费时间了。

所以就直接make build就可以正常编译了。

$ cd ${VPP_HOME}/src/vpp
$ make build
...
[15/15] Linking C shared library lib/x86_64-linux-gnu/vpp_api_test_plugins/myplugin_test_plugin.so
...

$ make run
DBGvpp# show plugins
    _______    _        _   _____  ___
 __/ __/ _ \  (_)__    | | / / _ \/ _ \
 _/ _// // / / / _ \   | |/ / ___/ ___/
 /_/ /____(_)_/\___/   |___/_/  /_/

DBGvpp# show plugins
 Plugin path is: /usr/local/src/vpp/build-root/install-vpp_debug-native/vpp/lib/x86_64-linux-gnu/vpp_plugins

     Plugin                                   Version                          Description
...
 57. myplugin_plugin.so                       23.06-release                    myplugin plugin description goes here
...

可以看到已经添加到了VPP的插件中了。我这里并没有在加载的时候就自己蹦出来,这时就可以使用命令这样看。不过它的顺序摸不准,而且由于version一样,很难找到,需要仔细查找下。我们可以通过定义版本号的方式,将VPP的插件和自定义的插件进行区分,这样找起来会更加方便。这个改动位置在myplugin.c中,在注册插件位置有个.version

#define MYPLUGIN_VERSION "0.0.1"


/* *INDENT-OFF* */
VLIB_PLUGIN_REGISTER () =
{
  // .version = VPP_BUILD_VER,
  .version = MYPLUGIN_VERSION,
  .description = "myplugin plugin description goes here",
};
/* *INDENT-ON* */

然后此时再重新编译(可能需要使用到make rebuild; make build,费时间也没法子)查看。就会发现版本已经变为了我们自定义的版本了:

$ make rebuild; make install
$ make run
    _______    _        _   _____  ___
 __/ __/ _ \  (_)__    | | / / _ \/ _ \
 _/ _// // / / / _ \   | |/ / ___/ ___/
 /_/ /____(_)_/\___/   |___/_/  /_/

DBGvpp# show plugins
 Plugin path is: /usr/local/src/vpp/build-root/install-vpp_debug-native/vpp/lib/x86_64-linux-gnu/vpp_plugins

     Plugin                                   Version                          Description
...
 57. myplugin_plugin.so                       0.0.1                            myplugin plugin description goes here
...

如果需要删除插件,可以直接用rm -r myplugin,然后再make build,就已经没了。

4. 参考

  1. Adding a plugin
  2. VPP之插件框架分析

标签:...,插件,Loading,vpp,自定义,src,FD,el,emacs
From: https://blog.51cto.com/u_12639411/6942336

相关文章

  • Kubernetes主流网络插件介绍
    一、Flannel1.1简介Flannel由CoreOS研发,使用”虚拟网桥和veth设备”的方式为Pod创建虚拟网络接口,通过可配置的后端(backend)定义Pod间的通信网络。它支持基于VXLAN和UDP的Overlay网络,以及基于三层路由的Underlay网络。    对于每一个容器而言,在加入网络时,在每个节点创建一......
  • 不可思议!Vue拖拽插件的实战大揭秘,竟然惊人抛弃了常规选择!
    大家好,我是程序视点的小二哥因为项目上有一个在规定区域内自由拖拽的小需求,自己纯js写又有点小麻烦,就花了点时间寻找到这个小组件。介绍vue-drag-resize是一个用于拖拽,缩放的组件根据网上搜索到的使用教程,都是照着文档翻译了一遍,根本解决不了我想要的问题花了几天时间,于是记......
  • Java中自定义注解
    1.注解的作用提供元数据信息编译时检查运行时处理代码分析与框架集成2.基本步骤1.使用@interface关键字定义一个注解类型public@interfaceAnnotationDemo{//注解成员Stringvalue();intnum()default0;}2.在注解类型中定义成员变量,该注解使用时可以设置这......
  • Unity第三方插件: OdinInspector简单介绍
    首先,OdinInspector需要在AssetStore付费购买,有的时候打折包也会包含1.Attribute排版更加美观和易于管理,且使用非常方便,只需要加Attribute就能显示在Inspector,并且官方提供了非常多的Attribute,想要使用的时候直接在Unity中查看使用就可以,也提供了代码 ......
  • 食品蔬菜出口美国FDA食品注册须知
    美国食品和药物管理局(FDA)是负责监管美国食品、药品、化妆品、医疗器械和辐射产品安全的机构。在美国,任何想要将食品产品销售到市场上的企业都需要进行FDA食品注册,以确保其产品符合相关的标准和法规。首先,申请者需要确定自己是否属于FDA规定的食品注册范围。按照FDA的定义,食品包括任......
  • 直播商城系统源码,自定义View实现方向控制控件,可拖拽中间圆
    直播商城系统源码,自定义View实现方向控制控件,可拖拽中间圆 publicclassDirectionViewextendsViewimplementsView.OnTouchListener{  privateintwidth;  privateintheight;  privateinthalfWidth;  privateinthalfHeight;  privateintsmal......
  • SIT1145AQ 带选择性唤醒及故障保护的低功耗 CAN FD 总线收发器
    ➢符合ISO11898-2:2016和SAEJ2284-1至SAEJ2284-5标准➢拥有低功耗休眠模式以及待机模式➢支持标准CAN唤醒帧的远程唤醒,兼容ISO11898-2:2016标准的选择性唤醒帧远程唤醒➢唤醒源诊断识别功能➢总线端口±58V耐压➢±12V接收器共模输入电压➢IO口支......
  • 流程引擎表单:可自定义和多场景应用,快速助力提质增效!
    当前,在办公职场中,传统表单制作暴露出越来越多的漏洞,已经无法满足日益增长的业务需求。采用什么样的平台和软件可以提高效率?低代码技术平台是深得客户喜爱的一种快速框架平台,其中的流程引擎表单是其主要功能之一,可以助力提升办公协作效率,满足广大用户流程化办公的心愿。随着社会发......
  • 美国激光产品FDA激光注册申请流程
    激光技术在现代生活中扮演着重要角色,广泛应用于医疗、美容、仪器仪表、通信等领域。然而,如果我们想将激光产品出口到美国,就必须办理美国食品药品监督管理局(FDA)的激光注册手续。那么,如何办理呢?首先,需要确定激光FDA注册的范围,即需要注册的激光器设备和使用场景。这个步骤非常关键,因为......
  • vue--day50--todolist案例自定义事件修改footer 和header 修改
    1.MyHeader.vue<template><divclass="todo-header"><!--v-model:="title"是实时绑定的--><inputtype="text"placeholder="请输入你的任务名称,回车键确认"v-model="title"@keyup.enter="add"/>......