声明:本文为原创
#####请转贴时保留以下内容######
作者: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"); }
|
阅读(1958) | 评论(1) | 转发(0) |