From 9db8d71ff0d8f6883090f2d07e4aa2e5170ba9cd Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Tue, 14 May 2002 04:26:25 +0000 Subject: [PATCH] 2002-05-14 Daniel Jacobowitz * ser-tcp.c: Include . 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 * gdb.texinfo (Debug Session): Document new `udp:' and `tcp:' options for `target remote'. --- gdb/ChangeLog | 10 +++++++++ gdb/doc/ChangeLog | 5 +++++ gdb/doc/gdb.texinfo | 20 +++++++++++++++-- gdb/remote.c | 26 +++++++++++++++++++--- gdb/ser-tcp.c | 54 ++++++++++++++++++++++++++++++--------------- 5 files changed, 92 insertions(+), 23 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 08ba434b7fd..53970ab6994 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2002-05-14 Daniel Jacobowitz + + * ser-tcp.c: Include . 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 * MAINTAINERS: List sh-elf as buildable with ,-Werror. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 83a87faa68a..bb46be3bb21 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2002-05-14 Daniel Jacobowitz + + * gdb.texinfo (Debug Session): Document new `udp:' and `tcp:' + options for `target remote'. + 2002-05-13 Andrew Cagney * gdbint.texinfo (Target Architecture Definition): Delete diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index f37e288a450..1080b8b44f8 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -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 diff --git a/gdb/remote.c b/gdb/remote.c index d447f3804f8..c3f40fed1f9 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -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); diff --git a/gdb/ser-tcp.c b/gdb/ser-tcp.c index 6dc82846b6f..cef62699ae0 100644 --- a/gdb/ser-tcp.c +++ b/gdb/ser-tcp.c @@ -38,12 +38,13 @@ #include #include #include +#include #include #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; -- 2.30.2