key_vector详解

news2025/3/1 1:22:21

key_vector是linux网络路由时,非常重要的一个结构,其定义如下:

struct key_vector {

t_key key;

unsigned char pos; /* 2log(KEYLENGTH) bits needed */

unsigned char bits; /* 2log(KEYLENGTH) bits needed */

unsigned char slen; 子网长度

union {

/* This list pointer if valid if (pos | bits) == 0 (LEAF) */

struct hlist_head leaf;

/* This array is valid if (pos | bits) > 0 (TNODE) */

struct key_vector __rcu *tnode[0];

};

};

先不解释结构中几个字段的含义,首先用一段代码,将系统中顶层的key_vector,及其下层的key_vector中的数据打印出来。


void PrintKeyVector(struct key_vector* p_kv)
{
	int n_count;
	int i;
	if (NULL == p_kv)
	{
		return;
	}

	printk("----------\n");
	printk("key: %lx\n", p_kv->key);
	printk("pos: %x\n", p_kv->pos);
	printk("bit: %x\n", p_kv->bits);
	printk("slen: %x\n", p_kv->slen);
}

static int hello_open(struct inode* inode, struct file*filep)
{
	struct task_struct *tsk = current;
	struct fib_table *tb;

	struct trie *t;
	struct key_vector *n, *pn;

	int i = 0;
	int n_count;

	// 主表-254 RT_TABLE_MAIN
	// 本地表-255 RT_TABLE_LOCAL
	tb = fib_get_table(tsk->nsproxy->net_ns, RT_TABLE_MAIN);
	printk("fib_table tb_id: %d\n", tb->tb_id); 

	printk("fib_table tb_num_default: %d\n", tb->tb_num_default); 

	t = (struct trie *) tb->tb_data;

	pn = t->kv;

	n = get_child_rcu(pn, 0);
	PrintKeyVector(n);

	n_count = 1 << n->bits;
	for (; i < n_count; ++i)
	{
		struct key_vector* pkv = n->tnode[i];
		printk("index = %d\n", i);
		PrintKeyVector(pkv);
	}
	return 0;
}

打印的日志:

[  227.486538] fib_table tb_id: 254
[  227.486540] fib_table tb_num_default: 1
[  227.486540] ----------
[  227.486541] key: 0
[  227.486542] pos: 1d
[  227.486542] bit: 3
[  227.486543] slen: 20
[  227.486544] index = 0
[  227.486544] ----------
[  227.486545] key: 0
[  227.486545] pos: 0
[  227.486546] bit: 0
[  227.486546] slen: 20
[  227.486547] index = 1
[  227.486548] index = 2
[  227.486548] index = 3
[  227.486549] ----------
[  227.486549] key: 7f000000
[  227.486550] pos: 16
[  227.486550] bit: 2
[  227.486551] slen: 18
[  227.486551] index = 4
[  227.486552] index = 5
[  227.486552] ----------
[  227.486553] key: a8000000
[  227.486554] pos: 19
[  227.486554] bit: 2
[  227.486555] slen: 19
[  227.486555] index = 6
[  227.486556] ----------
[  227.486556] key: c0a80000
[  227.486557] pos: 6
[  227.486557] bit: 2
[  227.486558] slen: 8
[  227.486559] index = 7 

 根据打印的日志,整理了下面的结构图:

 中间是上层的key_vector,两边的4个属于其下层。

key_vector各字段介绍

1. key

key表示的是IP地址或IP地址段,如key=0,表示的地址是0.0.0.0;key=0xc0a80000,表示的地址是192.168.0.0。

2. bit

bit用来表示下层有几个key_vector,下层对象的指针,存放在tnode指向的数组中。用2的bit次方,可以计算出下层key_vector的数量。中间key_vector的bit为3,表示其下面有8个key_vector。

3. pos

pos需要和bit一块使用,从pos开始的bit个位,表示了下层vector在本层vector的tnode数组中存放的位置。

