This workspace repository contains a set of crates providing MCTP support, primarily for use in embedded applications.
-
mctp
implements base type and trait definitions -
mctp-linux
implements a transport implementation, using the Linux kernel MCTP sockets support for message send/receive -
pldm
provides Platform Level Data Model (PLDM) base definitions on top of the generic MCTP support -
pldm-fw
uses thepldm
base definitions to implement the PLDM for Firmware Update protocol as a library. It include a Firmware Device (fd
) responder that can run on embedded devices withno_std
, and an Update Agent (ua
) forstd
platforms. -
pldm-fw-cli
is a command-line PLDM Firmware Update utility. This targetsmctp-linux
though could be adapted to any implementation of themctp
crate traits. -
mctp-estack
is a MCTP stack suitable for embedded devices, runningno_std
with fixed allocations. It includes a MCTP over I2C transport handler. The stack handles message fragmentation/reassembly and tag tracking. At present routing is left for specific platform code to handle. -
standalone
is amctp
trait implementation that includes its ownmctp-estack
instance, allowing running a standalone MCTP-over-serial stack against a Linux TTY (or any other pipe device). This can be used for example with QEMU.
There's a small example MCTP requester in mctp-linux/examples:
// Create a new endpoint using the linux socket support
let mut ep = MctpLinuxEp::new(EID, MCTP_NET_ANY)?;
// for subsequent use of `ep`, we're just interacting with the
// mctp::Comm trait, which is independent of the socket support
// Get Endpoint ID message: command 0x02, no data. Allow the MCTP stack
// to allocate an owned tag.
let tx_buf = vec![0x02u8];
ep.send(MCTP_TYPE_CONTROL, None, &tx_buf)?;
// Receive a response. We create a 16-byte vec to read into; ep.recv()
// will return the sub-slice containing just the response data.
let mut rx_buf = vec![0u8; 16];
let (rx_buf, eid, tag) = ep.recv(&mut rx_buf)?;
There are also some MCTP over serial examples in standalone/examples.