VPP之插件框架分析

1.实现使用模板插件

  本文基于文章VPP之浅谈插件和使用(转载)进行实现,采用vpp中提供的创建插件的脚本,创建需要的插件基本框架。注意模板插件起名时,最好不要以r开头,否则编译会出问题。

  然后,可以通过以下命令编译运行,会发现生成myplugin.so的文件。

  将该动态链接库可以直接拷贝至rpm包安装方式生成的的/lib/vpp_plugins目录中,并重启服务systemctl restart vpp,并查看到插件myplugin能够正常启动。这些步骤都说明,VPP中自定义插件的实现都需要基于其框架模板进行编码,才能挂载VPP结点并实现功能。因此,熟悉掌握其中框架结构,就变得很有意义。

2.插件模板目录结构

  自VPP版本19以上,插件的编译已不再使用autoconf/configure/makefile等方式,而是采用CMAKE编辑,所以先要理解其代码结构。采用插件模板生成文件如下。

其中部分文件主要功能解释如下,文件myplugin.api以及test文件可以参考文章

3.源码分析

  生成模板插件中的部分文件引用了VPP库中几个关键性目录中文件,可以参考如下目录;要注意的是,整个VPP的软件框架主要分为四个层面,依次执行顺序是VPP Infra->VLIB->VNET->Plugins,所以程序编码中,会以VLIB宏为基础执行,然后是VNET相关宏。

注册了process结点,监听插件是否工作的事件MYPLUGIN_EVENT_PERIODIC_ENABLE_DISABLE
通过命令行来触发VLIB_CLI_COMMAND (myplugin_enable_disable_command, static)这个事件。
使用这里enable了,该插件才会work。
  注册了内部结点,让其在ethernet-input结点运行之前运行。

3.1 注册结点:VLIB_REGISTER_NODE

  在node.c的VLIB_REGISTER_NODE中注册了内部结点myplugin

3.2 结点功能实现函数:VLIB_NODE_FN

  在node.c文件中,定义结点myplugin_node的实现函数VLIB_NODE_FN (myplugin_node),主要实现功能是对input结点收进来的报文,做一个src dst mac交换,然后源端口发送出去。因其参数为myplugin_node,所以与注册结点置入同一文件中。
  该结点功能函数调用是在myplugin.c文件中的vnet_feature_enable_disable 函数中。
那么为什么在VLIB_NODE_FN中定义功能函数,vnet_feature_enable_disable中实现功能函数,它们是如何关联上的呢?答案在节3.4的VNET_FEATURE_INIT (myplugin, static) 函数中。

3.3 注册插件名称以及描述:VLIB_PLUGIN_REGISTER

  在myplugin.c的VLIB_PLUGIN_REGISTER中,描述了插件的VPP版本号以及描述等信息。

3.4 注册结点初始化1:VLIB_INIT_FUNCTION

  在myplugin.c的VLIB_INIT_FUNCTION函数中,实例化myplugin_main_t结构体,赋值各个参数,其中msg_id_base是重点,将本API消息注册到全局hash表中。

3.4 注册结点初始化2:VNET_FEATURE_INIT

  因此VLIB与VNET是层级调用关系,所以在myplugin.c的VNET_FEATURE_INIT初始化,让其在ethernet-input结点运行之前运行。此处第一参数myplugin结构体的定义在vnet/feature/feature.h中。
  这一步中,将VLIB中定义的myplugin功能函数通过.node_name以及.arc_name联系起来,因此调用3.2节的结点功能函数时,使用vnet_feature_enable_disable ("device-input", "myplugin",sw_if_index, enable_disable, 0, 0);,函数参数是个重点。

3.5 注册结点的CLI命令及激活:VLIB_CLI_COMMAND

  通过命令行来触发VLIB_CLI_COMMAND (myplugin_enable_disable_command, static)事件,CLI命令是myplugin enable-disable eth0,挂载成功后该插件才会work。关闭某端口的该功能myplugin enable-disable eth0 disable

3.6 创建监听线程响应事件

  在执行上述CLI命令中,真实实现函数myplugin_enable_disable里面创建了监控进程,查看插件是否工作,并响应事件。真实的实现函数在文件myplugin_periodic.c中。之后具体事件处理不详细罗列。

3.7 完成测试VAT客户端消息响应函数

myplugin.c文件中具有API消息处理函数,应该是结合测试程序VAT使用的。
该函数主要作为VPP服务端用于开启关闭插件功能,VAT客户端实现见myplugin_test.c文件,同时它们之间交互接口的定义见C语言的myplugin.api。

4.流程图归纳

赞赏

微信赞赏支付宝赞赏

《VPP之插件框架分析》有2个想法

发表评论

邮箱地址不会被公开。 必填项已用*标注