xref: /openbmc/libmctp/README.md (revision 3b36d17cf18bd9ad13f043256371222e2845e4d9)
14cdc200fSJeremy Kerrlibmctp: Implementation of MCTP (DTMF DSP0236)
24cdc200fSJeremy Kerr==============================================
34cdc200fSJeremy Kerr
44cdc200fSJeremy KerrThis library is intended to be a portable implementation of the Management
54cdc200fSJeremy KerrComponent Transport Protocol (MCTP), as defined by DMTF standard "DSP0236",
64cdc200fSJeremy Kerrplus transport binding specifications.
74cdc200fSJeremy Kerr
84cdc200fSJeremy KerrCurrently, the library is is only at prototyping stage. Interfaces will likely
94cdc200fSJeremy Kerrchange, and are missing lots of components of the standard.
104cdc200fSJeremy Kerr
114cdc200fSJeremy KerrCore API
124cdc200fSJeremy Kerr--------
134cdc200fSJeremy Kerr
144cdc200fSJeremy KerrTo initialise the MCTP stack with a single hardware bus:
154cdc200fSJeremy Kerr
164cdc200fSJeremy Kerr * `mctp = mctp_init()`: Initialise the MCTP core
174cdc200fSJeremy Kerr * `binding = mctp_<binding>_init()`: Initialise a hardware binding
184cdc200fSJeremy Kerr * `mctp_register_bus(mctp, binding, eid)`: Register the hardware binding with
194cdc200fSJeremy Kerr   the core, using a predefined EID
204cdc200fSJeremy Kerr
214cdc200fSJeremy KerrThen, register a function call to be invoked when a message is received:
224cdc200fSJeremy Kerr
234cdc200fSJeremy Kerr * `mctp_set_rx_all(mctp, function)`: Provide a callback to be invoked when a
244cdc200fSJeremy Kerr   MCTP message is received
254cdc200fSJeremy Kerr
264cdc200fSJeremy KerrOr transmit a message:
274cdc200fSJeremy Kerr
284cdc200fSJeremy Kerr * `mctp_message_tx(mctp, message, len)`: Transmit a MCTP message
294cdc200fSJeremy Kerr
304cdc200fSJeremy KerrThe binding may require you to notify it to receive packets. For example,
314cdc200fSJeremy Kerrfor the serial binding, the `mctp_serial_read()` function should be invoked
324cdc200fSJeremy Kerrwhen the file-descriptor for the serial device has data available.
334cdc200fSJeremy Kerr
341a4ec3cdSJeremy Kerr### Bridging
351a4ec3cdSJeremy Kerr
361a4ec3cdSJeremy Kerrlibmctp implements basic support for bridging between two hardware bindings.
371a4ec3cdSJeremy KerrIn this mode, bindings may have different MTUs, so packets are reassembled into
381a4ec3cdSJeremy Kerrtheir messages, then the messages are re-packetised for the outgoing binding.
391a4ec3cdSJeremy Kerr
401a4ec3cdSJeremy KerrFor bridging between two endpoints, use the `mctp_bridge_busses()` function:
411a4ec3cdSJeremy Kerr
421a4ec3cdSJeremy Kerr * `mctp = mctp_init()`: Initialise the MCTP core
431a4ec3cdSJeremy Kerr * `b1 = mctp_<binding>_init(); b2 = mctp_<binding>_init()`: Initialise two hardware bindings
441a4ec3cdSJeremy Kerr * `mctp_bridge_busses(mctp, b1, b2)`: Setup bridge
451a4ec3cdSJeremy Kerr
461a4ec3cdSJeremy KerrNote that no EIDs are defined here; the bridge does not deliver any messages
471a4ec3cdSJeremy Kerrto a local rx callback, and messages are bridged as-is.
481a4ec3cdSJeremy Kerr
49*3b36d17cSJeremy KerrBinding API
50*3b36d17cSJeremy Kerr-----------
51*3b36d17cSJeremy Kerr
52*3b36d17cSJeremy KerrHardware bindings provide a method for libmctp to send and receive packets
53*3b36d17cSJeremy Kerrto/from hardware. A binding defines a hardware specific structure (`struct
54*3b36d17cSJeremy Kerrmctp_binding_<name>`), which wraps the generic binding (`struct mctp_binding`):
55*3b36d17cSJeremy Kerr
56*3b36d17cSJeremy Kerr    struct mctp_binding_foo {
57*3b36d17cSJeremy Kerr	    struct mctp_binding binding;
58*3b36d17cSJeremy Kerr	    /* hardware-specific members here... */
59*3b36d17cSJeremy Kerr    };
60*3b36d17cSJeremy Kerr
61*3b36d17cSJeremy KerrThe binding code then provides a method (`_init`) to allocate and initialise
62*3b36d17cSJeremy Kerrthe binding; this may be of any prototype (calling code will know what
63*3b36d17cSJeremy Kerrarguments to pass):
64*3b36d17cSJeremy Kerr
65*3b36d17cSJeremy Kerr    struct mctp_binding_foo *mctp_binding_foo_init(void);
66*3b36d17cSJeremy Kerr
67*3b36d17cSJeremy Kerror maybe the `foo` binding needs a path argument:
68*3b36d17cSJeremy Kerr
69*3b36d17cSJeremy Kerr    struct mctp_binding_foo *mctp_binding_foo_init(const char *path);
70*3b36d17cSJeremy Kerr
71*3b36d17cSJeremy KerrThe binding then needs to provide a function (`_core`) to convert the
72*3b36d17cSJeremy Kerrhardware-specific struct to the libmctp generic core struct
73*3b36d17cSJeremy Kerr
74*3b36d17cSJeremy Kerr    struct mctp_binding *mctp_binding_foo_core(struct mctp_binding_foo *b);
75*3b36d17cSJeremy Kerr
76*3b36d17cSJeremy Kerr(Implementations of this will usually be fairly consistent, just returning
77*3b36d17cSJeremy Kerr`b->binding`). Callers can then use that generic pointer to register the
78*3b36d17cSJeremy Kerrbinding with the core:
79*3b36d17cSJeremy Kerr
80*3b36d17cSJeremy Kerr    struct mctp_binding *binding = mctp_binding_foo_core(foo);
81*3b36d17cSJeremy Kerr    mctp_register_bus(mctp, binding, 8);
82*3b36d17cSJeremy Kerr
831a4ec3cdSJeremy Kerr
842f7e05bdSJeremy KerrIntegration
852f7e05bdSJeremy Kerr-----------
862f7e05bdSJeremy Kerr
872f7e05bdSJeremy KerrThe libmctp code is intended to be integrated into other codebases by two
882f7e05bdSJeremy Kerrmethods:
892f7e05bdSJeremy Kerr
90c7e764a2SJeremy Kerr 1. as a simple library (`libmctp.{a,so}`) which can be compiled separately
912f7e05bdSJeremy Kerr    and linked into the containing project
922f7e05bdSJeremy Kerr
932f7e05bdSJeremy Kerr 2. as a set of sources to be included into the containing project (either
942f7e05bdSJeremy Kerr    imported, or as a git subtree/submodule)
952f7e05bdSJeremy Kerr
962f7e05bdSJeremy KerrFor (1), you can use the top-level makefile to produce `libmtcp.a`.
972f7e05bdSJeremy Kerr
982f7e05bdSJeremy KerrFor (2), the `Makefile.inc` file provides the minimum set of dependencies to
992f7e05bdSJeremy Kerreither build libmctp.a, or just the actual object files (`LIBMCTP_OBS`), which
1002f7e05bdSJeremy Kerryou can include into your existing make definitions.  You'll want to set
1012f7e05bdSJeremy Kerr`LIBMTCP_DIR` to refer to the subdirectory that contains that makefile, so we
1022f7e05bdSJeremy Kerrcan set the correct paths to sources.
1032f7e05bdSJeremy Kerr
1042f7e05bdSJeremy Kerr
1054cdc200fSJeremy KerrEnvironment configuration
1064cdc200fSJeremy Kerr-------------------------
1074cdc200fSJeremy Kerr
1084cdc200fSJeremy KerrThis library is intended to be portable to be used in a range of environments,
1094cdc200fSJeremy Kerrbut the main targets are:
1104cdc200fSJeremy Kerr
1114cdc200fSJeremy Kerr  - Linux userspace, typically for BMC use-cases
1124cdc200fSJeremy Kerr  - Low-level firmware environments
1134cdc200fSJeremy Kerr
1144cdc200fSJeremy KerrFor the latter, we need to support customisation of the functions that libmctp
1154cdc200fSJeremy Kerruses (for example, POSIX file IO is not available).
1164cdc200fSJeremy Kerr
117c7e764a2SJeremy KerrIn order to support these, we have a few compile-time definitions:
1184cdc200fSJeremy Kerr
119c7e764a2SJeremy Kerr - `MCTP_HAVE_FILEIO`: define if POSIX file io is available, allowing the
1204cdc200fSJeremy Kerr   serial hardware binding to access char devices for IO.
1214cdc200fSJeremy Kerr
122c7e764a2SJeremy Kerr - `MCTP_HAVE_SYSLOG`: allow logging to syslog, through the `vsyslog`
123c7e764a2SJeremy Kerr   call.
1244cdc200fSJeremy Kerr
125c7e764a2SJeremy Kerr - `MCTP_DEFAULT_ALLOC`: set default allocator functions (malloc, free,
126c7e764a2SJeremy Kerr   realloc), so that applications do not have to provide their own.
1273cb4eee4SJeremy Kerr
1284cdc200fSJeremy KerrTODO
1294cdc200fSJeremy Kerr----
1304cdc200fSJeremy Kerr
13124db71fbSJeremy Kerr - Partial packet queue transmit
1324cdc200fSJeremy Kerr - Control messages
1334cdc200fSJeremy Kerr - Message- and packet-buffer pools and preallocation
1344cdc200fSJeremy Kerr - C++ API
1354cdc200fSJeremy Kerr - Non-file-based serial binding
136