声明:本文为原创
#####请转贴时保留以下内容######
作者:GTT
请提出宝贵意见Mail:mtloveft@hotmail.com 
Linux Version:2.6.33
提示:本文是介绍linux 网络协议栈初始化!
  
 
下面介绍core_initcall级别最后一个初始化方法netlink_proto_init。
core_initcall(netlink_proto_init)
 
netlink这个单词看到时还以为是指L2呢,netlink是指userspace 和kernel space 用socket来进行通信。对于看linux 网络代码,对这部分了解是必须的,否则可能会带来一些障碍。
Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 netlink。
 
初始化方法简单介绍一下,以后回来再详细看这个方法
下面是source code
| static int __init netlink_proto_init(void){
 struct sk_buff *dummy_skb;
 int i;
 unsigned long limit;
 unsigned int order;
 int err = proto_register(&netlink_proto, 0);
 if (err != 0) goto out;
 
 BUILD_BUG_ON(sizeof(struct netlink_skb_parms) > sizeof(dummy_skb->cb));
 
     nl_table = kcalloc(MAX_LINKS, sizeof(*nl_table), GFP_KERNEL);if (!nl_table)
 goto panic;
 
 if (totalram_pages >= (128 * 1024))
 limit = totalram_pages >> (21 - PAGE_SHIFT);
 else
 limit = totalram_pages >> (23 - PAGE_SHIFT);
 
 order = get_bitmask_order(limit) - 1 + PAGE_SHIFT;
 limit = (1UL << order) / sizeof(struct hlist_head);
 order = get_bitmask_order(min(limit, (unsigned long)UINT_MAX)) - 1;
 
 for (i = 0; i < MAX_LINKS; i++) {
 struct nl_pid_hash *hash = &nl_table[i].hash;
 
 hash->table = nl_pid_hash_zalloc(1 * sizeof(*hash->table));
 if (!hash->table) {
 while (i-- > 0)
 nl_pid_hash_free(nl_table[i].hash.table, 1 * sizeof(*hash->table));
 kfree(nl_table);
 goto panic;
 }
 hash->max_shift = order;
 hash->shift = 0;
 hash->mask = 0;
 hash->rehash_time = jiffies;
 }
 
 sock_register(&netlink_family_ops);
 register_pernet_subsys(&netlink_net_ops);
 /* The netlink device handler may be needed early. */
 rtnetlink_init();
 out:
 return err;
 panic:
 panic("netlink_init: Cannot allocate nl_table\n");
 }
 |