Fix Telnet option processing issue 84/14684/2
authorChris Luke <chrisy@flirble.org>
Thu, 6 Sep 2018 01:00:52 +0000 (21:00 -0400)
committerFlorin Coras <florin.coras@gmail.com>
Thu, 6 Sep 2018 14:40:15 +0000 (14:40 +0000)
- A check for the length of the buffer should have used the provided
  'len' variable, not 'vec_len' since the buffer pointer may be
  within a vector, but not the start of one. 'vec_len' reports 0
  in that case, causing premature exit from the options processing
  loop and a wait for further input before it checks the next option.
- Also add TCP_NODELAY to CLI sockets to disable Nagle on TCP
  connections for a possible improvement in interactive response.

Change-Id: Ie1f53c003ca7d66bed51f437d298183215bad38c
Signed-off-by: Chris Luke <chrisy@flirble.org>
src/vlib/unix/cli.c

index b268db5..42c1374 100644 (file)
@@ -60,6 +60,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 #include <limits.h>
+#include <netinet/tcp.h>
 
 /** ANSI escape code. */
 #define ESC "\x1b"
@@ -1294,7 +1295,7 @@ unix_cli_process_telnet (unix_main_t * um,
     case DO:
     case DONT:
       /* Expect 3 bytes */
-      if (vec_len (input_vector) < 3)
+      if (len < 3)
        return -1;              /* want more bytes */
 
       consume = 2;
@@ -2763,11 +2764,17 @@ unix_cli_listen_read_ready (clib_file_t * uf)
   clib_error_t *error;
   unix_cli_file_t *cf;
   u32 cf_index;
+  int one;
 
   error = clib_socket_accept (s, &client);
   if (error)
     return error;
 
+  /* Disable Nagle, ignore any errors doing so eg on PF_LOCAL socket */
+  one = 1;
+  setsockopt (client.fd, IPPROTO_TCP, TCP_NODELAY,
+             (void *) &one, sizeof (one));
+
   client_name = (char *) format (0, "%U%c", format_sockaddr, &client.peer, 0);
 
   cf_index = unix_cli_file_add (cm, client_name, client.fd);