netfilter: nf_ct_expect: Add nf_ct_remove_expect()
authorGao Feng <fgao@ikuai8.com>
Mon, 27 Mar 2017 02:31:26 +0000 (10:31 +0800)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 6 Apr 2017 16:39:40 +0000 (18:39 +0200)
When remove one expect, it needs three statements. And there are
multiple duplicated codes in current code. So add one common function
nf_ct_remove_expect to consolidate this.

Signed-off-by: Gao Feng <fgao@ikuai8.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/net/netfilter/nf_conntrack_expect.h
net/netfilter/nf_conntrack_expect.c
net/netfilter/nf_conntrack_helper.c
net/netfilter/nf_conntrack_sip.c

index e84df8d3bf37a7cb99e0a90efd95b283017adcc0..2ba54feaccd8d4a6ebccc84fd5e21f45bff665ca 100644 (file)
@@ -105,6 +105,7 @@ static inline void nf_ct_unlink_expect(struct nf_conntrack_expect *exp)
 
 void nf_ct_remove_expectations(struct nf_conn *ct);
 void nf_ct_unexpect_related(struct nf_conntrack_expect *exp);
+bool nf_ct_remove_expect(struct nf_conntrack_expect *exp);
 
 /* Allocate space for an expectation: this is mandatory before calling
    nf_ct_expect_related.  You will have to call put afterwards. */
index cb29e598605f5e6c22961c007bf23291fab0bbaa..71d136469be003913f02cc6ec4b9e38e9420f9ab 100644 (file)
@@ -103,6 +103,17 @@ nf_ct_exp_equal(const struct nf_conntrack_tuple *tuple,
               nf_ct_zone_equal_any(i->master, zone);
 }
 
+bool nf_ct_remove_expect(struct nf_conntrack_expect *exp)
+{
+       if (del_timer(&exp->timeout)) {
+               nf_ct_unlink_expect(exp);
+               nf_ct_expect_put(exp);
+               return true;
+       }
+       return false;
+}
+EXPORT_SYMBOL_GPL(nf_ct_remove_expect);
+
 struct nf_conntrack_expect *
 __nf_ct_expect_find(struct net *net,
                    const struct nf_conntrack_zone *zone,
@@ -211,10 +222,7 @@ void nf_ct_remove_expectations(struct nf_conn *ct)
 
        spin_lock_bh(&nf_conntrack_expect_lock);
        hlist_for_each_entry_safe(exp, next, &help->expectations, lnode) {
-               if (del_timer(&exp->timeout)) {
-                       nf_ct_unlink_expect(exp);
-                       nf_ct_expect_put(exp);
-               }
+               nf_ct_remove_expect(exp);
        }
        spin_unlock_bh(&nf_conntrack_expect_lock);
 }
@@ -255,10 +263,7 @@ static inline int expect_matches(const struct nf_conntrack_expect *a,
 void nf_ct_unexpect_related(struct nf_conntrack_expect *exp)
 {
        spin_lock_bh(&nf_conntrack_expect_lock);
-       if (del_timer(&exp->timeout)) {
-               nf_ct_unlink_expect(exp);
-               nf_ct_expect_put(exp);
-       }
+       nf_ct_remove_expect(exp);
        spin_unlock_bh(&nf_conntrack_expect_lock);
 }
 EXPORT_SYMBOL_GPL(nf_ct_unexpect_related);
@@ -394,10 +399,8 @@ static void evict_oldest_expect(struct nf_conn *master,
                        last = exp;
        }
 
-       if (last && del_timer(&last->timeout)) {
-               nf_ct_unlink_expect(last);
-               nf_ct_expect_put(last);
-       }
+       if (last)
+               nf_ct_remove_expect(last);
 }
 
 static inline int __nf_ct_expect_check(struct nf_conntrack_expect *expect)
@@ -419,11 +422,8 @@ static inline int __nf_ct_expect_check(struct nf_conntrack_expect *expect)
        h = nf_ct_expect_dst_hash(net, &expect->tuple);
        hlist_for_each_entry_safe(i, next, &nf_ct_expect_hash[h], hnode) {
                if (expect_matches(i, expect)) {
-                       if (del_timer(&i->timeout)) {
-                               nf_ct_unlink_expect(i);
-                               nf_ct_expect_put(i);
+                       if (nf_ct_remove_expect(expect))
                                break;
-                       }
                } else if (expect_clash(i, expect)) {
                        ret = -EBUSY;
                        goto out;
index 752a977e9eef3bd96233da83624d6a2ef8b9c11b..33ebb78649f8f0e6c10c831a5a505c191f518966 100644 (file)
@@ -451,11 +451,8 @@ void nf_conntrack_helper_unregister(struct nf_conntrack_helper *me)
                        if ((rcu_dereference_protected(
                                        help->helper,
                                        lockdep_is_held(&nf_conntrack_expect_lock)
-                                       ) == me || exp->helper == me) &&
-                           del_timer(&exp->timeout)) {
-                               nf_ct_unlink_expect(exp);
-                               nf_ct_expect_put(exp);
-                       }
+                                       ) == me || exp->helper == me))
+                               nf_ct_remove_expect(exp);
                }
        }
        spin_unlock_bh(&nf_conntrack_expect_lock);
index 0d17894798b5caea7540b3bf7d341a0a2f623fd6..91a9c97b7e9a5eef38db64c2fe4b4b50215cdc77 100644 (file)
@@ -829,10 +829,8 @@ static void flush_expectations(struct nf_conn *ct, bool media)
        hlist_for_each_entry_safe(exp, next, &help->expectations, lnode) {
                if ((exp->class != SIP_EXPECT_SIGNALLING) ^ media)
                        continue;
-               if (!del_timer(&exp->timeout))
+               if (!nf_ct_remove_expect(exp))
                        continue;
-               nf_ct_unlink_expect(exp);
-               nf_ct_expect_put(exp);
                if (!media)
                        break;
        }