vpp之node节点分析一: dual类型节点

本文解析VPP中Dual类型Node节点的工作原理,包括如何确定数据包的下一个Node节点及处理流程,并对比Dual与QS类型的差异。

vpp中node节点是数据包的处理流程,数据包在不同节点之间流动进行处理

vpp所有的node节点无论里面的逻辑如何处理,转发流程都分为两种,主要是为了性能优化,本篇文章介绍第一种dual类型

首先创建一个dual类型的插件,名字为testdual,查看node.c文件

注:一般来说处理数据包的代码文件名都是node.c,但是如果一个模块功能过于复杂就会根据相应类型取名,例如ip4的处理

1.第一个知识点,当前node是如何确定数据包的下一个node节点的

这两个要放在一起看

VLIB_REGISTER_NODE这个宏表示注册 testdual这个节点

name表示该节点的名字,其中vpp会给该node分配一个node index作为标识,和名称一一对应

type表示节点的类型,这个会在别的文章中分享,处理数据包的节点都是该类型

重点来了

n_next_nodes表示当前node节点的下一个节点有多少个,这个值就是上面枚举类型的最后一个

next_nodx表示当前node节点下一个节点有哪些,在代码中会变成char *next_nodes[] 数组,记录下每一个节点的名字,其中数组下标对应上面的枚举类型,具体代码中使用的下面讲解

2.第二个知识点,当前节点是如何处理数据

般的链表操作中,尾指针通常是指向链表的尾结点而非头节点,不过在某些特定场景下尾指针可能始终指向头节点,有以下些原因: ### 空链表情况 当链表为空时,没有实际的数据节点,此时头节点是链表中唯存在的节点,尾指针也就只能指向头节点。例如在链表初始化时,尚未添加任何数据节点,尾指针和头指针都指向头节点个唯的存在。 ### 特殊数据结构或算法需求 某些特殊的数据结构设计或者算法实现中,要求尾指针始终指向头节点以简化逻辑。比如在循环链表的特殊应用场景,若要实现种特殊的遍历或者操作逻辑,让尾指针指向头节点可以方便进行循环的控制和边界判断。 ### 简化插入操作 在些插入操作的设计中,若尾指针始终指向头节点,每次插入新节点时,不需要额外更新尾指针的指向,只需要在头节点之后进行插入操作即可。这样可以减少插入操作的复杂度,提高代码的简洁性和可维护性。 ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node { int data; struct Node* next; } Node; // 定义链表结构体 typedef struct { Node* head; Node* tail; } LinkList; // 初始化链表 void initList(LinkList* list) { list->head = (Node*)malloc(sizeof(Node)); list->head->next = NULL; list->tail = list->head; // 尾指针指向头节点 } // 插入节点 void insertNode(LinkList* list, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = list->head->next; list->head->next = newNode; // 尾指针始终指向头节点,无需更新 } int main() { LinkList list; initList(&list); insertNode(&list, 1); insertNode(&list, 2); return 0; } ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值