[RTEMS Project] #1366: Telnet client resets connection with telnetd during long commands

RTEMS trac trac at rtems.org
Fri Dec 19 04:07:10 UTC 2014


#1366: Telnet client resets connection with telnetd during long commands
------------------------+----------------------
 Reporter:  gene.smith  |       Owner:  chrisj
     Type:  defect      |      Status:  closed
 Priority:  normal      |   Milestone:  4.11
Component:  networking  |     Version:  4.9
 Severity:  normal      |  Resolution:  wontfix
 Keywords:              |
------------------------+----------------------
Changes (by gedare):

 * status:  accepted => closed
 * resolution:   => wontfix


Old description:

> Doing an "ls" command on a mounted SD or MMC card with 100's of files
> causes a "closed by foreign host" message to appear and the telnet client
> terminates.
>
> The ENTER terminating character is sent to telnetd by the telnet client
> but telnetd never ACKs the transmission. Telnet client retries the
> transmission many times but eventually times out and sends RST. After a
> while, telnetd does send the response but it is too late and rejected.
> (So actually the connection is terminated or reset by the local host.)
>
> So, other than the fact the the ls command is kind of slow or should
> respond incrementally, the real problem is due to telnetd running at the
> same priority as network task(s). It appears that the shell code doing
> ls, spawned by telnetd I think, is busy processing the request and can
> preempt tcp/ip from sending the ACK for the ENTER character which started
> the ls command. Telnet client times out before it see the ACK.
>
> If the telnetd task is set to a priority less than network task priority,
> the ACK occurs immediately right before the ls command processing begins
> and telnet client remains happy during the wait and the data is send by
> telnetd and accepted and displayed.
>
> I think this is a problem when default values are used for network and
> telnetd priority.
>
> In telnetd.c function rtems_telnetd_initialize() I think the default
> priority needs to be set to one greater (actually lower) than network:
>
> 339: priority = rtems_bsdnet_config.network_task_priority + 1;
>
> However, there is still a bit of a bug here too since, if network
> priority is default, its value at this point is still zero (the default
> user setting).
>
> This needs to be fixed in rtems_glue.c in function rtems_bsdnet_newproc()
> where priority is set. After rtems_task_create() this line should be
> added:
>
> 637:    rtems_bsdnet_config.network_task_priority =
> networkDaemonPriority;
>
> Without this, the telnetd priority gets set to 1 (really high) but is
> immediately adjusted back to 100 (which is still the same as default for
> networking) so the problem persists.
>
> Note: The .network_task_priority is used in ppp code at several places so
> this possible change could affect that code too. I don't use the ppp
> stuff.
>
> I can provides a patch if this looks like a correct solution.

New description:

 Doing an "ls" command on a mounted SD or MMC card with 100's of files
 causes a "closed by foreign host" message to appear and the telnet client
 terminates.

 The ENTER terminating character is sent to telnetd by the telnet client
 but telnetd never ACKs the transmission. Telnet client retries the
 transmission many times but eventually times out and sends RST. After a
 while, telnetd does send the response but it is too late and rejected. (So
 actually the connection is terminated or reset by the local host.)

 So, other than the fact the the ls command is kind of slow or should
 respond incrementally, the real problem is due to telnetd running at the
 same priority as network task(s). It appears that the shell code doing ls,
 spawned by telnetd I think, is busy processing the request and can preempt
 tcp/ip from sending the ACK for the ENTER character which started the ls
 command. Telnet client times out before it see the ACK.

 If the telnetd task is set to a priority less than network task priority,
 the ACK occurs immediately right before the ls command processing begins
 and telnet client remains happy during the wait and the data is send by
 telnetd and accepted and displayed.

 I think this is a problem when default values are used for network and
 telnetd priority.

 In telnetd.c function rtems_telnetd_initialize() I think the default
 priority needs to be set to one greater (actually lower) than network:

 339: priority = rtems_bsdnet_config.network_task_priority + 1;

 However, there is still a bit of a bug here too since, if network priority
 is default, its value at this point is still zero (the default user
 setting).

 This needs to be fixed in rtems_glue.c in function rtems_bsdnet_newproc()
 where priority is set. After rtems_task_create() this line should be
 added:

 637:    rtems_bsdnet_config.network_task_priority = networkDaemonPriority;

 Without this, the telnetd priority gets set to 1 (really high) but is
 immediately adjusted back to 100 (which is still the same as default for
 networking) so the problem persists.

 Note: The .network_task_priority is used in ppp code at several places so
 this possible change could affect that code too. I don't use the ppp
 stuff.

 I can provides a patch if this looks like a correct solution.

--

--
Ticket URL: <http://devel.rtems.org/ticket/1366#comment:3>
RTEMS Project <http://www.rtems.org/>
RTEMS Project


More information about the bugs mailing list