diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/evaluate.c | 7 | ||||
| -rw-r--r-- | src/netlink.c | 11 |
2 files changed, 15 insertions, 3 deletions
diff --git a/src/evaluate.c b/src/evaluate.c index cc35f884..b00344a0 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -1740,6 +1740,7 @@ static int expr_evaluate_concat(struct eval_ctx *ctx, struct expr **expr) break; case EXPR_RANGE: case EXPR_PREFIX: + case EXPR_RANGE_VALUE: /* allowed on RHS (e.g. th dport . mark { 1-65535 . 42 } * ~~~~~~~~ allowed * but not on LHS (e.g 1-4 . mark { ...} @@ -1763,7 +1764,6 @@ static int expr_evaluate_concat(struct eval_ctx *ctx, struct expr **expr) case EXPR_SET_REF: case EXPR_MAPPING: case EXPR_SET_ELEM_CATCHALL: - case EXPR_RANGE_VALUE: case EXPR_RANGE_SYMBOL: return expr_error(ctx->msgs, i, "cannot use %s in concatenation", @@ -1939,6 +1939,7 @@ static int expr_evaluate_set_elem(struct eval_ctx *ctx, struct expr **expr) switch (elem->key->etype) { case EXPR_PREFIX: case EXPR_RANGE: + case EXPR_RANGE_VALUE: key = elem->key; goto err_missing_flag; case EXPR_CONCAT: @@ -1946,6 +1947,7 @@ static int expr_evaluate_set_elem(struct eval_ctx *ctx, struct expr **expr) switch (key->etype) { case EXPR_PREFIX: case EXPR_RANGE: + case EXPR_RANGE_VALUE: goto err_missing_flag; default: break; @@ -2426,9 +2428,8 @@ static int expr_evaluate_symbol_range(struct eval_ctx *ctx, struct expr **exprp) left = range->left; right = range->right; - /* concatenation and maps need more work to use constant_range_expr. */ + /* maps need more work to use constant_range_expr. */ if (ctx->set && !set_is_map(ctx->set->flags) && - set_is_non_concat_range(ctx->set) && left->etype == EXPR_VALUE && right->etype == EXPR_VALUE) { constant_range = constant_range_expr_alloc(&expr->location, diff --git a/src/netlink.c b/src/netlink.c index b5c092b4..31fe8b72 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -286,6 +286,17 @@ static int __netlink_gen_concat_key(uint32_t flags, const struct expr *i, i = expr; break; + case EXPR_RANGE_VALUE: + if (flags & EXPR_F_INTERVAL_END) + mpz_init_set(value, i->range.high); + else + mpz_init_set(value, i->range.low); + + if (expr_basetype(i)->type == TYPE_INTEGER && + i->byteorder == BYTEORDER_HOST_ENDIAN) + byteorder_switch_expr_value(value, i); + + break; case EXPR_PREFIX: if (flags & EXPR_F_INTERVAL_END) { int count; |
