[Pkg-telepathy-commits] [libnice] 47/265: pseudotcp: Make it possible to disable the Nagle Algorithm

Simon McVittie smcv at debian.org
Wed May 14 12:04:51 UTC 2014


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to branch debian
in repository libnice.

commit 5db9af995a80a51beb5a5c5988adc91e299d004d
Author: Olivier Crête <olivier.crete at collabora.com>
Date:   Fri Jan 3 13:07:26 2014 -0500

    pseudotcp: Make it possible to disable the Nagle Algorithm
    
    Syncs with libjingle SVN rev 56
---
 agent/pseudotcp.c | 49 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 44 insertions(+), 5 deletions(-)

diff --git a/agent/pseudotcp.c b/agent/pseudotcp.c
index fe8dcc1..98344e5 100644
--- a/agent/pseudotcp.c
+++ b/agent/pseudotcp.c
@@ -153,7 +153,8 @@ const guint16 PACKET_MAXIMUMS[] = {
 #define MIN_RTO      250
 #define DEF_RTO     3000 /* 3 seconds (RFC1122, Sec 4.2.3.1) */
 #define MAX_RTO    60000 /* 60 seconds */
-#define ACK_DELAY    100 /* 100 milliseconds */
+#define DEFAULT_ACK_DELAY    100 /* 100 milliseconds */
+#define DEFAULT_NO_DELAY     FALSE
 
 /*
 #define FLAG_FIN 0x01
@@ -310,6 +311,8 @@ struct _PseudoTcpSocketPrivate {
   guint32 recover;
   guint32 t_ack;
 
+  gboolean use_nagling;
+  guint32 ack_delay;
 };
 
 
@@ -319,6 +322,8 @@ enum
   PROP_CONVERSATION = 1,
   PROP_CALLBACKS,
   PROP_STATE,
+  PROP_ACK_DELAY,
+  PROP_NO_DELAY,
   LAST_PROPERTY
 };
 
@@ -393,6 +398,17 @@ pseudo_tcp_socket_class_init (PseudoTcpSocketClass *cls)
           TCP_LISTEN, TCP_CLOSED, TCP_LISTEN,
           G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
+  g_object_class_install_property (object_class, PROP_ACK_DELAY,
+      g_param_spec_uint ("ack-delay", "ACK Delay",
+          "Delayed ACK timeout (in milliseconds)",
+          0, G_MAXUINT, DEFAULT_ACK_DELAY,
+          G_PARAM_READWRITE| G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (object_class, PROP_NO_DELAY,
+      g_param_spec_boolean ("no-delay", "No Delay",
+          "Disable the Nagle algorithm (like the TCP_NODELAY option)",
+          DEFAULT_NO_DELAY,
+          G_PARAM_READWRITE| G_PARAM_STATIC_STRINGS));
 }
 
 
@@ -414,6 +430,12 @@ pseudo_tcp_socket_get_property (GObject *object,
     case PROP_STATE:
       g_value_set_uint (value, self->priv->state);
       break;
+    case PROP_ACK_DELAY:
+      g_value_set_uint (value, self->priv->ack_delay);
+      break;
+    case PROP_NO_DELAY:
+      g_value_set_boolean (value, !self->priv->use_nagling);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
@@ -438,6 +460,12 @@ pseudo_tcp_socket_set_property (GObject *object,
         self->priv->callbacks = *c;
       }
       break;
+    case PROP_ACK_DELAY:
+      self->priv->ack_delay = g_value_get_uint (value);
+      break;
+    case PROP_NO_DELAY:
+      self->priv->use_nagling = !g_value_get_boolean (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
@@ -518,6 +546,9 @@ pseudo_tcp_socket_init (PseudoTcpSocket *obj)
 
   priv->rx_rto = DEF_RTO;
   priv->rx_srtt = priv->rx_rttvar = 0;
+
+  priv->ack_delay = DEFAULT_ACK_DELAY;
+  priv->use_nagling = !DEFAULT_NO_DELAY;
 }
 
 PseudoTcpSocket *pseudo_tcp_socket_new (guint32 conversation,
@@ -619,7 +650,7 @@ pseudo_tcp_socket_notify_clock(PseudoTcpSocket *self)
   }
 
   // Check if it's time to send delayed acks
-  if (priv->t_ack && (time_diff(priv->t_ack + ACK_DELAY, now) <= 0)) {
+  if (priv->t_ack && (time_diff(priv->t_ack + priv->ack_delay, now) <= 0)) {
     packet(self, priv->snd_nxt, 0, 0, 0);
   }
 
@@ -659,7 +690,7 @@ pseudo_tcp_socket_get_next_clock(PseudoTcpSocket *self, long *timeout)
   *timeout = DEFAULT_TIMEOUT;
 
   if (priv->t_ack) {
-    *timeout = min(*timeout, time_diff(priv->t_ack + ACK_DELAY, now));
+    *timeout = min(*timeout, time_diff(priv->t_ack + priv->ack_delay, now));
   }
   if (priv->rto_base) {
     *timeout = min(*timeout, time_diff(priv->rto_base + priv->rx_rto, now));
@@ -1092,7 +1123,11 @@ process(PseudoTcpSocket *self, Segment *seg)
   if (seg->seq != priv->rcv_nxt) {
     sflags = sfImmediateAck; // (Fast Recovery)
   } else if (seg->len != 0) {
-    sflags = sfDelayedAck;
+    if (priv->ack_delay == 0) {
+      sflags = sfImmediateAck;
+    } else {
+      sflags = sfDelayedAck;
+    }
   }
   if (sflags == sfImmediateAck) {
     if (seg->seq > priv->rcv_nxt) {
@@ -1322,7 +1357,11 @@ attempt_send(PseudoTcpSocket *self, SendFlags sflags)
     }
 
     // Nagle algorithm
-    if ((priv->snd_nxt > priv->snd_una) && (nAvailable < priv->mss))  {
+    // If there is data already in-flight, and we haven't a full segment of
+    // data ready to send then hold off until we get more to send, or the
+    // in-flight data is acknowledged.
+    if (priv->use_nagling && (priv->snd_nxt > priv->snd_una) &&
+        (nAvailable < priv->mss))  {
       return;
     }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-telepathy/libnice.git



More information about the Pkg-telepathy-commits mailing list