Commit 5f2823c4 authored by Donald Hunter's avatar Donald Hunter Committed by Jakub Kicinski
Browse files

tools/net/ynl: Refactor fixed header encoding into separate method



Refactor the fixed header encoding into a separate _encode_struct method
so that it can be reused for fixed headers in sub-messages and for
encoding structs.

Signed-off-by: default avatarDonald Hunter <donald.hunter@gmail.com>
Reviewed-by: default avatarBreno Leitao <leitao@debian.org>
Reviewed-by: default avatarJiri Pirko <jiri@nvidia.com>
Link: https://lore.kernel.org/r/20240129223458.52046-5-donald.hunter@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 78d23416
Loading
Loading
Loading
Loading
+15 −11
Original line number Diff line number Diff line
@@ -720,6 +720,20 @@ class YnlFamily(SpecFamily):
                fixed_header_attrs[m.name] = value
        return fixed_header_attrs

    def _encode_struct(self, name, vals):
        members = self.consts[name].members
        attr_payload = b''
        for m in members:
            value = vals.pop(m.name) if m.name in vals else 0
            if m.type == 'pad':
                attr_payload += bytearray(m.len)
            elif m.type == 'binary':
                attr_payload += bytes.fromhex(value)
            else:
                format = NlAttr.get_format(m.type, m.byte_order)
                attr_payload += format.pack(value)
        return attr_payload

    def handle_ntf(self, decoded):
        msg = dict()
        if self.include_raw:
@@ -779,18 +793,8 @@ class YnlFamily(SpecFamily):

        req_seq = random.randint(1024, 65535)
        msg = self.nlproto.message(nl_flags, op.req_value, 1, req_seq)
        fixed_header_members = []
        if op.fixed_header:
            fixed_header_members = self.consts[op.fixed_header].members
            for m in fixed_header_members:
                value = vals.pop(m.name) if m.name in vals else 0
                if m.type == 'pad':
                    msg += bytearray(m.len)
                elif m.type == 'binary':
                    msg += bytes.fromhex(value)
                else:
                    format = NlAttr.get_format(m.type, m.byte_order)
                    msg += format.pack(value)
            msg += self._encode_struct(op.fixed_header, vals)
        for name, value in vals.items():
            msg += self._add_attr(op.attr_set.name, name, value)
        msg = _genl_msg_finalize(msg)