ssh-console: introduce reasonable timeout values

The obmc-console design is that it must successfully send its data to
all connected clients before it will process any new data. This
guarantees there are no data losses to clients.

The drawback to this design is that if a single client stops responding
or gets hung up in some way, all clients get hung up. At IBM, our test
teams utilize some fairly extensive perl/expect based test suites that
utilize the host virtual console extensively. We continue to see
intermittent issues when running these test suites where the virtual
console to our hypervisor becomes unusable. If we log in and start to
kill dropbear ssh console sessions, we eventually find the right one and
the console starts working again.

This commit introduces some parameters to dropbear to drop the bad
client connection if it becomes unresponsive:
  -I <idle_timeout>
  -K <keepalive>

For idle_timeout, it seems reasonable to give the client 30 minutes
(1800 seconds) of inactivity.

For keepalive, it seems reasonable to assume that a client connection
can be verified within 10 seconds.

Tested:
- The issue is somewhat difficult to recreate but we did patch a system
  which was having this issue and we were unable to recreate the problem
  with this change. The test suite appears to recover if it senses it
  has a dropped connection.

Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
Change-Id: Iaa1182d52fb75762c47e515e43f1fc6352b5bdd1
1 file changed
tree: bd9f07978a147838960e9d1a8942d01731aa4e30
  1. conf/
  2. test/
  3. .gitignore
  4. .travis.yml
  5. bootstrap.sh
  6. config.c
  7. configure.ac
  8. console-client.c
  9. console-server.c
  10. console-server.h
  11. console-socket.c
  12. LICENSE
  13. log-handler.c
  14. MAINTAINERS
  15. Makefile.am
  16. OWNERS
  17. README.md
  18. ringbuffer.c
  19. socket-handler.c
  20. tty-handler.c
  21. util.c
README.md

To Build

Note: In addition to a toolchain and autoconf tools, this requires autotools-archive to be installed.

To build this project, run the following shell commands:

./bootstrap.sh
./configure ${CONFIGURE_FLAGS}
make

To fully clean the repository, run:

./bootstrap.sh clean

To Run Server

Running the server requires a serial port (e.g. /dev/ttyS0):

touch obmc-console.conf
./obmc-console-server --config obmc-console.conf ttyS0

To Connect Client

To connect to the server, simply run the client:

./obmc-console-client

To disconnect the client, use the standard ~. combination.

Underlying design

This shows how the host UART connection is abstracted within the BMC as a Unix domain socket.

               +--------------------------------------------------------------------------------------------+
               |                                                                                            |
               |       obmc-console-client      unix domain socket         obmc-console-server              |
               |                                                                                            |
               |     +---------------------+                           +------------------------+           |
               |     | client.2200.conf    |  +---------------------+  | server.ttyVUART0.conf  |           |
           +---+--+  +---------------------+  |                     |  +------------------------+  +--------+-------+
Network    | 2200 +-->                     +->+ @obmc-console.host0 +<-+                        <--+ /dev/ttyVUART0 |   UARTs
           +---+--+  | socket-id = "host0" |  |                     |  | socket-id = "host0"    |  +--------+-------+
               |     |                     |  +---------------------+  |                        |           |
               |     +---------------------+                           +------------------------+           |
               |                                                                                            |
               |                                                                                            |
               |                                                                                            |
               +--------------------------------------------------------------------------------------------+

This supports multiple independent consoles. The socket-id is a unique portion for the unix domain socket created by the obmc-console-server instance. The server needs to know this because it needs to know what to name the pipe; the client needs to know it as it needs to form the abstract socket name to which to connect.