netfilter: cttimeout: use nf_ct_iterate_cleanup_net to unlink timeout objs
authorLiping Zhang <zlpnobody@gmail.com>
Sun, 28 May 2017 14:37:19 +0000 (22:37 +0800)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 29 May 2017 10:46:24 +0000 (12:46 +0200)
Similar to nf_conntrack_helper, we can use nf_ct_iterare_cleanup_net to
remove these copy & paste code.

Signed-off-by: Liping Zhang <zlpnobody@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nfnetlink_cttimeout.c

index a3e7bb54d96acf2e7ac570077d57502d5b23625b..49638b03ccc90884c1e657871869e84da0592c91 100644 (file)
@@ -287,49 +287,20 @@ static int cttimeout_get_timeout(struct net *net, struct sock *ctnl,
        return ret;
 }
 
-static void untimeout(struct nf_conntrack_tuple_hash *i,
-                     struct ctnl_timeout *timeout)
+static int untimeout(struct nf_conn *ct, void *timeout)
 {
-       struct nf_conn *ct = nf_ct_tuplehash_to_ctrack(i);
        struct nf_conn_timeout *timeout_ext = nf_ct_timeout_find(ct);
 
        if (timeout_ext && (!timeout || timeout_ext->timeout == timeout))
                RCU_INIT_POINTER(timeout_ext->timeout, NULL);
+
+       /* We are not intended to delete this conntrack. */
+       return 0;
 }
 
 static void ctnl_untimeout(struct net *net, struct ctnl_timeout *timeout)
 {
-       struct nf_conntrack_tuple_hash *h;
-       const struct hlist_nulls_node *nn;
-       unsigned int last_hsize;
-       spinlock_t *lock;
-       int i, cpu;
-
-       for_each_possible_cpu(cpu) {
-               struct ct_pcpu *pcpu = per_cpu_ptr(net->ct.pcpu_lists, cpu);
-
-               spin_lock_bh(&pcpu->lock);
-               hlist_nulls_for_each_entry(h, nn, &pcpu->unconfirmed, hnnode)
-                       untimeout(h, timeout);
-               spin_unlock_bh(&pcpu->lock);
-       }
-
-       local_bh_disable();
-restart:
-       last_hsize = nf_conntrack_htable_size;
-       for (i = 0; i < last_hsize; i++) {
-               lock = &nf_conntrack_locks[i % CONNTRACK_LOCKS];
-               nf_conntrack_lock(lock);
-               if (last_hsize != nf_conntrack_htable_size) {
-                       spin_unlock(lock);
-                       goto restart;
-               }
-
-               hlist_nulls_for_each_entry(h, nn, &nf_conntrack_hash[i], hnnode)
-                       untimeout(h, timeout);
-               spin_unlock(lock);
-       }
-       local_bh_enable();
+       nf_ct_iterate_cleanup_net(net, untimeout, timeout, 0, 0);
 }
 
 /* try to delete object, fail if it is still in use. */