mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 06:31:49 +00:00
netfilter: conntrack: add clash resolution stat counter
There is a misconception about what "insert_failed" means. We increment this even when a clash got resolved, so it might not indicate a problem. Add a dedicated counter for clash resolution and only increment insert_failed if a clash cannot be resolved. For the old /proc interface, export this in place of an older stat that got removed a while back. For ctnetlink, export this with a new attribute. Also correct an outdated comment that implies we add a duplicate tuple -- we only add the (unique) reply direction. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
4afc41dfa5
commit
bc92470413
@ -10,6 +10,7 @@ struct ip_conntrack_stat {
|
|||||||
unsigned int invalid;
|
unsigned int invalid;
|
||||||
unsigned int insert;
|
unsigned int insert;
|
||||||
unsigned int insert_failed;
|
unsigned int insert_failed;
|
||||||
|
unsigned int clash_resolve;
|
||||||
unsigned int drop;
|
unsigned int drop;
|
||||||
unsigned int early_drop;
|
unsigned int early_drop;
|
||||||
unsigned int error;
|
unsigned int error;
|
||||||
|
@ -256,6 +256,7 @@ enum ctattr_stats_cpu {
|
|||||||
CTA_STATS_EARLY_DROP,
|
CTA_STATS_EARLY_DROP,
|
||||||
CTA_STATS_ERROR,
|
CTA_STATS_ERROR,
|
||||||
CTA_STATS_SEARCH_RESTART,
|
CTA_STATS_SEARCH_RESTART,
|
||||||
|
CTA_STATS_CLASH_RESOLVE,
|
||||||
__CTA_STATS_MAX,
|
__CTA_STATS_MAX,
|
||||||
};
|
};
|
||||||
#define CTA_STATS_MAX (__CTA_STATS_MAX - 1)
|
#define CTA_STATS_MAX (__CTA_STATS_MAX - 1)
|
||||||
|
@ -859,7 +859,6 @@ nf_conntrack_hash_check_insert(struct nf_conn *ct)
|
|||||||
|
|
||||||
out:
|
out:
|
||||||
nf_conntrack_double_unlock(hash, reply_hash);
|
nf_conntrack_double_unlock(hash, reply_hash);
|
||||||
NF_CT_STAT_INC(net, insert_failed);
|
|
||||||
local_bh_enable();
|
local_bh_enable();
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
}
|
}
|
||||||
@ -934,7 +933,7 @@ static int __nf_ct_resolve_clash(struct sk_buff *skb,
|
|||||||
nf_conntrack_put(&loser_ct->ct_general);
|
nf_conntrack_put(&loser_ct->ct_general);
|
||||||
nf_ct_set(skb, ct, ctinfo);
|
nf_ct_set(skb, ct, ctinfo);
|
||||||
|
|
||||||
NF_CT_STAT_INC(net, insert_failed);
|
NF_CT_STAT_INC(net, clash_resolve);
|
||||||
return NF_ACCEPT;
|
return NF_ACCEPT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -998,6 +997,8 @@ static int nf_ct_resolve_clash_harder(struct sk_buff *skb, u32 repl_idx)
|
|||||||
|
|
||||||
hlist_nulls_add_head_rcu(&loser_ct->tuplehash[IP_CT_DIR_REPLY].hnnode,
|
hlist_nulls_add_head_rcu(&loser_ct->tuplehash[IP_CT_DIR_REPLY].hnnode,
|
||||||
&nf_conntrack_hash[repl_idx]);
|
&nf_conntrack_hash[repl_idx]);
|
||||||
|
|
||||||
|
NF_CT_STAT_INC(net, clash_resolve);
|
||||||
return NF_ACCEPT;
|
return NF_ACCEPT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1027,10 +1028,10 @@ static int nf_ct_resolve_clash_harder(struct sk_buff *skb, u32 repl_idx)
|
|||||||
*
|
*
|
||||||
* Failing that, the new, unconfirmed conntrack is still added to the table
|
* Failing that, the new, unconfirmed conntrack is still added to the table
|
||||||
* provided that the collision only occurs in the ORIGINAL direction.
|
* provided that the collision only occurs in the ORIGINAL direction.
|
||||||
* The new entry will be added after the existing one in the hash list,
|
* The new entry will be added only in the non-clashing REPLY direction,
|
||||||
* so packets in the ORIGINAL direction will continue to match the existing
|
* so packets in the ORIGINAL direction will continue to match the existing
|
||||||
* entry. The new entry will also have a fixed timeout so it expires --
|
* entry. The new entry will also have a fixed timeout so it expires --
|
||||||
* due to the collision, it will not see bidirectional traffic.
|
* due to the collision, it will only see reply traffic.
|
||||||
*
|
*
|
||||||
* Returns NF_DROP if the clash could not be resolved.
|
* Returns NF_DROP if the clash could not be resolved.
|
||||||
*/
|
*/
|
||||||
|
@ -2516,7 +2516,9 @@ ctnetlink_ct_stat_cpu_fill_info(struct sk_buff *skb, u32 portid, u32 seq,
|
|||||||
nla_put_be32(skb, CTA_STATS_EARLY_DROP, htonl(st->early_drop)) ||
|
nla_put_be32(skb, CTA_STATS_EARLY_DROP, htonl(st->early_drop)) ||
|
||||||
nla_put_be32(skb, CTA_STATS_ERROR, htonl(st->error)) ||
|
nla_put_be32(skb, CTA_STATS_ERROR, htonl(st->error)) ||
|
||||||
nla_put_be32(skb, CTA_STATS_SEARCH_RESTART,
|
nla_put_be32(skb, CTA_STATS_SEARCH_RESTART,
|
||||||
htonl(st->search_restart)))
|
htonl(st->search_restart)) ||
|
||||||
|
nla_put_be32(skb, CTA_STATS_CLASH_RESOLVE,
|
||||||
|
htonl(st->clash_resolve)))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
nlmsg_end(skb, nlh);
|
nlmsg_end(skb, nlh);
|
||||||
|
@ -435,7 +435,7 @@ static int ct_cpu_seq_show(struct seq_file *seq, void *v)
|
|||||||
seq_printf(seq, "%08x %08x %08x %08x %08x %08x %08x %08x "
|
seq_printf(seq, "%08x %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,
|
nr_conntracks,
|
||||||
0,
|
st->clash_resolve, /* was: searched */
|
||||||
st->found,
|
st->found,
|
||||||
0,
|
0,
|
||||||
st->invalid,
|
st->invalid,
|
||||||
|
Loading…
Reference in New Issue
Block a user