diff options
author | Jakub Kicinski <kuba@kernel.org> | 2023-07-26 13:38:29 -0700 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2023-07-26 13:38:29 -0700 |
commit | fa29d467977d50400f6bb1374e942e7474fdf53c (patch) | |
tree | 7cb3f5685d9767843eb8faff814c240221c818b3 | |
parent | d4a7ce642100765119a872d4aba1bf63e3a22c8a (diff) | |
parent | df15c15e6c987a32ecbafe011ffae8a53c84cb4f (diff) | |
download | xfs-lts-backports-fa29d467977d50400f6bb1374e942e7474fdf53c.tar.gz |
Merge branch 'tools-ynl-gen-fix-parse-multi-attr-enum-attribute'
Arkadiusz Kubalewski says:
====================
tools: ynl-gen: fix parse multi-attr enum attribute
Fix the issues with parsing enums in ynl.py script.
====================
Link: https://lore.kernel.org/r/20230725101642.267248-1-arkadiusz.kubalewski@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r-- | tools/net/ynl/lib/ynl.py | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py index 1b3a36fbb1c376..3ca28d4bcb1887 100644 --- a/tools/net/ynl/lib/ynl.py +++ b/tools/net/ynl/lib/ynl.py @@ -417,11 +417,10 @@ class YnlFamily(SpecFamily): pad = b'\x00' * ((4 - len(attr_payload) % 4) % 4) return struct.pack('HH', len(attr_payload) + 4, nl_type) + attr_payload + pad - def _decode_enum(self, rsp, attr_spec): - raw = rsp[attr_spec['name']] + def _decode_enum(self, raw, attr_spec): enum = self.consts[attr_spec['enum']] - i = attr_spec.get('value-start', 0) if 'enum-as-flags' in attr_spec and attr_spec['enum-as-flags']: + i = 0 value = set() while raw: if raw & 1: @@ -429,8 +428,8 @@ class YnlFamily(SpecFamily): raw >>= 1 i += 1 else: - value = enum.entries_by_val[raw - i].name - rsp[attr_spec['name']] = value + value = enum.entries_by_val[raw].name + return value def _decode_binary(self, attr, attr_spec): if attr_spec.struct_name: @@ -438,7 +437,7 @@ class YnlFamily(SpecFamily): decoded = attr.as_struct(members) for m in members: if m.enum: - self._decode_enum(decoded, m) + decoded[m.name] = self._decode_enum(decoded[m.name], m) elif attr_spec.sub_type: decoded = attr.as_c_array(attr_spec.sub_type) else: @@ -466,6 +465,9 @@ class YnlFamily(SpecFamily): else: raise Exception(f'Unknown {attr_spec["type"]} with name {attr_spec["name"]}') + if 'enum' in attr_spec: + decoded = self._decode_enum(decoded, attr_spec) + if not attr_spec.is_multi: rsp[attr_spec['name']] = decoded elif attr_spec.name in rsp: @@ -473,8 +475,6 @@ class YnlFamily(SpecFamily): else: rsp[attr_spec.name] = [decoded] - if 'enum' in attr_spec: - self._decode_enum(rsp, attr_spec) return rsp def _decode_extack_path(self, attrs, attr_set, offset, target): |