blob: a37fbd0ab1d82321b4926c4f0624ecf4a02453cd [file] [log] [blame]
Jeremy Kerr1a4ec3c2019-09-03 11:01:50 +08001/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2
3#include <assert.h>
4#include <stdlib.h>
5#include <stdio.h>
6#include <string.h>
7
8#include <libmctp.h>
9#include <libmctp-alloc.h>
10
11#include "test-utils.h"
12
13struct mctp_binding_bridge {
Patrick Williamsa721c2d2022-12-04 14:30:26 -060014 struct mctp_binding binding;
15 int rx_count;
16 int tx_count;
17 uint8_t last_pkt_data;
Jeremy Kerr1a4ec3c2019-09-03 11:01:50 +080018};
19
20struct test_ctx {
Patrick Williamsa721c2d2022-12-04 14:30:26 -060021 struct mctp *mctp;
22 struct mctp_binding_bridge *bindings[2];
Jeremy Kerr1a4ec3c2019-09-03 11:01:50 +080023};
24
25static int mctp_binding_bridge_tx(struct mctp_binding *b,
Patrick Williamsa721c2d2022-12-04 14:30:26 -060026 struct mctp_pktbuf *pkt)
Jeremy Kerr1a4ec3c2019-09-03 11:01:50 +080027{
Patrick Williamsa721c2d2022-12-04 14:30:26 -060028 struct mctp_binding_bridge *binding =
29 container_of(b, struct mctp_binding_bridge, binding);
Jeremy Kerr1a4ec3c2019-09-03 11:01:50 +080030
31 binding->tx_count++;
32 assert(mctp_pktbuf_size(pkt) == sizeof(struct mctp_hdr) + 1);
33 binding->last_pkt_data = *(uint8_t *)mctp_pktbuf_data(pkt);
34
35 return 0;
36}
37
Andrew Jefferycdfafd92020-02-07 17:10:34 +103038static void mctp_binding_bridge_rx(struct mctp_binding_bridge *binding,
Patrick Williamsa721c2d2022-12-04 14:30:26 -060039 uint8_t key)
Jeremy Kerr1a4ec3c2019-09-03 11:01:50 +080040{
41 struct mctp_pktbuf *pkt;
42 struct mctp_hdr *hdr;
43 uint8_t *buf;
44
Patrick Williamsa721c2d2022-12-04 14:30:26 -060045 pkt = mctp_pktbuf_alloc(&binding->binding, sizeof(struct mctp_hdr) + 1);
Andrew Jefferycdfafd92020-02-07 17:10:34 +103046 assert(pkt);
Jeremy Kerr1a4ec3c2019-09-03 11:01:50 +080047
48 hdr = mctp_pktbuf_hdr(pkt);
49 hdr->flags_seq_tag = MCTP_HDR_FLAG_SOM | MCTP_HDR_FLAG_EOM;
50
51 /* arbitrary src/dest, as we're bridging */
52 hdr->src = 1;
53 hdr->dest = 2;
54
55 buf = mctp_pktbuf_data(pkt);
56 *buf = key;
57
58 binding->rx_count++;
59 mctp_bus_rx(&binding->binding, pkt);
60}
61
62static struct mctp_binding_bridge *mctp_binding_bridge_init(void)
63{
64 struct mctp_binding_bridge *binding;
65
66 binding = __mctp_alloc(sizeof(*binding));
67 memset(binding, 0, sizeof(*binding));
68 binding->binding.name = "test";
69 binding->binding.version = 1;
70 binding->binding.tx = mctp_binding_bridge_tx;
Andrew Jeffery73c268e2020-01-30 10:16:09 +103071 binding->binding.pkt_size = MCTP_PACKET_SIZE(MCTP_BTU);
Andrew Jeffery39da3d02021-03-12 16:51:26 +103072 binding->binding.pkt_header = 0;
73 binding->binding.pkt_trailer = 0;
Jeremy Kerr1a4ec3c2019-09-03 11:01:50 +080074 return binding;
75}
76
77int main(void)
78{
79 struct test_ctx _ctx, *ctx = &_ctx;
80
81 ctx->mctp = mctp_init();
82 ctx->bindings[0] = mctp_binding_bridge_init();
83 ctx->bindings[1] = mctp_binding_bridge_init();
84
Patrick Williamsa721c2d2022-12-04 14:30:26 -060085 mctp_bridge_busses(ctx->mctp, &ctx->bindings[0]->binding,
86 &ctx->bindings[1]->binding);
Jeremy Kerr1a4ec3c2019-09-03 11:01:50 +080087
88 mctp_binding_set_tx_enabled(&ctx->bindings[0]->binding, true);
89 mctp_binding_set_tx_enabled(&ctx->bindings[1]->binding, true);
90
91 mctp_binding_bridge_rx(ctx->bindings[0], 0xaa);
92 assert(ctx->bindings[0]->tx_count == 0);
93 assert(ctx->bindings[1]->tx_count == 1);
94 assert(ctx->bindings[1]->last_pkt_data == 0xaa);
95
96 mctp_binding_bridge_rx(ctx->bindings[1], 0x55);
97 assert(ctx->bindings[1]->tx_count == 1);
98 assert(ctx->bindings[0]->tx_count == 1);
99 assert(ctx->bindings[0]->last_pkt_data == 0x55);
100
Andrew Jefferyc8908ac2020-05-29 09:30:20 +0930101 __mctp_free(ctx->bindings[1]);
102 __mctp_free(ctx->bindings[0]);
103 mctp_destroy(ctx->mctp);
104
Jeremy Kerr1a4ec3c2019-09-03 11:01:50 +0800105 return EXIT_SUCCESS;
106}