From bd6ba14bebd27181ee18cfc3aebb21a78d96d672 Mon Sep 17 00:00:00 2001 From: Xiao Liang Date: Sat, 21 Aug 2021 00:12:37 +0800 Subject: src: Optimize prefix match only if is big-endian 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 Signed-off-by: Pablo Neira Ayuso --- src/netlink_linearize.c | 3 ++- tests/py/any/meta.t | 1 + tests/py/any/meta.t.json | 20 ++++++++++++++++++++ tests/py/any/meta.t.payload | 6 ++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/netlink_linearize.c b/src/netlink_linearize.c index eb53ccec..454b9ba3 100644 --- a/src/netlink_linearize.c +++ b/src/netlink_linearize.c @@ -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); diff --git a/tests/py/any/meta.t b/tests/py/any/meta.t index 125b0a3f..6ec4853e 100644 --- a/tests/py/any/meta.t +++ b/tests/py/any/meta.t @@ -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 diff --git a/tests/py/any/meta.t.json b/tests/py/any/meta.t.json index fd4d1c2a..b140aaaa 100644 --- a/tests/py/any/meta.t.json +++ b/tests/py/any/meta.t.json @@ -662,6 +662,26 @@ } ] +# meta mark 0xffffff00/24 +[ + { + "match": { + "left": { + "meta": { + "key": "mark" + } + }, + "op": "==", + "right": { + "prefix": { + "addr": 4294967040, + "len": 24 + } + } + } + } +] + # meta mark or 0x03 == 0x01 [ { diff --git a/tests/py/any/meta.t.payload b/tests/py/any/meta.t.payload index b79a0255..d8351c27 100644 --- a/tests/py/any/meta.t.payload +++ b/tests/py/any/meta.t.payload @@ -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 ] -- cgit v1.2.3