@@ -218,6 +218,11 @@ properties:
description: Max length for a string or a binary attribute.
$ref: '#/$defs/len-or-define'
sub-type: *attr-type
+ # Start genetlink-legacy
+ struct:
+ description: Name of the struct type used for the attribute.
+ type: string
+ # End genetlink-legacy
# Make sure name-prefix does not appear in subsets (subsets inherit naming)
dependencies:
@@ -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:
+ 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}"
@@ -371,8 +381,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')
- 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()
Add support for decoding attributes that contain C structs. Signed-off-by: Donald Hunter <donald.hunter@gmail.com> --- Documentation/netlink/genetlink-legacy.yaml | 5 +++++ tools/net/ynl/lib/ynl.py | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-)