mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
tools: ynl: Add fixed-header support to ynl
Add support for netlink families that add an optional fixed header structure after the genetlink header and before any attributes. The fixed-header can be specified on a per op basis, or once for all operations, which serves as a default value that can be overridden. Signed-off-by: Donald Hunter <donald.hunter@gmail.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
2607191395
commit
f036d936ca
@@ -278,14 +278,22 @@ def _genl_load_families():
|
||||
|
||||
|
||||
class GenlMsg:
|
||||
def __init__(self, nl_msg):
|
||||
def __init__(self, nl_msg, fixed_header_members=[]):
|
||||
self.nl = nl_msg
|
||||
|
||||
self.hdr = nl_msg.raw[0:4]
|
||||
self.raw = nl_msg.raw[4:]
|
||||
offset = 4
|
||||
|
||||
self.genl_cmd, self.genl_version, _ = struct.unpack("BBH", self.hdr)
|
||||
|
||||
self.fixed_header_attrs = dict()
|
||||
for m in fixed_header_members:
|
||||
format, size = NlAttr.type_formats[m.type]
|
||||
decoded = struct.unpack_from(format, nl_msg.raw, offset)
|
||||
offset += size
|
||||
self.fixed_header_attrs[m.name] = decoded[0]
|
||||
|
||||
self.raw = nl_msg.raw[offset:]
|
||||
self.raw_attrs = NlAttrs(self.raw)
|
||||
|
||||
def __repr__(self):
|
||||
@@ -509,6 +517,13 @@ class YnlFamily(SpecFamily):
|
||||
|
||||
req_seq = random.randint(1024, 65535)
|
||||
msg = _genl_msg(self.family.family_id, nl_flags, op.req_value, 1, req_seq)
|
||||
fixed_header_members = []
|
||||
if op.fixed_header:
|
||||
fixed_header_members = self.consts[op.fixed_header].members
|
||||
for m in fixed_header_members:
|
||||
value = vals.pop(m.name)
|
||||
format, _ = NlAttr.type_formats[m.type]
|
||||
msg += struct.pack(format, value)
|
||||
for name, value in vals.items():
|
||||
msg += self._add_attr(op.attr_set.name, name, value)
|
||||
msg = _genl_msg_finalize(msg)
|
||||
@@ -535,7 +550,7 @@ class YnlFamily(SpecFamily):
|
||||
done = True
|
||||
break
|
||||
|
||||
gm = GenlMsg(nl_msg)
|
||||
gm = GenlMsg(nl_msg, fixed_header_members)
|
||||
# Check if this is a reply to our request
|
||||
if nl_msg.nl_seq != req_seq or gm.genl_cmd != op.rsp_value:
|
||||
if gm.genl_cmd in self.async_msg_ids:
|
||||
@@ -545,7 +560,8 @@ class YnlFamily(SpecFamily):
|
||||
print('Unexpected message: ' + repr(gm))
|
||||
continue
|
||||
|
||||
rsp.append(self._decode(gm.raw_attrs, op.attr_set.name))
|
||||
rsp.append(self._decode(gm.raw_attrs, op.attr_set.name)
|
||||
| gm.fixed_header_attrs)
|
||||
|
||||
if not rsp:
|
||||
return None
|
||||
|
Reference in New Issue
Block a user