blob: aa282c90efe4dea9d5d28c8151dbd160bd118b62 [file] [log] [blame]
Andrew Jeffery25de0932020-02-06 15:56:12 +10301/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2
3#define _GNU_SOURCE
4
Andrew Jeffery2cda40f2020-02-28 15:26:20 +10305#if HAVE_CONFIG_H
Andrew Jeffery25de0932020-02-06 15:56:12 +10306#include "config.h"
Andrew Jeffery2cda40f2020-02-28 15:26:20 +10307#endif
Andrew Jeffery25de0932020-02-06 15:56:12 +10308
Andrew Jeffery5ab78252022-02-17 21:04:59 +10309#include "compiler.h"
Andrew Jeffery25de0932020-02-06 15:56:12 +103010#include "libmctp-log.h"
11#include "libmctp-serial.h"
12
13#ifdef NDEBUG
14#undef NDEBUG
15#endif
16
17#include <assert.h>
18#include <fcntl.h>
Andrew Jefferyb633b3f2020-02-25 15:49:22 +103019#include <stdbool.h>
Andrew Jeffery25de0932020-02-06 15:56:12 +103020#include <stdio.h>
21#include <string.h>
22#include <unistd.h>
23
24struct mctp_binding_serial_pipe {
25 int ingress;
26 int egress;
27
28 struct mctp_binding_serial *serial;
29};
30
31static int mctp_binding_serial_pipe_tx(void *data, void *buf, size_t len)
32{
33 struct mctp_binding_serial_pipe *ctx = data;
34 ssize_t rc;
35
36 rc = write(ctx->egress, buf, len);
Andrew Jefferyb93b6112020-06-05 14:13:44 +093037 assert(rc >= 0);
38 assert((size_t)rc == len);
Andrew Jeffery89a2b8e2020-02-07 17:07:38 +103039
40 return rc;
Andrew Jeffery25de0932020-02-06 15:56:12 +103041}
42
43uint8_t mctp_msg_src[2 * MCTP_BTU];
44
Andrew Jefferyb633b3f2020-02-25 15:49:22 +103045static bool seen;
Sumanth Bhatf39c3852022-01-10 17:04:10 +053046static bool received_tag_owner;
47static uint8_t received_msg_tag;
Andrew Jefferyb633b3f2020-02-25 15:49:22 +103048
Sumanth Bhatf39c3852022-01-10 17:04:10 +053049static void rx_message(uint8_t eid __unused, bool tag_owner, uint8_t msg_tag,
50 void *data __unused, void *msg, size_t len)
Andrew Jeffery25de0932020-02-06 15:56:12 +103051{
52 uint8_t type;
53
54 type = *(uint8_t *)msg;
55
Sumanth Bhatf39c3852022-01-10 17:04:10 +053056 mctp_prdebug("MCTP message received: len %zd, type %d, tag %d", len,
57 type, msg_tag);
Andrew Jeffery25de0932020-02-06 15:56:12 +103058
59 assert(sizeof(mctp_msg_src) == len);
60 assert(!memcmp(mctp_msg_src, msg, len));
Andrew Jefferyb633b3f2020-02-25 15:49:22 +103061
62 seen = true;
Sumanth Bhatf39c3852022-01-10 17:04:10 +053063 received_msg_tag = msg_tag;
64 received_tag_owner = tag_owner;
Andrew Jeffery25de0932020-02-06 15:56:12 +103065}
66
Andrew Jefferyb633b3f2020-02-25 15:49:22 +103067struct serial_test {
68 struct mctp_binding_serial_pipe binding;
69 struct mctp *mctp;
70};
71
Andrew Jeffery25de0932020-02-06 15:56:12 +103072int main(void)
73{
Andrew Jefferyb633b3f2020-02-25 15:49:22 +103074 struct serial_test scenario[2];
75
Andrew Jefferyf0315a32020-03-10 23:49:41 +103076 struct mctp_binding_serial_pipe *a;
77 struct mctp_binding_serial_pipe *b;
Sumanth Bhatf39c3852022-01-10 17:04:10 +053078 uint8_t msg_tag = 2;
79 bool tag_owner = false;
Andrew Jeffery25de0932020-02-06 15:56:12 +103080 int p[2][2];
81 int rc;
82
83 mctp_set_log_stdio(MCTP_LOG_DEBUG);
84
85 memset(&mctp_msg_src[0], 0x5a, MCTP_BTU);
86 memset(&mctp_msg_src[MCTP_BTU], 0xa5, MCTP_BTU);
87
88 rc = pipe(p[0]);
89 assert(!rc);
90
91 rc = pipe(p[1]);
92 assert(!rc);
93
Andrew Jeffery25de0932020-02-06 15:56:12 +103094 /* Instantiate the A side of the serial pipe */
Andrew Jefferyb633b3f2020-02-25 15:49:22 +103095 scenario[0].mctp = mctp_init();
96 assert(scenario[0].mctp);
Andrew Jefferyf0315a32020-03-10 23:49:41 +103097 scenario[0].binding.serial = mctp_serial_init();
98 assert(scenario[0].binding.serial);
99 a = &scenario[0].binding;
Andrew Jeffery25de0932020-02-06 15:56:12 +1030100 a->ingress = p[0][0];
101 a->egress = p[1][1];
102 mctp_serial_open_fd(a->serial, a->ingress);
103 mctp_serial_set_tx_fn(a->serial, mctp_binding_serial_pipe_tx, a);
Andrew Jefferyb633b3f2020-02-25 15:49:22 +1030104 mctp_register_bus(scenario[0].mctp, mctp_binding_serial_core(a->serial), 8);
Andrew Jeffery25de0932020-02-06 15:56:12 +1030105
106 /* Instantiate the B side of the serial pipe */
Andrew Jefferyb633b3f2020-02-25 15:49:22 +1030107 scenario[1].mctp = mctp_init();
108 assert(scenario[1].mctp);
109 mctp_set_rx_all(scenario[1].mctp, rx_message, NULL);
Andrew Jefferyf0315a32020-03-10 23:49:41 +1030110 scenario[1].binding.serial = mctp_serial_init();
111 assert(scenario[1].binding.serial);
112 b = &scenario[1].binding;
Andrew Jeffery25de0932020-02-06 15:56:12 +1030113 b->ingress = p[1][0];
114 b->egress = p[0][1];
115 mctp_serial_open_fd(b->serial, b->ingress);
116 mctp_serial_set_tx_fn(b->serial, mctp_binding_serial_pipe_tx, a);
Andrew Jefferyb633b3f2020-02-25 15:49:22 +1030117 mctp_register_bus(scenario[1].mctp, mctp_binding_serial_core(b->serial), 9);
Andrew Jeffery25de0932020-02-06 15:56:12 +1030118
Sumanth Bhatf39c3852022-01-10 17:04:10 +0530119 /* Transmit a message from A to B, with message tag */
120 rc = mctp_message_tx(scenario[0].mctp, 9, tag_owner, msg_tag,
121 mctp_msg_src, sizeof(mctp_msg_src));
Andrew Jeffery25de0932020-02-06 15:56:12 +1030122 assert(rc == 0);
123
124 /* Read the message at B from A */
Andrew Jefferyb633b3f2020-02-25 15:49:22 +1030125 seen = false;
Sumanth Bhatf39c3852022-01-10 17:04:10 +0530126 received_tag_owner = true;
127 received_msg_tag = 0;
Andrew Jeffery25de0932020-02-06 15:56:12 +1030128 mctp_serial_read(b->serial);
Andrew Jefferyb633b3f2020-02-25 15:49:22 +1030129 assert(seen);
Sumanth Bhatf39c3852022-01-10 17:04:10 +0530130 assert(received_tag_owner == tag_owner);
131 assert(received_msg_tag == msg_tag);
Andrew Jeffery25de0932020-02-06 15:56:12 +1030132
Andrew Jefferyf0315a32020-03-10 23:49:41 +1030133 mctp_serial_destroy(scenario[1].binding.serial);
134 mctp_destroy(scenario[1].mctp);
135 mctp_serial_destroy(scenario[0].binding.serial);
136 mctp_destroy(scenario[0].mctp);
137
Andrew Jeffery25de0932020-02-06 15:56:12 +1030138 return 0;
139}