On 22/11/2018 17:49, Andrew Lunn wrote:
>> +/* br_boolopt_toggle - change user-controlled boolean option
>> + *
>> + * @br: bridge device
>> + * @opt: id of the option to change
>> + * @on: new option value
>> + *
>> + * Changes the value of the respective boolean option to @on taking care of
>> + * any internal option value mapping and configuration.
>> + */
>> +int br_boolopt_toggle(struct net_bridge *br, enum br_boolopt_id opt, bool 
>> on)
>> +{
>> +    int err = -ENOENT;
>> +
>> +    switch (opt) {
>> +    default:
>> +            break;
>> +    }
>> +
>> +    return err;
>> +}
>> +
> 
> 
>> +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.

>       Andrew
> 

Reply via email to