xref: /openbmc/libmctp/tests/test_bridge.c (revision 6896d41e)
1 /* 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 
13 struct mctp_binding_bridge {
14 	struct mctp_binding	binding;
15 	int			rx_count;
16 	int			tx_count;
17 	uint8_t			last_pkt_data;
18 };
19 
20 struct test_ctx {
21 	struct mctp			*mctp;
22 	struct mctp_binding_bridge	*bindings[2];
23 };
24 
25 static int mctp_binding_bridge_tx(struct mctp_binding *b,
26 		struct mctp_pktbuf *pkt)
27 {
28 	struct mctp_binding_bridge *binding = container_of(b,
29 			struct mctp_binding_bridge, binding);
30 
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 
38 static void mctp_binding_bridge_rx(struct mctp_binding_bridge *binding,
39 		uint8_t key)
40 {
41 	struct mctp_pktbuf *pkt;
42 	struct mctp_hdr *hdr;
43 	uint8_t *buf;
44 
45 	pkt = mctp_pktbuf_alloc(&binding->binding,
46 			sizeof(struct mctp_hdr) + 1);
47 	assert(pkt);
48 
49 	hdr = mctp_pktbuf_hdr(pkt);
50 	hdr->flags_seq_tag = MCTP_HDR_FLAG_SOM | MCTP_HDR_FLAG_EOM;
51 
52 	/* arbitrary src/dest, as we're bridging */
53 	hdr->src = 1;
54 	hdr->dest = 2;
55 
56 	buf = mctp_pktbuf_data(pkt);
57 	*buf = key;
58 
59 	binding->rx_count++;
60 	mctp_bus_rx(&binding->binding, pkt);
61 }
62 
63 static struct mctp_binding_bridge *mctp_binding_bridge_init(void)
64 {
65 	struct mctp_binding_bridge *binding;
66 
67 	binding = __mctp_alloc(sizeof(*binding));
68 	memset(binding, 0, sizeof(*binding));
69 	binding->binding.name = "test";
70 	binding->binding.version = 1;
71 	binding->binding.tx = mctp_binding_bridge_tx;
72 	binding->binding.pkt_size = MCTP_PACKET_SIZE(MCTP_BTU);
73 	binding->binding.pkt_pad = 0;
74 	return binding;
75 }
76 
77 int 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 
85 	mctp_bridge_busses(ctx->mctp,
86 			&ctx->bindings[0]->binding,
87 			&ctx->bindings[1]->binding);
88 
89 	mctp_binding_set_tx_enabled(&ctx->bindings[0]->binding, true);
90 	mctp_binding_set_tx_enabled(&ctx->bindings[1]->binding, true);
91 
92 	mctp_binding_bridge_rx(ctx->bindings[0], 0xaa);
93 	assert(ctx->bindings[0]->tx_count == 0);
94 	assert(ctx->bindings[1]->tx_count == 1);
95 	assert(ctx->bindings[1]->last_pkt_data == 0xaa);
96 
97 	mctp_binding_bridge_rx(ctx->bindings[1], 0x55);
98 	assert(ctx->bindings[1]->tx_count == 1);
99 	assert(ctx->bindings[0]->tx_count == 1);
100 	assert(ctx->bindings[0]->last_pkt_data == 0x55);
101 
102 	return EXIT_SUCCESS;
103 }
104