VPP Node分析(一) Node示例代码分析

VPP Node分析(一) Node示例代码分析

1、概述

VPP由一个个plugin组成,功能逻辑按node进行划分,数据包在node之间进行传递,一个个node构成了VPP的Graph处理图谱,本文先简单分析node的一般代码框架,后续文章深入分析Node的后台调度框架和原理。

2、节点注册

VPP中Node注册是自定义插件的入口,由于VPP封装性好,注册一个Node,只需按格式调用VPP定义的宏VLIB_REGISTER_NODE,示例代码如下:

VLIB_REGISTER_NODE (sample_node) =
{
  .name = "sample",
  .vector_size = sizeof (u32),
  .format_trace = format_sample_trace,
  .type = VLIB_NODE_TYPE_INTERNAL,

  .n_errors = ARRAY_LEN(sample_error_strings),
  .error_strings = sample_error_strings,

  .n_next_nodes = SAMPLE_N_NEXT,

  /* edit / add dispositions here */
  .next_nodes = {
    [SAMPLE_NEXT_INTERFACE_OUTPUT] = "interface-output",
  },
};

我们把VLIB_REGISTER_NODE宏进行展开,进一步分析Node注册,被宏定义隐藏的细节内容。如下是VLIB_REGISTER_NODE的宏定义代码:

#define VLIB_REGISTER_NODE(x,...)                                       \
    __VA_ARGS__ vlib_node_registration_t x;                             \
static void __vlib_add_node_registration_##x (void)                     \
    __attribute__((__constructor__)) ;                                  \
static void __vlib_add_node_registration_##x (void)                     \
{                                      
VPP中注册一个收包插件的示例代码如下: ```c #include <vnet/vnet.h> #include <vnet/plugin/plugin.h> #include <vpp/app/version.h> #include <vnet/ip/ip.h> /* 定义插件名称 */ #define PLUGIN_NAME "my_plugin" /* 定义插件版本 */ #define PLUGIN_VERSION "1.0" /* 定义插件注册函数 */ static clib_error_t * my_plugin_init (vlib_main_t * vm) { /* 定义收包函数 */ void my_packet_handler (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame); /* 注册收包函数 */ ip4_register_protocol (IP_PROTOCOL_UDP, my_packet_handler); return 0; } /* 定义收包函数 */ void my_packet_handler (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { /* 处理收到的数据包 */ // ... /* 释放数据包 */ vlib_buffer_free (vm, vlib_frame_vector_args (frame), frame->n_vectors); } /* 注册插件 */ VNET_FEATURE_INIT (my_plugin, static) = { .arc_name = "ip4-unicast", .node_name = "ip4-lookup", .runs_before = VNET_FEATURES ("ip4-lookup"), .runs_after = VNET_FEATURES ("ip4-udp-lookup"), .init_function = my_plugin_init, .feature_name = PLUGIN_NAME, .version = PLUGIN_VERSION, }; ``` 在上述代码中,`my_plugin_init` 函数中注册了一个收包函数 `my_packet_handler`,并将其绑定到了 `IP_PROTOCOL_UDP` 协议上,表示当收到 UDP 协议的数据包时会调用该函数进行处理。同时,通过 `VNET_FEATURE_INIT` 宏注册了插件,并指定了插件在 `ip4-lookup` 节点之前运行。具体的节点顺序可以根据实际需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值