mirror of
https://github.com/torvalds/linux
synced 2024-07-22 03:01:14 +00:00
tools/net/ynl: Add binary and pad support to structs for tc
The tc netlink-raw family needs binary and pad types for several qopt C structs. Add support for them to ynl. Reviewed-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Donald Hunter <donald.hunter@gmail.com> Link: https://lore.kernel.org/r/20231215093720.18774-6-donald.hunter@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
1769e2be4b
commit
8b6811d966
|
@ -670,8 +670,11 @@ class YnlFamily(SpecFamily):
|
|||
fixed_header_members = self.consts[name].members
|
||||
size = 0
|
||||
for m in fixed_header_members:
|
||||
format = NlAttr.get_format(m.type, m.byte_order)
|
||||
size += format.size
|
||||
if m.type in ['pad', 'binary']:
|
||||
size += m.len
|
||||
else:
|
||||
format = NlAttr.get_format(m.type, m.byte_order)
|
||||
size += format.size
|
||||
return size
|
||||
else:
|
||||
return 0
|
||||
|
@ -681,12 +684,20 @@ class YnlFamily(SpecFamily):
|
|||
fixed_header_attrs = dict()
|
||||
offset = 0
|
||||
for m in fixed_header_members:
|
||||
format = NlAttr.get_format(m.type, m.byte_order)
|
||||
[ value ] = format.unpack_from(msg.raw, offset)
|
||||
offset += format.size
|
||||
if m.enum:
|
||||
value = self._decode_enum(value, m)
|
||||
fixed_header_attrs[m.name] = value
|
||||
value = None
|
||||
if m.type == 'pad':
|
||||
offset += m.len
|
||||
elif m.type == 'binary':
|
||||
value = msg.raw[offset : offset + m.len]
|
||||
offset += m.len
|
||||
else:
|
||||
format = NlAttr.get_format(m.type, m.byte_order)
|
||||
[ value ] = format.unpack_from(msg.raw, offset)
|
||||
offset += format.size
|
||||
if value is not None:
|
||||
if m.enum:
|
||||
value = self._decode_enum(value, m)
|
||||
fixed_header_attrs[m.name] = value
|
||||
return fixed_header_attrs
|
||||
|
||||
def handle_ntf(self, decoded):
|
||||
|
@ -753,8 +764,13 @@ class YnlFamily(SpecFamily):
|
|||
fixed_header_members = self.consts[op.fixed_header].members
|
||||
for m in fixed_header_members:
|
||||
value = vals.pop(m.name) if m.name in vals else 0
|
||||
format = NlAttr.get_format(m.type, m.byte_order)
|
||||
msg += format.pack(value)
|
||||
if m.type == 'pad':
|
||||
msg += bytearray(m.len)
|
||||
elif m.type == 'binary':
|
||||
msg += bytes.fromhex(value)
|
||||
else:
|
||||
format = NlAttr.get_format(m.type, m.byte_order)
|
||||
msg += format.pack(value)
|
||||
for name, value in vals.items():
|
||||
msg += self._add_attr(op.attr_set.name, name, value)
|
||||
msg = _genl_msg_finalize(msg)
|
||||
|
|
Loading…
Reference in a new issue