上一章我们看到了通过
fib_lookup去查找了路由信息,这一章我们就看看fib到底是什么
FIB(Forward Information Base) 转发信息库
inet_init()->ip_init()->ip_rt_init()->
register_inetaddr_notifier(&fib_inetaddr_notifier);
inet_init()->ip_init()->ip_rt_init()->
ipv4_dst_ops.kmem_cachep =
kmem_cache_create("ip_dst_cache", sizeof( struct rtable), 0, rtable结构高速缓存的创建
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
kmem_cache_create("ip_dst_cache", sizeof( struct rtable), 0, rtable结构高速缓存的创建
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
rt_hash_table = (struct
rt_hash_bucket *)
路由缓存的hash表创建
alloc_large_system_hash("IP route cache",
sizeof(struct rt_hash_bucket),
rhash_entries,
(totalram_pages >= 128 * 1024) ?
15 : 17,
0,
&rt_hash_log,
&rt_hash_mask,
rhash_entries ? 0 : 512 * 1024);
memset(rt_hash_table, 0, (rt_hash_mask + 1) * sizeof(struct rt_hash_bucket));
alloc_large_system_hash("IP route cache",
sizeof(struct rt_hash_bucket),
rhash_entries,
(totalram_pages >= 128 * 1024) ?
15 : 17,
0,
&rt_hash_log,
&rt_hash_mask,
rhash_entries ? 0 : 512 * 1024);
memset(rt_hash_table, 0, (rt_hash_mask + 1) * sizeof(struct rt_hash_bucket));
ip_fib_init()->
注册与路由相关的rtnetlink 消息以及他的处理函数,主要处理路由添加删除
rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL);rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL);
rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib);
register_netdevice_notifier(&fib_netdev_notifier); 通知链注册register_pernet_subsys(& fib_net_ops); 注册协议栈子系统,也就是路由系统。 重点--fib_net_ops
register_inetaddr_notifier(&fib_inetaddr_notifier);
fib_hash_init()
fib_hash_init()
该函数出现在fib_hash.c fib_trie.c两个文件中都有,系统可配置两种路由表组织算法,默认hash算法
void __init fib_hash_init(void)
{
fn_hash_kmem = kmem_cache_create("ip_fib_hash", sizeof( struct fib_node), fib_node高速缓存创建
{
fn_hash_kmem = kmem_cache_create("ip_fib_hash", sizeof( struct fib_node), fib_node高速缓存创建
0, SLAB_PANIC, NULL);
fn_alias_kmem = kmem_cache_create("ip_fib_alias", sizeof( struct fib_alias), fib_alias高速缓存创建
fn_alias_kmem = kmem_cache_create("ip_fib_alias", sizeof( struct fib_alias), fib_alias高速缓存创建
0, SLAB_PANIC, NULL);
}
}
主要数据结构:
struct
fib_node { 代表一个路由指向的子网
struct hlist_node fn_hash; hash节点
struct list_head fn_alias; 路由别名
__be32 fn_key; 子网地址
struct fib_alias fn_embedded_alias; 内嵌的路由别名
};
struct hlist_node fn_hash; hash节点
struct list_head fn_alias; 路由别名
__be32 fn_key; 子网地址
struct fib_alias fn_embedded_alias; 内嵌的路由别名
};
struct fib_alias {
struct list_head fa_list;
struct fib_info *fa_info; 路由信息结构保存着如何处理数据包
u8 fa_tos; TOS
u8 &nb
struct list_head fa_list;
struct fib_info *fa_info; 路由信息结构保存着如何处理数据包
u8 fa_tos; TOS
u8 &nb