我需要删除内核中的conntrack条目。有许多功能,如nf_ct_delete
和nf_ct_put
。目前我在skb->nfct
上使用了两者(在跟踪的跟踪skb上)。它起初似乎工作正常,但几秒钟后内核就崩溃了。
我目前的代码如下:
struct nf_conntrack *con = skb->nfct;
nf_conntrack_get(sub_conntrack);
//... do some stuff
nf_ct_delete((struct nf_conn *) con, 0, 0);
nf_ct_put((struct nf_conn *) con);
执行delete和put语句后,我会检查conntrack -L conntrack
条目并且它们已经消失(正如预期的那样)。但一分钟左右后,系统冻结了。我猜conntrack启动了一些在被解雇时崩溃的计时器。
所以我的问题是:如何立即删除特定连接的所有内容?包括停止任何计时器和清理所有状态。
答案 0 :(得分:0)
这是根据netfilter code
改编的int delete_nat_entry(u32 loc_ip, u32 rem_ip, u16 loc_port, u16 rem_port) {
struct nf_conntrack_tuple_hash *h;
struct nf_conntrack_tuple tuple;
struct nf_conn *ct;
memset(&tuple, 0, sizeof(tuple));
//layer 3
tuple.src.l3num = PF_INET;
tuple.src.u3.ip = htonl(loc_ip);
tuple.dst.u3.ip = htonl(rem_ip);
//layer 4
tuple.dst.protonum = IPPROTO_TCP;
tuple.dst.dir = IP_CT_DIR_ORIGINAL;
tuple.src.u.tcp.port = htons(loc_port);
tuple.dst.u.tcp.port = htons(rem_port);
h = nf_conntrack_find_get(&init_net, NF_CT_DEFAULT_ZONE, &tuple);
if (!h) {
debug_msg(KERN_INFO "cannot find conntrack tuple\n");
return -ENOENT;
}
ct = nf_ct_tuplehash_to_ctrack(h);
if (del_timer(&ct->timeout))
nf_ct_delete(ct, 0, 0);
nf_ct_put(ct);
return 0;
}