This is the mail archive of the
ecos-discuss@sourceware.org
mailing list for the eCos project.
RedBoot doesn't handle telnet WILL properly.
- From: Grant Edwards <grante at visi dot com>
- To: ecos-discuss at sources dot redhat dot com
- Date: Sat, 1 Apr 2006 17:56:41 +0000 (UTC)
- Subject: [ECOS] RedBoot doesn't handle telnet WILL properly.
Why does RedBoot handle DO but not WILL? It's normal for a
telnet client to send a bunch of WILL commands after connecting
to a server.
The current code in net_io_getc_nonblock() handles the telnet
DO by replying with a WONT (which is a correct). But, when it
receives a WILL sequence from the client, it just returns the
option code as a received character and doesn't reply to the
client.
This causes the first command read by the main loop to contain
a bunch of "garbage" characters consisting of all of the option
codes which the client said it "WILL" do during option
negotiation.
I've added code to net_io_getc_nonblock() in my version of
RedBoot to fix this problem.
Is there interest in merging this fix into CVS?
------------------------------8<------------------------------
--- net_io.c-old 2006-04-01 11:52:30.000000000 -0600
+++ net_io.c 2006-04-01 11:52:52.000000000 -0600
@@ -161,18 +161,20 @@
// Functions in this module
static void net_io_flush(void);
static void net_io_revert_console(void);
static void net_io_putc(void*, cyg_uint8);
// Special characters used by Telnet - must be interpretted here
#define TELNET_IAC 0xFF // Interpret as command (escape)
#define TELNET_IP 0xF4 // Interrupt process
-#define TELNET_WONT 0xFC // I Won't do it
+#define TELNET_WILL 0xFB // I Will do XXX
+#define TELNET_WONT 0xFC // I Won't do XXX
#define TELNET_DO 0xFD // Will you XXX
+#define TELNET_DONT 0xFE // Don't you XXX
#define TELNET_TM 0x06 // Time marker (special DO/WONT after IP)
static cyg_bool
_net_io_getc_nonblock(void* __ch_data, cyg_uint8* ch)
{
if (in_buflen == 0) {
__tcp_poll();
if (tcp_sock.state == _CLOSE_WAIT) {
@@ -239,16 +241,24 @@
case TELNET_DO:
// Telnet DO option
while (!_net_io_getc_nonblock(__ch_data, &esc)) ;
// Respond with WONT option
net_io_putc(__ch_data, TELNET_IAC);
net_io_putc(__ch_data, TELNET_WONT);
net_io_putc(__ch_data, esc);
return false; // Ignore this whole thing!
+ case TELNET_WILL:
+ // Telnet WILL option
+ while (!_net_io_getc_nonblock(__ch_data, &esc)) ;
+ // Respond with DONT option
+ net_io_putc(__ch_data, TELNET_IAC);
+ net_io_putc(__ch_data, TELNET_DONT);
+ net_io_putc(__ch_data, esc);
+ return false; // Ignore this whole thing!
default:
return false;
}
}
static cyg_uint8
net_io_getc(void* __ch_data)
{
------------------------------8<------------------------------
--
Grant Edwards grante Yow! Yow! It's a hole
at all the way to downtown
visi.com Burbank!
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss