2014-10-07 340 views
0

我需要刪除內核中的conntrack條目。有許多功能,如nf_ct_deletenf_ct_put。目前我在skb->nfct上使用了兩個(在跟蹤的追蹤skb上的塊)。它似乎一開始工作正常,但幾秒鐘後內核崩潰。刪除內核中的conntrack條目

我當前的代碼如下:

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); 

刪除,並把語句的執行後直接,我請與conntrack -L conntrack條目,他們都走了(如預期)。但是一分鐘左右後,系統凍結。我猜conntrack啓動了一些定時器,當被解僱時會崩潰。

所以我的問題是:我如何立即刪除的一切爲一個特定的連接?包括停止任何計時器並清理所有狀態。

回答

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; 
} 
適於