mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
tools: ynl: allow setting recv() size
Make the size of the buffer we use for recv() configurable. The details of the buffer sizing in netlink are somewhat arcane, we could spend a lot of time polishing this API. Let's just leave some hopefully helpful comments for now. This is a for-developers-only feature, anyway. Signed-off-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Donald Hunter <donald.hunter@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7df7231d6a
commit
7c93a88785
@ -84,6 +84,10 @@ class NlError(Exception):
|
||||
return f"Netlink error: {os.strerror(-self.nl_msg.error)}\n{self.nl_msg}"
|
||||
|
||||
|
||||
class ConfigError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class NlAttr:
|
||||
ScalarFormat = namedtuple('ScalarFormat', ['native', 'big', 'little'])
|
||||
type_formats = {
|
||||
@ -400,7 +404,8 @@ class SpaceAttrs:
|
||||
|
||||
|
||||
class YnlFamily(SpecFamily):
|
||||
def __init__(self, def_path, schema=None, process_unknown=False):
|
||||
def __init__(self, def_path, schema=None, process_unknown=False,
|
||||
recv_size=0):
|
||||
super().__init__(def_path, schema)
|
||||
|
||||
self.include_raw = False
|
||||
@ -415,6 +420,16 @@ class YnlFamily(SpecFamily):
|
||||
except KeyError:
|
||||
raise Exception(f"Family '{self.yaml['name']}' not supported by the kernel")
|
||||
|
||||
# Note that netlink will use conservative (min) message size for
|
||||
# the first dump recv() on the socket, our setting will only matter
|
||||
# from the second recv() on.
|
||||
self._recv_size = recv_size if recv_size else 131072
|
||||
# Netlink will always allocate at least PAGE_SIZE - sizeof(skb_shinfo)
|
||||
# for a message, so smaller receive sizes will lead to truncation.
|
||||
# Note that the min size for other families may be larger than 4k!
|
||||
if self._recv_size < 4000:
|
||||
raise ConfigError()
|
||||
|
||||
self.sock = socket.socket(socket.AF_NETLINK, socket.SOCK_RAW, self.nlproto.proto_num)
|
||||
self.sock.setsockopt(Netlink.SOL_NETLINK, Netlink.NETLINK_CAP_ACK, 1)
|
||||
self.sock.setsockopt(Netlink.SOL_NETLINK, Netlink.NETLINK_EXT_ACK, 1)
|
||||
@ -799,7 +814,7 @@ class YnlFamily(SpecFamily):
|
||||
def check_ntf(self):
|
||||
while True:
|
||||
try:
|
||||
reply = self.sock.recv(128 * 1024, socket.MSG_DONTWAIT)
|
||||
reply = self.sock.recv(self._recv_size, socket.MSG_DONTWAIT)
|
||||
except BlockingIOError:
|
||||
return
|
||||
|
||||
@ -854,7 +869,7 @@ class YnlFamily(SpecFamily):
|
||||
done = False
|
||||
rsp = []
|
||||
while not done:
|
||||
reply = self.sock.recv(128 * 1024)
|
||||
reply = self.sock.recv(self._recv_size)
|
||||
nms = NlMsgs(reply, attr_space=op.attr_set)
|
||||
for nl_msg in nms:
|
||||
if nl_msg.extack:
|
||||
|
Loading…
Reference in New Issue
Block a user