宏CONFIG_IP_MULTIPLE_TABLES表示配置路由策略(对路由器而言?),如果定义了该宏,系统可以创建多达256张路由表,全部存放在数组struct fib_table *fib_tables[RT_TABLE_MAX+1]中。
如果配置了路由策略,在FIB的初始化函数中,首先创建了两张路由表myip_fib_local_table, myip_fib_main_table(它们会成为fib_tables中的一项)。
如果没有配置路由策略,则只是向内核注册一个通知回调fib_rules_notifier。关于这个回调的含义,在使用到时再分析。
最后,初始化函数向内核注册了两个通知回调myfib_netdev_notifier,myfib_inetaddr_notifier。结束了FIB的初始化过程。
理解FIB的关键是理解表示路由表的数据结构,fib_tables是一张总的路由表集,含有256张表,表示一张路由表的数据结构是struct fib_table:
struct fib_table {
unsigned char 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 *table, struct rtmsg *r,
struct kern_rta *rta, struct nlmsghdr *n,
struct netlink_skb_parms *req);
int (*tb_delete)(struct fib_table *table, struct rtmsg *r,
struct kern_rta *rta, struct nlmsghdr *n,
struct netlink_skb_parms *req);
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];
};
它含有路由表的id,表戳,以及对表的操作集(包括路由的插入,删除等)。tb_data是路由数据,它实际上是一个结构体struct fn_hash:
struct fn_hash {
struct fn_zone *fn_zones[33];
struct fn_zone *fn_zone_list;
};
通过zone可以找到路由节点struct fib_node,进而找到路由信息struct fib_info。关于这些数据的细节,我们在代码实现到这一步时再进行分析。
阅读(464) | 评论(0) | 转发(0) |