tools: ynl: support debug printing messages

For manual debug, allow printing the netlink level messages
to stderr.

Reviewed-by: Donald Hunter <donald.hunter@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Jakub Kicinski 2024-03-04 21:33:09 -08:00 committed by David S. Miller
parent 7c93a88785
commit a6a41521f9

View file

@ -7,6 +7,7 @@ import random
import socket import socket
import struct import struct
from struct import Struct from struct import Struct
import sys
import yaml import yaml
import ipaddress import ipaddress
import uuid import uuid
@ -420,6 +421,7 @@ class YnlFamily(SpecFamily):
except KeyError: except KeyError:
raise Exception(f"Family '{self.yaml['name']}' not supported by the kernel") raise Exception(f"Family '{self.yaml['name']}' not supported by the kernel")
self._recv_dbg = False
# Note that netlink will use conservative (min) message size for # Note that netlink will use conservative (min) message size for
# the first dump recv() on the socket, our setting will only matter # the first dump recv() on the socket, our setting will only matter
# from the second recv() on. # from the second recv() on.
@ -453,6 +455,17 @@ class YnlFamily(SpecFamily):
self.sock.setsockopt(Netlink.SOL_NETLINK, Netlink.NETLINK_ADD_MEMBERSHIP, self.sock.setsockopt(Netlink.SOL_NETLINK, Netlink.NETLINK_ADD_MEMBERSHIP,
mcast_id) mcast_id)
def set_recv_dbg(self, enabled):
self._recv_dbg = enabled
def _recv_dbg_print(self, reply, nl_msgs):
if not self._recv_dbg:
return
print("Recv: read", len(reply), "bytes,",
len(nl_msgs.msgs), "messages", file=sys.stderr)
for nl_msg in nl_msgs:
print(" ", nl_msg, file=sys.stderr)
def _encode_enum(self, attr_spec, value): def _encode_enum(self, attr_spec, value):
enum = self.consts[attr_spec['enum']] enum = self.consts[attr_spec['enum']]
if enum.type == 'flags' or attr_spec.get('enum-as-flags', False): if enum.type == 'flags' or attr_spec.get('enum-as-flags', False):
@ -819,6 +832,7 @@ class YnlFamily(SpecFamily):
return return
nms = NlMsgs(reply) nms = NlMsgs(reply)
self._recv_dbg_print(reply, nms)
for nl_msg in nms: for nl_msg in nms:
if nl_msg.error: if nl_msg.error:
print("Netlink error in ntf!?", os.strerror(-nl_msg.error)) print("Netlink error in ntf!?", os.strerror(-nl_msg.error))
@ -871,6 +885,7 @@ class YnlFamily(SpecFamily):
while not done: while not done:
reply = self.sock.recv(self._recv_size) reply = self.sock.recv(self._recv_size)
nms = NlMsgs(reply, attr_space=op.attr_set) nms = NlMsgs(reply, attr_space=op.attr_set)
self._recv_dbg_print(reply, nms)
for nl_msg in nms: for nl_msg in nms:
if nl_msg.extack: if nl_msg.extack:
self._decode_extack(msg, op, nl_msg.extack) self._decode_extack(msg, op, nl_msg.extack)