- 论坛徽章:
- 0
|
原帖由 wwwspirit 于 2006-2-22 10:13 发表
我有一处不明白。还望各位多指点:
规则的组织方式是struct ipt_ip + struct ipt_entry_match + struct ipt_entry_match + ... + struct ipt_entry_target;
而规则在初始化的时候(建立的时候),需要分 ...
想法是对了的……只是想得太过简单了……
我们以规则的添加为例来描述规则的构造,
看先iptables的源码的do_command()函数:
其中,分析一些标准的规则参数,如地址等等,存储于struct ipt_entry fw这个结构中,这个略去不表,重点在match和target.
每添加一个mathc,都对应一个-m,我们来看选项分析的case 'm':
case 'm': {
……
m->m = fw_calloc(1, size);
……
}
这样,就为每个match动态分析了一段地址!!target类似,略去不表。然后是调用每个match的parse函数分析,填充相应的值。
好,最后来看规则的整合了:
e = generate_entry(&fw, iptables_matches, target->t);
有是你所说的规则,fw是标准规则部份,每二个是match的全局结构变量,过会会遍历它,后一个是target:
只需看这个函数的前面开头部份就可以回答你的问题了:
static struct ipt_entry *
generate_entry(const struct ipt_entry *fw,
struct iptables_match *matches,
struct ipt_entry_target *target)
{
unsigned int size;
struct iptables_match *m;
struct ipt_entry *e;
size = sizeof(struct ipt_entry);
for (m = matches; m; m = m->next) {
if (!m->used)
continue;
size += m->m->u.match_size;
}
e = fw_malloc(size + target->u.target_size);
……
其中size用来计算规是空间,其实就是分别计算三个部份的长度,然后一起分配,所以即不会浪费,也不会有溢出等等……
而到了内核中,只需把用户空间的内容直接拷贝到对应地址空间即可!!! |
|