]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
netfilter: conncount: Support count only use case
authorYi-Hung Wei <yihung.wei@gmail.com>
Sun, 4 Mar 2018 23:29:52 +0000 (15:29 -0800)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 20 Mar 2018 12:27:18 +0000 (13:27 +0100)
Currently, nf_conncount_count() counts the number of connections that
matches key and inserts a conntrack 'tuple' with the same key into the
accounting data structure.  This patch supports another use case that only
counts the number of connections where 'tuple' is not provided.  Therefore,
proper changes are made on nf_conncount_count() to support the case where
'tuple' is NULL.  This could be useful for querying statistics or
debugging purpose.

Signed-off-by: Yi-Hung Wei <yihung.wei@gmail.com>
Acked-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_conncount.c

index 9305a08b442272b9f559926b7986fa6867becc0c..153e690e289399cab0f22660952eb286ea621df5 100644 (file)
@@ -104,7 +104,7 @@ static unsigned int check_hlist(struct net *net,
        struct nf_conn *found_ct;
        unsigned int length = 0;
 
-       *addit = true;
+       *addit = tuple ? true : false;
 
        /* check the saved connections */
        hlist_for_each_entry_safe(conn, n, head, node) {
@@ -117,7 +117,7 @@ static unsigned int check_hlist(struct net *net,
 
                found_ct = nf_ct_tuplehash_to_ctrack(found);
 
-               if (nf_ct_tuple_equal(&conn->tuple, tuple)) {
+               if (tuple && nf_ct_tuple_equal(&conn->tuple, tuple)) {
                        /*
                         * Just to be sure we have it only once in the list.
                         * We should not see tuples twice unless someone hooks
@@ -220,6 +220,9 @@ count_tree(struct net *net, struct rb_root *root,
                goto restart;
        }
 
+       if (!tuple)
+               return 0;
+
        /* no match, need to insert new node */
        rbconn = kmem_cache_alloc(conncount_rb_cachep, GFP_ATOMIC);
        if (rbconn == NULL)
@@ -242,6 +245,9 @@ count_tree(struct net *net, struct rb_root *root,
        return 1;
 }
 
+/* Count and return number of conntrack entries in 'net' with particular 'key'.
+ * If 'tuple' is not null, insert it into the accounting data structure.
+ */
 unsigned int nf_conncount_count(struct net *net,
                                struct nf_conncount_data *data,
                                const u32 *key,