VPP中如何决定当前NODE的下一跳NODE是next_nodes[]中的哪一个

首先, 我觉得我被一些解释误导了, 下边是一些文章中的描述:

上边这里是一个NODE 的.function 的定义, 可以看到说的是2这里返回多少, 那下一跳Node 就是取next_node[]中的哪一个。 这就不科学了, 这个返回值是值frame中有多少个数据包, 怎么能决定下一跳Node的值呢。

我认为我们在node的 .function 函数中处理报文时, 应该去修改next0 (标记1) 的值来决定下一跳的值。 为了验证这个猜想, 我们来看一下, VPP 源码中的node "ip4-input":

可以看到 0 处是在注册Node, 但是没有.function的定义, 不慌, 1 处就是。VLIB_NODE_FN 宏展开可以看到, 是在这里对.function 赋值的。

那这个NODE的主要处理函数就是:

### **VLIB_REGISTER_NODE 解析(VPP开发)** `VLIB_REGISTER_NODE` 是 **VPP(Vector Packet Processing)** 框架中用于**注册节点(Node)**的核心宏,用于定义数据包处理逻辑。节点是VPP数据平面的基本执行单元,每个节点负责特定功能(如路由、ACL、NAT等)。 --- ## **1. 基本结构与参数** ```c VLIB_REGISTER_NODE (node_name) = { .name = "节点名称", // 用于CLI/API标识 .function = node_function, // 处理函数 .vector_size = sizeof(u32), // 向量化处理单位大小(通常为u32) .format_trace = format_trace_fn, // 调试跟踪格式化函数(可选) .n_next_nodes = N_NEXT, // 下节点数量 .next_nodes = { // 下节点列表 [NEXT_ACTION1] = "next-node-1", [NEXT_ACTION2] = "next-node-2", ... }, }; ``` **关键参数说明:** | 参数 | 说明 | |------|------| | `.name` | 节点名称,用于CLI/API调用(如 `show node <name>`) | | `.function` | 核心处理函数,接收 `vlib_frame_t*` 处理数据包 | | `.vector_size` | 向量化处理单位(通常 `sizeof(u32)`,表示逐包处理) | | `.n_next_nodes` | 定义可能的下节点数量 | | `.next_nodes` | 下节点数组,决定数据包流向(如丢包、转发到下节点) | | `.format_trace` | (可选)调试时格式化数据包跟踪信息 | --- ## **2. 核心处理函数(`node_function`)** 处理函数的基本模板: ```c static uword node_function (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame) { u32 *buffers = vlib_frame_args (frame); // 获取数据包缓冲区索引数组 uword n_packets = frame->n_vectors; // 当前中的数据包数量 for (u32 i = 0; i < n_packets; i++) { u32 bi = buffers[i]; vlib_buffer_t *b = vlib_get_buffer (vm, bi); // 获取数据包缓冲区 /* 处理逻辑(如修改数据包、查找路由表等) */ // 设置下节点(如转发或丢包) vlib_validate_buffer_enqueue_x1 (vm, node, next_index, bi); } return frame->n_vectors; // 返回处理的数据包数量 } ``` --- ## **3. 节点注册流程** 1. **定义节点结构体**:使用 `VLIB_REGISTER_NODE` 宏声明节点。 2. **实现处理函数**:编写 `node_function` 处理数据包。 3. **注册到VPP图(Graph)**:VPP启动时自动加载节点到数据包处理图。 4. **CLI/API调用**:通过节点名称(`.name`)管理节点(如 `show node`、`trace add`)。 --- ## **4. 示例:一个简单的"drop"节点** ```c #include <vnet/vnet.h> static uword my_drop_node_fn (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame) { // 直接丢弃所有数据包 return frame->n_vectors; } VLIB_REGISTER_NODE (my_drop_node) = { .name = "my-drop-node", .function = my_drop_node_fn, .vector_size = sizeof(u32), .n_next_nodes = 0, // 无下 }; ``` **测试方法:** ```bash # 查看节点 vpp# show node my-drop-node # 跟踪数据包流向 vpp# trace add dpdk-input 10 vpp# pa # 发送测试流量 ``` --- ## **5. 常见用途** - **自定义协议处理**(如解析新协议头) - **数据包过滤/ACL** - **负载均衡/路由策略** - **与DPDK插件集成** ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值