Chinaunix首页 | 论坛 | 博客
  • 博客访问: 644003
  • 博文数量: 155
  • 博客积分: 5688
  • 博客等级: 大校
  • 技术积分: 2134
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-15 15:12
文章分类

全部博文(155)

文章存档

2011年(58)

2010年(97)

分类: LINUX

2010-09-18 18:22:57

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见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) |
给主人留下些什么吧!~~

chinaunix网友2010-09-21 10:03:28

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com