您的位置:首页 > 理论基础 > 数据结构算法

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的一个链表
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: