[PATCH nft] datatype: fix print of raw numerical symbol values

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The two rules:
arp operation 1-2 accept
arp operation 256-512 accept

are both shown as 256-512:

        chain in_public {
                arp operation 256-512 accept
                arp operation 256-512 accept
                meta mark "1"
                tcp flags 2,4
        }

This is because range expression enforces numeric output,
yet nft_print doesn't respect byte order.

Behave as if we had no symbol in the first place and call
the base type print function instead.

This means we now respect format specifier as well:
	chain in_public {
                arp operation 1-2 accept
                arp operation 256-512 accept
                meta mark "0x00000001"
                tcp flags 0x2,0x4
	}

Without fix, added test case will fail:
'add rule arp test-arp input arp operation 1-2': 'arp operation 1-2' mismatches 'arp operation 256-512'

Signed-off-by: Florian Westphal <fw@xxxxxxxxx>
---
  Note there is a discrepancy between output when we have a symbol and
  when we do not.

  Example, add rule:
  meta mark "foo"

  (with '1 "foo"' in rt_marks), nft will print quotes when symbol
  printing is inhibited via -n, but elides them in case the symbol
  is not available.

 src/datatype.c                    | 2 +-
 tests/py/arp/arp.t                | 1 +
 tests/py/arp/arp.t.payload        | 6 ++++++
 tests/py/arp/arp.t.payload.netdev | 8 ++++++++
 4 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/datatype.c b/src/datatype.c
index 8ae3aa1c3f90..d193ccc0a659 100644
--- a/src/datatype.c
+++ b/src/datatype.c
@@ -198,7 +198,7 @@ void symbolic_constant_print(const struct symbol_table *tbl,
 		nft_print(octx, "\"");
 
 	if (nft_output_numeric_symbol(octx))
-		nft_print(octx, "%" PRIu64 "", val);
+		expr_basetype(expr)->print(expr, octx);
 	else
 		nft_print(octx, "%s", s->identifier);
 
diff --git a/tests/py/arp/arp.t b/tests/py/arp/arp.t
index 86bab5232eaf..2540c0a77419 100644
--- a/tests/py/arp/arp.t
+++ b/tests/py/arp/arp.t
@@ -38,6 +38,7 @@ arp plen != {33-55};ok
 
 arp operation {nak, inreply, inrequest, rreply, rrequest, reply, request};ok
 arp operation != {nak, inreply, inrequest, rreply, rrequest, reply, request};ok
+arp operation 1-2;ok
 arp operation request;ok
 arp operation reply;ok
 arp operation rrequest;ok
diff --git a/tests/py/arp/arp.t.payload b/tests/py/arp/arp.t.payload
index d36bef183396..52c993294810 100644
--- a/tests/py/arp/arp.t.payload
+++ b/tests/py/arp/arp.t.payload
@@ -188,6 +188,12 @@ arp test-arp input
   [ payload load 2b @ network header + 6 => reg 1 ]
   [ lookup reg 1 set __set%d 0x1 ]
 
+# arp operation 1-2
+arp test-arp input
+  [ payload load 2b @ network header + 6 => reg 1 ]
+  [ cmp gte reg 1 0x00000100 ]
+  [ cmp lte reg 1 0x00000200 ]
+
 # arp operation request
 arp test-arp input
   [ payload load 2b @ network header + 6 => reg 1 ]
diff --git a/tests/py/arp/arp.t.payload.netdev b/tests/py/arp/arp.t.payload.netdev
index 0146cf500ee2..667691fff2f6 100644
--- a/tests/py/arp/arp.t.payload.netdev
+++ b/tests/py/arp/arp.t.payload.netdev
@@ -246,6 +246,14 @@ netdev test-netdev ingress
   [ payload load 2b @ network header + 6 => reg 1 ]
   [ lookup reg 1 set __set%d 0x1 ]
 
+# arp operation 1-2
+netdev test-netdev ingress
+  [ meta load protocol => reg 1 ]
+  [ cmp eq reg 1 0x00000608 ]
+  [ payload load 2b @ network header + 6 => reg 1 ]
+  [ cmp gte reg 1 0x00000100 ]
+  [ cmp lte reg 1 0x00000200 ]
+
 # arp operation request
 netdev test-netdev ingress 
   [ meta load protocol => reg 1 ]
-- 
2.21.0




[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux