[Spice-devel] [PATCH 1/1] channel: add optional tcp keepalive timeout to channels
David Jaša
djasa at redhat.com
Fri Nov 27 00:00:41 PST 2015
Hi,
On Pá, 2015-11-27 at 14:45 +0900, Sunny Shin wrote:
>
>
> Hi,
>
>
> With firewall running between spice server and client, if idle time is
> larger than firewall session timeout, spice sessions freeze and users
> lose their keyboard and mouse control.
>
>
> To workaround this issue, I made a patch to add tcp keepalive timeout
> to spice server.
cool!
However, I think that your configuration approach won't be accepted, the
proper way to set such a value would be addition of another option=value
pair to -spice parameter of qemu CLI (and associated element under
<graphics> element in libvirt - but I'd leave that to libvirt people
once qemu option gets in).
David
> The timeout can be added to qemu config like below.
> <domain type='kvm'
> xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
> <qemu:commandline>
> <qemu:env name='SPICE_KEEPALIVE_TIMEOUT' value='1800'/>
> </qemu:commandline>
>
>
> I wanted to add this option to spice client, but there was no
> setsockopt() option of TCP_KEEPIDLE for windows platform, So, I ended
> up adding it to spice server. Please review the patch and let me know
> what you think. Thank you.
>
>
> ---------------------------------------------------------------------------------------------------
> [PATCH 1/1] channel: add optional tcp keepalive timeout to channels
>
>
> Signed-off-by: Sunny Shin <sunny4s.git at gmail.com>
> ---
> server/reds.c | 28 ++++++++++++++++++++++++++++
> 1 file changed, 28 insertions(+)
>
>
> diff --git a/server/reds.c b/server/reds.c
> index 8b3c3cb..05d0b1d 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -2254,6 +2254,9 @@ static RedLinkInfo
> *reds_init_client_connection(int socket)
> RedLinkInfo *link;
> int delay_val = 1;
> int flags;
> + char *keepalive_timeout_str;
> + int keepalive_timeout;
> + int keepalive = 1;
>
>
> if ((flags = fcntl(socket, F_GETFL)) == -1) {
> spice_warning("accept failed, %s", strerror(errno));
> @@ -2271,6 +2274,31 @@ static RedLinkInfo
> *reds_init_client_connection(int socket)
> }
> }
>
>
> + keepalive_timeout_str = getenv("SPICE_KEEPALIVE_TIMEOUT");
> + if (keepalive_timeout_str != NULL) {
> + errno = 0;
> + keepalive_timeout = strtol(keepalive_timeout_str, NULL, 10);
> + if (errno != 0) {
> + spice_warning("error parsing SPICE_KEEPALIVE_TIMEOUT: %
> s", strerror(errno));
> + goto error;
> + }
> +
> + spice_debug("keepalive timeout %ds", keepalive_timeout);
> + if (setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &keepalive,
> sizeof(keepalive)) == -1) {
> + if (errno != ENOTSUP) {
> + spice_printerr("setsockopt for keepalive failed, %s",
> strerror(errno));
> + goto error;
> + }
> + }
> + if (setsockopt(socket, SOL_TCP, TCP_KEEPIDLE,
> + &keepalive_timeout, sizeof(keepalive_timeout))
> == -1) {
> + if (errno != ENOTSUP) {
> + spice_printerr("setsockopt for keepalive timeout
> failed, %s", strerror(errno));
> + goto error;
> + }
> + }
> + }
> +
> link = spice_new0(RedLinkInfo, 1);
> link->stream = reds_stream_new(socket);
>
>
> --
> 1.8.3.1
>
>
>
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list