linux路由内核实现分析(二)---FIB相关数据结构(1)

------------------------------------------------------------------------------------------

以下是我根据 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的一个链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值