1 /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2 
3 #include <assert.h>
4 #include <err.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8 #include <sys/poll.h>
9 #include <sys/socket.h>
10 
11 #include "libmctp.h"
12 #include "libmctp-astlpc.h"
13 
14 static const mctp_eid_t local_eid = 8;
15 static const mctp_eid_t remote_eid = 9;
16 
17 static const uint8_t echo_req = 1;
18 static const uint8_t echo_resp = 2;
19 
20 struct ctx {
21 	struct mctp	*mctp;
22 };
23 
24 static void tx_message(struct ctx *ctx, mctp_eid_t eid, void *msg, size_t len)
25 {
26 	uint8_t type;
27 
28 	type = len > 0 ? *(uint8_t *)(msg) : 0x00;
29 
30 	fprintf(stderr, "TX: dest EID 0x%02x: %zd bytes, first byte [0x%02x]\n",
31 			eid, len, type);
32 	mctp_message_tx(ctx->mctp, eid, msg, len);
33 }
34 
35 static void rx_message(uint8_t eid, void *data, void *msg, size_t len)
36 {
37 	struct ctx *ctx = data;
38 	uint8_t type;
39 
40 	type = len > 0 ? *(uint8_t *)(msg) : 0x00;
41 
42 	fprintf(stderr, "RX: src EID 0x%02x: %zd bytes, first byte [0x%02x]\n",
43 			eid, len, type);
44 
45 	if (type == echo_req) {
46 		*(uint8_t *)(msg) = echo_resp;
47 		tx_message(ctx, eid, msg, len);
48 	}
49 }
50 
51 int main(void)
52 {
53 	struct mctp_binding_astlpc *astlpc;
54 	struct mctp *mctp;
55 	struct ctx *ctx, _ctx;
56 	int rc;
57 
58 	mctp = mctp_init();
59 	assert(mctp);
60 
61 	astlpc = mctp_astlpc_init_fileio();
62 	assert(astlpc);
63 
64 	mctp_astlpc_register_bus(astlpc, mctp, local_eid);
65 
66 	ctx = &_ctx;
67 	ctx->mctp = mctp;
68 
69 	mctp_set_rx_all(mctp, rx_message, ctx);
70 
71 	for (;;) {
72 #if 0
73 
74 		struct pollfd pollfds[2];
75 
76 		pollfds[0].fd = STDIN_FILENO;
77 		pollfds[0].events = POLLIN;
78 
79 		pollfds[1].fd = mctp_astlpc_get_fd(astlpc);
80 		pollfds[1].events = POLLIN;
81 
82 		rc = poll(pollfds, 2, -1);
83 		if (rc < 0)
84 			err(EXIT_FAILURE, "poll");
85 
86 		if (pollfds[0].revents) {
87 			uint8_t buf[1024];
88 			rc = read(STDIN_FILENO, buf, sizeof(buf));
89 			if (rc == 0)
90 				break;
91 			if (rc < 0)
92 				err(EXIT_FAILURE, "read");
93 			tx_message(ctx, remote_eid, buf, rc);
94 		}
95 
96 		if (pollfds[1].revents) {
97 			rc = mctp_astlpc_poll(astlpc);
98 			if (rc)
99 				break;
100 		}
101 #else
102 		(void)remote_eid;
103 		rc = mctp_astlpc_poll(astlpc);
104 		if (rc)
105 			break;
106 
107 #endif
108 
109 	}
110 
111 	return EXIT_SUCCESS;
112 
113 }
114