Commit 18b18864 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by Paolo Abeni
Browse files

tools: ynl-gen: array-nest: support put for scalar



C codegen supports ArrayNest AKA indexed-array carrying scalars,
but only for the netlink -> struct parsing. Support rendering
from struct to netlink.

Reviewed-by: default avatarDonald Hunter <donald.hunter@gmail.com>
Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Link: https://patch.msgid.link/20250429154704.2613851-10-kuba@kernel.org


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 3456084d
Loading
Loading
Loading
Loading
+25 −3
Original line number Diff line number Diff line
@@ -747,6 +747,23 @@ class TypeArrayNest(Type):
                     '}']
        return get_lines, None, local_vars

    def attr_put(self, ri, var):
        ri.cw.p(f'array = ynl_attr_nest_start(nlh, {self.enum_name});')
        if self.sub_type in scalars:
            put_type = self.sub_type
            ri.cw.block_start(line=f'for (i = 0; i < {var}->n_{self.c_name}; i++)')
            ri.cw.p(f"ynl_attr_put_{put_type}(nlh, i, {var}->{self.c_name}[i]);")
            ri.cw.block_end()
        else:
            raise Exception(f"Put for ArrayNest sub-type {self.attr['sub-type']} not supported, yet")
        ri.cw.p('ynl_attr_nest_end(nlh, array);')

    def _setter_lines(self, ri, member, presence):
        # For multi-attr we have a count, not presence, hack up the presence
        presence = presence[:-(len('_present.') + len(self.c_name))] + "n_" + self.c_name
        return [f"{member} = {self.c_name};",
                f"{presence} = n_{self.c_name};"]


class TypeNestTypeValue(Type):
    def _complex_member_type(self, ri):
@@ -1728,10 +1745,15 @@ def put_req_nested(ri, struct):
    local_vars.append('struct nlattr *nest;')
    init_lines.append("nest = ynl_attr_nest_start(nlh, attr_type);")

    has_anest = False
    has_count = False
    for _, arg in struct.member_list():
        if arg.presence_type() == 'count':
        has_anest |= arg.type == 'indexed-array'
        has_count |= arg.presence_type() == 'count'
    if has_anest:
        local_vars.append('struct nlattr *array;')
    if has_count:
        local_vars.append('unsigned int i;')
            break

    put_req_nested_prototype(ri, struct, suffix='')
    ri.cw.block_start()