blob: 12da74fa6c943a36412f049f577cf48e6b5d1c15 [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
Sumanth Bhatf39c3852022-01-10 17:04:10 +053015static void
16rx_message(uint8_t eid __unused, bool tag_owner __unused,
17 uint8_t msg_tag __unused, void *data __unused, void *msg, 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];
31 mctp_eid_t eids[] = {8, 9};
32 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
Brad Bishope4d84562021-11-30 14:04:10 -050053 mctp_register_bus(mctp[0], mctp_binding_serial_core(serial[0]), eids[0]);
54 mctp_register_bus(mctp[1], mctp_binding_serial_core(serial[1]), eids[1]);
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080055
56 mctp_set_rx_all(mctp[1], rx_message, NULL);
57
58 pollfds[0].fd = mctp_fds[0];
59 pollfds[0].events = POLLIN;
60 pollfds[1].fd = mctp_fds[1];
61 pollfds[1].events = POLLIN;
62 pollfds[2].fd = STDIN_FILENO;
63 pollfds[2].events = POLLIN;
Jeremy Kerr73d8bc82019-02-08 09:34:20 +080064 n = 3;
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080065
66 for (;;) {
67 uint8_t buf[1024];
68
Jeremy Kerr73d8bc82019-02-08 09:34:20 +080069 rc = poll(pollfds, n, -1);
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080070 if (rc < 0)
71 return EXIT_FAILURE;
72
Jeremy Kerr73d8bc82019-02-08 09:34:20 +080073 if (pollfds[0].revents) {
74 rc = mctp_serial_read(serial[0]);
75 if (rc)
76 pollfds[0].fd = -1;
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080077 }
Jeremy Kerr73d8bc82019-02-08 09:34:20 +080078
79 if (pollfds[1].revents) {
80 rc = mctp_serial_read(serial[1]);
81 if (rc)
82 pollfds[1].fd = -1;
83 }
84
85 if (n > 2 && pollfds[2].revents) {
86 rc = read(STDIN_FILENO, buf, sizeof(buf));
87 if (rc == 0) {
88 n = 2;
89 close(mctp_fds[0]);
90 pollfds[0].fd = -1;
91 } else if (rc < 0) {
92 err(EXIT_FAILURE, "read");
93 } else {
Sumanth Bhatf39c3852022-01-10 17:04:10 +053094 mctp_message_tx(mctp[0], eids[1],
95 MCTP_MESSAGE_TO_SRC, 0, buf,
96 rc);
Jeremy Kerr73d8bc82019-02-08 09:34:20 +080097 }
98 }
99
100 if (n == 2 && pollfds[0].fd < 0 && pollfds[1].fd < 0)
101 break;
Jeremy Kerr4cdc2002019-02-07 16:49:12 +0800102 }
103
104 return EXIT_SUCCESS;
105
106}