[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20230324113734.1473-4-donald.hunter@gmail.com>
Date: Fri, 24 Mar 2023 11:37:30 +0000
From: Donald Hunter <donald.hunter@...il.com>
To: netdev@...r.kernel.org, Jakub Kicinski <kuba@...nel.org>,
"David S. Miller" <davem@...emloft.net>,
Eric Dumazet <edumazet@...gle.com>,
Paolo Abeni <pabeni@...hat.com>,
Jonathan Corbet <corbet@....net>, linux-doc@...r.kernel.org
Cc: donald.hunter@...hat.com, Donald Hunter <donald.hunter@...il.com>
Subject: [PATCH net-next v3 3/7] tools: ynl: Add struct attr decoding to ynl
Add support for decoding attributes that contain C structs.
Signed-off-by: Donald Hunter <donald.hunter@...il.com>
---
Documentation/netlink/genetlink-legacy.yaml | 5 +++++
tools/net/ynl/lib/ynl.py | 15 ++++++++++++++-
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/Documentation/netlink/genetlink-legacy.yaml b/Documentation/netlink/genetlink-legacy.yaml
index 5dc6f1c07a97..d50c78b9f42d 100644
--- a/Documentation/netlink/genetlink-legacy.yaml
+++ b/Documentation/netlink/genetlink-legacy.yaml
@@ -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:
diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py
index fbcaca67d571..b2845a63f6af 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:
+ 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()
--
2.39.0
Powered by blists - more mailing lists