Patchwork [1/5] nfacct: add variable to not zero counter after read

login
register
mail settings
Submitter Eric Leblond
Date Aug. 1, 2012, 9:27 p.m.
Message ID <1343856436-11129-2-git-send-email-eric@regit.org>
Download mbox | patch
Permalink /patch/174603/
State Accepted
Headers show

Comments

Eric Leblond - Aug. 1, 2012, 9:27 p.m.
The default nfacct input plugin zeroes counter after each read. This
is a limitation as other software can't use the counter at the same
time as ulogd2.
This patch adds the zerocounter variable to the NFACCT input plugin.
If set to zero, the counters are not zeroed.
---
 input/sum/ulogd_inpflow_NFACCT.c |   29 +++++++++++++++++++++--------
 ulogd.conf.in                    |    2 ++
 2 files changed, 23 insertions(+), 8 deletions(-)
Pablo Neira - Aug. 3, 2012, 9:24 a.m.
On Wed, Aug 01, 2012 at 11:27:12PM +0200, Eric Leblond wrote:
> The default nfacct input plugin zeroes counter after each read. This
> is a limitation as other software can't use the counter at the same
> time as ulogd2.
> This patch adds the zerocounter variable to the NFACCT input plugin.
> If set to zero, the counters are not zeroed.

Applied with minor glitches. Thanks Eric.

> ---
>  input/sum/ulogd_inpflow_NFACCT.c |   29 +++++++++++++++++++++--------
>  ulogd.conf.in                    |    2 ++
>  2 files changed, 23 insertions(+), 8 deletions(-)
> 
> diff --git a/input/sum/ulogd_inpflow_NFACCT.c b/input/sum/ulogd_inpflow_NFACCT.c
> index f3b936f..a3bcc72 100644
> --- a/input/sum/ulogd_inpflow_NFACCT.c
> +++ b/input/sum/ulogd_inpflow_NFACCT.c
> @@ -40,10 +40,17 @@ static struct config_keyset nfacct_kset = {
>  			.options = CONFIG_OPT_NONE,
>  			.u.value = 0,
>  		},
> +		{
> +			.key	 = "zerocounter",
> +			.type	 = CONFIG_TYPE_INT,
> +			.options = CONFIG_OPT_NONE,
> +			.u.value = 1,
> +		}
>  	},
> -	.num_ces = 1,
> +	.num_ces = 2,
>  };
>  #define pollint_ce(x)	(x->ces[0])
> +#define zerocounter_ce(x) (x->ces[1])
>  
>  enum ulogd_nfacct_keys {
>  	ULOGD_NFACCT_NAME,
> @@ -145,13 +152,22 @@ static int nfacct_read_cb(int fd, unsigned int what, void *param)
>  	return ret;
>  }
>  
> -static int nfacct_send_request(struct nfacct_pluginstance *cpi)
> +static int nfacct_send_request(struct ulogd_pluginstance *upi)
>  {
> +

Removed extra white line.

> +	struct nfacct_pluginstance *cpi =
> +		(struct nfacct_pluginstance *)upi->private;
>  	struct nlmsghdr *nlh;
>  	char buf[MNL_SOCKET_BUFFER_SIZE];
> +	int flushctr;
>  
> +	if (zerocounter_ce(upi->config_kset).u.value != 0) {
> +		flushctr = NFNL_MSG_ACCT_GET_CTRZERO;
> +	} else {
> +		flushctr = NFNL_MSG_ACCT_GET;
> +	}

No need for brackets in this case, removed.

>  	cpi->seq = time(NULL);
> -	nlh = nfacct_nlmsg_build_hdr(buf, NFNL_MSG_ACCT_GET_CTRZERO,
> +	nlh = nfacct_nlmsg_build_hdr(buf, flushctr,
>  				     NLM_F_DUMP, cpi->seq);

This line above doesn't need the line break to fit into 80-chars.

>  	if (mnl_socket_sendto(cpi->nl, nlh, nlh->nlmsg_len) < 0) {
> @@ -167,7 +183,7 @@ static void polling_timer_cb(struct ulogd_timer *t, void *data)
>  	struct nfacct_pluginstance *cpi =
>  		(struct nfacct_pluginstance *)upi->private;
>  
> -	nfacct_send_request(cpi);
> +	nfacct_send_request(upi);
>  
>  	ulogd_add_timer(&cpi->timer, pollint_ce(upi->config_kset).u.value);
>  }
> @@ -234,12 +250,9 @@ static int destructor_nfacct(struct ulogd_pluginstance *upi)
>  
>  static void signal_nfacct(struct ulogd_pluginstance *upi, int signal)
>  {
> -	struct nfacct_pluginstance *cpi =
> -		(struct nfacct_pluginstance *)upi->private;
> -
>  	switch (signal) {
>  	case SIGUSR2:
> -		nfacct_send_request(cpi);
> +		nfacct_send_request(upi);
>  		break;
>  	}
>  }
> diff --git a/ulogd.conf.in b/ulogd.conf.in
> index 5f19cae..879ab3c 100644
> --- a/ulogd.conf.in
> +++ b/ulogd.conf.in
> @@ -263,3 +263,5 @@ mark = 1
>  
>  [acct1]
>  pollinterval = 2
> +# Set to zero to avoid zeroing counters after read
> +#zerocounter = 0
> -- 
> 1.7.10.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/input/sum/ulogd_inpflow_NFACCT.c b/input/sum/ulogd_inpflow_NFACCT.c
index f3b936f..a3bcc72 100644
--- a/input/sum/ulogd_inpflow_NFACCT.c
+++ b/input/sum/ulogd_inpflow_NFACCT.c
@@ -40,10 +40,17 @@  static struct config_keyset nfacct_kset = {
 			.options = CONFIG_OPT_NONE,
 			.u.value = 0,
 		},
+		{
+			.key	 = "zerocounter",
+			.type	 = CONFIG_TYPE_INT,
+			.options = CONFIG_OPT_NONE,
+			.u.value = 1,
+		}
 	},
-	.num_ces = 1,
+	.num_ces = 2,
 };
 #define pollint_ce(x)	(x->ces[0])
+#define zerocounter_ce(x) (x->ces[1])
 
 enum ulogd_nfacct_keys {
 	ULOGD_NFACCT_NAME,
@@ -145,13 +152,22 @@  static int nfacct_read_cb(int fd, unsigned int what, void *param)
 	return ret;
 }
 
-static int nfacct_send_request(struct nfacct_pluginstance *cpi)
+static int nfacct_send_request(struct ulogd_pluginstance *upi)
 {
+
+	struct nfacct_pluginstance *cpi =
+		(struct nfacct_pluginstance *)upi->private;
 	struct nlmsghdr *nlh;
 	char buf[MNL_SOCKET_BUFFER_SIZE];
+	int flushctr;
 
+	if (zerocounter_ce(upi->config_kset).u.value != 0) {
+		flushctr = NFNL_MSG_ACCT_GET_CTRZERO;
+	} else {
+		flushctr = NFNL_MSG_ACCT_GET;
+	}
 	cpi->seq = time(NULL);
-	nlh = nfacct_nlmsg_build_hdr(buf, NFNL_MSG_ACCT_GET_CTRZERO,
+	nlh = nfacct_nlmsg_build_hdr(buf, flushctr,
 				     NLM_F_DUMP, cpi->seq);
 
 	if (mnl_socket_sendto(cpi->nl, nlh, nlh->nlmsg_len) < 0) {
@@ -167,7 +183,7 @@  static void polling_timer_cb(struct ulogd_timer *t, void *data)
 	struct nfacct_pluginstance *cpi =
 		(struct nfacct_pluginstance *)upi->private;
 
-	nfacct_send_request(cpi);
+	nfacct_send_request(upi);
 
 	ulogd_add_timer(&cpi->timer, pollint_ce(upi->config_kset).u.value);
 }
@@ -234,12 +250,9 @@  static int destructor_nfacct(struct ulogd_pluginstance *upi)
 
 static void signal_nfacct(struct ulogd_pluginstance *upi, int signal)
 {
-	struct nfacct_pluginstance *cpi =
-		(struct nfacct_pluginstance *)upi->private;
-
 	switch (signal) {
 	case SIGUSR2:
-		nfacct_send_request(cpi);
+		nfacct_send_request(upi);
 		break;
 	}
 }
diff --git a/ulogd.conf.in b/ulogd.conf.in
index 5f19cae..879ab3c 100644
--- a/ulogd.conf.in
+++ b/ulogd.conf.in
@@ -263,3 +263,5 @@  mark = 1
 
 [acct1]
 pollinterval = 2
+# Set to zero to avoid zeroing counters after read
+#zerocounter = 0