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