On Fri, 24 Mar 2023 19:18:56 +0000 Donald Hunter wrote: > 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? > + 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()