All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
To: Andrew Lunn <andrew@lunn.ch>
Cc: netdev@vger.kernel.org, roopa@cumulusnetworks.com,
	davem@davemloft.net, bridge@lists.linux-foundation.org
Subject: Re: [PATCH net-next 1/2] net: bridge: add support for user-controlled bool options
Date: Fri, 23 Nov 2018 03:55:24 +0200	[thread overview]
Message-ID: <c5d16533-8a53-a418-08df-499fa82bb6f9@cumulusnetworks.com> (raw)
In-Reply-To: <47484385-f944-e8bf-c358-e3436dfd776d@cumulusnetworks.com>

On 22/11/2018 18:13, Nikolay Aleksandrov wrote:
<snip>
>>> +int br_boolopt_multi_toggle(struct net_bridge *br,
>>> +			    struct br_boolopt_multi *bm)
>>> +{
>>> +	unsigned long bitmap = bm->optmask;
>>> +	int err = 0;
>>> +	int opt_id;
>>> +
>>> +	for_each_set_bit(opt_id, &bitmap, BR_BOOLOPT_MAX) {
>>> +		bool on = !!(bm->optval & BIT(opt_id));
>>> +
>>> +		err = br_boolopt_toggle(br, opt_id, on);
>>> +		if (err) {
>>> +			br_debug(br, "boolopt multi-toggle error: option: %d current: %d new: %d error: %d\n",
>>> +				 opt_id, br_boolopt_get(br, opt_id), on, err);
>>> +			break;
>>> +		}
>>
>> An old kernel with a new iproute2 might partially succeed in toggling
>> some low bits, but then silently ignore a high bit that is not
>> supported by the kernel. As a user, i want to know the kernel does not
>> support an option i'm trying to toggle.
>>
> 
> That is already how netlink option setting works, if the option isn't supported
> it is silently ignored. I tried to stay as close to the current behaviour as possible.
> It also applies to partial option changes, some options will be changed until an error
> is encountered.
> 
>> Can you walk all the bits in the u32 from the MSB to the LSB? That
>> should avoid this problem.
>>
> 
> I did wonder about this and left it as netlink option behaviour but
> I can leave the walk as is and just check if the highest order set bit >= BR_BOOLOPT_MAX
> and err out with ENOTSUPP for example. Will reconsider for v2.
> 

Actually this doesn't improve user experience, after testing a little the problem is
that we can't return to the user the exact option that failed in any understandable manner.
The options are:
 - exact error message: (no bit/option value) so pretty much just say "Failed bool option"
 - pr_err: this has 2 issues, first it can't be retrieved by the caller (will be in the logs)
           and more importantly the best we can do is print the option bit that we don't support
           which really doesn't help the user at all

So the example is having newer iproute2 on older kernel and trying to set non-existing option
mixed with existing ones - the user has no way of determining which one failed even if we print
the bit, so this is really frustrating. The current way of ignoring the missing options seems
a bit more user-friendly and also with the change that we return the supported bit options
in optmask (thanks for the suggestion), the user-space tool (iproute2) can determine if an
option is not supported and at least give an indication when dumping it.
All of this does align with how netlink currently handles options and people are used to it.

WARNING: multiple messages have this Message-ID (diff)
From: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
To: Andrew Lunn <andrew@lunn.ch>
Cc: netdev@vger.kernel.org, roopa@cumulusnetworks.com,
	bridge@lists.linux-foundation.org, davem@davemloft.net
Subject: Re: [Bridge] [PATCH net-next 1/2] net: bridge: add support for user-controlled bool options
Date: Fri, 23 Nov 2018 03:55:24 +0200	[thread overview]
Message-ID: <c5d16533-8a53-a418-08df-499fa82bb6f9@cumulusnetworks.com> (raw)
In-Reply-To: <47484385-f944-e8bf-c358-e3436dfd776d@cumulusnetworks.com>

On 22/11/2018 18:13, Nikolay Aleksandrov wrote:
<snip>
>>> +int br_boolopt_multi_toggle(struct net_bridge *br,
>>> +			    struct br_boolopt_multi *bm)
>>> +{
>>> +	unsigned long bitmap = bm->optmask;
>>> +	int err = 0;
>>> +	int opt_id;
>>> +
>>> +	for_each_set_bit(opt_id, &bitmap, BR_BOOLOPT_MAX) {
>>> +		bool on = !!(bm->optval & BIT(opt_id));
>>> +
>>> +		err = br_boolopt_toggle(br, opt_id, on);
>>> +		if (err) {
>>> +			br_debug(br, "boolopt multi-toggle error: option: %d current: %d new: %d error: %d\n",
>>> +				 opt_id, br_boolopt_get(br, opt_id), on, err);
>>> +			break;
>>> +		}
>>
>> An old kernel with a new iproute2 might partially succeed in toggling
>> some low bits, but then silently ignore a high bit that is not
>> supported by the kernel. As a user, i want to know the kernel does not
>> support an option i'm trying to toggle.
>>
> 
> That is already how netlink option setting works, if the option isn't supported
> it is silently ignored. I tried to stay as close to the current behaviour as possible.
> It also applies to partial option changes, some options will be changed until an error
> is encountered.
> 
>> Can you walk all the bits in the u32 from the MSB to the LSB? That
>> should avoid this problem.
>>
> 
> I did wonder about this and left it as netlink option behaviour but
> I can leave the walk as is and just check if the highest order set bit >= BR_BOOLOPT_MAX
> and err out with ENOTSUPP for example. Will reconsider for v2.
> 

Actually this doesn't improve user experience, after testing a little the problem is
that we can't return to the user the exact option that failed in any understandable manner.
The options are:
 - exact error message: (no bit/option value) so pretty much just say "Failed bool option"
 - pr_err: this has 2 issues, first it can't be retrieved by the caller (will be in the logs)
           and more importantly the best we can do is print the option bit that we don't support
           which really doesn't help the user at all

So the example is having newer iproute2 on older kernel and trying to set non-existing option
mixed with existing ones - the user has no way of determining which one failed even if we print
the bit, so this is really frustrating. The current way of ignoring the missing options seems
a bit more user-friendly and also with the change that we return the supported bit options
in optmask (thanks for the suggestion), the user-space tool (iproute2) can determine if an
option is not supported and at least give an indication when dumping it.
All of this does align with how netlink currently handles options and people are used to it.




  reply	other threads:[~2018-11-23 12:37 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-22  4:29 [PATCH net-next 0/2] net: bridge: add an option to disabe linklocal learning Nikolay Aleksandrov
2018-11-22  4:29 ` [Bridge] " Nikolay Aleksandrov
2018-11-22  4:29 ` [PATCH net-next 1/2] net: bridge: add support for user-controlled bool options Nikolay Aleksandrov
2018-11-22  4:29   ` [Bridge] " Nikolay Aleksandrov
2018-11-22 15:35   ` Andrew Lunn
2018-11-22 15:35     ` [Bridge] " Andrew Lunn
2018-11-22 16:01     ` Nikolay Aleksandrov
2018-11-22 16:01       ` [Bridge] " Nikolay Aleksandrov
2018-11-22 19:37       ` Stephen Hemminger
2018-11-22 19:37         ` [Bridge] " Stephen Hemminger
2018-11-22 15:49   ` Andrew Lunn
2018-11-22 15:49     ` [Bridge] " Andrew Lunn
2018-11-22 16:13     ` Nikolay Aleksandrov
2018-11-22 16:13       ` [Bridge] " Nikolay Aleksandrov
2018-11-23  1:55       ` Nikolay Aleksandrov [this message]
2018-11-23  1:55         ` Nikolay Aleksandrov
2018-11-22 15:52   ` Andrew Lunn
2018-11-22 15:52     ` [Bridge] " Andrew Lunn
2018-11-22 16:07     ` Nikolay Aleksandrov
2018-11-22 16:07       ` [Bridge] " Nikolay Aleksandrov
2018-11-22  4:29 ` [PATCH net-next 2/2] net: bridge: add no_linklocal_learn bool option Nikolay Aleksandrov
2018-11-22  4:29   ` [Bridge] " Nikolay Aleksandrov
2018-11-22 16:04   ` Andrew Lunn
2018-11-22 16:04     ` [Bridge] " Andrew Lunn
2018-11-22 16:06     ` Nikolay Aleksandrov
2018-11-22 16:06       ` [Bridge] " Nikolay Aleksandrov

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=c5d16533-8a53-a418-08df-499fa82bb6f9@cumulusnetworks.com \
    --to=nikolay@cumulusnetworks.com \
    --cc=andrew@lunn.ch \
    --cc=bridge@lists.linux-foundation.org \
    --cc=davem@davemloft.net \
    --cc=netdev@vger.kernel.org \
    --cc=roopa@cumulusnetworks.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.