Netdev List
 help / color / mirror / Atom feed
From: Matthieu Baerts <matttbe@kernel.org>
To: Stephen Hemminger <stephen@networkplumber.org>
Cc: David Ahern <dsahern@kernel.org>,
	netdev@vger.kernel.org, mptcp@lists.linux.dev
Subject: Re: [PATCH iproute2-net] mptcp: limits: fix JSON support
Date: Thu, 29 Oct 2026 18:24:25 +0100	[thread overview]
Message-ID: <48a15033-3e8f-4043-aa2b-eb7440bf3742@kernel.org> (raw)
In-Reply-To: <20261029100741.3cd38216@phoenix.local>

Hi Stephen,

Thank you for the review!

On 29/10/2026 18:07, Stephen Hemminger wrote:
> On Thu, 29 Oct 2026 14:17:42 +0100
> "Matthieu Baerts (NGI0)" <matttbe@kernel.org> wrote:
> 
>> print_mptcp_limit() was trying to open a JSON sub-object and closing it,
>> but no JSON object was actually created before.
>>
>> Because of that, JSON support was working with the MPTCP limits:
>>
>>   $ ip -j mptcp limits show
>>   add_addr_accepted 0 subflows 2
>>
>> Create a plain object before calling print_mptcp_limit: an array is not
>> needed here because all limits have a different name.
>>
>> After this modification, we now have:
>>
>>   $ ip -j mptcp limits show | jq
>>   {
>>     "add_addr_accepted": 0,
>>     "subflows": 2
>>   }
>>
>> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
>> ---
> 
> Should be the regular json_obj variants, not the _plain ones
> here.

Mmh, can I disagree with AI? :)

> The AI response was:
> 
> On Thu, 29 Oct 2026 14:17:42 +0100, Matthieu Baerts (NGI0) wrote:
>> print_mptcp_limit() was trying to open a JSON sub-object and closing it,
>> but no JSON object was actually created before.
> 
> Right, and that part of the diagnosis is correct -- the open_json_object()
> and close_json_object() calls in print_mptcp_limit() were silent no-ops
> because no writer existed. Thanks for catching it.
> 
>> Create a plain object before calling print_mptcp_limit: an array is not
>> needed here because all limits have a different name.
> 
> This is where I'd push back. An array isn't needed in the sense that there
> is only ever one object, but it is what every other "ip" subcommand emits,
> including the other three JSON sites in this same file:
> 
> 	ip/ipmptcp.c:317	new_json_obj(json)	mptcp_addr_dump()
> 	ip/ipmptcp.c:345	new_json_obj(json)	mptcp_addr_show()
> 	ip/ipmptcp.c:611	new_json_obj(json)	mptcp_monitor()
> 
> So after this patch "ip mptcp" is inconsistent with itself:
> 
> 	$ ip -j mptcp endpoint show
> 	[]
> 	$ ip -j mptcp limits show
> 	{"add_addr_accepted":0,"subflows":2}

Mmh, yes that's "inconsistent", but that's a different output, for a
different purpose:

 - for the first one, we have a list of endpoints: a dictionary with
   the same keys. We need an extra object (an array, but that could have
   been a dict with the ID as key) here to get the different endpoints.

 - for the limits, we have a bunch of key-values. Adding an extra array
   doesn't make sense.

> The _plain variant exists for the standalone utilities that have their own
> output conventions -- dcb, devlink, dpll, nstat, ifstat, lnstat, vdpa. It
> is not used anywhere else under ip/, and I'd rather it stayed that way.
> 
>> +		new_json_obj_plain(json);
>>  		ret = print_mptcp_limit(answer, stdout);
>> +		delete_json_obj_plain();

Each output has its own convention, no?

> Please use the regular pair instead:
> 
> 		new_json_obj(json);
> 		ret = print_mptcp_limit(answer, stdout);
> 		delete_json_obj();
> 
> which gives
> 
> 	$ ip -j mptcp limits show
> 	[{"add_addr_accepted":0,"subflows":2}]
> 	$ ip -j -p mptcp limits show
> 	[
> 	    {
> 	        "add_addr_accepted": 0,
> 	        "subflows": 2
> 	    }
> 	]

Here, we can see the array doesn't make sense. Are there other similar
output in 'ip' adding an extra array just to present one dict?

> No other change is needed: print_mptcp_limit() already calls
> open_json_object(NULL), which is required either way -- under an array it
> creates the element object, under _plain it created the root object. Plain
> text output is unchanged in both versions.
> 
> Worth doing now rather than later: JSON output for the limits never worked,
> so nothing can be depending on the current shape yet. I checked the mptcp
> selftests as the likely consumer and they parse text only --
> pm_netlink.sh:71 does
> 
> 	ip -n "${ns1}" mptcp limits | awk '{ print $2" "$4 }'
> 
> with no -j or --json use anywhere under selftests/net/mptcp/ (the only jq
> there parses nft output in mptcp_sockopt.sh). So the shape is still free to
> change; once it ships in a release it isn't.
> 
> One nit in the commit message while you're respinning:
> 
>> Because of that, JSON support was working with the MPTCP limits:
> 
> Missing a negation -- "was not working". The example output just below makes
> the intent clear, so this alone wouldn't be worth a v2.

Indeed, I can add the missing "not" if a v2 is needed.

Cheers,
Matt
-- 
Sponsored by the NGI0 Core fund.


      reply	other threads:[~2026-10-29 17:24 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-29 13:17 [PATCH iproute2-net] mptcp: limits: fix JSON support Matthieu Baerts (NGI0)
2026-10-29 17:07 ` Stephen Hemminger
2026-10-29 17:24   ` Matthieu Baerts [this message]

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=48a15033-3e8f-4043-aa2b-eb7440bf3742@kernel.org \
    --to=matttbe@kernel.org \
    --cc=dsahern@kernel.org \
    --cc=mptcp@lists.linux.dev \
    --cc=netdev@vger.kernel.org \
    --cc=stephen@networkplumber.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