免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3071 | 回复: 3
打印 上一主题 下一主题

[C] netfilter扩展字段 注册的时候alloc_size 字段问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-29 23:36 |只看该作者 |倒序浏览
linux nat在初始化开始就会调用nf_ct_extend_register在ct的ext字段上注册扩展字段,方便需要的时候扩展,但是注册函数最后调用update_alloc_size函数更改一下alloc_size的大小,

int nf_ct_extend_register(struct nf_ct_ext_type *type)
{
        int ret = 0;

        mutex_lock(&nf_ct_ext_type_mutex);
        if (nf_ct_ext_types[type->id]) {
                ret = -EBUSY;
                goto out;
        }

        /* This ensures that nf_ct_ext_create() can allocate enough area
           before updating alloc_size */
        //这地方没有问题,就都支持初始化一个头加自己结构的长度
        type->alloc_size = ALIGN(sizeof(struct nf_ct_ext), type->align)
                           + type->len;
        rcu_assign_pointer(nf_ct_ext_types[type->id], type);
        //有问题的就是这个函数里面了,里面会更改alloc_size的大小
        update_alloc_size(type);
out:
        mutex_unlock(&nf_ct_ext_type_mutex);
        return ret;
}


static void update_alloc_size(struct nf_ct_ext_type *type)
{
        int i, j;
        struct nf_ct_ext_type *t1, *t2;
        enum nf_ct_ext_id min = 0, max = NF_CT_EXT_NUM - 1;

        /* unnecessary to update all types */
       //如果没有这个标志位就只是改自己的alloc_size的大小,如果有这个标志位就全部便利一下都改
        if ((type->flags & NF_CT_EXT_F_PREALLOC) == 0) {
                min = type->id;
                max = type->id;
        }

        /* This assumes that extended areas in conntrack for the types
           whose NF_CT_EXT_F_PREALLOC bit set are allocated in order */
        for (i = min; i <= max; i++) {
                t1 = nf_ct_ext_types[i];
                if (!t1)
                        continue;
                //问题就是这里了 这里为什么要多加个sizeof(struct nf_ct_ext)呢? 后面那个宏是根据t1-》align对其,这就起码两个sizeof(struct nf_ct_ext) 这么长了 后面的t1的len我知道,就是好奇为什么要两个 struct nf_ct_ext的长度
                t1->alloc_size = sizeof(struct nf_ct_ext)
                                 + ALIGN(sizeof(struct nf_ct_ext), t1->align)
                                 + t1->len;
                for (j = 0; j < NF_CT_EXT_NUM; j++) {
                        t2 = nf_ct_ext_types[j];
                        if (t2 == NULL || t2 == t1 ||
                            (t2->flags & NF_CT_EXT_F_PREALLOC) == 0)
                                continue;

                        t1->alloc_size = ALIGN(t1->alloc_size, t2->align)
                                         + t2->len;
                }
        }
}
上面这个函数就是为了如果有NF_CT_EXT_F_PREALLOC(就nat有) 这个标志的扩展字段注册的话,create时就分配自己和nat的空间出来,其他的不用管,就是nat比较常用为了方便吧,其他字段用上的概率小吧,为什么要2倍的struct nf_ct_ext的长度 ?????????请高手解答

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
2 [报告]
发表于 2014-09-28 23:02 |只看该作者
回复 1# lunixwh


    我现在也遇到这个问题了,不理解为啥要多累加一次sizeof(struct nf_conn_ext)的大小,希望斑竹能帮助解惑,谢谢!

论坛徽章:
0
3 [报告]
发表于 2014-12-03 23:45 |只看该作者
这个最新的内核已经修改过来了,那是多加了

论坛徽章:
0
4 [报告]
发表于 2014-12-03 23:48 |只看该作者
那是多加的回复 2# jiufei19


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP