From: Vadim Kochan <[email protected]>
Allow set start/stop timestamp for new flows by setting:
/proc/sys/net/netfilter/nf_conntrack_timestamp
on start and reset it on exit or panic.
Signed-off-by: Vadim Kochan <[email protected]>
---
flowtop.c | 45 ++++++++++++++++++++++++++++++++++++---------
1 file changed, 36 insertions(+), 9 deletions(-)
diff --git a/flowtop.c b/flowtop.c
index d073715..cbeecea 100644
--- a/flowtop.c
+++ b/flowtop.c
@@ -88,11 +88,16 @@ struct flow_list {
#define INCLUDE_ICMP (1 << 5)
#define INCLUDE_SCTP (1 << 6)
+struct sysctl_params_ctx {
+ int nfct_acct;
+ int nfct_tstamp;
+};
+
static volatile bool is_flow_collecting;
static volatile sig_atomic_t sigint = 0;
static int what = INCLUDE_IPV4 | INCLUDE_IPV6 | INCLUDE_TCP, show_src = 0;
static struct flow_list flow_list;
-static int nfct_acct_val = -1;
+static struct sysctl_params_ctx sysctl = { -1, -1 };
static const char *short_options = "vhTUsDIS46u";
static const struct option long_options[] = {
@@ -1107,12 +1112,17 @@ static int flow_event_cb(enum nf_conntrack_msg_type
type,
return NFCT_CB_CONTINUE;
}
-static void restore_sysctl(void *value)
+static void restore_sysctl(void *obj)
{
- int int_val = *(int *)value;
+ struct sysctl_params_ctx *sysctl_ctx = (struct sysctl_params_ctx *)obj;
- if (int_val == 0)
- sysctl_set_int("net/netfilter/nf_conntrack_acct", int_val);
+ if (sysctl_ctx->nfct_acct == 0)
+ sysctl_set_int("net/netfilter/nf_conntrack_acct",
+ sysctl_ctx->nfct_acct);
+
+ if (sysctl_ctx->nfct_tstamp == 0)
+ sysctl_set_int("net/netfilter/nf_conntrack_timestamp",
+ sysctl_ctx->nfct_tstamp);
}
static void on_panic_handler(void *arg)
@@ -1124,12 +1134,12 @@ static void on_panic_handler(void *arg)
static void conntrack_acct_enable(void)
{
/* We can still work w/o traffic accounting so just warn about error */
- if (sysctl_get_int("net/netfilter/nf_conntrack_acct", &nfct_acct_val)) {
+ if (sysctl_get_int("net/netfilter/nf_conntrack_acct",
&sysctl.nfct_acct)) {
fprintf(stderr, "Can't read net/netfilter/nf_conntrack_acct:
%s\n",
strerror(errno));
}
- if (nfct_acct_val == 1)
+ if (sysctl.nfct_acct == 1)
return;
if (sysctl_set_int("net/netfilter/nf_conntrack_acct", 1)) {
@@ -1138,6 +1148,22 @@ static void conntrack_acct_enable(void)
}
}
+static void conntrack_tstamp_enable(void)
+{
+ if (sysctl_get_int("net/netfilter/nf_conntrack_timestamp",
&sysctl.nfct_tstamp)) {
+ fprintf(stderr, "Can't read
net/netfilter/nf_conntrack_timestamp: %s\n",
+ strerror(errno));
+ }
+
+ if (sysctl.nfct_tstamp == 1)
+ return;
+
+ if (sysctl_set_int("net/netfilter/nf_conntrack_timestamp", 1)) {
+ fprintf(stderr, "Can't write
net/netfilter/nf_conntrack_timestamp: %s\n",
+ strerror(errno));
+ }
+}
+
static int flow_update_cb(enum nf_conntrack_msg_type type,
struct nf_conntrack *ct, void *data __maybe_unused)
{
@@ -1440,9 +1466,10 @@ int main(int argc, char **argv)
register_signal(SIGTERM, signal_handler);
register_signal(SIGHUP, signal_handler);
- panic_handler_add(on_panic_handler, &nfct_acct_val);
+ panic_handler_add(on_panic_handler, &sysctl);
conntrack_acct_enable();
+ conntrack_tstamp_enable();
init_geoip(1);
@@ -1454,7 +1481,7 @@ int main(int argc, char **argv)
destroy_geoip();
- restore_sysctl(&nfct_acct_val);
+ restore_sysctl(&sysctl);
return 0;
}
--
2.4.2
--
You received this message because you are subscribed to the Google Groups
"netsniff-ng" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.