中间vector的pos为29,bit为3,说明下层key_vector的key,从29开始的3位(已标红的3位),表识了在中间key_vector数组的索引。

如:key为0xc0a80000(即192.168.0.0)的key_vector,对应的3位为0x110,该对象的指针,存放在中间key_vector数组的索引为6的位置。

4. slen

slen为后缀长度。

次层key_vector

用上面同样的方法,将192.168.0.0的下层key_vector打印出来。

 上层pos为6,bits为2,因此下层key中从第6位开始的2位,标识了下层在上次数组中的索引。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/520163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kubernetes❀资源管理

kubernetes❀资源管理 3. 资源管理3.1 资源管理介绍3.2 YAML语言介绍3.3 资源管理方式3.3.1 命令式对象管理3.3.2 命令式对象配置3.3.3 声明式对象配置 3. 资源管理 3.1 资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管…

Git advanced高级操作

这篇文章是继Git概念介绍&#xff0c;常用命令与工作流程整理 配图_TranSad的博客-CSDN博客 之后的一些补充&#xff0c;学习总结一些额外Git操作中的比较常用的操作。所以这篇文章假设你已经有了前面的基础&#xff0c;我就直接说一些没有提到过的部分。 Detached HEAD 在G…

镜面反射BRDF模型(Specular BRDF)

利用这些假设&#xff08;局部光学平坦表面&#xff0c;没有相互反射&#xff09;&#xff0c;可以很容易推导出一个被称为Microfacet Cook-Torrance BRDF的一般形式的Specular BRDF项。此Specular BRDF具有以下形式&#xff1a; 其中&#xff1a; D(h) : 法线分布函数 &#…

数据结构与算法十一 图的入门

一 图的入门 1.1 图的实际应用 在现实生活中&#xff0c;有许多应用场景会包含很多点以及点点之间的连接&#xff0c;而这些应用场景我们都可以用即将要学习的图这种数据结构去解决。 地图&#xff1a; 我们生活中经常使用的地图&#xff0c;基本上是由城市以及连接城市的道…

【Nginx高级篇】nginx扩容

目录 一、单机垂直扩容&#xff1a;硬件资源增加 二、水平扩展&#xff1a;集群化 &#xff08;一&#xff09;会话管理 1、Nginx高级负载均衡 2、使用sticky模块完成对Nginx的负载均衡 3、keepalive &#xff08;二&#xff09;upstream的工作流程 &#xff08;三&…

为什么别人家的ChatGPT比我家的更聪明?

文章目录 引子使用技巧技巧1&#xff1a;使用分隔符技巧2&#xff1a;结构化输出技巧3&#xff1a;整理操作步骤技巧4&#xff1a;做示范技巧5&#xff1a;给定具体的步骤技巧6&#xff1a;生成摘要技巧7&#xff1a;情感分析 好问题的三要素总结 引子 你有没有发现&#xff0…

ENVI自动地理配准栅格图像(至少一一幅图像含有地理信息)

本文就介绍一种在ENVI 5.3 (64-bit) 软件中&#xff0c;自动生成地面控制点&#xff0c;从而对遥感影像进行地理配准的方法。 我们先来看一下本文需要实现的需求。现有以下两景遥感影像&#xff0c;其中一景含有地理参考信息&#xff0c;而另一景则不含有任何地理参考信息。在…

STL常用容器_1

目录 一、string容器 1、基本概念 2、构造函数 3、赋值操作 4、字符串拼接 5、查找和替换 6、字符串比较 7、字符存取 8、插入与删除 9、获取字串 二、vector容器 1、基本概念 2、构造函数 3、赋值操作 4、容量和大小 5、插入和删除 6、数据存取 7、互换容器…

Apache Hive

Hive的概念 Hive是Facebook开源出来&#xff0c;后来贡献给力Apache .宗旨是&#xff1a;提高分析数据的能力降低分析数据的开发成本。 Hive是基于 Hadoop 的一个数据仓库工具&#xff0c;用于分析数据的。 为什么说Hive是基于Hadoop的呢&#xff1f; ​ #作为一款数据仓库软件…

