Thread (14 messages) 14 messages, 2 authors, 2023-03-25

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()
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help