]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tools: ynl-gen: support local attrs in _multi_parse
authorJakub Kicinski <kuba@kernel.org>
Tue, 20 May 2025 16:19:12 +0000 (09:19 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 21 May 2025 19:38:22 +0000 (12:38 -0700)
The _multi_parse() helper calls the _attr_get() method of each attr,
but it only respects what code the helper wants to emit, not what
local variables it needs. Local variables will soon be needed,
support them.

Reviewed-by: Donald Hunter <donald.hunter@gmail.com>
Link: https://patch.msgid.link/20250520161916.413298-9-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/net/ynl/pyynl/ynl_gen_c.py

index bd1fadb2cf5a926adc40f0fdf9e8c5d00e18cc65..f2a4404d0d211ccd638278ea2f0d4670ef80bfc1 100755 (executable)
@@ -2214,12 +2214,16 @@ def parse_rsp_submsg(ri, struct):
     parse_rsp_nested_prototype(ri, struct, suffix='')
 
     var = 'dst'
+    local_vars = {'const struct nlattr *attr = nested;',
+                  f'{struct.ptr_name}{var} = yarg->data;',
+                  'struct ynl_parse_arg parg;'}
 
-    ri.cw.block_start()
-    ri.cw.write_func_lvar(['const struct nlattr *attr = nested;',
-                          f'{struct.ptr_name}{var} = yarg->data;',
-                          'struct ynl_parse_arg parg;'])
+    for _, arg in struct.member_list():
+        _, _, l_vars = arg._attr_get(ri, var)
+        local_vars |= set(l_vars) if l_vars else set()
 
+    ri.cw.block_start()
+    ri.cw.write_func_lvar(list(local_vars))
     ri.cw.p('parg.ys = yarg->ys;')
     ri.cw.nl()