路由表(FIB)的初始化

宏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。关于这些数据的细节,我们在代码实现到这一步时再进行分析。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值