内核的各种协议并不直接使用前面提供的函数来访问选路树,而是调用几个函数:rtalloc和rtallocl是完成路由表查询的两个
函数;rtrequest函数用于添加和删除路由表项;另外大多数接口在接口连接或断开时都会调用函数rtinit。
选路消息在两个方向上传递信息。进程(route命令)或守护进程(routed或gated)把选路消息写入选路插口,以使内核添加
路由、删除路由或者修改现有的路由。当有时间发生时,如接口断开、收到重定向等,内核也会发送选路消息。进程通过选路
插口来读取它们感兴趣的内容。
内核还提供了另一种访问路由表的接口,即系统的sysctl调用。
1.rtalloc和rtalloc1函数
通常,路由表的查找通过调查rtalloc和rtalloc1函数来实现的。rtalloc调用rtalloc1,rtalloc1调用rnh_matchaddr函数,对于
Internet地址来说,该函数就是rn_match函数。
rtalloc1的大概处理流程如下:
调用rn_match,如果符合下列三个条件,则查找成功。
1)存在该协议族的路由表。
2)rn_match返回一个非空指针;并且
3)匹配的radix_node结构没有设置RNF_ROOT标志。
如果查找成功,则指向匹配的radix_node结构的指针保存在rt中。如果调用的第二个参数非0,而且匹配的路由表设有
RTF_CLONING标志,则调用rtrequest函数发送RTM_RESOLVE命令来创建一个新的rtentry结构,该结构是查询结果的
克隆。
2.宏RTFREE和rtfree函数
宏RTFREE,仅在引用计数小于等于1时才调用rtfree函数;否则,它仅完成引用计数的递减。
3.rtrequest函数
rtrequest函数是添加和删除路由表项的关键点。下图给出了调用它的一些其他函数。
rtrequest是一个switch语句,每个case对应一个命令:RTM_ADD、RTM_DELE