Hi Phil, On Tue, Sep 09, 2025 at 10:49:48PM +0200, Phil Sutter wrote: > Adjust the expression size to 1B so cmp expression value is correct. > Without this, the rule 'fib saddr . iif check exists' generates > following byte code on BE: > > | [ fib saddr . iif oif present => reg 1 ] > | [ cmp eq reg 1 0x00000001 ] > > Though with NFTA_FIB_F_PRESENT flag set, nft_fib.ko writes to the first > byte of reg 1 only (using nft_reg_store8()). With this patch in place, > byte code is correct: > > | [ fib saddr . iif oif present => reg 1 ] > | [ cmp eq reg 1 0x01000000 ] Is this a generic issue of boolean that is using 1 bit? const struct datatype boolean_type = { .type = TYPE_BOOLEAN, .name = "boolean", .desc = "boolean type", .size = 1, > Fixes: f686a17eafa0b ("fib: Support existence check") > Cc: Yi Chen <yiche@xxxxxxxxxx> > Signed-off-by: Phil Sutter <phil@xxxxxx> > --- > src/evaluate.c | 1 + > src/fib.c | 4 +++- > 2 files changed, 4 insertions(+), 1 deletion(-) > > diff --git a/src/evaluate.c b/src/evaluate.c > index 8cecbe09de01c..6a1aa4963bceb 100644 > --- a/src/evaluate.c > +++ b/src/evaluate.c > @@ -3002,6 +3002,7 @@ static int expr_evaluate_fib(struct eval_ctx *ctx, struct expr **exprp) > if (expr->flags & EXPR_F_BOOLEAN) { > expr->fib.flags |= NFTA_FIB_F_PRESENT; > datatype_set(expr, &boolean_type); > + expr->len = BITS_PER_BYTE; > } > return expr_evaluate_primary(ctx, exprp); > } > diff --git a/src/fib.c b/src/fib.c > index 5383613292a5e..4db7cd2bbc9c3 100644 > --- a/src/fib.c > +++ b/src/fib.c > @@ -198,8 +198,10 @@ struct expr *fib_expr_alloc(const struct location *loc, > BUG("Unknown result %d\n", result); > } > > - if (flags & NFTA_FIB_F_PRESENT) > + if (flags & NFTA_FIB_F_PRESENT) { > type = &boolean_type; > + len = BITS_PER_BYTE; > + } > > expr = expr_alloc(loc, EXPR_FIB, type, > BYTEORDER_HOST_ENDIAN, len); > -- > 2.51.0 >