Re: [nft PATCH] fib: Fix for existence check on Big Endian

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

 



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
> 




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

  Powered by Linux