Skip to content

Commit

Permalink
netfilter: nf_conntrack: extend with extra stat counter
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jesper Dangaard Brouer authored and Patrick McHardy committed Apr 23, 2010
1 parent cecc74d commit af740b2
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 7 deletions.
1 change: 1 addition & 0 deletions include/linux/netfilter/nf_conntrack_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
7 changes: 4 additions & 3 deletions net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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;
}
Expand Down
4 changes: 3 additions & 1 deletion net/netfilter/nf_conntrack_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -319,8 +319,10 @@ __nf_conntrack_find(struct net *net, u16 zone,
* 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;
Expand Down
7 changes: 4 additions & 3 deletions net/netfilter/nf_conntrack_standalone.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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;
}
Expand Down

0 comments on commit af740b2

Please sign in to comment.