diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/evaluate.c | 14 | ||||
-rw-r--r-- | src/expression.c | 4 | ||||
-rw-r--r-- | src/fib.c | 5 |
3 files changed, 21 insertions, 2 deletions
diff --git a/src/evaluate.c b/src/evaluate.c index 7c039cba..7ddbb658 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -1658,6 +1658,17 @@ range: return 0; } +static int expr_evaluate_fib(struct eval_ctx *ctx, struct expr **exprp) +{ + struct expr *expr = *exprp; + + if (expr->flags & EXPR_F_BOOLEAN) { + expr->fib.flags |= NFTA_FIB_F_PRESENT; + expr->dtype = &boolean_type; + } + return expr_evaluate_primary(ctx, exprp); +} + static int expr_evaluate(struct eval_ctx *ctx, struct expr **expr) { #ifdef DEBUG @@ -1680,8 +1691,9 @@ static int expr_evaluate(struct eval_ctx *ctx, struct expr **expr) return expr_evaluate_exthdr(ctx, expr); case EXPR_VERDICT: case EXPR_META: - case EXPR_FIB: return expr_evaluate_primary(ctx, expr); + case EXPR_FIB: + return expr_evaluate_fib(ctx, expr); case EXPR_PAYLOAD: return expr_evaluate_payload(ctx, expr); case EXPR_RT: diff --git a/src/expression.c b/src/expression.c index da94b79f..a6065524 100644 --- a/src/expression.c +++ b/src/expression.c @@ -592,6 +592,10 @@ struct expr *relational_expr_alloc(const struct location *loc, enum ops op, expr->left = left; expr->op = op; expr->right = right; + + if (right->dtype == &boolean_type) + left->flags |= EXPR_F_BOOLEAN; + return expr; } @@ -73,7 +73,7 @@ static void __fib_expr_print_f(unsigned int *flags, unsigned int f, const char * static void fib_expr_print(const struct expr *expr) { - unsigned int flags = expr->fib.flags; + unsigned int flags = expr->fib.flags & ~NFTA_FIB_F_PRESENT; printf("fib "); __fib_expr_print_f(&flags, NFTA_FIB_F_SADDR, "saddr"); @@ -130,6 +130,9 @@ struct expr *fib_expr_alloc(const struct location *loc, BUG("Unknown result %d\n", result); } + if (flags & NFTA_FIB_F_PRESENT) + type = &boolean_type; + expr = expr_alloc(loc, &fib_expr_ops, type, BYTEORDER_HOST_ENDIAN, len); |