# obmc-console

## To Build

To build this project, run the following shell commands:

    meson setup build
    meson compile -C build

To test:

    meson test -C build

## 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
            +---+--+  | console-id = "host0" |  |                     |  |  console-id = "host0"  |  +--------+-------+
                |     |                      |  +---------------------+  |                        |           |
                |     +----------------------+                           +------------------------+           |
                |                                                                                             |
                |                                                                                             |
                |                                                                                             |
                +---------------------------------------------------------------------------------------------+

This supports multiple independent consoles. The `console-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.

## Mux Support

In some hardware designs, multiple UARTS may be available behind a Mux. Please
reference
[docs/mux-support.md](https://github.com/openbmc/obmc-console/blob/master/docs/mux-support.md)
in that case.

## Sample Development Setup

For developing obmc-console, we can use pseudo terminals (pty's) in Linux.

The socat command will output names of 2 pty's, one of which is the master and
the other one is the slave. The master pty can be used to emulate a UART.

    $ socat -d -d pty,raw,echo=0,link=pty1 pty,raw,echo=0,link=pty2

    $ obmc-console-server --console-id dev $(realpath pty2)

    $ obmc-console-client -i dev

    # this message should appear for the client
    $ echo "hi" > pty1