mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 19:49:33 -04:00
tools/net/ynl: add indexed-array scalar support to ynl-gen-c
Extend ynl-gen-c.py with support for indexed-array that has a scalar sub-type. Signed-off-by: Donald Hunter <donald.hunter@gmail.com> Link: https://patch.msgid.link/20250211120127.84858-8-donald.hunter@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
16cd1a5299
commit
9fcfc1e210
@@ -688,7 +688,10 @@ class TypeArrayNest(Type):
|
||||
raise Exception(f"Sub-type {self.attr['sub-type']} not supported yet")
|
||||
|
||||
def _attr_typol(self):
|
||||
return f'.type = YNL_PT_NEST, .nest = &{self.nested_render_name}_nest, '
|
||||
if self.attr['sub-type'] in scalars:
|
||||
return f'.type = YNL_PT_U{c_upper(self.sub_type[1:])}, '
|
||||
else:
|
||||
return f'.type = YNL_PT_NEST, .nest = &{self.nested_render_name}_nest, '
|
||||
|
||||
def _attr_get(self, ri, var):
|
||||
local_vars = ['const struct nlattr *attr2;']
|
||||
@@ -890,7 +893,7 @@ class AttrSet(SpecAttrSet):
|
||||
elif elem['type'] == 'nest':
|
||||
t = TypeNest(self.family, self, elem, value)
|
||||
elif elem['type'] == 'indexed-array' and 'sub-type' in elem:
|
||||
if elem["sub-type"] == 'nest':
|
||||
if elem["sub-type"] in ['nest', 'u32']:
|
||||
t = TypeArrayNest(self.family, self, elem, value)
|
||||
else:
|
||||
raise Exception(f'new_attr: unsupported sub-type {elem["sub-type"]}')
|
||||
@@ -1674,6 +1677,9 @@ def _multi_parse(ri, struct, init_lines, local_vars):
|
||||
if aspec["sub-type"] == 'nest':
|
||||
local_vars.append(f'const struct nlattr *attr_{aspec.c_name};')
|
||||
array_nests.add(arg)
|
||||
elif aspec['sub-type'] in scalars:
|
||||
local_vars.append(f'const struct nlattr *attr_{aspec.c_name};')
|
||||
array_nests.add(arg)
|
||||
else:
|
||||
raise Exception(f'Not supported sub-type {aspec["sub-type"]}')
|
||||
if 'multi-attr' in aspec:
|
||||
@@ -1729,11 +1735,17 @@ def _multi_parse(ri, struct, init_lines, local_vars):
|
||||
ri.cw.p(f"dst->{aspec.c_name} = calloc(n_{aspec.c_name}, sizeof(*dst->{aspec.c_name}));")
|
||||
ri.cw.p(f"dst->n_{aspec.c_name} = n_{aspec.c_name};")
|
||||
ri.cw.p('i = 0;')
|
||||
ri.cw.p(f"parg.rsp_policy = &{aspec.nested_render_name}_nest;")
|
||||
if 'nested-attributes' in aspec:
|
||||
ri.cw.p(f"parg.rsp_policy = &{aspec.nested_render_name}_nest;")
|
||||
ri.cw.block_start(line=f"ynl_attr_for_each_nested(attr, attr_{aspec.c_name})")
|
||||
ri.cw.p(f"parg.data = &dst->{aspec.c_name}[i];")
|
||||
ri.cw.p(f"if ({aspec.nested_render_name}_parse(&parg, attr, ynl_attr_type(attr)))")
|
||||
ri.cw.p('return YNL_PARSE_CB_ERROR;')
|
||||
if 'nested-attributes' in aspec:
|
||||
ri.cw.p(f"parg.data = &dst->{aspec.c_name}[i];")
|
||||
ri.cw.p(f"if ({aspec.nested_render_name}_parse(&parg, attr, ynl_attr_type(attr)))")
|
||||
ri.cw.p('return YNL_PARSE_CB_ERROR;')
|
||||
elif aspec.sub_type in scalars:
|
||||
ri.cw.p(f"dst->{aspec.c_name}[i] = ynl_attr_get_{aspec.sub_type}(attr);")
|
||||
else:
|
||||
raise Exception(f"Nest parsing type not supported in {aspec['name']}")
|
||||
ri.cw.p('i++;')
|
||||
ri.cw.block_end()
|
||||
ri.cw.block_end()
|
||||
|
||||
Reference in New Issue
Block a user