From: Corey Minyard <minyard@acm.org>
To: Peter Astrand <peter@cendio.se>
Cc: linux-serial@vger.kernel.org
Subject: Re: Serial port redirection
Date: Fri, 05 Dec 2003 15:10:35 -0600 [thread overview]
Message-ID: <3FD0F44B.8080906@acm.org> (raw)
In-Reply-To: <Pine.LNX.4.44.0312051007200.11858-100000@maggie.lkpg.cendio.se>
[-- Attachment #1: Type: text/plain, Size: 910 bytes --]
My mailer screwed up, so this might be a dup.
Here's another patch, relative to 2.0 of ser2net. Hopefully it fixes
this problem.
-Corey
Peter Astrand wrote:
>
>> I've attached a ser2net patch for this. Could you try it out?
>
>
> It's a good start, but it's not enough. cyclades-ser-cli doesn't
> finished the initialization; it seems to be waiting for ACKs for the
> SET-MODEMSTATE-MASK op.
>
>> >* ser2net is totally incompatible with cyclades-serial-client. This is
>> >because ser2net interprets RFC2217 a bit differently. sredird sends
>> >command "101" as ack for command "1", while ser2net sends "1".
>> RFC2217 is
>> >not very explicit about which way is most correct. The ser2net approach
>> >looks better to me, but the sredird one is probably more widely used
>> >(since Cyclades terminal server uses it, for example.) Probably,
>> RFC2217
>> >software needs to handle both cases.
>
>
>
[-- Attachment #2: ser2net.diff --]
[-- Type: text/plain, Size: 12815 bytes --]
? .libs
? Makefile
? Makefile.in
? aclocal.m4
? config.cache
? config.log
? config.status
? configure
? libtool
? ser2net
? ser2net-2.0.tar.gz
? ser2net-2.1.tar.gz
? .deps/controller.P
? .deps/dataxfer.P
? .deps/devcfg.P
? .deps/readconfig.P
? .deps/selector.P
? .deps/ser2net.P
? .deps/telnet.P
? .deps/utils.P
Index: ChangeLog
===================================================================
RCS file: /cvsroot/ser2net/ser2net/ChangeLog,v
retrieving revision 1.36
diff -u -r1.36 ChangeLog
--- ChangeLog 14 Oct 2003 20:52:13 -0000 1.36
+++ ChangeLog 5 Dec 2003 20:58:02 -0000
@@ -1,4 +1,27 @@
+2003-12-04 Corey Minyard <minyard@acm.org>
+
+ * dataxfer.c: Add responses for all the telnet com port
+ control commands that we handle.
+
+ * telnet.c: Fixed IAC processing in suboption to be able
+ to handle a stream of IACs properly.
+
+2003-12-04 Corey Minyard <minyard@acm.org>
+
+ * configure.in: Moved to version 2.1.
+
+ * dataxfer.c: Have the telnet option responses use the 1xx
+ responses to the com port control options. I believe this is
+ wrong, but it is consistent with other products already in the
+ field.
+
+ * dataxfer.c, ser2net.c, telnet.h: Added support for setting the
+ use of Cisco IOS baud rates instead of RFC 2217 ones, by command
+ option.
+
+ * selector.c, ser2net.c: Cleaned up some compile warnings.
+
2003-10-14 Corey Minyard <minyard@acm.org>
* configure.in: Moved to version 2.0.
Index: configure.in
===================================================================
RCS file: /cvsroot/ser2net/ser2net/configure.in,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- configure.in 14 Oct 2003 15:29:39 -0000 1.16
+++ configure.in 5 Dec 2003 15:19:41 -0000 1.17
@@ -1,5 +1,5 @@
AC_INIT(ser2net.c)
-AM_INIT_AUTOMAKE(ser2net, 2.0)
+AM_INIT_AUTOMAKE(ser2net, 2.1)
AC_PROG_CC
AM_PROG_LIBTOOL
AC_ARG_WITH(uucp-locking,
Index: controller.c
===================================================================
RCS file: /cvsroot/ser2net/ser2net/controller.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- controller.c 14 Oct 2003 15:29:39 -0000 1.15
+++ controller.c 5 Dec 2003 15:17:55 -0000 1.16
@@ -17,7 +17,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <termios.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
Index: dataxfer.c
===================================================================
RCS file: /cvsroot/ser2net/ser2net/dataxfer.c,v
retrieving revision 1.28
diff -u -r1.28 dataxfer.c
--- dataxfer.c 14 Oct 2003 20:52:13 -0000 1.28
+++ dataxfer.c 5 Dec 2003 20:58:05 -0000
@@ -1878,26 +1878,30 @@
static struct baud_rates_s {
int real_rate;
int val;
+ int cisco_ios_val;
} baud_rates[] =
{
- { 50, B50 },
- { 75, B75 },
- { 110, B110 },
- { 134, B134 },
- { 150, B150 },
- { 200, B200 },
- { 300, B300 },
- { 600, B600 },
- { 1200, B1200 },
- { 1800, B1800 },
- { 2400, B2400 },
- { 4800, B4800 },
- { 9600, B9600 },
- { 19200, B19200 },
- { 38400, B38400 },
- { 57600, B57600 },
- { 115200, B115200 },
- { 230400, B230400 },
+ { 50, B50, -1 },
+ { 75, B75, -1 },
+ { 110, B110, -1 },
+ { 134, B134, -1 },
+ { 150, B150, -1 },
+ { 200, B200, -1 },
+ { 300, B300, 3 },
+ { 600, B600 , 4},
+ { 1200, B1200, 5 },
+ { 1800, B1800, -1 },
+ { 2400, B2400, 6 },
+ { 4800, B4800, 7 },
+ { 9600, B9600, 8 },
+ /* We don't support 14400 baud */
+ { 19200, B19200, 10 },
+ /* We don't support 28800 baud */
+ { 38400, B38400, 12 },
+ { 57600, B57600, 13 },
+ { 115200, B115200, 14 },
+ { 230400, B230400, 15 },
+ /* We don't support 460800 baud */
};
#define BAUD_RATES_LEN ((sizeof(baud_rates) / sizeof(struct baud_rates_s)))
@@ -1906,9 +1910,16 @@
{
int i;
for (i=0; i<BAUD_RATES_LEN; i++) {
- if (rate == baud_rates[i].real_rate) {
- *val = baud_rates[i].val;
- return 1;
+ if (cisco_ios_baud_rates) {
+ if (rate == baud_rates[i].cisco_ios_val) {
+ *val = baud_rates[i].val;
+ return 1;
+ }
+ } else {
+ if (rate == baud_rates[i].real_rate) {
+ *val = baud_rates[i].val;
+ return 1;
+ }
}
}
@@ -1921,7 +1932,16 @@
int i;
for (i=0; i<BAUD_RATES_LEN; i++) {
if (baud_rate == baud_rates[i].val) {
- *val = baud_rates[i].real_rate;
+ if (cisco_ios_baud_rates) {
+ if (baud_rates[i].cisco_ios_val < 0)
+ /* We are at a baud rate unsopported by the
+ enumeration, just return zero. */
+ *val = 0;
+ else
+ *val = baud_rates[i].cisco_ios_val;
+ } else {
+ *val = baud_rates[i].real_rate;
+ }
return;
}
}
@@ -1983,12 +2003,17 @@
break;
case 1: /* SET-BAUDRATE */
- if (len < 6)
- return;
+ if (cisco_ios_baud_rates) {
+ if (len < 3)
+ return;
+ val = option[2];
+ } else {
+ if (len < 6)
+ return;
+ val = ntohl(*((uint32_t *) (option+2)));
+ }
- val = 0;
if (tcgetattr(port->devfd, &termio) != -1) {
- val = ntohl(*((uint32_t *) (option+2)));
if ((val != 0) && (get_baud_rate(val, &val))) {
/* We have a valid baud rate. */
cfsetispeed(&termio, val);
@@ -1997,12 +2022,19 @@
}
tcgetattr(port->devfd, &termio);
val = cfgetispeed(&termio);
+ } else {
+ val = 0;
}
get_rate_from_baud_rate(val, &val);
outopt[0] = 44;
- outopt[1] = 1;
- *((uint32_t *) (outopt+2)) = htonl(val);
- telnet_send_option(&port->tn_data, outopt, 6);
+ outopt[1] = 101;
+ if (cisco_ios_baud_rates) {
+ outopt[2] = val;
+ telnet_send_option(&port->tn_data, outopt, 3);
+ } else {
+ *((uint32_t *) (outopt+2)) = htonl(val);
+ telnet_send_option(&port->tn_data, outopt, 6);
+ }
break;
case 2: /* SET-DATASIZE */
@@ -2030,7 +2062,7 @@
}
}
outopt[0] = 44;
- outopt[1] = 2;
+ outopt[1] = 102;
outopt[2] = val;
telnet_send_option(&port->tn_data, outopt, 3);
break;
@@ -2061,7 +2093,7 @@
val = 1; /* NONE */
}
outopt[0] = 44;
- outopt[1] = 3;
+ outopt[1] = 103;
outopt[2] = val;
telnet_send_option(&port->tn_data, outopt, 3);
break;
@@ -2088,7 +2120,7 @@
val = 1; /* 1 stop bit. */
}
outopt[0] = 44;
- outopt[1] = 4;
+ outopt[1] = 104;
outopt[2] = val;
telnet_send_option(&port->tn_data, outopt, 3);
break;
@@ -2210,29 +2242,43 @@
}
outopt[0] = 44;
- outopt[1] = 5;
+ outopt[1] = 105;
outopt[2] = val;
telnet_send_option(&port->tn_data, outopt, 3);
break;
case 8: /* FLOWCONTROL-SUSPEND */
tcflow(port->devfd, TCIOFF);
+ outopt[0] = 44;
+ outopt[1] = 108;
+ telnet_send_option(&port->tn_data, outopt, 2);
break;
case 9: /* FLOWCONTROL-RESUME */
tcflow(port->devfd, TCION);
+ outopt[0] = 44;
+ outopt[1] = 109;
+ telnet_send_option(&port->tn_data, outopt, 2);
break;
case 10: /* SET-LINESTATE-MASK */
if (len < 3)
return;
port->linestate_mask = option[2];
+ outopt[0] = 44;
+ outopt[1] = 110;
+ outopt[2] = port->linestate_mask;
+ telnet_send_option(&port->tn_data, outopt, 3);
break;
case 11: /* SET-MODEMSTATE-MASK */
if (len < 3)
return;
port->modemstate_mask = option[2];
+ outopt[0] = 44;
+ outopt[1] = 111;
+ outopt[2] = port->modemstate_mask;
+ telnet_send_option(&port->tn_data, outopt, 3);
break;
case 12: /* PURGE_DATA */
@@ -2247,6 +2293,10 @@
break;
purge_found:
tcflush(port->devfd, val);
+ outopt[0] = 44;
+ outopt[1] = 112;
+ outopt[2] = option[2];
+ telnet_send_option(&port->tn_data, outopt, 3);
break;
case 6: /* NOTIFY-LINESTATE */
Index: selector.c
===================================================================
RCS file: /cvsroot/ser2net/ser2net/selector.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- selector.c 22 Apr 2003 12:36:51 -0000 1.8
+++ selector.c 5 Dec 2003 14:00:10 -0000 1.9
@@ -548,6 +548,7 @@
left = elem->left;
}
done:
+ return;
}
static void
@@ -586,6 +587,7 @@
print_tree(*top, *last);
check_tree(*top, *last);
#endif
+ return;
}
static void
@@ -662,6 +664,7 @@
print_tree(*top, *last);
check_tree(*top, *last);
#endif
+ return;
}
int
Index: ser2net.8
===================================================================
RCS file: /cvsroot/ser2net/ser2net/ser2net.8,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- ser2net.8 14 Oct 2003 20:52:13 -0000 1.11
+++ ser2net.8 5 Dec 2003 14:00:10 -0000 1.12
@@ -36,6 +36,11 @@
.I \-u
If UUCP locking is enabled, this will disable the use of UUCP locks.
.TP
+.I \-b
+Cisco IOS uses a different mechanism for specifying the baud rates
+than the mechanism described in RFC2217. This option sets the IOS
+version of setting the baud rates. The default is RFC2217's.
+.TP
.I \-v
Prints the version of the program and exits.
.TP
Index: ser2net.c
===================================================================
RCS file: /cvsroot/ser2net/ser2net/ser2net.c,v
retrieving revision 1.10
diff -u -r1.10 ser2net.c
--- ser2net.c 4 Dec 2002 21:15:26 -0000 1.10
+++ ser2net.c 5 Dec 2003 20:58:05 -0000
@@ -22,12 +22,12 @@
/* TODO
*
- * Add getty support and UUCP locking
* Add some type of security
*/
#include <stdio.h>
#include <signal.h>
+#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <sys/types.h>
@@ -46,6 +46,7 @@
#ifdef USE_UUCP_LOCKING
int uucp_locking_enabled = 1;
#endif
+int cisco_ios_baud_rates = 0;
selector_t *ser2net_sel;
@@ -58,6 +59,7 @@
#ifdef USE_UUCP_LOCKING
" -u - Disable UUCP locking\n"
#endif
+" -b - Do CISCO IOS baud-rate negotiation, instead of RFC2217\n"
" -v - print the program's version and exit\n";
void
@@ -96,6 +98,10 @@
debug = 1;
break;
+ case 'b':
+ cisco_ios_baud_rates = 1;
+ break;
+
case 'c':
/* Get a config file. */
i++;
@@ -156,6 +162,7 @@
/* Detach from the calling terminal. */
openlog("ser2net", LOG_PID | LOG_CONS, LOG_DAEMON);
+ syslog(LOG_NOTICE, "ser2net startup");
if ((pid = fork()) > 0) {
exit(0);
} else if (pid < 0) {
Index: ser2net.spec
===================================================================
RCS file: /cvsroot/ser2net/ser2net/ser2net.spec,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- ser2net.spec 5 Dec 2003 14:01:01 -0000 1.11
+++ ser2net.spec 5 Dec 2003 15:19:41 -0000 1.12
@@ -1,5 +1,5 @@
Name: ser2net
-Version: 2.0
+Version: 2.1
Release: 1
License: GPL
Summary: Serial to network proxy
@@ -38,6 +38,8 @@
%changelog
+* Tue Dec 5 2003 Corey Minyard <minyard@acm.org>
+- Moved to version 2.1.
* Tue Oct 14 2003 Corey Minyard <minyard@acm.org>
- Moved to version 2.0.
* Tue Apr 22 2003 Corey Minyard <minyard@acm.org>
Index: telnet.c
===================================================================
RCS file: /cvsroot/ser2net/ser2net/telnet.c,v
retrieving revision 1.2
diff -u -r1.2 telnet.c
--- telnet.c 14 Oct 2003 16:09:43 -0000 1.2
+++ telnet.c 5 Dec 2003 20:58:05 -0000
@@ -205,7 +205,7 @@
}
} else {
/* It's in a suboption, look for the end and IACs. */
- if (td->telnet_cmd[td->telnet_cmd_pos-1] == 255) {
+ if (td->suboption_iac) {
if (tn_byte == 240) {
/* Remove the IAC 240 from the end. */
td->telnet_cmd_pos--;
@@ -219,6 +219,7 @@
character, delete them both */
td->telnet_cmd_pos--;
}
+ td->suboption_iac = 0;
} else {
if (td->telnet_cmd_pos > MAX_TELNET_CMD_SIZE)
/* Always store the last character
@@ -230,12 +231,15 @@
td->telnet_cmd[td->telnet_cmd_pos] = tn_byte;
td->telnet_cmd_pos++;
+ if (tn_byte == 255)
+ td->suboption_iac = 1;
}
}
} else if (data[i] == 255) {
td->telnet_cmd[td->telnet_cmd_pos] = 255;
len = delete_char(data, i, len);
td->telnet_cmd_pos++;
+ td->suboption_iac = 0;
} else {
i++;
}
Index: telnet.h
===================================================================
RCS file: /cvsroot/ser2net/ser2net/telnet.h,v
retrieving revision 1.2
diff -u -r1.2 telnet.h
--- telnet.h 14 Oct 2003 16:09:43 -0000 1.2
+++ telnet.h 5 Dec 2003 20:58:05 -0000
@@ -52,6 +52,9 @@
telnet_cmd buffer. If zero,
no telnet command is in
progress. */
+ int suboption_iac; /* If true, we are in a
+ suboption and processing an
+ IAC. */
/* Outgoing telnet commands. The output routines should look at
this *first* to see if they should transmit some data from
@@ -96,5 +99,9 @@
struct telnet_cmd *cmds,
unsigned char *init_seq,
int init_seq_len);
+
+/* Set to true if we are supposed to do CISCO IOS baud rates instead
+ of RFC2217 ones. */
+extern int cisco_ios_baud_rates;
#endif /* _SER2NET_TELNET_H */
next prev parent reply other threads:[~2003-12-05 21:10 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-12-01 14:32 Serial port redirection Peter Astrand
[not found] ` <Pine.LNX.4.44.0312011300480.8142-100000-K9BqGu7AvB3wj5YHdwD3Ga2PxDmRETKR@public.gmane.org>
2003-12-03 16:30 ` Peter Astrand
2003-12-03 13:31 ` Corey Minyard
2003-12-05 9:11 ` Peter Astrand
2003-12-05 21:10 ` Corey Minyard [this message]
2003-12-08 9:49 ` Peter Astrand
2003-12-08 10:11 ` Peter Astrand
[not found] ` <Pine.LNX.4.44.0312031557190.12826-100000-K9BqGu7AvB3wj5YHdwD3Ga2PxDmRETKR@public.gmane.org>
2003-12-03 16:36 ` Jeffrey Altman
[not found] ` <3FCE1101.40502-WLbs8XpHrcb2fBVCVOL8/A@public.gmane.org>
2003-12-03 13:02 ` Corey Minyard
[not found] ` <3FCDDEE6.4070905-HInyCGIudOg@public.gmane.org>
2003-12-04 17:13 ` Jeffrey Altman
[not found] ` <3FCF6B4D.2050103-WLbs8XpHrcb2fBVCVOL8/A@public.gmane.org>
2003-12-03 13:23 ` Corey Minyard
2003-12-04 17:37 ` Jeffrey Altman
2003-12-04 17:49 ` Corey Minyard
[not found] ` <3FCF73BE.1010707-HInyCGIudOg@public.gmane.org>
2003-12-04 19:12 ` Jeffrey Altman
2003-12-03 16:42 ` Jeffrey Altman
2003-12-03 13:21 ` Corey Minyard
2003-12-04 17:34 ` Jeffrey Altman
[not found] ` <3FCF7026.6070109-WLbs8XpHrcb2fBVCVOL8/A@public.gmane.org>
2003-12-03 13:45 ` Corey Minyard
2003-12-04 17:52 ` Jeffrey Altman
2003-12-05 9:19 ` Peter Astrand
2003-12-05 15:33 ` Jeffrey Altman
2003-12-05 15:43 ` Peter Astrand
2003-12-05 15:50 ` Jeffrey Altman
2003-12-06 23:31 ` Peter Astrand
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3FD0F44B.8080906@acm.org \
--to=minyard@acm.org \
--cc=linux-serial@vger.kernel.org \
--cc=peter@cendio.se \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.