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>
This commit is contained in:
committed by
Jakub Kicinski
parent
9494dc0b08
commit
e8058a49e6
@@ -1202,17 +1202,13 @@ static void __devlink_compat_running_version(struct devlink *devlink,
|
||||
if (err)
|
||||
goto free_msg;
|
||||
|
||||
nla_for_each_attr(nlattr, (void *)msg->data, msg->len, rem) {
|
||||
nla_for_each_attr_type(nlattr, DEVLINK_ATTR_INFO_VERSION_RUNNING,
|
||||
(void *)msg->data, msg->len, rem) {
|
||||
const struct nlattr *kv;
|
||||
int rem_kv;
|
||||
|
||||
if (nla_type(nlattr) != DEVLINK_ATTR_INFO_VERSION_RUNNING)
|
||||
continue;
|
||||
|
||||
nla_for_each_nested(kv, nlattr, rem_kv) {
|
||||
if (nla_type(kv) != DEVLINK_ATTR_INFO_VERSION_VALUE)
|
||||
continue;
|
||||
|
||||
nla_for_each_nested_type(kv, DEVLINK_ATTR_INFO_VERSION_VALUE,
|
||||
nlattr, rem_kv) {
|
||||
strlcat(buf, nla_data(kv), len);
|
||||
strlcat(buf, " ", len);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user