------------------------------------------------------------------------------------------
以下是我根据 linux-2.6.23.9版本内核源代码所做阅读笔记,属个人兴趣而为,希望找到有共同兴趣
的朋友一起讨论和研究,有谬误之处,笔者水平有限,欢迎大家拍砖:)
------------------------------------------------------------------------------------------
FIB结构
用于保存路由规则,路由的查找过程如下:
1, 在缓存中搜索路由表项,如果能查到,就直接将对应的一项作为路由规则
2, 如果不能查到,就从FIB规则中换算出来,并且在路由缓存中添加表项
fib_table结构
struct fib_table {
};
u32
主转发表(main_table)用于描述对设备路由规则
局部转发表(local_table)用于记录本地地址信息
unsigned char tb_data[0];这个指针指向一个fn_hash结构.
在系统初始化的时候 memset(tb->tb_data, 0, sizeof(struct fn_hash));
在linux 2.6内核中本结构添加了struct hlist_node tb_hlist,所有的fib_table可以使用这个结构连成一个双向链表,这个结构定义如下:
struct hlist_node {
};
可以使用一个宏hlist_for_each_entry_rcu使用RCU模式对所有的fib_table进行遍历,相关的函数还有hlist_add_head_rcu, hlist_del_rcu()等等.RCU模式不需要读写互斥,仅需要禁用抢占.
内核中fib_new_table函数用于创建一个新的fib_table结构.
fn_hash结构
struct fn_hash {
};
struct fn_zone *fn_zones[33];//每个数组元素对应着一个fn_zone结构指针
fz_zone[0] : 0000,0000,0000,0000,0000,0000,0000,0000
fz_zone[1] : 1000,0000,0000,0000,0000,0000,0000,0000
fz_zone[2] : 1100,0000,0000,0000,0000,0000,0000,0000
实际上用于标识子网掩码,可以看出,fz_zone[0]实际上对应默认网关
struct fn_zone *fn_zone_list;//当前正在使用的fz_zone的一个链表