/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */ #include #include #include #include #include #include #include #include "libmctp.h" #include "libmctp-astlpc.h" static const mctp_eid_t local_eid = 8; static const mctp_eid_t remote_eid = 9; static const uint8_t echo_req = 1; static const uint8_t echo_resp = 2; struct ctx { struct mctp *mctp; }; static void tx_message(struct ctx *ctx, mctp_eid_t eid, void *msg, size_t len) { uint8_t type; type = len > 0 ? *(uint8_t *)(msg) : 0x00; fprintf(stderr, "TX: dest EID 0x%02x: %zd bytes, first byte [0x%02x]\n", eid, len, type); mctp_message_tx(ctx->mctp, eid, msg, len); } static void rx_message(uint8_t eid, void *data, void *msg, size_t len) { struct ctx *ctx = data; uint8_t type; type = len > 0 ? *(uint8_t *)(msg) : 0x00; fprintf(stderr, "RX: src EID 0x%02x: %zd bytes, first byte [0x%02x]\n", eid, len, type); if (type == echo_req) { *(uint8_t *)(msg) = echo_resp; tx_message(ctx, eid, msg, len); } } int main(void) { struct mctp_binding_astlpc *astlpc; struct mctp *mctp; struct ctx *ctx, _ctx; int rc; mctp = mctp_init(); assert(mctp); astlpc = mctp_astlpc_init_fileio(); assert(astlpc); mctp_astlpc_register_bus(astlpc, mctp, local_eid); ctx = &_ctx; ctx->mctp = mctp; mctp_set_rx_all(mctp, rx_message, ctx); for (;;) { #if 0 struct pollfd pollfds[2]; pollfds[0].fd = STDIN_FILENO; pollfds[0].events = POLLIN; pollfds[1].fd = mctp_astlpc_get_fd(astlpc); pollfds[1].events = POLLIN; rc = poll(pollfds, 2, -1); if (rc < 0) err(EXIT_FAILURE, "poll"); if (pollfds[0].revents) { uint8_t buf[1024]; rc = read(STDIN_FILENO, buf, sizeof(buf)); if (rc == 0) break; if (rc < 0) err(EXIT_FAILURE, "read"); tx_message(ctx, remote_eid, buf, rc); } if (pollfds[1].revents) { rc = mctp_astlpc_poll(astlpc); if (rc) break; } #else (void)remote_eid; rc = mctp_astlpc_poll(astlpc); if (rc) break; #endif } return EXIT_SUCCESS; }