linux网络协议栈分析笔记12-路由2-FIB1

本文深入剖析了Linux内核的FIB(Forward Information Base)转发信息库的初始化过程,包括路由缓存的创建、路由表的注册以及相关数据结构。介绍了关键数据结构如`fib_node`、`fib_alias`,并讲解了路由规则的注册与管理,如`fib_net_ops`、`fib_rules_ops`及其作用。通过对`ip_fib_net_init`、`fib4_rules_init`等函数的分析,展示了Linux路由查找与管理的机制。
摘要由CSDN通过智能技术生成
上一章我们看到了通过 fib_lookup去查找了路由信息,这一章我们就看看fib到底是什么
FIB(Forward Information Base) 转发信息库

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);

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));

ip_fib_init()->
      注册与路由相关的rtnetlink 消息以及他的处理函数,主要处理路由添加删除  
rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL);
          rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL);
          rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib); 

register_pernet_subsys(& fib_net_ops);     注册协议栈子系统,也就是路由系统。 重点--fib_net_ops
          register_netdevice_notifier(&fib_netdev_notifier);           通知链注册
          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高速缓存创建
                         0, SLAB_PANIC, NULL);

     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 fib_alias {
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值