linux路由内核实现分析(二)---FIB相关数据结构(1)
2013-07-10 12:14
549 查看
------------------------------------------------------------------------------------------
以下是我根据 linux-2.6.23.9版本内核源代码所做阅读笔记,属个人兴趣而为,希望找到有共同兴趣
的朋友一起讨论和研究,有谬误之处,笔者水平有限,欢迎大家拍砖:)
------------------------------------------------------------------------------------------
FIB结构
用于保存路由规则,路由的查找过程如下:
1, 在缓存中搜索路由表项,如果能查到,就直接将对应的一项作为路由规则
2, 如果不能查到,就从FIB规则中换算出来,并且在路由缓存中添加表项
fib_table结构
struct fib_table {
struct hlist_node tb_hlist;
u32 tb_id;
unsigned tb_stamp;
int (*tb_lookup)(struct fib_table *tb, const struct flowi *flp, struct fib_result *res);
int (*tb_insert)(struct fib_table *, struct fib_config *);
int (*tb_delete)(struct fib_table *, struct fib_config *);
int (*tb_dump)(struct fib_table *table, struct sk_buff *skb,
struct netlink_callback *cb);
int (*tb_flush)(struct fib_table *table);
void (*tb_select_default)(struct fib_table *table,
const
struct flowi *flp, struct fib_result *res);
unsigned char tb_data[0];
};
u32 tb_id;//是fib_table唯一的标识,例如local_table(局部转发表,用于本地),标记是255,对main_table(主转发表,用于数据转发),标记是254,只有在查找local_table表时没有找到匹配的路由(不是发给本地的)它才会去查找main_table
主转发表(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 {
struct hlist_node *next, **pprev;
};
可以使用一个宏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];
struct fn_zone *fn_zone_list;
};
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的一个链表
以下是我根据 linux-2.6.23.9版本内核源代码所做阅读笔记,属个人兴趣而为,希望找到有共同兴趣
的朋友一起讨论和研究,有谬误之处,笔者水平有限,欢迎大家拍砖:)
------------------------------------------------------------------------------------------
FIB结构
用于保存路由规则,路由的查找过程如下:
1, 在缓存中搜索路由表项,如果能查到,就直接将对应的一项作为路由规则
2, 如果不能查到,就从FIB规则中换算出来,并且在路由缓存中添加表项
fib_table结构
struct fib_table {
struct hlist_node tb_hlist;
u32 tb_id;
unsigned tb_stamp;
int (*tb_lookup)(struct fib_table *tb, const struct flowi *flp, struct fib_result *res);
int (*tb_insert)(struct fib_table *, struct fib_config *);
int (*tb_delete)(struct fib_table *, struct fib_config *);
int (*tb_dump)(struct fib_table *table, struct sk_buff *skb,
struct netlink_callback *cb);
int (*tb_flush)(struct fib_table *table);
void (*tb_select_default)(struct fib_table *table,
const
struct flowi *flp, struct fib_result *res);
unsigned char tb_data[0];
};
u32 tb_id;//是fib_table唯一的标识,例如local_table(局部转发表,用于本地),标记是255,对main_table(主转发表,用于数据转发),标记是254,只有在查找local_table表时没有找到匹配的路由(不是发给本地的)它才会去查找main_table
主转发表(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 {
struct hlist_node *next, **pprev;
};
可以使用一个宏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];
struct fn_zone *fn_zone_list;
};
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的一个链表
相关文章推荐
- linux路由内核实现分析(二)---FIB相关数据结构(2)
- linux路由内核实现分析(二)---FIB相关数据结构(3)
- linux路由内核实现分析(二)---FIB相关数据结构
- linux路由内核实现分析(二)---FIB相关数据结构(4)
- linux路由内核实现分析(四)---路由缓存机制(3)
- Linux内核--网络栈实现分析(八)--应用层发送数据(下)
- Linux内核--网络栈实现分析(八)--应用层发送数据(下)
- linux路由内核实现分析(一)----邻居子节点(2)
- linux路由内核实现分析(四)---路由缓存机制(4)
- Linux 路由 学习笔记 之一 相关的数据结构
- linux路由内核实现分析(一)----邻居子节点
- linux路由内核实现分析(三)---路由查找过程
- linux路由内核实现分析(四)---路由缓存机制
- linux路由内核实现分析(三)---路由查找过程
- Linux0.11内核--进程相关数据结构
- linux路由内核实现分析(四)---路由缓存机制(1)
- Linux0.11内核--进程相关数据结构
- Linux2.6内核--VFS层中和进程相关的数据结构
- linux路由内核实现分析(一)----邻居子节点(1)
- linux路由内核实现分析(四)---路由缓存机制(2)