[Spice-devel] [PATCH v6 02/18] sound: Implements config_socket RedChannel callback

Frediano Ziglio fziglio at redhat.com
Fri Dec 2 10:53:49 UTC 2016


This code is the same inside __new_channel but will set the
RedsStream from RedChannel.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/sound.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 45 insertions(+), 1 deletion(-)

diff --git a/server/sound.c b/server/sound.c
index 912dc7a..307d292 100644
--- a/server/sound.c
+++ b/server/sound.c
@@ -1007,7 +1007,51 @@ error1:
 
 static int snd_channel_config_socket(RedChannelClient *rcc)
 {
-    g_assert_not_reached();
+    int delay_val;
+    int flags;
+#ifdef SO_PRIORITY
+    int priority;
+#endif
+    int tos;
+    RedsStream *stream = red_channel_client_get_stream(rcc);
+    RedClient *red_client = red_channel_client_get_client(rcc);
+    MainChannelClient *mcc = red_client_get_main(red_client);
+
+    if ((flags = fcntl(stream->socket, F_GETFL)) == -1) {
+        spice_printerr("accept failed, %s", strerror(errno));
+        return FALSE;
+    }
+
+#ifdef SO_PRIORITY
+    priority = 6;
+    if (setsockopt(stream->socket, SOL_SOCKET, SO_PRIORITY, (void*)&priority,
+                   sizeof(priority)) == -1) {
+        if (errno != ENOTSUP) {
+            spice_printerr("setsockopt failed, %s", strerror(errno));
+        }
+    }
+#endif
+
+    tos = IPTOS_LOWDELAY;
+    if (setsockopt(stream->socket, IPPROTO_IP, IP_TOS, (void*)&tos, sizeof(tos)) == -1) {
+        if (errno != ENOTSUP) {
+            spice_printerr("setsockopt failed, %s", strerror(errno));
+        }
+    }
+
+    delay_val = main_channel_client_is_low_bandwidth(mcc) ? 0 : 1;
+    if (setsockopt(stream->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val, sizeof(delay_val)) == -1) {
+        if (errno != ENOTSUP) {
+            spice_printerr("setsockopt failed, %s", strerror(errno));
+        }
+    }
+
+    if (fcntl(stream->socket, F_SETFL, flags | O_NONBLOCK) == -1) {
+        spice_printerr("accept failed, %s", strerror(errno));
+        return FALSE;
+    }
+
+    return TRUE;
 }
 
 static void snd_channel_on_disconnect(RedChannelClient *rcc)
-- 
git-series 0.9.1


More information about the Spice-devel mailing list