Chinaunix首页 | 论坛 | 博客
  • 博客访问: 519623
  • 博文数量: 398
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 14
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-21 16:02
个人简介

嵌入式屌丝

文章分类

全部博文(398)

文章存档

2013年(398)

我的朋友

分类: LINUX

2013-08-21 17:17:05

原文地址:路由表(FIB)的初始化 作者:lwchsz

宏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。关于这些数据的细节,我们在代码实现到这一步时再进行分析。
阅读(592) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~