如何新建VPP插件

简介: 如何新建一个VPP插件

How to create a new plugin

1.使用VPP提供的sample插件作为基础,复制和重命名sample插件文件夹以及am文件

cp -r src/examples/sample-plugin/sample src/plugins/newplugin  
cp src/examples/sample-plugin/sample.am src/plugins/newplugin.am  

2.修改./src/plugins/newplugin.am文件
这里插件的名字假定为newplugin
需要修改newplugin.am文件中关于目录和文件的信息(sample/ -> newplugin/),使得该am文件指向你的插件,如果不需要二进制api的话,可以把api相关的文件删除
例如:

vppapitestplugins_LTLIBRARIES += newplugin.la
vppplugins_LTLIBRARIES += newplugin_plugin.la

newplugin_plugin_la_SOURCES =        \
    newplugin/sample.c                \
    newplugin/node.c                \
    newplugin/sample_plugin.api.h

API_FILES += newplugin/sample.api

nobase_apiinclude_HEADERS +=            \
  newplugin/sample_all_api_h.h                \
  newplugin/sample_msg_enum.h                \
  newplugin/sample.api.h

newplugin_plugin_la_SOURCES = newplugin/sample_test.c newplugin/sample_plugin.api.h

最简单的一种修改实现:

vppplugins_LTLIBRARIES += newplugin_plugin.la
 
newplugin_plugin_la_SOURCES = newplugin/main.c newplugin/cmd.c newplugin/node.c
newplugin_plugin_la_LIBADD = -lxxxx  ===> 这里可以添加上你的插件依赖的库,比如-ldpdk

3.修改./src/plugins/Makefile.am文件
在该文件中添加如下判断,这里是为了让编译系统找到插件的makefile

if ENABLE_NEWPLUGIN_PLUGIN
include newplugin.am
endif

4.修改./src/configure.ac文件
为了生成相应的编译规则,还需要对configure.ac文件进行修改,添加如下信息,最后再重新生成一次makefile即可
在324行左右添加如下:

PLUGIN_ENABLED(newplugin)

5.插件须含有的元素

  • 插件声明(必须)
VLIB_PLUGIN_REGISTER() = {
    .version     = VPP_BUILD_VER,
    .description = "newplugin",
};
  • 插件初始化函数
VLIB_INIT_FUNCTION(newplugin_init);
  • 插件结点相关函数
VLIB_REGISTER_NODE(newplugin_ip4_node) = {
    .function = newplugin_ip4_node_fn,
    .name = "newplugin-ip4",
    .vector_size = sizeof(u32),
    .format_trace = format_newplugin_trace,
    .type = VLIB_NODE_TYPE_INTERNAL,
    .n_next_nodes = 2,
    .next_nodes = {
            [NEWPLUGIN_NEXT_DROP] = "error-drop",
            [NEWPLUGIN_NEXT_IP4_LOOKUP] = "ip4-lookup",
    },
};

VNET_FEATURE_INIT(newplugin_ip4, static) = {
  .arc_name    = "ip4-output",
  .node_name   = "newplugin-ip4",
  .runs_before = VNET_FEATURES("interface-output"),
};

这里newplugin插件的结点名为newplugin-ip4,结点函数为newplugin_ip4_node_fn, 其后两个结点为"error-drop" or "ip4-lookup"
该结点放在ip4-output arc内,在执行interface-output结点之前运行

Reference

  1. how-to-develop-vpp-plugins
  2. VPP Infrastructure Libraries
目录
相关文章
OpenWrt Web界面修改及功能实现实例说明
http://www.cnblogs.com/dwayne/archive/2012/04/21/2460830.html 通过上篇文章的介绍,我们应该了解了Lua语言在OpenWrt Web配置页面的基本对应功能设计方法。
2744 0
|
3月前
|
NoSQL 安全 芯片
OpenOCD(三):学习OpenJTAG Config文件配置
OpenOCD(三):学习OpenJTAG Config文件配置
115 0
|
8月前
JRebel and xrebel 热部署插件 激活时出现LS client not configued 报错
JRebel and xrebel 热部署插件 激活时出现LS client not configued 报错
318 0
|
8月前
CTK框架 - 插件依赖关系 - 给插件加上界面
在第一篇文章中吗,我们提到了MANIFEST.MF中有个字段是依赖关系,这次我们来测试一下这个依赖关系:
113 0
|
9月前
|
JSON 安全 IDE
vscode 在不同设备上共用自己的配置
vscode 在不同设备上共用自己的配置
94 0
|
9月前
|
前端开发
DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作)
DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作)
104 0
|
11月前
Magisk模块自动更新~
Magisk模块自动更新~
325 0
|
11月前
【Magisk模块|MM管理器】recovery模式中对magisk模块进行管理
在Recovery模式中对magisk模块进行管理,mm管理器可以在手机不开机时进入recovery模式终端中对magisk模块进行查看停用卸载。
744 0
|
11月前
成功刷入Magisk后我们需要安装那些模块?
好多小伙伴们初次搞机,费了九牛二虎之力成功解锁BL然后刷入Magisk,然后到这里却不知道接下来应该装什么!😳 今天就简单给大家分享一下一些玩机经验,当我们刷完Magisk后,首先我们要刷入以下模块!
1742 0
成功刷入Magisk后我们需要安装那些模块?
vscode彻底删除安装过的插件和个人配置信息
vscode彻底删除安装过的插件和个人配置信息
1366 0
vscode彻底删除安装过的插件和个人配置信息