forked from Sricharanti/sricharan
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
netfilter: accounting rework: ct_extend + 64bit counters (v4)
Initially netfilter has had 64bit counters for conntrack-based accounting, but it was changed in 2.6.14 to save memory. Unfortunately in-kernel 64bit counters are still required, for example for "connbytes" extension. However, 64bit counters waste a lot of memory and it was not possible to enable/disable it runtime. This patch: - reimplements accounting with respect to the extension infrastructure, - makes one global version of seq_print_acct() instead of two seq_print_counters(), - makes it possible to enable it at boot time (for CONFIG_SYSCTL/CONFIG_SYSFS=n), - makes it possible to enable/disable it at runtime by sysctl or sysfs, - extends counters from 32bit to 64bit, - renames ip_conntrack_counter -> nf_conn_counter, - enables accounting code unconditionally (no longer depends on CONFIG_NF_CT_ACCT), - set initial accounting enable state based on CONFIG_NF_CT_ACCT - removes buggy IPCT_COUNTER_FILLING event handling. If accounting is enabled newly created connections get additional acct extend. Old connections are not changed as it is not possible to add a ct_extend area to confirmed conntrack. Accounting is performed for all connections with acct extend regardless of a current state of "net.netfilter.nf_conntrack_acct". Signed-off-by: Krzysztof Piotr Oledzki <[email protected]> Signed-off-by: Patrick McHardy <[email protected]> Signed-off-by: David S. Miller <[email protected]>
- Loading branch information
Showing
15 changed files
with
248 additions
and
86 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -336,3 +336,13 @@ When: After the only user (hal) has seen a release with the patches | |
Why: Over 1K .text/.data size reduction, data is available in other | ||
ways (ioctls) | ||
Who: Johannes Berg <[email protected]> | ||
|
||
--------------------------- | ||
|
||
What: CONFIG_NF_CT_ACCT | ||
When: 2.6.29 | ||
Why: Accounting can now be enabled/disabled without kernel recompilation. | ||
Currently used only to set a default value for a feature that is also | ||
controlled by a kernel/module/sysfs/sysctl parameter. | ||
Who: Krzysztof Piotr Oledzki <[email protected]> | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
/* | ||
* (C) 2008 Krzysztof Piotr Oledzki <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#ifndef _NF_CONNTRACK_ACCT_H | ||
#define _NF_CONNTRACK_ACCT_H | ||
#include <linux/netfilter/nf_conntrack_common.h> | ||
#include <linux/netfilter/nf_conntrack_tuple_common.h> | ||
#include <net/netfilter/nf_conntrack.h> | ||
#include <net/netfilter/nf_conntrack_extend.h> | ||
|
||
struct nf_conn_counter { | ||
u_int64_t packets; | ||
u_int64_t bytes; | ||
}; | ||
|
||
extern int nf_ct_acct; | ||
|
||
static inline | ||
struct nf_conn_counter *nf_conn_acct_find(const struct nf_conn *ct) | ||
{ | ||
return nf_ct_ext_find(ct, NF_CT_EXT_ACCT); | ||
} | ||
|
||
static inline | ||
struct nf_conn_counter *nf_ct_acct_ext_add(struct nf_conn *ct, gfp_t gfp) | ||
{ | ||
struct nf_conn_counter *acct; | ||
|
||
if (!nf_ct_acct) | ||
return NULL; | ||
|
||
acct = nf_ct_ext_add(ct, NF_CT_EXT_ACCT, gfp); | ||
if (!acct) | ||
pr_debug("failed to add accounting extension area"); | ||
|
||
|
||
return acct; | ||
}; | ||
|
||
extern unsigned int | ||
seq_print_acct(struct seq_file *s, const struct nf_conn *ct, int dir); | ||
|
||
extern int nf_conntrack_acct_init(void); | ||
extern void nf_conntrack_acct_fini(void); | ||
|
||
#endif /* _NF_CONNTRACK_ACCT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
/* Accouting handling for netfilter. */ | ||
|
||
/* | ||
* (C) 2008 Krzysztof Piotr Oledzki <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#include <linux/netfilter.h> | ||
#include <linux/kernel.h> | ||
#include <linux/moduleparam.h> | ||
|
||
#include <net/netfilter/nf_conntrack.h> | ||
#include <net/netfilter/nf_conntrack_extend.h> | ||
#include <net/netfilter/nf_conntrack_acct.h> | ||
|
||
#ifdef CONFIG_NF_CT_ACCT | ||
#define NF_CT_ACCT_DEFAULT 1 | ||
#else | ||
#define NF_CT_ACCT_DEFAULT 0 | ||
#endif | ||
|
||
int nf_ct_acct __read_mostly = NF_CT_ACCT_DEFAULT; | ||
EXPORT_SYMBOL_GPL(nf_ct_acct); | ||
|
||
module_param_named(acct, nf_ct_acct, bool, 0644); | ||
MODULE_PARM_DESC(acct, "Enable connection tracking flow accounting."); | ||
|
||
#ifdef CONFIG_SYSCTL | ||
static struct ctl_table_header *acct_sysctl_header; | ||
static struct ctl_table acct_sysctl_table[] = { | ||
{ | ||
.ctl_name = CTL_UNNUMBERED, | ||
.procname = "nf_conntrack_acct", | ||
.data = &nf_ct_acct, | ||
.maxlen = sizeof(unsigned int), | ||
.mode = 0644, | ||
.proc_handler = &proc_dointvec, | ||
}, | ||
{} | ||
}; | ||
#endif /* CONFIG_SYSCTL */ | ||
|
||
unsigned int | ||
seq_print_acct(struct seq_file *s, const struct nf_conn *ct, int dir) | ||
{ | ||
struct nf_conn_counter *acct; | ||
|
||
acct = nf_conn_acct_find(ct); | ||
if (!acct) | ||
return 0; | ||
|
||
return seq_printf(s, "packets=%llu bytes=%llu ", | ||
(unsigned long long)acct[dir].packets, | ||
(unsigned long long)acct[dir].bytes); | ||
}; | ||
EXPORT_SYMBOL_GPL(seq_print_acct); | ||
|
||
static struct nf_ct_ext_type acct_extend __read_mostly = { | ||
.len = sizeof(struct nf_conn_counter[IP_CT_DIR_MAX]), | ||
.align = __alignof__(struct nf_conn_counter[IP_CT_DIR_MAX]), | ||
.id = NF_CT_EXT_ACCT, | ||
}; | ||
|
||
int nf_conntrack_acct_init(void) | ||
{ | ||
int ret; | ||
|
||
#ifdef CONFIG_NF_CT_ACCT | ||
printk(KERN_WARNING "CONFIG_NF_CT_ACCT is deprecated and will be removed soon. Plase use\n"); | ||
printk(KERN_WARNING "nf_conntrack.acct=1 kernel paramater, acct=1 nf_conntrack module option or\n"); | ||
printk(KERN_WARNING "sysctl net.netfilter.nf_conntrack_acct=1 to enable it.\n"); | ||
#endif | ||
|
||
ret = nf_ct_extend_register(&acct_extend); | ||
if (ret < 0) { | ||
printk(KERN_ERR "nf_conntrack_acct: Unable to register extension\n"); | ||
return ret; | ||
} | ||
|
||
#ifdef CONFIG_SYSCTL | ||
acct_sysctl_header = register_sysctl_paths(nf_net_netfilter_sysctl_path, | ||
acct_sysctl_table); | ||
|
||
if (!acct_sysctl_header) { | ||
nf_ct_extend_unregister(&acct_extend); | ||
|
||
printk(KERN_ERR "nf_conntrack_acct: can't register to sysctl.\n"); | ||
return -ENOMEM; | ||
} | ||
#endif | ||
|
||
return 0; | ||
} | ||
|
||
void nf_conntrack_acct_fini(void) | ||
{ | ||
#ifdef CONFIG_SYSCTL | ||
unregister_sysctl_table(acct_sysctl_header); | ||
#endif | ||
nf_ct_extend_unregister(&acct_extend); | ||
} |
Oops, something went wrong.