第四章 路由
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 基于输入方向的路由表查找与创建
......
阅读(668) | 评论(0) | 转发(0) |