]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
set: make set initializer parsable
authorPatrick McHardy <kaber@trash.net>
Thu, 16 Jan 2014 20:01:56 +0000 (20:01 +0000)
committerPatrick McHardy <kaber@trash.net>
Thu, 16 Jan 2014 20:01:56 +0000 (20:01 +0000)
If a set contains elements, the output is not parsable since the
elements = { ... } is not understood by the parser. Fix this and
also add support for creating constant sets (which only makes sense
when using an initializer).

Signed-off-by: Patrick McHardy <kaber@trash.net>
src/evaluate.c
src/parser.y
src/rule.c
src/scanner.l

index 94fee64b2b149d3b584e25507a8b1ddcb64b3f04..21ca5581ca7156b0aefb7ca1f1b97e1b2761d6ae 100644 (file)
@@ -1210,6 +1210,12 @@ static int set_evaluate(struct eval_ctx *ctx, struct set *set)
                return set_error(ctx, set, "unqualified key data type "
                                 "specified in %s definition", type);
 
+       if (set->init != NULL) {
+               expr_set_context(&ctx->ectx, set->keytype, set->keylen);
+               if (expr_evaluate(ctx, &set->init) < 0)
+                       return -1;
+       }
+
        if (!(set->flags & SET_F_MAP))
                return 0;
 
index 1b09e616aef5935e5996cd6d32ee6c51f6f70149..345d8d067ae58fd40bf1af94c8d49d02ac903c75 100644 (file)
@@ -182,7 +182,9 @@ static void location_update(struct location *loc, struct location *rhs, int n)
 %token RETURN                  "return"
 %token QUEUE                   "queue"
 
+%token CONSTANT                        "constant"
 %token INTERVAL                        "interval"
+%token ELEMENTS                        "elements"
 
 %token <val> NUM               "number"
 %token <string> STRING         "string"
@@ -746,6 +748,11 @@ set_block          :       /* empty */     { $$ = $<set>-1; }
                                $1->flags = $3;
                                $$ = $1;
                        }
+                       |       set_block       ELEMENTS        '='             set_expr
+                       {
+                               $1->init = $4;
+                               $$ = $1;
+                       }
                        ;
 
 set_flag_list          :       set_flag_list   COMMA           set_flag
@@ -755,7 +762,8 @@ set_flag_list               :       set_flag_list   COMMA           set_flag
                        |       set_flag
                        ;
 
-set_flag               :       INTERVAL        { $$ = SET_F_INTERVAL; }
+set_flag               :       CONSTANT        { $$ = SET_F_CONSTANT; }
+                       |       INTERVAL        { $$ = SET_F_INTERVAL; }
                        ;
 
 map_block_alloc                :       /* empty */
@@ -793,6 +801,11 @@ map_block          :       /* empty */     { $$ = $<set>-1; }
                                $1->flags = $3;
                                $$ = $1;
                        }
+                       |       map_block       ELEMENTS        '='             set_expr
+                       {
+                               $1->init = $4;
+                               $$ = $1;
+                       }
                        ;
 
 hook_spec              :       TYPE            STRING          HOOK            STRING          PRIORITY        NUM
index 0f7f4b51af1f423b5b370a85c6d896b5f17230f5..9f6c04bbf714e90c0f5547c8b2effd9eabd3e0c8 100644 (file)
@@ -100,8 +100,12 @@ void set_print(const struct set *set)
                printf(" : %s", set->datatype->name);
        printf("\n");
 
-       if (set->flags & (SET_F_INTERVAL)) {
+       if (set->flags & (SET_F_CONSTANT | SET_F_INTERVAL)) {
                printf("\t\tflags ");
+               if (set->flags & SET_F_CONSTANT) {
+                       printf("%sconstant", delim);
+                       delim = ",";
+               }
                if (set->flags & SET_F_INTERVAL) {
                        printf("%sinterval", delim);
                        delim = ",";
index 904d6fbc0dcc38ce61424cc703eabc987cd12d5e..c47e6101fe907c358ba89036092e9a28b1e63e26 100644 (file)
@@ -256,7 +256,9 @@ addrstring  ({macaddr}|{ip4addr}|{ip6addr})
 
 "position"             { return POSITION; }
 
+"constant"             { return CONSTANT; }
 "interval"             { return INTERVAL; }
+"elements"             { return ELEMENTS; }
 
 "counter"              { return COUNTER; }
 "packets"              { return PACKETS; }