Re: [PATCH net-next v4 3/7] tools: ynl: Add struct attr decoding to ynl
From: Jakub Kicinski <kuba@kernel.org>
Date: 2023-03-25 03:42:47
Also in:
linux-doc
On Fri, 24 Mar 2023 19:18:56 +0000 Donald Hunter wrote:
quoted hunk ↗ jump to hunk
diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py index b635d147175c..af1d6d380035 100644 --- a/tools/net/ynl/lib/ynl.py +++ b/tools/net/ynl/lib/ynl.py@@ -102,6 +102,16 @@ class NlAttr: format, _ = self.type_formats[type] return list({ x[0] for x in struct.iter_unpack(format, self.raw) }) + def as_struct(self, members): + value = dict() + offset = 0 + for m in members:
Maybe add a TODO here for string and binary?
quoted hunk ↗ jump to hunk
+ format, size = self.type_formats[m.type] + decoded = struct.unpack_from(format, self.raw, offset) + offset += size + value[m.name] = decoded[0] + return value + def __repr__(self): return f"[type:{self.type} len:{self._len}] {self.raw}"@@ -373,8 +383,11 @@ class YnlFamily(SpecFamily): rsp[attr_spec['name']] = value def _decode_binary(self, attr, attr_spec): + struct_name = attr_spec.get('struct') sub_type = attr_spec.get('sub-type')
Could you add these as fields in class SpecAttr, like is_multi and access the fields here instead of the get()s?
- if sub_type:
+ if struct_name:
+ decoded = attr.as_struct(self.consts[struct_name])
+ elif sub_type:
decoded = attr.as_c_array(sub_type)
else:
decoded = attr.as_bin()