summaryrefslogtreecommitdiffstats
path: root/src/evaluate.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/evaluate.c')
-rw-r--r--src/evaluate.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/evaluate.c b/src/evaluate.c
index 384e2fa7..2ed68aad 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -1455,8 +1455,25 @@ static int expr_evaluate_set(struct eval_ctx *ctx, struct expr **expr)
}
}
- if (ctx->set && (ctx->set->flags & NFT_SET_CONCAT))
- set->set_flags |= NFT_SET_CONCAT;
+ if (ctx->set) {
+ if (ctx->set->flags & NFT_SET_CONCAT)
+ set->set_flags |= NFT_SET_CONCAT;
+ } else if (set->size == 1) {
+ i = list_first_entry(&set->expressions, struct expr, list);
+ if (i->etype == EXPR_SET_ELEM) {
+ switch (i->key->etype) {
+ case EXPR_PREFIX:
+ case EXPR_RANGE:
+ case EXPR_VALUE:
+ *expr = i->key;
+ i->key = NULL;
+ expr_free(set);
+ return 0;
+ default:
+ break;
+ }
+ }
+ }
set->set_flags |= NFT_SET_CONSTANT;