依次对两数组对应位置的元素进行逻辑判断numpy.logical_and()numpy.logical_or()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 依次对两数组对应位置的元素进行逻辑判断 numpy.logical_and() numpy.logical_or() [太阳]选择题 下列代码中np.logical_or(A, B)输出的结果是&#xff1f; import numpy as np A [True, Fa…

R语言 | 正态分布

目录 一、用直方图检验crabs对象 二、用直方图检验beaver2对象 三、用QQ图检验数据是否服从正态分布 四、shapiro.test()函数 所谓正态分布又称高斯分布&#xff0c;许多统计学的理论都是假设所使用的数据服从正态分布。 一、用直方图检验crabs对象 检验数据是否服从正态分…

Kubernetes❀ 详细教程-介绍

Kubernetes❀ 详细教程-介绍 Kubernetes详细教程-介绍1. Kubernetes介绍1.1 应用部署方式演变1.2 kubernetes简介1.3 kubernetes组件1.4 kubernetes概念 Kubernetes详细教程-介绍 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个…

c++ 一个简单的请求程序

https://github.com/AHUT-GeekTeam/ESP32CAM_BaiduAI/blob/master/demo.ino HTTP格式 请求行 回车换行请求头 回车换行请求头 回车换行请求头 回车换行……请求头 回车换行 回车换行数据 jichu daima 参考黑马程序员的代码MAIN.C #include "b.h" //#include <p…

威纶通触摸屏复合式多功能按钮的使用方法

威纶通触摸屏复合式多功能按钮的使用方法 如下图所示,打开easy builder pro软件,新建一个测试项目,在元件中找到复合式多功能按钮,点击后放入画面中, 如下图所示,此时会弹出以下窗口,在动作中点击“+”图标,选择自己需要添加的动作, 如下图所示,首先添加一个位状…

C++类与对象—下

本期我们继续学习类与对象&#xff0c;没有看过上和中的小伙伴建议先看前两期内容 (2条消息) C类与对象—上_KLZUQ的博客-CSDN博客 (2条消息) C类与对象—中_KLZUQ的博客-CSDN博客 目录 1.再谈构造函数 1.1构造函数体赋值 1.2初始化列表 1.3 explicit关键字 2. static成员…

学成在线笔记+踩坑(12)——用户认证

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题 目录 1 需求分析 2 【认证模块】连接用户中心数据库 2.1 连接数据库认证 2.1.1 分析 2.1.2 实现&#xff0c;实现UserDetailsService接口 …

Golang每日一练(leetDay0064) 轮转数组、颠倒二进制位

目录 189. 轮转数组 Rotate Array &#x1f31f;&#x1f31f; 190. 颠倒二进制位 Reverse Bits &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 189. 轮转数组 Rotate Ar…

小曾同学【五周年创作纪念日】——努力向前冲的菜鸟

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c; 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想当开发的测试&#xff0c;不是一个好…

什么是UA?常见蜘蛛UA?怎么查询UA?

什么是UA? UA简介查看自己的UA修改它的常见用处搜索引擎蜘蛛UA大全常见蜘蛛UA标识 UA简介 UA其实是User Agent的简称。 所谓的User Agent其实就是浏览器在跟服务器通信的时候&#xff0c;一段百十来个字符的落款信息罢了。浏览器发送的每一个HTTP请求数据的头部都加了这个信息…

【C++】红黑树的插入分析及验证

文章目录 1. 红黑树概念2. 红黑树性质3. 结构定义关于默认节点为红/黑色的讨论 4. insert情况1—— uncle节点存在且为红色(g p c左斜形成一条直线)情况2——uncle节点不存在/存在且为黑色(g p c 左斜形成直线 右单旋)uncle节点不存在uncle节点存在并且为黑色 情况3——uncle节…