Creating TCP sockets with TCP_NODELAY option set to TRUE
authorPhilip Withnall <philip@tecnocode.co.uk>
Sat, 29 Aug 2015 21:39:56 +0000 (22:39 +0100)
committerPhilip Withnall <philip@tecnocode.co.uk>
Sat, 29 Aug 2015 21:44:50 +0000 (22:44 +0100)
Disable Nagling for underlying TCP sockets used by libnice, because they
are typically used for streaming applications, or for pseudo-TCP; the
bandwidth in both cases is harmed by Nagling.

Based on a patch by Vadim Genkin.

Maniphest Tasks: T3317

Reviewers: pwithnall

Projects: #libnice

Subscribers: pwithnall, vadimgenkin

Differential Revision: https://phabricator.freedesktop.org/D230

socket/tcp-active.c
socket/tcp-bsd.c
socket/tcp-passive.c

index 5144678..5402806 100644 (file)
 #include <unistd.h>
 #endif
 
+/* FIXME: This should be defined in gio/gnetworking.h, which we should include;
+ * but we cannot do that without refactoring.
+ * (See: https://phabricator.freedesktop.org/D230). */
+#define TCP_NODELAY 1
+
 typedef struct {
   GSocketAddress *local_addr;
   GMainContext *context;
@@ -225,6 +230,9 @@ nice_tcp_active_socket_connect (NiceSocket *sock, NiceAddress *addr)
   /* GSocket: All socket file descriptors are set to be close-on-exec. */
   g_socket_set_blocking (gsock, false);
 
+  /* setting TCP_NODELAY to TRUE in order to avoid packet batching */
+  g_socket_set_option (gsock, IPPROTO_TCP, TCP_NODELAY, TRUE, NULL);
+
   /* Allow g_socket_bind to fail */
   g_socket_bind (gsock, priv->local_addr, FALSE, NULL);
 
index 20dd698..c02d6e2 100644 (file)
 #include <unistd.h>
 #endif
 
+/* FIXME: This should be defined in gio/gnetworking.h, which we should include;
+ * but we cannot do that without refactoring.
+ * (See: https://phabricator.freedesktop.org/D230). */
+#define TCP_NODELAY 1
+
 typedef struct {
   NiceAddress remote_addr;
   GQueue send_queue;
@@ -168,6 +173,9 @@ nice_tcp_bsd_socket_new (GMainContext *ctx, NiceAddress *local_addr,
   /* GSocket: All socket file descriptors are set to be close-on-exec. */
   g_socket_set_blocking (gsock, false);
 
+  /* setting TCP_NODELAY to TRUE in order to avoid packet batching */
+  g_socket_set_option (gsock, IPPROTO_TCP, TCP_NODELAY, TRUE, NULL);
+
   gret = g_socket_connect (gsock, gaddr, NULL, &gerr);
   g_object_unref (gaddr);
 
index 16fbe3d..131ff4b 100644 (file)
 #include <unistd.h>
 #endif
 
+/* FIXME: This should be defined in gio/gnetworking.h, which we should include;
+ * but we cannot do that without refactoring.
+ * (See: https://phabricator.freedesktop.org/D230). */
+#define TCP_NODELAY 1
+
 typedef struct {
   GMainContext *context;
   GHashTable *connections;
@@ -284,6 +289,9 @@ nice_tcp_passive_socket_accept (NiceSocket *sock)
   /* GSocket: All socket file descriptors are set to be close-on-exec. */
   g_socket_set_blocking (gsock, false);
 
+  /* setting TCP_NODELAY to TRUE in order to avoid packet batching */
+  g_socket_set_option (gsock, IPPROTO_TCP, TCP_NODELAY, TRUE, NULL);
+
   gaddr = g_socket_get_remote_address (gsock, NULL);
   if (gaddr == NULL ||
       !g_socket_address_to_native (gaddr, &name.addr, sizeof (name), NULL)) {