13d36ee2eSJeremy Kerr /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2bd4e3628SJeremy Kerr
35ab78259SAndrew Jeffery #include "compiler.h"
45ab78259SAndrew Jeffery #include "libmctp.h"
55ab78259SAndrew Jeffery #include "libmctp-serial.h"
65ab78259SAndrew Jeffery
7bd4e3628SJeremy Kerr #include <assert.h>
8bd4e3628SJeremy Kerr #include <err.h>
9bd4e3628SJeremy Kerr #include <stdio.h>
10bd4e3628SJeremy Kerr #include <stdlib.h>
11bd4e3628SJeremy Kerr #include <unistd.h>
12bd4e3628SJeremy Kerr #include <sys/poll.h>
13bd4e3628SJeremy Kerr #include <sys/socket.h>
14bd4e3628SJeremy Kerr
rx_message(uint8_t eid __unused,bool tag_owner __unused,uint8_t msg_tag __unused,void * data __unused,void * msg,size_t len)15*435670d6SAndrew Jeffery static void rx_message(uint8_t eid __unused, bool tag_owner __unused,
16*435670d6SAndrew Jeffery uint8_t msg_tag __unused, void *data __unused, void *msg,
17*435670d6SAndrew Jeffery size_t len)
18bd4e3628SJeremy Kerr {
19f967c709SAndrew Jeffery ssize_t rc;
20f967c709SAndrew Jeffery
21f967c709SAndrew Jeffery rc = write(STDOUT_FILENO, msg, len);
22f967c709SAndrew Jeffery if (rc < 0)
23f967c709SAndrew Jeffery warn("Write failed");
24f967c709SAndrew Jeffery else if ((size_t)rc < len)
25f967c709SAndrew Jeffery warnx("Short write of length %zd, requested %zd", rc, len);
26bd4e3628SJeremy Kerr }
27bd4e3628SJeremy Kerr
main(void)28bd4e3628SJeremy Kerr int main(void)
29bd4e3628SJeremy Kerr {
30bd4e3628SJeremy Kerr struct mctp_binding_serial *serial[2];
31bd4e3628SJeremy Kerr mctp_eid_t eids[] = { 8, 9 };
32bd4e3628SJeremy Kerr struct pollfd pollfds[3];
33bd4e3628SJeremy Kerr int rc, n, mctp_fds[2];
34bd4e3628SJeremy Kerr struct mctp *mctp[2];
35bd4e3628SJeremy Kerr
36bd4e3628SJeremy Kerr mctp[0] = mctp_init();
37bd4e3628SJeremy Kerr mctp[1] = mctp_init();
38bd4e3628SJeremy Kerr
39bd4e3628SJeremy Kerr assert(mctp[0] && mctp[1]);
40bd4e3628SJeremy Kerr
41bd4e3628SJeremy Kerr serial[0] = mctp_serial_init();
42bd4e3628SJeremy Kerr serial[1] = mctp_serial_init();
43bd4e3628SJeremy Kerr
44bd4e3628SJeremy Kerr assert(serial[0] && serial[1]);
45bd4e3628SJeremy Kerr
46bd4e3628SJeremy Kerr rc = socketpair(AF_UNIX, SOCK_STREAM, 0, mctp_fds);
47bd4e3628SJeremy Kerr if (rc)
48bd4e3628SJeremy Kerr err(EXIT_FAILURE, "Can't create sockets");
49bd4e3628SJeremy Kerr
50bd4e3628SJeremy Kerr mctp_serial_open_fd(serial[0], mctp_fds[0]);
51bd4e3628SJeremy Kerr mctp_serial_open_fd(serial[1], mctp_fds[1]);
52bd4e3628SJeremy Kerr
53*435670d6SAndrew Jeffery mctp_register_bus(mctp[0], mctp_binding_serial_core(serial[0]),
54*435670d6SAndrew Jeffery eids[0]);
55*435670d6SAndrew Jeffery mctp_register_bus(mctp[1], mctp_binding_serial_core(serial[1]),
56*435670d6SAndrew Jeffery eids[1]);
57bd4e3628SJeremy Kerr
58bd4e3628SJeremy Kerr mctp_set_rx_all(mctp[1], rx_message, NULL);
59bd4e3628SJeremy Kerr
60bd4e3628SJeremy Kerr pollfds[0].fd = mctp_fds[0];
61bd4e3628SJeremy Kerr pollfds[0].events = POLLIN;
62bd4e3628SJeremy Kerr pollfds[1].fd = mctp_fds[1];
63bd4e3628SJeremy Kerr pollfds[1].events = POLLIN;
64bd4e3628SJeremy Kerr pollfds[2].fd = STDIN_FILENO;
65bd4e3628SJeremy Kerr pollfds[2].events = POLLIN;
66bd4e3628SJeremy Kerr n = 3;
67bd4e3628SJeremy Kerr
68bd4e3628SJeremy Kerr for (;;) {
69bd4e3628SJeremy Kerr uint8_t buf[1024];
70bd4e3628SJeremy Kerr
71bd4e3628SJeremy Kerr rc = poll(pollfds, n, -1);
72bd4e3628SJeremy Kerr if (rc < 0)
73bd4e3628SJeremy Kerr return EXIT_FAILURE;
74bd4e3628SJeremy Kerr
75bd4e3628SJeremy Kerr if (pollfds[0].revents) {
76bd4e3628SJeremy Kerr rc = mctp_serial_read(serial[0]);
77bd4e3628SJeremy Kerr if (rc)
78bd4e3628SJeremy Kerr pollfds[0].fd = -1;
79bd4e3628SJeremy Kerr }
80bd4e3628SJeremy Kerr
81bd4e3628SJeremy Kerr if (pollfds[1].revents) {
82bd4e3628SJeremy Kerr rc = mctp_serial_read(serial[1]);
83bd4e3628SJeremy Kerr if (rc)
84bd4e3628SJeremy Kerr pollfds[1].fd = -1;
85bd4e3628SJeremy Kerr }
86bd4e3628SJeremy Kerr
87bd4e3628SJeremy Kerr if (n > 2 && pollfds[2].revents) {
88bd4e3628SJeremy Kerr rc = read(STDIN_FILENO, buf, sizeof(buf));
89bd4e3628SJeremy Kerr if (rc == 0) {
90bd4e3628SJeremy Kerr n = 2;
91bd4e3628SJeremy Kerr close(mctp_fds[0]);
92bd4e3628SJeremy Kerr pollfds[0].fd = -1;
93bd4e3628SJeremy Kerr } else if (rc < 0) {
94bd4e3628SJeremy Kerr err(EXIT_FAILURE, "read");
95bd4e3628SJeremy Kerr } else {
96f39c3857SSumanth Bhat mctp_message_tx(mctp[0], eids[1],
97f39c3857SSumanth Bhat MCTP_MESSAGE_TO_SRC, 0, buf,
98f39c3857SSumanth Bhat rc);
99bd4e3628SJeremy Kerr }
100bd4e3628SJeremy Kerr }
101bd4e3628SJeremy Kerr
102bd4e3628SJeremy Kerr if (n == 2 && pollfds[0].fd < 0 && pollfds[1].fd < 0)
103bd4e3628SJeremy Kerr break;
104bd4e3628SJeremy Kerr }
105bd4e3628SJeremy Kerr
106bd4e3628SJeremy Kerr return EXIT_SUCCESS;
107bd4e3628SJeremy Kerr }
108