This changes output to first list the queue flags (with prepended "flags" keyword), then the queue number. This is to avoid parser problems when a flag is used after the queue number, e.g. "queue num 42 bypass". While this works fine, this does not: "queue num tcp dport bypass" ... because scanner state has been switched, "bypass" is parsed as symbol expression. Input parser is changed to recognize the stricter flag usage. Signed-off-by: Florian Westphal <fw@xxxxxxxxx> --- doc/statements.txt | 4 ++-- src/parser_bison.y | 4 ++++ src/statement.c | 15 ++++++++++----- tests/py/any/queue.t | 7 +++---- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/doc/statements.txt b/doc/statements.txt index 7c7240c82fab..602a5b2011a7 100644 --- a/doc/statements.txt +++ b/doc/statements.txt @@ -589,8 +589,8 @@ for details. [verse] ____ -*queue* [*num* 'queue_number'] [*bypass*] -*queue* [*num* 'queue_number_from' - 'queue_number_to'] ['QUEUE_FLAGS'] +*queue* [*flags* 'QUEUE_FLAGS'] [*num* 'queue_number'] +*queue* [*flags* 'QUEUE_FLAGS'] [*num* 'queue_number_from' - 'queue_number_to'] 'QUEUE_FLAGS' := 'QUEUE_FLAG' [*,* 'QUEUE_FLAGS'] 'QUEUE_FLAG' := *bypass* | *fanout* diff --git a/src/parser_bison.y b/src/parser_bison.y index 9e45a5da1716..cf90d5ce5672 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -3739,6 +3739,10 @@ nf_nat_flag : RANDOM { $$ = NF_NAT_RANGE_PROTO_RANDOM; } ; queue_stmt : queue_stmt_compat close_scope_queue + | QUEUE FLAGS queue_stmt_flags QUEUENUM queue_stmt_expr_simple close_scope_queue + { + $$ = queue_stmt_alloc(&@$, $5, $3); + } ; queue_stmt_compat : queue_stmt_alloc diff --git a/src/statement.c b/src/statement.c index a713952c0af7..9eb49339555b 100644 --- a/src/statement.c +++ b/src/statement.c @@ -493,20 +493,25 @@ struct stmt *limit_stmt_alloc(const struct location *loc) static void queue_stmt_print(const struct stmt *stmt, struct output_ctx *octx) { - const char *delim = " "; + struct expr *e = stmt->queue.queue; + const char *delim = " flags "; nft_print(octx, "queue"); - if (stmt->queue.queue != NULL) { - nft_print(octx, " num "); - expr_print(stmt->queue.queue, octx); - } + if (stmt->queue.flags & NFT_QUEUE_FLAG_BYPASS) { nft_print(octx, "%sbypass", delim); delim = ","; } + if (stmt->queue.flags & NFT_QUEUE_FLAG_CPU_FANOUT) nft_print(octx, "%sfanout", delim); + if (e) { + nft_print(octx, " num "); + expr_print(stmt->queue.queue, octx); + } else { + nft_print(octx, " num 0"); + } } static void queue_stmt_destroy(struct stmt *stmt) diff --git a/tests/py/any/queue.t b/tests/py/any/queue.t index 75c071dde44b..af844aa7c835 100644 --- a/tests/py/any/queue.t +++ b/tests/py/any/queue.t @@ -12,7 +12,6 @@ queue num 65535;ok queue num 65536;fail queue num 2-3;ok queue num 1-65535;ok -- queue num {3, 4, 6};ok -queue num 4-5 fanout bypass;ok;queue num 4-5 bypass,fanout -queue num 4-5 fanout;ok -queue num 4-5 bypass;ok +queue num 4-5 fanout bypass;ok;queue flags bypass,fanout num 4-5 +queue num 4-5 fanout;ok;queue flags fanout num 4-5 +queue num 4-5 bypass;ok;queue flags bypass num 4-5 -- 2.31.1