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. The stack handles message fragmentation/reassembly and tag tracking. The crate'sRouter
can be used by async MCTP applications to interface with multiple transport ports, and handles MCTP bridging. It includes built-in MCTP transport handling for I2C, USB, and serial.mctp-estack
includes a minimal MCTP control protocol implementation. -
mctp-usb-embassy
is a MCTP over USB transport forembassy-usb
. -
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.
mctp
mctp-linux
pldm
pldm-fw
mctp-estack
mctp-usb-embassy
There's a small example MCTP requester in mctp-linux/examples:
// Create a new endpoint using the linux socket support
let mut ep = MctpLinuxReq::new(EID, None)?;
// for subsequent use of `ep`, we're just interacting with the
// mctp::ReqChannel 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, &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 (typ, ic, rx_buf) = ep.recv(&mut rx_buf)?;
There are also some MCTP over serial examples in standalone/examples.