netfilter: nf_tables: add packet and byte counters per chain
Subsystems (2)
[email protected]
maintainerPATCH 1/2 netfilter: nf_tables: add packet and byte counters per chain
From: Pablo Neira Ayuso <[email protected]>
This patch adds per-cpu chain counters. Only base chains are allowed to have them to emulate x_tables behaviour.
Signed-off-by Pablo Neira Ayuso <[email protected]>
--- include/net/netfilter/nf_tables.h | 7 +++ include/uapi/linux/netfilter/nf_tables.h | 1 + net/netfilter/nf_tables_api.c | 100 ++++++++++++++++++++++++++++++ net/netfilter/nf_tables_core.c | 26 ++++++-- 4 files changed, 130 insertions(+), 4 deletions(-)
include/net/netfilter/nf_tables.h +7 -0
@@ -400,18 +400,25 @@ enum nft_chain_type { NFT_CHAIN_T_MAX }; +struct nft_stats { +u64 bytes; +u64 pkts; +}; +/** * struct nft_base_chain - nf_tables base chain * * @ops: netfilter hook ops * @type: chain type * @policy: default policy +* @stats: per-cpu chain stats * @chain: the chain */ struct nft_base_chain {struct nf_hook_ops ops;enum nft_chain_type type;u8 policy; +struct nft_stats __percpu *stats;struct nft_chain chain; };
include/uapi/linux/netfilter/nf_tables.h +1 -0
@@ -83,6 +83,7 @@ enum nft_chain_attributes {NFTA_CHAIN_POLICY ,NFTA_CHAIN_USE ,NFTA_CHAIN_TYPE , +NFTA_CHAIN_COUNTERS , __NFTA_CHAIN_MAX };#define NFTA_CHAIN_MAX (__NFTA_CHAIN_MAX - 1)
net/netfilter/nf_tables_api.c +100 -0
147 lines not on this page · raw message
net/netfilter/nf_tables_core.c +22 -4
@@ -60,6 +60,25 @@ static bool nft_payload_fast_eval(const struct nft_expr *expr,return true; } +struct nft_jumpstack { +const struct nft_chain *chain; +const struct nft_rule *rule; +}; + +static inline void +nft_chain_stats (const struct nft_chain *this,const struct nft_pktinfo *pkt, +struct nft_jumpstack *jumpstack,unsigned int stackptr) +{ +struct nft_stats __percpu *stats; +const struct nft_chain *chain = stackptr ? jumpstack[0 ].chain : this; + +rcu_read_lock_bh (); + stats =rcu_dereference (nft_base_chain (chain)->stats); +__this_cpu_inc (stats->pkts); +__this_cpu_add (stats->bytes, pkt->skb->len); +rcu_read_unlock_bh (); +} +unsigned int nft_do_chain_pktinfo (struct nft_pktinfo *pkt,const struct nf_hook_ops *ops) {
@@ -68,10 +87,7 @@ nft_do_chain_pktinfo(struct nft_pktinfo *pkt, const struct nf_hook_ops *ops)const struct nft_expr *expr, *last;struct nft_data data[NFT_REG_MAX +1 ];unsigned int stackptr =0 ; -struct { -const struct nft_chain *chain; -const struct nft_rule *rule; - } jumpstack[NFT_JUMP_STACK_SIZE ]; +struct nft_jumpstack jumpstack[NFT_JUMP_STACK_SIZE ];/* * Cache cursor to avoid problems in case that the cursor is updated * while traversing the ruleset.
@@ -113,6 +129,7 @@ next_rule:case NF_ACCEPT :case NF_DROP :case NF_QUEUE : +nft_chain_stats (chain, pkt, jumpstack, stackptr);return data[NFT_REG_VERDICT ].verdict;case NFT_JUMP :BUG_ON (stackptr >=NFT_JUMP_STACK_SIZE );
@@ -136,6 +153,7 @@ next_rule: rule = jumpstack[stackptr].rule; goto next_rule; } +nft_chain_stats (chain, pkt, jumpstack, stackptr);return nft_base_chain (chain)->policy; }
Signature · 1 line
1.7.10.4
[email protected]
maintainerPATCH 2/2 netfilter: nf_tables: add trace support
From: Pablo Neira Ayuso <[email protected]>
Signed-off-by Pablo Neira Ayuso <[email protected]>
--- include/net/netfilter/nf_tables.h | 2 ++ net/netfilter/nf_tables_api.c | 1 + net/netfilter/nf_tables_core.c | 55 +++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+)
include/net/netfilter/nf_tables.h +2 -0
@@ -376,6 +376,7 @@ enum nft_chain_flags {* @list: used internally * @rcu_head: used internally * @net: net namespace that this chain belongs to +* @table: table that this chain belongs to * @handle: chain handle * @flags: bitmask of enum nft_chain_flags * @use: number of jump references to this chain
@@ -388,6 +389,7 @@ struct nft_chain {struct list_head list;struct rcu_head rcu_head;struct net *net; +struct nft_table *table;u64 handle;u8 flags;u16 use;
net/netfilter/nf_tables_api.c +1 -0
@@ -962,6 +962,7 @@ static int nf_tables_newchain(struct sock *nlsk, struct sk_buff *skb,INIT_LIST_HEAD (&chain->dirty_rules); chain->handle =nf_tables_alloc_handle (table); chain->net = net; + chain->table = table;nla_strlcpy (chain->name, name,NFT_CHAIN_MAXNAMELEN ); if (!(table->flags & NFT_TABLE_F_DORMANT) &&
net/netfilter/nf_tables_core.c +55 -0
115 lines not on this page · raw message
Signature · 1 line
1.7.10.4