Fix thinko when deciding whether to disable TCP's Nagle algorithm
authorSergio Durigan Junior <sergiodj@redhat.com>
Fri, 3 Aug 2018 22:04:38 +0000 (18:04 -0400)
committerSergio Durigan Junior <sergiodj@redhat.com>
Fri, 3 Aug 2018 22:04:38 +0000 (18:04 -0400)
This patch fixes a thinko that happened when I was implementing the
IPv6 support on GDB/gdbserver.  On certain situations, it is necessary
to disable TCP's Nagle algorithm (NODELAY).  For obvious reasons, this
only applies when we are dealing with a TCP connection.

While implementing the IPv6 patch, I noticed that the net_open
function (on gdb/ser-tcp.c) kept a flag indicating whether the
connection type was UDP or TCP.  I eliminated that flag, and started
using the 'struct addrinfo *' related to the successful connection
directly.  However, I made a mistake:

  if (success_ainfo->ai_socktype == IPPROTO_TCP)
                     ^^^^^^^^^^^
    {
      /* Disable Nagle algorithm.  Needed in some cases.  */
      int tmp = 1;

      setsockopt (scb->fd, IPPROTO_TCP, TCP_NODELAY,
  (char *) &tmp, sizeof (tmp));
    }

The 'ai_socktype' field specifies the socket type (SOCK_STREAM or
SOCK_DGRAM), and not the protocol.  This test was always failing, and
the Nagle algorithm was never being disabled.

The obvious fix is to use the 'ai_protocol' field.  This is what this
patch does.

Huge "thank you" to Joel Brobecker who reported the regression (he was
experiencing an unusual delay while debugging a bare-metal program
running under QEMU) and helped me set up a proper reproducer for the
bug.

gdb/ChangeLog:
2018-08-03  Sergio Durigan Junior  <sergiodj@redhat.com>

* ser-tcp.c (net_open): Fix thinko when deciding whether to
disable TCP's Nagle algorithm (use "ai_protocol" instead of
"ai_socktype").

gdb/ChangeLog
gdb/ser-tcp.c

index 227e3ff74f626ba246261de83d0ecb14b0842a2d..43594561d50f525565598d4fe3a6c0db94f2ba85 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-03  Sergio Durigan Junior  <sergiodj@redhat.com>
+
+       * ser-tcp.c (net_open): Fix thinko when deciding whether to
+       disable TCP's Nagle algorithm (use "ai_protocol" instead of
+       "ai_socktype").
+
 2018-08-02  Tom Tromey  <tom@tromey.com>
 
        PR symtab/16842.
index 618d2d931ac6347a82d498735d65e5e18a8f6d03..bdfd55663b6569204499937aa0e041f3e3fb450f 100644 (file)
@@ -371,7 +371,7 @@ net_open (struct serial *scb, const char *name)
 
   ioctl (scb->fd, FIONBIO, &ioarg);
 
-  if (success_ainfo->ai_socktype == IPPROTO_TCP)
+  if (success_ainfo->ai_protocol == IPPROTO_TCP)
     {
       /* Disable Nagle algorithm.  Needed in some cases.  */
       int tmp = 1;