diff options
author | Sunny Shin <sunny4s.git@gmail.com> | 2015-12-01 13:46:30 +0900 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2016-01-13 12:08:17 +0100 |
commit | 98417d8309893e14efadfe5d2f9002b94d6c56a6 (patch) | |
tree | f1bbae72092418c2dafa94a2ed6aaa21a545d15b | |
parent | a81a25adc17215cc523827ec7c0c1438d01aeba4 (diff) |
channel: add option tcp keepalive timeout to channels
-rw-r--r-- | server/reds-private.h | 1 | ||||
-rw-r--r-- | server/reds.c | 22 | ||||
-rw-r--r-- | server/spice-server.h | 1 | ||||
-rw-r--r-- | server/spice-server.syms | 5 |
4 files changed, 29 insertions, 0 deletions
diff --git a/server/reds-private.h b/server/reds-private.h index 790f61c7..4859542d 100644 --- a/server/reds-private.h +++ b/server/reds-private.h @@ -175,6 +175,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 c99f470f..fc391ea1 100644 --- a/server/reds.c +++ b/server/reds.c @@ -2271,6 +2271,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); link->stream = reds_stream_new(socket); @@ -3908,3 +3923,10 @@ SPICE_GNUC_VISIBLE void spice_server_set_seamless_migration(SpiceServer *s, int reds->seamless_migration_enabled = enable && !reds->allow_multiple_clients; spice_debug("seamless migration enabled=%d", enable); } + +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.h b/server/spice-server.h index c2ff61d6..fa741360 100644 --- a/server/spice-server.h +++ b/server/spice-server.h @@ -111,6 +111,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); diff --git a/server/spice-server.syms b/server/spice-server.syms index d65e14d9..4137546c 100644 --- a/server/spice-server.syms +++ b/server/spice-server.syms @@ -162,3 +162,8 @@ global: spice_replay_next_cmd; spice_replay_free_cmd; } SPICE_SERVER_0.12.5; + +SPICE_SERVER_0.12.7 { +global: + spice_server_set_keepalive_timeout; +} SPICE_SERVER_0.12.6; |