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结点之前运行