Fixed broken dbus interface for multiple consoles

There is a console server instance per console. So if there are two
consoles then two console server instances will be started. The issue
is that each instance is sharing same bus name and object path. The
issue is fixed by keeping the interface name same as before
(xyz.openbmc_project.console) but changing the bus name and object path
name by appending socket-id which makes them unique. So the bus name
becomes xyz.openbmc_project.Console.<socket-id> and the object name
becomes /xyz/openbmc_project/Console/<socket-id>. Each console server
has its own socket-id hence there should not be any conflict between two
consoles.

Testing:
    -> Ran busctl to check object changes
    $ busctl get-property xyz.openbmc_project.Console.console0 /xyz/openbmc_project/console/console0 xyz.openbmc_project.console baudrate
    u 0
    $ busctl introspect xyz.openbmc_project.Console.console0 /xyz/openbmc_project/console/console0    ....
    xyz.openbmc_project.Console         interface -         -            -
    .setBaudRate                        method    u         x            -
    .baudrate                           property  u         0            -

Change-Id: Ic1aacd8f284a867416081b4965b55ba7c3cb34e3
Signed-off-by: Ninad Palsule <ninadpalsule@us.ibm.com>
1 file changed
tree: 8aea9cbe0a1d89acaffb32a1e8ecf1cf1b7ee4a3
  1. conf/
  2. test/
  3. .clang-format
  4. .clang-tidy
  5. .gitignore
  6. .travis.yml
  7. config.c
  8. console-client.c
  9. console-server.c
  10. console-server.h
  11. console-socket.c
  12. LICENSE
  13. log-handler.c
  14. meson.build
  15. meson_options.txt
  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.