Fix Telnet option processing issue

- 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>
diff --git a/src/vlib/unix/cli.c b/src/vlib/unix/cli.c
index b268db5..42c1374 100644
--- a/src/vlib/unix/cli.c
+++ b/src/vlib/unix/cli.c
@@ -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 @@
     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 @@
   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);