diff mbox series

[iptables,1/2] ebtables: Fix rule listing with counters

Message ID 20190121164335.25025-2-phil@nwl.cc
State Accepted
Delegated to: Pablo Neira
Headers show
Series ebtables-nft output fixes | expand

Commit Message

Phil Sutter Jan. 21, 2019, 4:43 p.m. UTC
This is a partial revert of commit 583b27eabcad6 ("ebtables-save: add -c
option, using xtables-style counters") which broke ruleset listing with
'--Lc' flag turned on:

| # ebtables-nft -L --Lc
| Bridge table: filter
|
| Bridge chain: INPUT, entries: 0, policy: ACCEPT
|
| Bridge chain: FORWARD, entries: 2, policy: ACCEPT
| -j foo
|  , pcnt = 0 -- bcnt = 0-j ACCEPT
|  , pcnt = 0 -- bcnt = 0
| Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
|
| Bridge chain: foo, entries: 1, policy: RETURN
| -j ACCEPT
|  , pcnt = 0 -- bcnt = 0%

(That percentage sign means no newline after last line of output and
doesn't belong to ebtables-nft's output.)

Problem was that nft_bridge_print_rule() printed the counters after
nft_bridge_save_rule() had already printed the newline character.

Note also that there is no need to remove FMT_EBT_SAVE bit from 'format'
variable: It is set only by ebtables-nft-save which doesn't call
nft_bridge_print_rule().

Fixes: 583b27eabcad6 ("ebtables-save: add -c option, using xtables-style counters")
Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 iptables/nft-bridge.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/iptables/nft-bridge.c b/iptables/nft-bridge.c
index ad583a60c424d..61c82f72c7740 100644
--- a/iptables/nft-bridge.c
+++ b/iptables/nft-bridge.c
@@ -469,6 +469,11 @@  static void nft_bridge_save_rule(const void *data, unsigned int format)
 		       (uint64_t)cs->counters.pcnt,
 		       (uint64_t)cs->counters.bcnt);
 
+	if (!(format & FMT_NOCOUNTS))
+		printf(" , pcnt = %"PRIu64" -- bcnt = %"PRIu64"",
+		       (uint64_t)cs->counters.pcnt,
+		       (uint64_t)cs->counters.bcnt);
+
 	if (!(format & FMT_NONEWLINE))
 		fputc('\n', stdout);
 }
@@ -482,11 +487,7 @@  static void nft_bridge_print_rule(struct nftnl_rule *r, unsigned int num,
 		printf("%d ", num);
 
 	nft_rule_to_ebtables_command_state(r, &cs);
-	nft_bridge_save_rule(&cs, format & ~FMT_EBT_SAVE);
-	if (!(format & FMT_NOCOUNTS))
-		printf(" , pcnt = %"PRIu64" -- bcnt = %"PRIu64"",
-		       (uint64_t)cs.counters.pcnt,
-		       (uint64_t)cs.counters.bcnt);
+	nft_bridge_save_rule(&cs, format);
 	ebt_cs_clean(&cs);
 }