- 论坛徽章:
- 1
|
回复 1# jiufei19
下面我分析下造成产生对此函数功能不清的问题
1、假定当前netfilter已经添加了nat_extend,但是尚未添加ftp helper_extend
2 、开始准备添加一个ftp helper_extend,于是根据如下源码:
void *__nf_ct_ext_add(struct nf_conn *ct, enum nf_ct_ext_id id, gfp_t gfp)
{
...
if (!ct->ext)
return nf_ct_ext_create(&ct->ext, id, gfp);
if (nf_ct_ext_exist(ct, id))
return NULL;
...
if (newlen >= ct->ext->real_len) {
...
for (i = 0; i < NF_CT_EXT_NUM; i++) {
if (!nf_ct_ext_exist(ct, i))
continue;
t = rcu_dereference(nf_ct_ext_types);
if (t && t->move)
t->move(ct, ct->ext + ct->ext->offset[id]);
...
}
...
}
上面红色语句表示实际调用nf_nat_move_storage这个函数,显然上面的id为即将添加的helper_extend的id,而我们知道此时我们正要添加一个helper_extend,于是知道这里的ct->ext->offset[id]应该为0,所以上述红色语句实际应为:
t->move(ct, ct->ext);
于是我们进入了本问题的关键部分,即在nf_nat_move_storage函数中有如下两个语句:
struct nf_conn_nat *new_nat = nf_ct_ext_find(conntrack, NF_CT_EXT_NAT);
struct nf_conn_nat *old_nat = (struct nf_conn_nat *)old;
其中new_nat为实际当前连接跟踪conntrack已经具有的nat_extend的偏移位置;而old_nat就是上面调用move函数是传入的ct->ext,显然这里把ct->ext称为了old_nat,因此就产生了我的疑问了,不晓得这里是要做什么?望前辈指点。 |
|