diff options
| author | Johannes Berg <johannes.berg@intel.com> | 2024-03-28 22:31:45 +0300 | 
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2024-03-30 01:06:02 +0300 | 
| commit | e8058a49e67fe7bc7e4a0308851a3ca3a6d2e45d (patch) | |
| tree | efa29fe86af2008c5bb1bec33abc94e6d28b59b6 /drivers/net/ethernet/intel/i40e/i40e_main.c | |
| parent | 9494dc0b0860e5ca28a5cd5586cca3e171609fee (diff) | |
| download | linux-e8058a49e67fe7bc7e4a0308851a3ca3a6d2e45d.tar.xz | |
netlink: introduce type-checking attribute iteration
There are, especially with multi-attr arrays, many cases
of needing to iterate all attributes of a specific type
in a netlink message or a nested attribute. Add specific
macros to support that case.
Also convert many instances using this spatch:
    @@
    iterator nla_for_each_attr;
    iterator name nla_for_each_attr_type;
    identifier nla;
    expression head, len, rem;
    expression ATTR;
    type T;
    identifier x;
    @@
    -nla_for_each_attr(nla, head, len, rem)
    +nla_for_each_attr_type(nla, ATTR, head, len, rem)
     {
    <... T x; ...>
    -if (nla_type(nla) == ATTR) {
     ...
    -}
     }
    @@
    identifier nla;
    iterator nla_for_each_nested;
    iterator name nla_for_each_nested_type;
    expression attr, rem;
    expression ATTR;
    type T;
    identifier x;
    @@
    -nla_for_each_nested(nla, attr, rem)
    +nla_for_each_nested_type(nla, ATTR, attr, rem)
     {
    <... T x; ...>
    -if (nla_type(nla) == ATTR) {
     ...
    -}
     }
    @@
    iterator nla_for_each_attr;
    iterator name nla_for_each_attr_type;
    identifier nla;
    expression head, len, rem;
    expression ATTR;
    type T;
    identifier x;
    @@
    -nla_for_each_attr(nla, head, len, rem)
    +nla_for_each_attr_type(nla, ATTR, head, len, rem)
     {
    <... T x; ...>
    -if (nla_type(nla) != ATTR) continue;
     ...
     }
    @@
    identifier nla;
    iterator nla_for_each_nested;
    iterator name nla_for_each_nested_type;
    expression attr, rem;
    expression ATTR;
    type T;
    identifier x;
    @@
    -nla_for_each_nested(nla, attr, rem)
    +nla_for_each_nested_type(nla, ATTR, attr, rem)
     {
    <... T x; ...>
    -if (nla_type(nla) != ATTR) continue;
     ...
     }
Although I had to undo one bad change this made, and
I also adjusted some other code for whitespace and to
use direct variable initialization now.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Link: https://lore.kernel.org/r/20240328203144.b5a6c895fb80.I1869b44767379f204998ff44dd239803f39c23e0@changeid
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'drivers/net/ethernet/intel/i40e/i40e_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 8 | 
1 files changed, 2 insertions, 6 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index f86578857e8a..e427e65af205 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -13108,13 +13108,9 @@ static int i40e_ndo_bridge_setlink(struct net_device *dev,  	if (!br_spec)  		return -EINVAL; -	nla_for_each_nested(attr, br_spec, rem) { -		__u16 mode; +	nla_for_each_nested_type(attr, IFLA_BRIDGE_MODE, br_spec, rem) { +		__u16 mode = nla_get_u16(attr); -		if (nla_type(attr) != IFLA_BRIDGE_MODE) -			continue; - -		mode = nla_get_u16(attr);  		if ((mode != BRIDGE_MODE_VEPA) &&  		    (mode != BRIDGE_MODE_VEB))  			return -EINVAL;  | 
