aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuraj Marcin <jmarcin@redhat.com>2025-05-21 15:52:33 +0200
committerDaniel P. Berrangé <berrange@redhat.com>2025-05-22 11:24:41 +0100
commit00064705ed1f3943d3634be25da434466c87e7d5 (patch)
tree81884f65ce3452961df543af853960337d0532b9
parent911e0f2c6e2d00c985affa75ec188c8edcf480f2 (diff)
downloadqemu-00064705ed1f3943d3634be25da434466c87e7d5.zip
qemu-00064705ed1f3943d3634be25da434466c87e7d5.tar.gz
qemu-00064705ed1f3943d3634be25da434466c87e7d5.tar.bz2
util/qemu-sockets: Add support for keep-alive flag to passive sockets
Commit aec21d3175 (qapi: Add InetSocketAddress member keep-alive) introduces the keep-alive flag, which enables the SO_KEEPALIVE socket option, but only on client-side sockets. However, this option is also useful for server-side sockets, so they can check if a client is still reachable or drop the connection otherwise. This patch enables the SO_KEEPALIVE socket option on passive server-side sockets if the keep-alive flag is enabled. This socket option is then inherited by active server-side sockets communicating with connected clients. Signed-off-by: Juraj Marcin <jmarcin@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
-rw-r--r--qapi/sockets.json4
-rw-r--r--util/qemu-sockets.c9
2 files changed, 5 insertions, 8 deletions
diff --git a/qapi/sockets.json b/qapi/sockets.json
index 6a95023..62797cd 100644
--- a/qapi/sockets.json
+++ b/qapi/sockets.json
@@ -56,8 +56,8 @@
# @ipv6: whether to accept IPv6 addresses, default try both IPv4 and
# IPv6
#
-# @keep-alive: enable keep-alive when connecting to this socket. Not
-# supported for passive sockets. (Since 4.2)
+# @keep-alive: enable keep-alive when connecting to/listening on this socket.
+# (Since 4.2, not supported for listening sockets until 10.1)
#
# @mptcp: enable multi-path TCP. (Since 6.1)
#
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 329fdbf..4fbf1ed 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -236,12 +236,6 @@ static int inet_listen_saddr(InetSocketAddress *saddr,
int saved_errno = 0;
bool socket_created = false;
- if (saddr->keep_alive) {
- error_setg(errp, "keep-alive option is not supported for passive "
- "sockets");
- return -1;
- }
-
memset(&ai,0, sizeof(ai));
ai.ai_flags = AI_PASSIVE;
if (saddr->has_numeric && saddr->numeric) {
@@ -349,6 +343,9 @@ static int inet_listen_saddr(InetSocketAddress *saddr,
goto fail;
}
/* We have a listening socket */
+ if (inet_set_sockopts(slisten, saddr, errp) < 0) {
+ goto fail;
+ }
freeaddrinfo(res);
return slisten;
}