]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: Optimize prefix match only if is big-endian
authorXiao Liang <shaw.leon@gmail.com>
Fri, 20 Aug 2021 16:12:37 +0000 (00:12 +0800)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 23 Aug 2021 14:34:52 +0000 (16:34 +0200)
A prefix of integer type is big-endian in nature. Prefix match can be
optimized to truncated 'cmp' only if it is big-endian.

[ Add one tests/py for this use-case --pablo ]

Fixes: 25338cdb6c77 ("src: Optimize prefix matches on byte-boundaries")
Signed-off-by: Xiao Liang <shaw.leon@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/netlink_linearize.c
tests/py/any/meta.t
tests/py/any/meta.t.json
tests/py/any/meta.t.payload

index eb53ccec1154cbdc1b7ce3bf0778c161c5dce7a6..454b9ba3fbc7282db8df5a99469cefa52dfda845 100644 (file)
@@ -548,7 +548,8 @@ static void netlink_gen_relational(struct netlink_linearize_ctx *ctx,
        case EXPR_PREFIX:
                sreg = get_register(ctx, expr->left);
                if (expr_basetype(expr->left)->type != TYPE_STRING &&
-                   (!expr->right->prefix_len ||
+                   (expr->right->byteorder != BYTEORDER_BIG_ENDIAN ||
+                    !expr->right->prefix_len ||
                     expr->right->prefix_len % BITS_PER_BYTE)) {
                        len = div_round_up(expr->right->len, BITS_PER_BYTE);
                        netlink_gen_expr(ctx, expr->left, sreg);
index 125b0a3f5697bf3d1f5b626b8ed3c8b001d4c81e..6ec4853eee4f3d5d3965ea0749cb94621ab2745a 100644 (file)
@@ -55,6 +55,7 @@ meta mark and 0x03 == 0x01;ok;meta mark & 0x00000003 == 0x00000001
 meta mark and 0x03 != 0x01;ok;meta mark & 0x00000003 != 0x00000001
 meta mark 0x10;ok;meta mark 0x00000010
 meta mark != 0x10;ok;meta mark != 0x00000010
+meta mark 0xffffff00/24;ok
 
 meta mark or 0x03 == 0x01;ok;meta mark | 0x00000003 == 0x00000001
 meta mark or 0x03 != 0x01;ok;meta mark | 0x00000003 != 0x00000001
index fd4d1c2ae57b29bbbb7bbb28fe56d336d6133afd..b140aaaa0e1c1161cec64331beef9a84bc0a0664 100644 (file)
     }
 ]
 
+# meta mark 0xffffff00/24
+[
+    {
+        "match": {
+            "left": {
+                "meta": {
+                    "key": "mark"
+                }
+            },
+            "op": "==",
+            "right": {
+                "prefix": {
+                    "addr": 4294967040,
+                    "len": 24
+                }
+            }
+        }
+    }
+]
+
 # meta mark or 0x03 == 0x01
 [
     {
index b79a0255f7783a70161142cf0448fd7a6644956f..d8351c275e642253382159d7c152d37488065b7c 100644 (file)
@@ -155,6 +155,12 @@ ip test-ip4 input
   [ meta load mark => reg 1 ]
   [ cmp neq reg 1 0x00000010 ]
 
+# meta mark 0xffffff00/24
+ip test-ip4 input
+  [ meta load mark => reg 1 ]
+  [ bitwise reg 1 = ( reg 1 & 0xffffff00 ) ^ 0x00000000 ]
+  [ cmp eq reg 1 0xffffff00 ]
+
 # meta mark or 0x03 == 0x01
 ip test-ip4 input
   [ meta load mark => reg 1 ]