From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Sunny Shin Date: Tue, 1 Dec 2015 13:46:30 +0900 Subject: [PATCH] channel: add option tcp keepalive timeout to channels --- server/reds-private.h | 1 + server/reds.c | 22 ++++++++++++++++++++++ server/spice-server.syms | 5 +++++ server/spice.h | 1 + 4 files changed, 29 insertions(+) diff --git a/server/reds-private.h b/server/reds-private.h index 46899f6..0f7ab65 100644 --- a/server/reds-private.h +++ b/server/reds-private.h @@ -162,6 +162,7 @@ typedef struct RedsState { int vm_running; Ring char_devs_states; /* list of SpiceCharDeviceStateItem */ int seamless_migration_enabled; /* command line arg */ + int keepalive_timeout; SSL_CTX *ctx; diff --git a/server/reds.c b/server/reds.c index f4c6d1d..a28027e 100644 --- a/server/reds.c +++ b/server/reds.c @@ -2899,6 +2899,21 @@ static RedLinkInfo *reds_init_client_connection(int socket) } } + if (reds->keepalive_timeout > 0) { + int keepalive = 1; + if (setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive)) == -1) { + if (errno != ENOTSUP) { + spice_printerr("setsockopt for keepalive failed, %s", strerror(errno)); + } + } + if (setsockopt(socket, SOL_TCP, TCP_KEEPIDLE, + &reds->keepalive_timeout, sizeof(reds->keepalive_timeout)) == -1) { + if (errno != ENOTSUP) { + spice_printerr("setsockopt for keepalive timeout failed, %s", strerror(errno)); + } + } + } + link = spice_new0(RedLinkInfo, 1); stream = spice_new0(RedsStream, 1); stream->info = spice_new0(SpiceChannelEventInfo, 1); @@ -4690,3 +4705,10 @@ void reds_stream_free(RedsStream *s) free(s); } + +SPICE_GNUC_VISIBLE void spice_server_set_keepalive_timeout(SpiceServer *s, int timeout) +{ + spice_assert(s == reds); + reds->keepalive_timeout = timeout; + spice_debug("keepalive timeout=%d", timeout); +} diff --git a/server/spice-server.syms b/server/spice-server.syms index 4f2dc37..9af3354 100644 --- a/server/spice-server.syms +++ b/server/spice-server.syms @@ -145,3 +145,8 @@ SPICE_SERVER_0.12.4 { global: spice_server_set_agent_file_xfer; } SPICE_SERVER_0.12.3; + +SPICE_SERVER_0.12.7 { +global: + spice_server_set_keepalive_timeout; +} SPICE_SERVER_0.12.4; diff --git a/server/spice.h b/server/spice.h index 9c8e18a..c31839d 100644 --- a/server/spice.h +++ b/server/spice.h @@ -508,6 +508,7 @@ int spice_server_set_playback_compression(SpiceServer *s, int enable); int spice_server_set_agent_mouse(SpiceServer *s, int enable); int spice_server_set_agent_copypaste(SpiceServer *s, int enable); int spice_server_set_agent_file_xfer(SpiceServer *s, int enable); +void spice_server_set_keepalive_timeout(SpiceServer *s, int timeout); int spice_server_get_sock_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen); int spice_server_get_peer_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen);