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) \
{