VPP之浅谈插件和使用(转载)

1.vpp版本

笔者这里使用的vpp版本是最新git下来的,show version信息如下

2.插件介绍

vpp的软件框架主要分为四个层面:

每一个插件在vpp里面有不同的node构成,每一个node主要分为以下四种类型:

  1. VLIB_NODE_TYPE_INTERNAL
      内部节点,最典型的节点接收缓冲向量,执行操作。vpp大部分节点是这个角色,主要对数据流做内部处理,比如ip4-input-no-checksum/ip4-icmp-input等内部功能节点

  2. VLIB_NODE_TYPE_INPUT
      输入节点,通常是设备输入节点。从零开始创建框架并分派到内部节点(internal), 比如dpdk-input/af-packet-input节点,
    input节点收包模式分为轮询和中断两种模式vlib_node_state_t.

  3. VLIB_NODE_TYPE_PRE_INPUT
      输入节点前处理的节点,暂时在vpp里面没用用到

  4. VLIB_NODE_TYPE_PROCESS
      线程节点,和线程一样,可以可以暂停、等待事件、恢复,不同于pthread_thread,他是基于setjump/longjump实现的弦程.
    等待一个事件:always_inline f64 vlib_process_wait_for_event_or_clock (vlib_main_t vm, f64 dt)
    发送一个事件: always_inline void vlib_process_signal_event (vlib_main_t
    vm, uword node_index, uword type_opaque, uword data)

3.注册节点

3.1 注册一个输入节点

3.2 注册一个内部结点

3.3 注册一个线程节点

4.创建一个插件基本框架

  在最新的版本,vpp提供了一个创建插件的脚本,直接使用这个脚本就可以创建我们需要的插件基本框架。
  如果自己系统没有安装emacs,需要安装一下,否则脚本运行会失败,我自己的系统是centos,所以需要安装

需要提供两个设置:

  • 插件的名字
  • 调度类型,有双单环路对还是四单环路对

下面是具体命令:

调度类型暂时我还不太清楚有多大差异,暂时选择dual模式,后面自己根据自己业务,对插件做相关的修改就行。

生成出来的文件:

5.编译插件

6.验证插件是否正常

如果上面有显示自己插件的信息,表示你提供的插件功能基本完备,能正常加载使用了.

7.测试插件

默认创建的插件已经实现了以下功能:

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

  在内部节点的实现函数里面(VLIB_NODE_FN (myplugin_node)),主要实现功能是对input节点收进来的报文,做一个src dst mac交换,然后源端口发送出去。
  ok,到此为止我们知道这个模板插件能做的事情了,下面我们测试一下,我们结合前面的vpp+dpdk环境,测试一下这个模型。

8.测试

将dpdk网口up起来
set int state eth0 up
开启网口的混杂模式
set int promiscuous on eth0
使能我们的插件
myplugin enable-disable eth0
dpdk网口对端发包
预期结果
在发送侧:每发送一个报文,能在本端口收到一个src mac和dst mac交换的报文.


在vpp测,可以看到网口收发包统计和trace信息:

[原文链接](https://blog.csdn.net/yaochuh/article/details/88841633

赞赏

微信赞赏支付宝赞赏

发表评论

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