| /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */ | 
 |  | 
 | #include <assert.h> | 
 | #include <err.h> | 
 | #include <stdio.h> | 
 | #include <stdlib.h> | 
 | #include <unistd.h> | 
 | #include <sys/poll.h> | 
 | #include <sys/socket.h> | 
 |  | 
 | #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, 0, MCTP_MESSAGE_TO_SRC, msg, len); | 
 | } | 
 |  | 
 | static void rx_message(uint8_t eid, uint8_t msg_tag, bool tag_owner, 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; | 
 |  | 
 | } |