ZBLOG

vpp怎么写node

VPP(Vector Packet Processing)是一个高性能的数据平面开源项目,用于构建网络功能虚拟化(NFV)和软件定义网络(SDN)解决方案。它由Cisco开发,并在Apache 2.0许可下发布。

在VPP中,节点(Node)是数据包处理的基本单元。每个节点都执行一些特定的功能,并且可以相互组合形成流水线,完成复杂的数据包处理任务。以下是如何编写一个基本节点的步骤:

  1. 包含头文件:首先需要包含VPP相关头文件,例如vlib/vlib.h、vnet/vnet.h等。

  2. 定义结构体:定义一个包含节点配置信息和运行时状态的结构体。通常命名为node_main_t。

  3. 注册节点:使用VLIB_REGISTER_NODE宏将节点注册到VPP框架中。该宏需要提供节点名字、输入输出描述符等参数。

  4. 创建节点函数:实现一个create_node函数,其中会初始化节点配置信息和运行时状态。这个函数会被VPP框架调用,创建实际的节点。

  5. 处理数据包:实现一个process_packet函数,用于对输入数据包进行处理,并将结果发送给下一个节点或者输出口。

  6. 清理节点函数:实现一个cleanup_node函数,用于清理节点状态和资源。

以下是一个简单的节点示例,用于向输出口发送ping应答:

#include <vlib/vlib.h>
#include <vnet/vnet.h>

typedef struct {
  u32 sw_if_index;
} node_main_t;

static uword process_packet(vlib_main_t *vm, vlib_node_runtime_t *node,
                            vlib_frame_t *frame) {
  u32 n_left_from, *from;
  from = vlib_frame_vector_args(frame);
  n_left_from = frame->n_vectors;

  while (n_left_from > 0) {
    u32 n_left_to_next;
    vlib_get_next_frame(vm, node, VLIB_NODE_FORWARD_NEXT_INDEX, to_next,
                        n_left_to_next);
    while (n_left_from > 0 && n_left_to_next > 0) {
      vlib_buffer_t *buf;
      u32 bi;
      bi = from[0];
      from += 1;
      n_left_from -= 1;
      to_next[0] = bi;
      to_next += 1;
      n_left_to_next -= 1;
      buf = vlib_get_buffer(vm, bi);
      u32 sw_if_index = ((node_main_t *)node->runtime_data)->sw_if_index;
      vnet_buffer(b)->sw_if_index[VLIB_TX] = sw_if_index;
      vlib_set_next_frame_buffer(vm, node, VLIB_NODE_FORWARD_NEXT_INDEX, bi);
    }
    vlib_put_next_frame(vm, node, VLIB_NODE_FORWARD_NEXT_INDEX, n_left_to_next);
  }

  return frame->n_vectors;
}

static clib_error_t *setup_function(vlib_main_t *vm) {
  node_main_t *nm;
  nm = &node_main;
  nm->sw_if_index = 0;
  return 0;
}

VLIB_REGISTER_NODE(node_ping_reply) = {
    .function = process_packet,
    .name = "ping-reply",
    .type = VLIB_NODE_TYPE_INTERNAL,
    .vector_size = sizeof(u32),
    .n_errors = 0,
    .format_trace = 0,
    .flags = VLIB_NODE_FLAG_IS_DROP,
};

VLIB_INIT_FUNCTION(setup_function);

可以看到,节点的实现主要包含了创建、处理和清理三个函数。其中process_packet是最重要的函数,它通过循环获取所有输入数据包,并对每个数据包进行处理。在这个例子中,只是简单地将输出口设置为节点配置中的sw_if_index。其余部分都是基本的VPP框架代码。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=97

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?