第四章 路由
4.1 路由函数表结构及关系图
a. 图: 略
b. 从图可看出,路由函数表fib_table是路由的总根, 从此出发可找到各个路由区结构fn_zone, 也可以找到路由节点结构fib_node或者路由信息结构fib_info
4.2 路由函数表的初始化
......前一篇
4.3 通过路由函数表查找路由信息
sys_socketcall()-->sys_bind()-->inet_bind()-->inet_addr_type()-->__inet_dev_addr_type()->fn_hash_lookup()-->fib_semantic_match()
fn_hash_lookup()(2层循环: 外层对路由区队列的循环(同一子网号的路由区节点);内层对路由节点队列的循环)
fib_semantic_match()(查找可满足条件的路由......需要进行分析明确逻辑国)
4.4 路由设置及相关结构的初始化
路由结构是在用户使用工具或路由指令通知链设置路由时初始化的. 下面从3条设置路线分析路由设置过程
1. 路由设置路线A(net-tools通过ioctl系统调用进入ip_rt_ioctl()函数, 通过路由函数表的钩子函数实现增加或删除路由)
2. 路由设置路线B(IPROUTE2通过netlink调用inet_rtm_newroute()增加或inet_rtm_delroute()删除路由)
3. 路由设置路线C(内核注册的通知节点register_inetaddr_notifier(&fib_inetaddr_notifier))
static struct notifier_block fib_inetaddr_notifier = {
.notifier_call = fib_inetaddr_event,
};
fib_add_ifaddr()添加地址到路由中
fib_del_ifaddr()删除地址到路由中
fib_inetaddr_event()/fib_netdev_event()-->fib_magic()-->fib_new_table()-->fib_get_table()
-->fib_hash_table()
fib_new_table()(3条路线中多次出现. 建立路由表)
fn_hash_insert()-->fn_new_zone()(创建新的路由区结构)
-->fib_create_info()(创建路由信息结构)
!!!!!!!!!!!!!!!!!!!!!!!!待进一步分析补充
4.5 基于输出方向的路由表查找与创建
......
4.6 基于输入方向的路由表查找与创建
......
阅读(592) | 评论(0) | 转发(0) |