Skip to content

Commit 8b6811d

Browse files
donaldhkuba-moo
authored andcommitted
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 <[email protected]> Signed-off-by: Donald Hunter <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 1769e2b commit 8b6811d

File tree

1 file changed

+26
-10
lines changed

1 file changed

+26
-10
lines changed

tools/net/ynl/lib/ynl.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -670,8 +670,11 @@ def _fixed_header_size(self, name):
670670
fixed_header_members = self.consts[name].members
671671
size = 0
672672
for m in fixed_header_members:
673-
format = NlAttr.get_format(m.type, m.byte_order)
674-
size += format.size
673+
if m.type in ['pad', 'binary']:
674+
size += m.len
675+
else:
676+
format = NlAttr.get_format(m.type, m.byte_order)
677+
size += format.size
675678
return size
676679
else:
677680
return 0
@@ -681,12 +684,20 @@ def _decode_fixed_header(self, msg, name):
681684
fixed_header_attrs = dict()
682685
offset = 0
683686
for m in fixed_header_members:
684-
format = NlAttr.get_format(m.type, m.byte_order)
685-
[ value ] = format.unpack_from(msg.raw, offset)
686-
offset += format.size
687-
if m.enum:
688-
value = self._decode_enum(value, m)
689-
fixed_header_attrs[m.name] = value
687+
value = None
688+
if m.type == 'pad':
689+
offset += m.len
690+
elif m.type == 'binary':
691+
value = msg.raw[offset : offset + m.len]
692+
offset += m.len
693+
else:
694+
format = NlAttr.get_format(m.type, m.byte_order)
695+
[ value ] = format.unpack_from(msg.raw, offset)
696+
offset += format.size
697+
if value is not None:
698+
if m.enum:
699+
value = self._decode_enum(value, m)
700+
fixed_header_attrs[m.name] = value
690701
return fixed_header_attrs
691702

692703
def handle_ntf(self, decoded):
@@ -753,8 +764,13 @@ def _op(self, method, vals, flags=None, dump=False):
753764
fixed_header_members = self.consts[op.fixed_header].members
754765
for m in fixed_header_members:
755766
value = vals.pop(m.name) if m.name in vals else 0
756-
format = NlAttr.get_format(m.type, m.byte_order)
757-
msg += format.pack(value)
767+
if m.type == 'pad':
768+
msg += bytearray(m.len)
769+
elif m.type == 'binary':
770+
msg += bytes.fromhex(value)
771+
else:
772+
format = NlAttr.get_format(m.type, m.byte_order)
773+
msg += format.pack(value)
758774
for name, value in vals.items():
759775
msg += self._add_attr(op.attr_set.name, name, value)
760776
msg = _genl_msg_finalize(msg)

0 commit comments

Comments
 (0)