- 论坛徽章:
- 0
|
看了九贱兄写的hashlimit模块的理解,大有收获,但还是有一些细节没有搞清楚,代码如下:
2.6.35/net/netfilter/xt_hashlimit.c中的static int htable_create()函数中:
{
.....
/* FIXME: don't use vmalloc() here or anywhere else -HW */
hinfo = vmalloc(sizeof(struct xt_hashlimit_htable) + sizeof(struct list_head) * size);
if (hinfo == NULL)
return -ENOMEM;
minfo->hinfo = hinfo;
/* copy match config into hashtable config */
memcpy(&hinfo->cfg, &minfo->cfg, sizeof(hinfo->cfg));
hinfo->cfg.size = size;
if (hinfo->cfg.max == 0)
hinfo->cfg.max = 8 * hinfo->cfg.size;
else if (hinfo->cfg.max < hinfo->cfg.size)
hinfo->cfg.max = hinfo->cfg.size;
for (i = 0; i < hinfo->cfg.size; i++)
INIT_HLIST_HEAD(&hinfo->hash[i]);
.....
}
上面代码中是用sizeof(struct list_head) 类型来申请的空间,而后面却是用哈希表头的初始化INIT_HLIST_HEAD(&hinfo->hash[i])函数来进行初始化的,
这样就相当于多申请了一倍的空间,不知为什么?用8字节的类型来申请的空间,却用4字节的类型来进行初始化,不理解为什么?请大家帮我看看这儿是怎么一
回事? |
|