Linux Netfilter development
 help / color / mirror / Atom feed
From: Phil Sutter <phil@nwl.cc>
To: Alexandre Knecht <knecht.alexandre@gmail.com>
Cc: Florian Westphal <fw@strlen.de>, netfilter-devel@vger.kernel.org
Subject: Re: [PATCH nf-next v4] parser_json: support handle for rule positioning without breaking other objects
Date: Wed, 14 Jan 2026 16:27:38 +0100	[thread overview]
Message-ID: <aWe16oO_R-GwM_Af@orbyte.nwl.cc> (raw)
In-Reply-To: <aRcwa_ZsBrvKFEci@strlen.de>

Alexandre, will you follow-up on this one? Feel free to ping me if
something is unclear or you're stuck somewhere - we're there to help if
needed!

Thanks, Phil

On Fri, Nov 14, 2025 at 02:36:43PM +0100, Florian Westphal wrote:
> Phil Sutter <phil@nwl.cc> wrote:
> > > +/* Mask for flags that affect expression parsing context */
> > > +#define CTX_F_EXPR_MASK	(CTX_F_RHS | CTX_F_STMT | CTX_F_PRIMARY | CTX_F_DTYPE | \
> > > +			 CTX_F_SET_RHS | CTX_F_MANGLE | CTX_F_SES | CTX_F_MAP | \
> > > +			 CTX_F_CONCAT)
> > 
> > Maybe define as 'UINT32_MAX & ~(CTX_F_COLLAPSED | CTX_F_IMPLICIT)'
> > instead?
> 
> > >  struct json_ctx {
> > >  	struct nft_ctx *nft;
> > > @@ -1725,10 +1731,14 @@ static struct expr *json_parse_expr(struct json_ctx *ctx, json_t *root)
> > >  		return NULL;
> > >  
> > >  	for (i = 0; i < array_size(cb_tbl); i++) {
> > > +		uint32_t expr_flags;
> > > +
> > >  		if (strcmp(type, cb_tbl[i].name))
> > >  			continue;
> > >  
> > > -		if ((cb_tbl[i].flags & ctx->flags) != ctx->flags) {
> > > +		/* Only check expression context flags, not command-level flags */
> > > +		expr_flags = ctx->flags & CTX_F_EXPR_MASK;
> > > +		if ((cb_tbl[i].flags & expr_flags) != expr_flags) {
> 
> So when adding CTX_F_BLA as new expr flag, one has to rember to add it
> to CTX_F_EXPR_MASK.  Given that I concur with Phil.
> 
> > >  	rule = rule_alloc(int_loc, NULL);
> > >  
> > >  	json_unpack(root, "{s:s}", "comment", &comment);
> > > @@ -4352,8 +4374,21 @@ static struct cmd *json_parse_cmd(struct json_ctx *ctx, json_t *root)
> > >  
> > >  		return parse_cb_table[i].cb(ctx, tmp, parse_cb_table[i].op);
> > >  	}
> > > -	/* to accept 'list ruleset' output 1:1, try add command */
> > > -	return json_parse_cmd_add(ctx, root, CMD_ADD);
> > > +	/* to accept 'list ruleset' output 1:1, try add command
> > > +	 * Mark as implicit to distinguish from explicit add commands.
> > > +	 * This allows explicit {"add": {"rule": ...}} to use handle for positioning
> > > +	 * while implicit {"rule": ...} (export format) ignores handles.
> > > +	 */
> > > +	{
> > > +		uint32_t old_flags = ctx->flags;
> > > +		struct cmd *cmd;
> > > +
> > > +		ctx->flags |= CTX_F_IMPLICIT;
> > > +		cmd = json_parse_cmd_add(ctx, root, CMD_ADD);
> > > +		ctx->flags = old_flags;
> > > +
> > > +		return cmd;
> > > +	}
> > 
> > This use of nested blocks is uncommon in this project. I suggest to
> > either introduce a wrapper function or declare the two variables at the
> > start of the function's body.
> 
> Right, as json_parse_cmd() is small I would go for the latter.
> 
> > > +# Verify all objects were created
> > > +$NFT list ruleset > /dev/null || { echo "Failed to list ruleset after add operations"; exit 1; }
> > 
> > This command does not do what the comment says. To verify object
> > creation, either use a series of 'nft list table/chain/set/...' commands
> > or compare against a stored ruleset dump. See
> > tests/shell/testcases/cache/0010_implicit_chain_0 for a simple example.
> 
> Yes, please use stored dump and let the test wrapper validate this if
> possible.  I understand this can't work when the script has to validate
> intermediate states too, but the last expected state canand should be
> handled via dump.  More dumps also enhance fuzzer coverage since the
> dumps are used for the initial input pool.
> 
> Also run "tools/check-tree.sh" and make sure it doesn't result in new
> errors with the new test case.
> 
> If you like you can also split the actual patch and the test cases in
> multiple patches, but thats up to you.
> 
> 

  reply	other threads:[~2026-01-14 15:27 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-13 20:30 [PATCH nf-next v4] parser_json: support handle for rule positioning without breaking other objects Alexandre Knecht
2025-11-14 12:59 ` Phil Sutter
2025-11-14 13:36   ` Florian Westphal
2026-01-14 15:27     ` Phil Sutter [this message]
2026-01-15 20:23       ` Alexandre Knecht
2026-01-16 12:39         ` Phil Sutter
2026-01-19 14:18           ` Alexandre Knecht

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aWe16oO_R-GwM_Af@orbyte.nwl.cc \
    --to=phil@nwl.cc \
    --cc=fw@strlen.de \
    --cc=knecht.alexandre@gmail.com \
    --cc=netfilter-devel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox