2002-05-14 Daniel Jacobowitz <drow@mvista.com>
authorDaniel Jacobowitz <drow@false.org>
Tue, 14 May 2002 04:26:25 +0000 (04:26 +0000)
committerDaniel Jacobowitz <drow@false.org>
Tue, 14 May 2002 04:26:25 +0000 (04:26 +0000)
        * ser-tcp.c: Include <netinet/udp.h>.  Rename tcp_open
        and tcp_close to net_open and net_close.
        (net_open): Accept "udp:" and "tcp:" specifications.  Connect
        using UDP if requested.  Don't try to disable Nagle on UDP
        sockets.
        * remote.c (remote_serial_open): New function.  Warn about UDP.
        (remote_open_1, remote_async_open_1, remote_cisco_open): Call it.

2002-05-14  Daniel Jacobowitz  <drow@mvista.com>

        * gdb.texinfo (Debug Session): Document new `udp:' and `tcp:'
        options for `target remote'.

gdb/ChangeLog
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/remote.c
gdb/ser-tcp.c

index 08ba434b7fd25b6ab6a7e5c5b84d8843325d5df8..53970ab699455ab24436c1c37455ec43665ef83d 100644 (file)
@@ -1,3 +1,13 @@
+2002-05-14  Daniel Jacobowitz  <drow@mvista.com>
+
+       * ser-tcp.c: Include <netinet/udp.h>.  Rename tcp_open
+       and tcp_close to net_open and net_close.
+       (net_open): Accept "udp:" and "tcp:" specifications.  Connect
+       using UDP if requested.  Don't try to disable Nagle on UDP
+       sockets.
+       * remote.c (remote_serial_open): New function.  Warn about UDP.
+       (remote_open_1, remote_async_open_1, remote_cisco_open): Call it.
+
 2002-05-13  Elena Zannoni  <ezannoni@redhat.com>
 
        * MAINTAINERS: List sh-elf as buildable with ,-Werror.
index 83a87faa68a088f7477aecfa3d5d402fcddef9b5..bb46be3bb2145e8425309cb6de2db8f772f09b50 100644 (file)
@@ -1,3 +1,8 @@
+2002-05-14  Daniel Jacobowitz  <drow@mvista.com>
+
+       * gdb.texinfo (Debug Session): Document new `udp:' and `tcp:'
+       options for `target remote'.
+
 2002-05-13  Andrew Cagney  <ac131313@redhat.com>
 
        * gdbint.texinfo (Target Architecture Definition): Delete
index f37e288a450a28395dc4f1b21fc9f1ac1a96bb04..1080b8b44f8d255ef0abf219c3799df97824092f 100644 (file)
@@ -10475,7 +10475,7 @@ of its pure text.
 Establish communication using the @code{target remote} command.
 Its argument specifies how to communicate with the target
 machine---either via a devicename attached to a direct serial line, or a
-TCP port (usually to a terminal server which in turn has a serial line
+TCP or UDP port (usually to a terminal server which in turn has a serial line
 to the target).  For example, to use a serial line connected to the
 device named @file{/dev/ttyb}:
 
@@ -10485,7 +10485,8 @@ target remote /dev/ttyb
 
 @cindex TCP port, @code{target remote}
 To use a TCP connection, use an argument of the form
-@code{@var{host}:port}.  For example, to connect to port 2828 on a
+@code{@var{host}:@var{port}} or @code{tcp:@var{host}:@var{port}}.
+For example, to connect to port 2828 on a
 terminal server named @code{manyfarms}:
 
 @smallexample
@@ -10503,6 +10504,21 @@ target remote :1234
 @noindent
 
 Note that the colon is still required here.
+
+@cindex UDP port, @code{target remote}
+To use a UDP connection, use an argument of the form
+@code{udp:@var{host}:@var{port}}.  For example, to connect to UDP port 2828
+on a terminal server named @code{manyfarms}:
+
+@smallexample
+target remote udp:manyfarms:2828
+@end smallexample
+
+When using a UDP connection for remote debugging, you should keep in mind
+that the `U' stands for ``Unreliable''.  UDP can silently drop packets on
+busy or unreliable networks, which will cause havoc with your debugging
+session.
+
 @end enumerate
 
 Now you can use all the usual commands to examine and change data and to
index d447f3804f845e437c044e039bcc079115233795..c3f40fed1f986fe8886390f26425de0861eb63d3 100644 (file)
@@ -2222,6 +2222,26 @@ remote_check_symbols (struct objfile *objfile)
     }
 }
 
+static struct serial *
+remote_serial_open (char *name)
+{
+  static int udp_warning = 0;
+
+  /* FIXME: Parsing NAME here is a hack.  But we want to warn here instead
+     of in ser-tcp.c, because it is the remote protocol assuming that the
+     serial connection is reliable and not the serial connection promising
+     to be.  */
+  if (!udp_warning && strncmp (name, "udp:", 4) == 0)
+    {
+      warning ("The remote protocol may be unreliable over UDP.");
+      warning ("Some events may be lost, rendering further debugging "
+              "impossible.");
+      udp_warning = 1;
+    }
+
+  return serial_open (name);
+}
+
 static void
 remote_open_1 (char *name, int from_tty, struct target_ops *target,
               int extended_p)
@@ -2239,7 +2259,7 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target,
 
   unpush_target (target);
 
-  remote_desc = serial_open (name);
+  remote_desc = remote_serial_open (name);
   if (!remote_desc)
     perror_with_name (name);
 
@@ -2337,7 +2357,7 @@ remote_async_open_1 (char *name, int from_tty, struct target_ops *target,
 
   unpush_target (target);
 
-  remote_desc = serial_open (name);
+  remote_desc = remote_serial_open (name);
   if (!remote_desc)
     perror_with_name (name);
 
@@ -5463,7 +5483,7 @@ remote_cisco_open (char *name, int from_tty)
 
   unpush_target (&remote_cisco_ops);
 
-  remote_desc = serial_open (name);
+  remote_desc = remote_serial_open (name);
   if (!remote_desc)
     perror_with_name (name);
 
index 6dc82846b6fe223b433b9a0596f3a63be4b7db0e..cef62699ae082972801269dea2e6af765fd18cf7 100644 (file)
 #include <netdb.h>
 #include <sys/socket.h>
 #include <netinet/tcp.h>
+#include <netinet/udp.h>
 
 #include <signal.h>
 #include "gdb_string.h"
 
-static int tcp_open (struct serial *scb, const char *name);
-static void tcp_close (struct serial *scb);
+static int net_open (struct serial *scb, const char *name);
+static void net_close (struct serial *scb);
 extern int (*ui_loop_hook) (int);
 void _initialize_ser_tcp (void);
 
@@ -55,17 +56,27 @@ void _initialize_ser_tcp (void);
 /* Open a tcp socket */
 
 static int
-tcp_open (struct serial *scb, const char *name)
+net_open (struct serial *scb, const char *name)
 {
   char *port_str, hostname[100];
   int n, port, tmp;
+  int use_udp;
   struct hostent *hostent;
   struct sockaddr_in sockaddr;
 
+  use_udp = 0;
+  if (strncmp (name, "udp:", 4) == 0)
+    {
+      use_udp = 1;
+      name = name + 4;
+    }
+  else if (strncmp (name, "tcp:", 4) == 0)
+    name = name + 4;
+
   port_str = strchr (name, ':');
 
   if (!port_str)
-    error ("tcp_open: No colon in host name!");           /* Shouldn't ever happen */
+    error ("net_open: No colon in host name!");           /* Shouldn't ever happen */
 
   tmp = min (port_str - name, (int) sizeof hostname - 1);
   strncpy (hostname, name, tmp);       /* Don't want colon */
@@ -84,7 +95,11 @@ tcp_open (struct serial *scb, const char *name)
       return -1;
     }
 
-  scb->fd = socket (PF_INET, SOCK_STREAM, 0);
+  if (use_udp)
+    scb->fd = socket (PF_INET, SOCK_DGRAM, 0);
+  else
+    scb->fd = socket (PF_INET, SOCK_STREAM, 0);
+
   if (scb->fd < 0)
     return -1;
   
@@ -102,7 +117,7 @@ tcp_open (struct serial *scb, const char *name)
 
   if (n < 0 && errno != EINPROGRESS)
     {
-      tcp_close (scb);
+      net_close (scb);
       return -1;
     }
 
@@ -124,7 +139,7 @@ tcp_open (struct serial *scb, const char *name)
              if (ui_loop_hook (0))
                {
                  errno = EINTR;
-                 tcp_close (scb);
+                 net_close (scb);
                  return -1;
                }
            }
@@ -142,7 +157,7 @@ tcp_open (struct serial *scb, const char *name)
        {
          if (polls > TIMEOUT * POLL_INTERVAL)
            errno = ETIMEDOUT;
-         tcp_close (scb);
+         net_close (scb);
          return -1;
        }
     }
@@ -156,20 +171,23 @@ tcp_open (struct serial *scb, const char *name)
       {
        if (err)
          errno = err;
-       tcp_close (scb);
+       net_close (scb);
        return -1;
       }
   } 
-  
+
   /* turn off nonblocking */
   tmp = 0;
   ioctl (scb->fd, FIONBIO, &tmp);
 
-  /* Disable Nagle algorithm. Needed in some cases. */
-  tmp = 1;
-  setsockopt (scb->fd, IPPROTO_TCP, TCP_NODELAY,
-             (char *)&tmp, sizeof (tmp));
-  
+  if (use_udp == 0)
+    {
+      /* Disable Nagle algorithm. Needed in some cases. */
+      tmp = 1;
+      setsockopt (scb->fd, IPPROTO_TCP, TCP_NODELAY,
+                 (char *)&tmp, sizeof (tmp));
+    }
+
   /* If we don't do this, then GDB simply exits
      when the remote side dies.  */
   signal (SIGPIPE, SIG_IGN);
@@ -178,7 +196,7 @@ tcp_open (struct serial *scb, const char *name)
 }
 
 static void
-tcp_close (struct serial *scb)
+net_close (struct serial *scb)
 {
   if (scb->fd < 0)
     return;
@@ -194,8 +212,8 @@ _initialize_ser_tcp (void)
   memset (ops, sizeof (struct serial_ops), 0);
   ops->name = "tcp";
   ops->next = 0;
-  ops->open = tcp_open;
-  ops->close = tcp_close;
+  ops->open = net_open;
+  ops->close = net_close;
   ops->readchar = ser_unix_readchar;
   ops->write = ser_unix_write;
   ops->flush_output = ser_unix_nop_flush_output;