Chinaunix首页 | 论坛 | 博客
  • 博客访问: 660613
  • 博文数量: 186
  • 博客积分: 1875
  • 博客等级: 上尉
  • 技术积分: 2117
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 23:21
个人简介

有时候,就是想窥视一下不知道的东东,因为好奇!

文章分类

全部博文(186)

文章存档

2024年(2)

2023年(3)

2020年(1)

2019年(1)

2018年(1)

2017年(2)

2016年(69)

2015年(53)

2014年(14)

2013年(1)

2012年(5)

2011年(25)

2010年(9)

分类: LINUX

2015-07-26 21:08:07

第四章 路由
4.1 路由函数表结构及关系图
        a. 图: 
    
        b. 从图可看出,路由函数表fib_table是路由的总根, 从此出发可找到各个路由区结构fn_zone, 也可以找到路由节点结构fib_node或者路由信息结构fib_info
4.2 路由函数表的初始化
        inet_init()-->ip_init()-->ip_rt_init()-->atomic_set()(设置路由随机数)
                                                            -->__alloc_percpu()(分配percpu变量)
                                                            -->kmem_cache_create()(创建路由项高速缓存)
                                                            -->alloc_large_system_hash()(创建路由hash桶缓存---一个rt_hash_bucket路由队列空间)
                                                            -->memset()(对上分配的空间赋值--初始化)
                                                            -->rt_hash_lock_init()(初始化路由hash队列)
                                                            -->devinet_init()(一些登记工作) -->register_pernet_sybsys()(登记pernet_operations结构devinet_ops, 网络空间函数表,初始化/释放网络空间)
                                                                                                              -->register_gifconf()(登记一个SIOCGIF处理程序)
                                                                                                              -->register_netdevice_notifier()(注册通知节点)
                                                                                                              -->rtnl_register()(3次调用此函数, 注册处理(增/删/取)路由"地址"的netlink)
                                                            -->ip_fib_init()-->rtnl_register()(3次调用此函数, 注册管理(增/删/取)路由"目的"的netlink)
                                                                                  -->register_pernet_subsys()-->register_pernet_operations()-->fib_net_init()-->ip_fib_net_init()-->fib4_rules_init()-->fib_hash_table()(创建本地/主路由函数表)
                                                                                                                                                                                                                                                                   -->hlist_add_head_rcu()
                                                                                                                                                                                                                                     -->fib4_rules_init()-->fib_default_rules_init()-->fib_default_rules_add()
                                                                                                                                                                                                        -->nl_fib_lookup_init()
                                                                                                                                                                                                        -->fib_proc_init()(在内核proc文件系统中创建route节点)
                                                                                  -->register_netdevice_notifier()(将fib_netdev_notifier设备节点链入到内核的设备通知链netdev_chain)
                                                                                  -->register_inetaddr_notifier()(将fib_inetaddr_notifier挂入到inetaddr_chain地址通知链)
                                                                                  -->fib_hash_init()(创建两个调整缓存: 一个用于fib_node路由项结构, 一个用于fib_alias路由别名结构)
                                                           -->rtnl_register()登记一个獲得路由的netlink
                                      -->inet_peers()初始化外部(对端)ip地址的高速缓存
        register_pernet_subsys()-->register_pernet_operations()(将fib_net_ops={.init=fib_net_init, .exit=fib_net_exit}挂入到first_device队列中)
        ip_fib_net_init()(初始化init_net网络空间的fib_table_hash路由函数表队列)
        
        (无多路由规则: )

        fib4_rules_init()-->fib_hash_table()(创建本地/主路由函数表...后续链入到路由函数表队列数组)
        (有多路由规则: 调用kmemdup() 相应初始化后 )
        fib4_rules_init()-->kmemdup()(将fib4_rules_ops_templates作为模板复制到ops.)
                                 -->fib_rules_register()(链接到网络空间结构中的专用队列)
                                 -->fib_default_rules_init()-->fib_default_rule_add()(3次分别创建本地/主/默认路由规则并链接到专用队列)
         fib_hash_table()(创建路由函数表: 分配struct fib_table及fn_hash结构空间. 初始化各数据函数成员后返回此结构)其中各结构关系见原书P92/93/79
         nl_fib_lookup_init()(提供非阻塞消息传递功能. 将新创建的sock记录在网络空间的ipv4.fibnl中,以建立从网络空间找到的netlink_sock的桥梁)
         static struct notifier_block fib_netdev_notifier = {
            .notifier_call = fib_netdev_evnet,
         }
         fib_netdev_event()函数第一次执行时,传入的参数event是NETDEV_REGISTER和NETDEV_UP

4.3 通过路由函数表查找路由信息
          ......
4.4 路由设置及相关结构的初始化
          ......
4.5 基于输出方向的路由表查找与创建
          ......
4.6 基于输入方向的路由表查找与创建
          ......
阅读(626) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~