Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> writes: > 06.06.2019 14:17, Daniel P. Berrangé wrote: >> On Thu, Jun 06, 2019 at 01:15:33PM +0300, Vladimir Sementsov-Ogievskiy wrote: >>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> >>> --- >>> >>> Hi all! >>> >>> This is a continuation of "[PATCH v2 0/2] nbd: enable keepalive", but >>> it's a try from another side, so almost nothing common with v2.
Please explain intended use of your new option in your commit message. >>> qapi/sockets.json | 5 ++++- >>> util/qemu-sockets.c | 13 +++++++++++++ >>> 2 files changed, 17 insertions(+), 1 deletion(-) >>> >>> diff --git a/qapi/sockets.json b/qapi/sockets.json >>> index fc81d8d5e8..aefa024051 100644 >>> --- a/qapi/sockets.json >>> +++ b/qapi/sockets.json >>> @@ -53,6 +53,8 @@ >>> # >>> # @ipv6: whether to accept IPv6 addresses, default try both IPv4 and IPv6 >>> # >>> +# @keepalive: enable keepalive when connecting to this socket (Since 4.1) >>> +# >>> # Since: 1.3 >>> ## >>> { 'struct': 'InetSocketAddress', >>> @@ -61,7 +63,8 @@ >>> '*numeric': 'bool', >>> '*to': 'uint16', >>> '*ipv4': 'bool', >>> - '*ipv6': 'bool' } } >>> + '*ipv6': 'bool', >>> + '*keepalive': 'bool' } } I know the C identifier is SO_KEEPALIVE, but let's stick to proper English words in QMP: keep-alive. >>> >>> ## >>> # @UnixSocketAddress: >>> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c >>> index 8850a280a8..d2cd2a9d4f 100644 >>> --- a/util/qemu-sockets.c >>> +++ b/util/qemu-sockets.c >>> @@ -457,6 +457,19 @@ int inet_connect_saddr(InetSocketAddress *saddr, Error >>> **errp) >>> } >>> >>> freeaddrinfo(res); >>> + >>> + if (saddr->keepalive) { >> >> IIUC, best practice is to use 'saddr->has_keepalive && saddr->keepalive' > > As I remember, now all optional fields are zeroed. But I'm not against > stricter condition. As far as I'm concerned, relying on zero-initialization of optional members is fine. > >> >>> + int val = 1; >>> + int ret = qemu_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, >>> + &val, sizeof(val)); >>> + >>> + if (ret < 0) { >>> + error_setg_errno(errp, errno, "Unable to set KEEPALIVE"); >>> + close(sock); >>> + return -1; >>> + } >>> + } >>> + >>> return sock; >>> } Possibly ignorant question: why obey the keep-alive option for active connections (made with inet_connect_saddr()), but not passive ones (made with inet_listen_saddr() + accept())? Do you need to update inet_parse()?