linux内核 路由fib表之初始化

1、路由表操作
主要实现下列功能:
         a)、路由表初始化
         b)、路由创建
         c)、路由删除
 1.1 路由表的初始化
         路由表的初始化由ip_fib_init函数实现的,
功能:
         a)、注册路由操作相关函数
         b)、将路由模块添加到网络命令空间
         c)、注册网络设备状态和地址变化到通知链
         d)、为fib_node和fib_alias创建缓存池

流程:

linux内核 路由fib表之初始化_第1张图片

代码:

_init ip_fib_init(void)
{  
    //注册与路由相关的netlink消息,以及相对应的路由添加、删除、获取的函数
    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); //将一个网络协议模块添加到每一个网络命令空间中,然后再执行其ops->init程序进行初始化,一般其ops->init会在其对应的proc目录下,生成一个网络协议模块对应的proc文件或proc目录,并执行一些协议初始化相关的函数
    register_netdevice_notifier(&fib_netdev_notifier);  //注册网络设备状态变化到通知链netdev_chain
    register_inetaddr_notifier(&fib_inetaddr_notifier); //注册网络设备地址变化到通知链netdev_chain
 
    fib_hash_init();    //为fib_node和fib_alias创建缓存池
}

创建用于分配fib_node的内存池fn_hash_kmem,以及用于分配fib_alias的内存池fn_alias_kmem。

void __init fib_hash_init(void)
{
    fn_hash_kmem = kmem_cache_create("ip_fib_hash", sizeof(struct fib_node), 0, SLAB_PANIC, NULL);
 
    fn_alias_kmem = kmem_cache_create("ip_fib_alias", sizeof(struct fib_alias), 0, SLAB_PANIC, NULL);
}


你可能感兴趣的:(linux,网络协议)