Blame SOURCES/0078-channel-add-option-tcp-keepalive-timeout-to-channels.patch

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