[Spice-devel] [PATCH 2/2] channel: add option tcp keepalive timeout to channels

Christophe Fergeau cfergeau at redhat.com
Tue Dec 8 09:52:08 PST 2015


On Tue, Dec 01, 2015 at 01:46:30PM +0900, Sunny Shin wrote:
> channel: add option tcp keepalive timeout to channels
> 
> Signed-off-by: Sunny Shin <sunny4s.git at gmail.com>
> ---
>  server/reds-private.h    |  1 +
>  server/reds.c            | 23 +++++++++++++++++++++++
>  server/spice-server.h    |  1 +
>  server/spice-server.syms |  1 +
>  4 files changed, 26 insertions(+)
> 
> diff --git a/server/reds-private.h b/server/reds-private.h
> index 790f61c..4859542 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 8b3c3cb..692461f 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);
> 
> @@ -3944,3 +3959,11 @@ 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 c2ff61d..fa74136 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 d65e14d..92c26a9 100644
> --- a/server/spice-server.syms
> +++ b/server/spice-server.syms
> @@ -161,4 +161,5 @@ global:
>      spice_replay_new;
>      spice_replay_next_cmd;
>      spice_replay_free_cmd;
> +    spice_server_set_keepalive_timeout;
>  } SPICE_SERVER_0.12.5;

This needs to go in a separate block:

SPICE_SERVER_0.12.7 {
global:
    spice_server_set_keepalive_timeout;
} SPICE_SERVER_0.12.6;

I've fixed it locally. Apart from this, the patch looks good to me.

Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20151208/5530092c/attachment.sig>


More information about the Spice-devel mailing list