summaryrefslogtreecommitdiffstats
path: root/lib/netfilter
diff options
context:
space:
mode:
authorКоренберг Марк (дома) <socketpair@gmail.com>2012-08-27 17:39:29 (GMT)
committerКоренберг Марк <mark@ideco.ru>2012-08-28 12:53:33 (GMT)
commita0f1c0e281ee78ab8ee874bbb6c2140c12101284 (patch)
treed2539a6c212a1cd620bee67c5670ec8ff5df5ac5 /lib/netfilter
parent052a13119353f97e70216808b02bc692bcb18378 (diff)
downloadlibnl-a0f1c0e281ee78ab8ee874bbb6c2140c12101284.zip
libnl-a0f1c0e281ee78ab8ee874bbb6c2140c12101284.tar.gz
libnl-a0f1c0e281ee78ab8ee874bbb6c2140c12101284.tar.bz2
ct_dump_stats: detect when stats are not available
Since about 2.6.27 kernel, stats are not enabled by default. Stats can be enabled using sysctl named net.netfilter.nf_conntrack_acct So, do not print zeroes in stats if it's not available. When not checked, trash may appear in output
Diffstat (limited to 'lib/netfilter')
-rw-r--r--lib/netfilter/ct_obj.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/lib/netfilter/ct_obj.c b/lib/netfilter/ct_obj.c
index c205427..70a814f 100644
--- a/lib/netfilter/ct_obj.c
+++ b/lib/netfilter/ct_obj.c
@@ -256,18 +256,29 @@ static void ct_dump_stats(struct nl_object *a, struct nl_dump_params *p)
struct nfnl_ct *ct = (struct nfnl_ct *) a;
double res;
char *unit;
+ uint64_t packets;
+ const char * const names[] = {"rx", "tx"};
+ int i;
ct_dump_details(a, p);
- nl_dump_line(p, " # packets volume\n");
-
- res = nl_cancel_down_bytes(nfnl_ct_get_bytes(ct, 1), &unit);
- nl_dump_line(p, " rx %10llu %7.2f %s\n",
- nfnl_ct_get_packets(ct, 1), res, unit);
+ if (!nfnl_ct_test_bytes(ct, 0) ||
+ !nfnl_ct_test_packets(ct, 0) ||
+ !nfnl_ct_test_bytes(ct, 1) ||
+ !nfnl_ct_test_packets(ct, 1))
+ {
+ nl_dump_line(p, " Statics are not available.\n");
+ nl_dump_line(p, " Please set sysctl net.netfilter.nf_conntrack_acct = 1\n");
+ nl_dump_line(p, " (Require kernel 2.6.27)\n");
+ return;
+ }
- res = nl_cancel_down_bytes(nfnl_ct_get_bytes(ct, 0), &unit);
- nl_dump_line(p, " tx %10llu %7.2f %s\n",
- nfnl_ct_get_packets(ct, 0), res, unit);
+ nl_dump_line(p, " # packets volume\n");
+ for (i=0; i<=1; i++) {
+ res = nl_cancel_down_bytes(nfnl_ct_get_bytes(ct, i), &unit);
+ packets = nfnl_ct_get_packets(ct, i);
+ nl_dump_line(p, " %s %10llu %7.2f %s\n", names[i], packets, res, unit);
+ }
}
static int ct_compare(struct nl_object *_a, struct nl_object *_b,