blob: f1e041b85a5f26d195dfc90c2a03b289cef6de10 [file] [log] [blame]
Jeremy Kerr3d36ee22019-05-30 11:15:37 +08001/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
Jeremy Kerr4cdc2002019-02-07 16:49:12 +08002
Andrew Jeffery5ab78252022-02-17 21:04:59 +10303#include "compiler.h"
4#include "libmctp.h"
5#include "libmctp-serial.h"
6
Jeremy Kerr4cdc2002019-02-07 16:49:12 +08007#include <assert.h>
8#include <err.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <unistd.h>
12#include <sys/poll.h>
13#include <sys/socket.h>
14
Andrew Jeffery435670d2022-09-30 14:19:44 +093015static void rx_message(uint8_t eid __unused, bool tag_owner __unused,
16 uint8_t msg_tag __unused, void *data __unused, void *msg,
17 size_t len)
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080018{
Andrew Jefferyf967c702022-02-17 17:41:35 +103019 ssize_t rc;
Andrew Jefferyf967c702022-02-17 17:41:35 +103020
21 rc = write(STDOUT_FILENO, msg, len);
22 if (rc < 0)
23 warn("Write failed");
24 else if ((size_t)rc < len)
25 warnx("Short write of length %zd, requested %zd", rc, len);
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080026}
27
28int main(void)
29{
30 struct mctp_binding_serial *serial[2];
Andrew Jeffery435670d2022-09-30 14:19:44 +093031 mctp_eid_t eids[] = { 8, 9 };
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080032 struct pollfd pollfds[3];
Jeremy Kerr73d8bc82019-02-08 09:34:20 +080033 int rc, n, mctp_fds[2];
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080034 struct mctp *mctp[2];
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080035
36 mctp[0] = mctp_init();
37 mctp[1] = mctp_init();
38
39 assert(mctp[0] && mctp[1]);
40
41 serial[0] = mctp_serial_init();
42 serial[1] = mctp_serial_init();
43
44 assert(serial[0] && serial[1]);
45
Jeremy Kerr73d8bc82019-02-08 09:34:20 +080046 rc = socketpair(AF_UNIX, SOCK_STREAM, 0, mctp_fds);
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080047 if (rc)
48 err(EXIT_FAILURE, "Can't create sockets");
49
50 mctp_serial_open_fd(serial[0], mctp_fds[0]);
51 mctp_serial_open_fd(serial[1], mctp_fds[1]);
52
Andrew Jeffery435670d2022-09-30 14:19:44 +093053 mctp_register_bus(mctp[0], mctp_binding_serial_core(serial[0]),
54 eids[0]);
55 mctp_register_bus(mctp[1], mctp_binding_serial_core(serial[1]),
56 eids[1]);
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080057
58 mctp_set_rx_all(mctp[1], rx_message, NULL);
59
60 pollfds[0].fd = mctp_fds[0];
61 pollfds[0].events = POLLIN;
62 pollfds[1].fd = mctp_fds[1];
63 pollfds[1].events = POLLIN;
64 pollfds[2].fd = STDIN_FILENO;
65 pollfds[2].events = POLLIN;
Jeremy Kerr73d8bc82019-02-08 09:34:20 +080066 n = 3;
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080067
68 for (;;) {
69 uint8_t buf[1024];
70
Jeremy Kerr73d8bc82019-02-08 09:34:20 +080071 rc = poll(pollfds, n, -1);
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080072 if (rc < 0)
73 return EXIT_FAILURE;
74
Jeremy Kerr73d8bc82019-02-08 09:34:20 +080075 if (pollfds[0].revents) {
76 rc = mctp_serial_read(serial[0]);
77 if (rc)
78 pollfds[0].fd = -1;
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080079 }
Jeremy Kerr73d8bc82019-02-08 09:34:20 +080080
81 if (pollfds[1].revents) {
82 rc = mctp_serial_read(serial[1]);
83 if (rc)
84 pollfds[1].fd = -1;
85 }
86
87 if (n > 2 && pollfds[2].revents) {
88 rc = read(STDIN_FILENO, buf, sizeof(buf));
89 if (rc == 0) {
90 n = 2;
91 close(mctp_fds[0]);
92 pollfds[0].fd = -1;
93 } else if (rc < 0) {
94 err(EXIT_FAILURE, "read");
95 } else {
Sumanth Bhatf39c3852022-01-10 17:04:10 +053096 mctp_message_tx(mctp[0], eids[1],
97 MCTP_MESSAGE_TO_SRC, 0, buf,
98 rc);
Jeremy Kerr73d8bc82019-02-08 09:34:20 +080099 }
100 }
101
102 if (n == 2 && pollfds[0].fd < 0 && pollfds[1].fd < 0)
103 break;
Jeremy Kerr4cdc2002019-02-07 16:49:12 +0800104 }
105
106 return EXIT_SUCCESS;
Jeremy Kerr4cdc2002019-02-07 16:49:12 +0800107}