Re: [nftables PATCH] queue: More compact syntax for nft queue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jun 10, 2014 at 01:28:23PM +0200, Alvaro Neira Ayuso wrote:
> This patch allows to use a new syntax more compact and break
> the last syntax. This new syntax is more similar than the nftables
> syntax that we use usually. We can use range like we have used in
> other case in nftables. Here, we have some examples:
> 
> Before, If we want to declare a queue, we have used a syntax like this:
> 
> nft add rule test input queue num 1 total 3 options bypass,fanout
> 
> If we want to use the queue number 1 and the two next (total 3),
> we use a range in the new syntax, for example:
> 
> nft add rule test input queue num 1-3 bypass fanout
> 
> Also if we want to use only one queue, the new rules are like:
> 
> nft add rule test input queue num 1	//queue 1
> or
> nft add rule test input queue	//queue 0
> 
> And if we want to add a specific flags we only need to put
> what flags we want to use:
> 
> nft add rule test input queue bypass
> 
> we don't need to use options and the comma for stablishing the
> flags.
> 
> Signed-off-by: Alvaro Neira Ayuso <alvaroneay@xxxxxxxxx>
> ---
>  include/statement.h       |    4 ++--
>  src/netlink_delinearize.c |    9 ++++++---
>  src/netlink_linearize.c   |   13 ++++++++++---
>  src/parser.y              |   40 ++++++++++++++++++++++++----------------
>  src/scanner.l             |    2 --
>  src/statement.c           |   23 ++++++++---------------
>  6 files changed, 50 insertions(+), 41 deletions(-)
> 
> diff --git a/include/statement.h b/include/statement.h
> index 896b972..480b719 100644
> --- a/include/statement.h
> +++ b/include/statement.h
> @@ -60,8 +60,8 @@ struct nat_stmt {
>  extern struct stmt *nat_stmt_alloc(const struct location *loc);
>  
>  struct queue_stmt {
> -	uint16_t		queuenum;
> -	uint16_t		queues_total;
> +	uint16_t		from;
> +	uint16_t		to;
>  	uint16_t		flags;
>  };
>  
> diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c
> index ea33308..aa47d5f 100644
> --- a/src/netlink_delinearize.c
> +++ b/src/netlink_delinearize.c
> @@ -541,11 +541,14 @@ static void netlink_parse_queue(struct netlink_parse_ctx *ctx,
>  			      const struct nft_rule_expr *nle)
>  {
>  	struct stmt *stmt;
> +	uint16_t range_to;
>  
>  	stmt = queue_stmt_alloc(loc);
> -	stmt->queue.queuenum = nft_rule_expr_get_u16(nle, NFT_EXPR_QUEUE_NUM);
> -	stmt->queue.queues_total =
> -		nft_rule_expr_get_u16(nle, NFT_EXPR_QUEUE_TOTAL);
> +	stmt->queue.from = nft_rule_expr_get_u16(nle, NFT_EXPR_QUEUE_NUM);
> +	range_to = nft_rule_expr_get_u16(nle, NFT_EXPR_QUEUE_TOTAL);
> +	range_to += stmt->queue.from - 1;
> +
> +	stmt->queue.to = range_to;
>  	stmt->queue.flags = nft_rule_expr_get_u16(nle, NFT_EXPR_QUEUE_FLAGS);
>  	list_add_tail(&stmt->list, &ctx->rule->stmts);
>  }
> diff --git a/src/netlink_linearize.c b/src/netlink_linearize.c
> index 19153fd..9b6eed6 100644
> --- a/src/netlink_linearize.c
> +++ b/src/netlink_linearize.c
> @@ -683,15 +683,22 @@ static void netlink_gen_queue_stmt(struct netlink_linearize_ctx *ctx,
>  				 const struct stmt *stmt)
>  {
>  	struct nft_rule_expr *nle;
> +	uint16_t total_queues;
>  
>  	nle = alloc_nft_expr("queue");
>  
>  	nft_rule_expr_set_u16(nle, NFT_EXPR_QUEUE_NUM,
> -			      stmt->queue.queuenum);
> -	if (stmt->queue.queues_total) {
> +			      stmt->queue.from);
> +
> +	if (stmt->queue.to >= stmt->queue.from) {
> +		total_queues = stmt->queue.to - stmt->queue.from;
>  		nft_rule_expr_set_u16(nle, NFT_EXPR_QUEUE_TOTAL,
> -				      stmt->queue.queues_total);
> +				      total_queues + 1);
> +	} else {
> +		BUG("invalid queue interval %u-%u\n", stmt->queue.from,
> +		    stmt->queue.to);

You can control this error case in the parser.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux