netfilter: nf_conntrack: extend with extra stat counter
authorJesper Dangaard Brouer <hawk@comx.dk>
Fri, 23 Apr 2010 10:34:56 +0000 (12:34 +0200)
committerPatrick McHardy <kaber@trash.net>
Fri, 23 Apr 2010 10:34:56 +0000 (12:34 +0200)
I suspect an unfortunatly series of events occuring under a DDoS
attack, in function __nf_conntrack_find() nf_contrack_core.c.

Adding a stats counter to see if the search is restarted too often.

Signed-off-by: Jesper Dangaard Brouer <hawk@comx.dk>
Signed-off-by: Patrick McHardy <kaber@trash.net>
include/linux/netfilter/nf_conntrack_common.h
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c
net/netfilter/nf_conntrack_core.c
net/netfilter/nf_conntrack_standalone.c

index c608677dda60ac4eda7d96945f68ee22897529c1..14e6d32002c43d5a104bd45878c7671f9cbc20bc 100644 (file)
@@ -113,6 +113,7 @@ struct ip_conntrack_stat {
        unsigned int expect_new;
        unsigned int expect_create;
        unsigned int expect_delete;
+       unsigned int search_restart;
 };
 
 /* call to create an explicit dependency on nf_conntrack. */
index 2fb7b76da94fafed76c19f9a0fe8396ae5bbf321..244f7cb08d681d35f9a08744ca449ce90f5b8972 100644 (file)
@@ -336,12 +336,12 @@ static int ct_cpu_seq_show(struct seq_file *seq, void *v)
        const struct ip_conntrack_stat *st = v;
 
        if (v == SEQ_START_TOKEN) {
-               seq_printf(seq, "entries  searched found new invalid ignore delete delete_list insert insert_failed drop early_drop icmp_error  expect_new expect_create expect_delete\n");
+               seq_printf(seq, "entries  searched found new invalid ignore delete delete_list insert insert_failed drop early_drop icmp_error  expect_new expect_create expect_delete search_restart\n");
                return 0;
        }
 
        seq_printf(seq, "%08x  %08x %08x %08x %08x %08x %08x %08x "
-                       "%08x %08x %08x %08x %08x  %08x %08x %08x \n",
+                       "%08x %08x %08x %08x %08x  %08x %08x %08x %08x\n",
                   nr_conntracks,
                   st->searched,
                   st->found,
@@ -358,7 +358,8 @@ static int ct_cpu_seq_show(struct seq_file *seq, void *v)
 
                   st->expect_new,
                   st->expect_create,
-                  st->expect_delete
+                  st->expect_delete,
+                  st->search_restart
                );
        return 0;
 }
index 0c9bbe93cc169c86ab2dbb241ae5a2654285e25f..3907efb97a7c1d92f639cef10476b8534d4b11bf 100644 (file)
@@ -319,8 +319,10 @@ begin:
         * not the expected one, we must restart lookup.
         * We probably met an item that was moved to another chain.
         */
-       if (get_nulls_value(n) != hash)
+       if (get_nulls_value(n) != hash) {
+               NF_CT_STAT_INC(net, search_restart);
                goto begin;
+       }
        local_bh_enable();
 
        return NULL;
index faa8eb3722b96572edfd82298e275f10053e697d..ea4a8d3842340c9010a76e30c33bf34c9f0975c8 100644 (file)
@@ -252,12 +252,12 @@ static int ct_cpu_seq_show(struct seq_file *seq, void *v)
        const struct ip_conntrack_stat *st = v;
 
        if (v == SEQ_START_TOKEN) {
-               seq_printf(seq, "entries  searched found new invalid ignore delete delete_list insert insert_failed drop early_drop icmp_error  expect_new expect_create expect_delete\n");
+               seq_printf(seq, "entries  searched found new invalid ignore delete delete_list insert insert_failed drop early_drop icmp_error  expect_new expect_create expect_delete search_restart\n");
                return 0;
        }
 
        seq_printf(seq, "%08x  %08x %08x %08x %08x %08x %08x %08x "
-                       "%08x %08x %08x %08x %08x  %08x %08x %08x \n",
+                       "%08x %08x %08x %08x %08x  %08x %08x %08x %08x\n",
                   nr_conntracks,
                   st->searched,
                   st->found,
@@ -274,7 +274,8 @@ static int ct_cpu_seq_show(struct seq_file *seq, void *v)
 
                   st->expect_new,
                   st->expect_create,
-                  st->expect_delete
+                  st->expect_delete,
+                  st->search_restart
                );
        return 0;
 }