* [PATCH 0/2] set: set parsing fixes
@ 2014-01-16 20:16 Patrick McHardy
2014-01-16 20:16 ` [PATCH 1/2] set: make set flags output parsable Patrick McHardy
2014-01-16 20:16 ` [PATCH 2/2] set: make set initializer parsable Patrick McHardy
0 siblings, 2 replies; 3+ messages in thread
From: Patrick McHardy @ 2014-01-16 20:16 UTC (permalink / raw)
To: pablo; +Cc: netfilter-devel
The following two patches fix a couple of problems with printed set
outputs from "nft list table ..." and parsing the output again with
"nft -f".
- internal flags are printed
- flags are not parsable
- initializers (elements = { }) is not parsable
With these patches, parsing the output of "nft list table ..." works
in at least more cases than before when sets are present. We still
have ordering problems, verdict maps referencing chains will fail
since chains are created after the maps. The same problem exists
generally for jump rules.
Changes to last version: set data type and evaluate initializers.
These patches have been tested to work as described. I'll push them
to master now.
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] set: make set flags output parsable
2014-01-16 20:16 [PATCH 0/2] set: set parsing fixes Patrick McHardy
@ 2014-01-16 20:16 ` Patrick McHardy
2014-01-16 20:16 ` [PATCH 2/2] set: make set initializer parsable Patrick McHardy
1 sibling, 0 replies; 3+ messages in thread
From: Patrick McHardy @ 2014-01-16 20:16 UTC (permalink / raw)
To: pablo; +Cc: netfilter-devel
This patch fixes two problems:
- the output of "nft list table ..." is not parsable if sets are included
because the parser can't parse the flags.
- set flags can't be specified during set creation.
To fix this, the set output is changed to:
- not print each flag on a single line
- prefix the flags with "flags "
- only show the interval flag since all others are for internal use only
The parser is changed to parse the flags specified in a set declaration.
This allows to parse empty sets. The following patch will take care of
parsing sets that are already populated.
Signed-off-by: Patrick McHardy <kaber@trash.net>
---
src/parser.y | 24 ++++++++++++++++++++++++
src/rule.c | 15 +++++++++------
src/scanner.l | 2 ++
3 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/src/parser.y b/src/parser.y
index 5cd8ef6..1b09e61 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -182,6 +182,8 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%token RETURN "return"
%token QUEUE "queue"
+%token INTERVAL "interval"
+
%token <val> NUM "number"
%token <string> STRING "string"
%token <string> QUOTED_STRING
@@ -353,6 +355,8 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%type <rule> rule
%destructor { rule_free($$); } rule
+%type <val> set_flag_list set_flag
+
%type <set> set_block_alloc set_block
%destructor { set_free($$); } set_block_alloc
@@ -737,6 +741,21 @@ set_block : /* empty */ { $$ = $<set>-1; }
}
$$ = $1;
}
+ | set_block FLAGS set_flag_list stmt_seperator
+ {
+ $1->flags = $3;
+ $$ = $1;
+ }
+ ;
+
+set_flag_list : set_flag_list COMMA set_flag
+ {
+ $$ = $1 | $3;
+ }
+ | set_flag
+ ;
+
+set_flag : INTERVAL { $$ = SET_F_INTERVAL; }
;
map_block_alloc : /* empty */
@@ -769,6 +788,11 @@ map_block : /* empty */ { $$ = $<set>-1; }
$$ = $1;
}
+ | map_block FLAGS set_flag_list stmt_seperator
+ {
+ $1->flags = $3;
+ $$ = $1;
+ }
;
hook_spec : TYPE STRING HOOK STRING PRIORITY NUM
diff --git a/src/rule.c b/src/rule.c
index 04dd6c7..0f7f4b5 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -89,6 +89,7 @@ struct set *set_lookup(const struct table *table, const char *name)
void set_print(const struct set *set)
{
+ const char *delim = "";
const char *type;
type = set->flags & SET_F_MAP ? "map" : "set";
@@ -99,12 +100,14 @@ void set_print(const struct set *set)
printf(" : %s", set->datatype->name);
printf("\n");
- if (set->flags & SET_F_ANONYMOUS)
- printf("\t\tanonymous\n");
- if (set->flags & SET_F_CONSTANT)
- printf("\t\tconstant\n");
- if (set->flags & SET_F_INTERVAL)
- printf("\t\tinterval\n");
+ if (set->flags & (SET_F_INTERVAL)) {
+ printf("\t\tflags ");
+ if (set->flags & SET_F_INTERVAL) {
+ printf("%sinterval", delim);
+ delim = ",";
+ }
+ printf("\n");
+ }
if (set->init != NULL && set->init->size > 0) {
printf("\t\telements = ");
diff --git a/src/scanner.l b/src/scanner.l
index 25fbc61..904d6fb 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -256,6 +256,8 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr})
"position" { return POSITION; }
+"interval" { return INTERVAL; }
+
"counter" { return COUNTER; }
"packets" { return PACKETS; }
"bytes" { return BYTES; }
--
1.8.4.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] set: make set initializer parsable
2014-01-16 20:16 [PATCH 0/2] set: set parsing fixes Patrick McHardy
2014-01-16 20:16 ` [PATCH 1/2] set: make set flags output parsable Patrick McHardy
@ 2014-01-16 20:16 ` Patrick McHardy
1 sibling, 0 replies; 3+ messages in thread
From: Patrick McHardy @ 2014-01-16 20:16 UTC (permalink / raw)
To: pablo; +Cc: netfilter-devel
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 | 6 ++++++
src/parser.y | 15 ++++++++++++++-
src/rule.c | 6 +++++-
src/scanner.l | 2 ++
4 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/src/evaluate.c b/src/evaluate.c
index 94fee64..21ca558 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -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;
diff --git a/src/parser.y b/src/parser.y
index 1b09e61..345d8d0 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -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
diff --git a/src/rule.c b/src/rule.c
index 0f7f4b5..9f6c04b 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -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 = ",";
diff --git a/src/scanner.l b/src/scanner.l
index 904d6fb..c47e610 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -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; }
--
1.8.4.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-01-16 20:16 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-16 20:16 [PATCH 0/2] set: set parsing fixes Patrick McHardy
2014-01-16 20:16 ` [PATCH 1/2] set: make set flags output parsable Patrick McHardy
2014-01-16 20:16 ` [PATCH 2/2] set: make set initializer parsable Patrick McHardy
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).