xref: /openbmc/libmctp/tests/test_cmds.c (revision a3830d259a53269f7b9c8b46129e863ebed1b188)
1 /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2 
3 #include "test-utils.h"
4 
5 #include "compiler.h"
6 #include "libmctp.h"
7 #include "libmctp-alloc.h"
8 #include "libmctp-cmds.h"
9 
10 #include <stdio.h>
11 #include <string.h>
12 #include <assert.h>
13 
14 #ifdef NDEBUG
15 #undef NDEBUG
16 #endif
17 
18 static const mctp_eid_t eid_1 = 9;
19 static const mctp_eid_t eid_2 = 10;
20 
21 struct msg_payload {
22 	struct mctp_hdr hdr;
23 	struct mctp_ctrl_msg_hdr ctrl_hdr;
24 };
25 
26 struct callback_data {
27 	uint8_t invoked;
28 	union {
29 		uint8_t command_code;
30 		uint8_t completion_code;
31 	};
32 };
33 
control_message_transport_callback(mctp_eid_t src __unused,bool tag_owner __unused,uint8_t msg_tag __unused,void * data,void * buf,size_t len __unused)34 static void control_message_transport_callback(mctp_eid_t src __unused,
35 					       bool tag_owner __unused,
36 					       uint8_t msg_tag __unused,
37 					       void *data, void *buf,
38 					       size_t len __unused)
39 {
40 	struct callback_data *ctx = data;
41 	struct mctp_ctrl_msg_hdr *msg_hdr = buf;
42 	printf("Transport control message received - command code: 0x%X\n",
43 	       msg_hdr->command_code);
44 	ctx->invoked++;
45 	assert(msg_hdr->command_code == ctx->command_code);
46 }
47 
rcv_ctrl_msg(struct mctp_binding * b,const void * buf,size_t len)48 static void rcv_ctrl_msg(struct mctp_binding *b, const void *buf, size_t len)
49 {
50 	struct mctp_pktbuf *pkt = mctp_pktbuf_alloc(b, len);
51 	memcpy(mctp_pktbuf_hdr(pkt), buf, len);
52 	mctp_bus_rx(b, pkt);
53 	mctp_pktbuf_free(pkt);
54 }
55 
setup_test_binding(struct mctp_binding * test_binding,struct mctp * test_endpoint,void * callback_ctx)56 static void setup_test_binding(struct mctp_binding *test_binding,
57 			       struct mctp *test_endpoint, void *callback_ctx)
58 {
59 	assert(test_binding != NULL);
60 	assert(test_endpoint != NULL);
61 	assert(callback_ctx != NULL);
62 
63 	uint8_t tx_storage[MCTP_PKTBUF_SIZE(MCTP_BTU)] PKTBUF_STORAGE_ALIGN;
64 	memset(test_binding, 0, sizeof(*test_binding));
65 	test_binding->name = "test";
66 	test_binding->version = 1;
67 	test_binding->tx = NULL;
68 	test_binding->pkt_size = MCTP_PACKET_SIZE(MCTP_BTU);
69 	test_binding->pkt_header = 0;
70 	test_binding->pkt_trailer = 0;
71 	test_binding->control_rx = control_message_transport_callback;
72 	test_binding->control_rx_data = callback_ctx;
73 	test_binding->tx_storage = tx_storage;
74 
75 	mctp_register_bus(test_endpoint, test_binding, eid_1);
76 	mctp_binding_set_tx_enabled(test_binding, true);
77 }
78 
send_transport_control_message(void)79 static void send_transport_control_message(void)
80 {
81 	struct mctp *endpoint = mctp_init();
82 	struct mctp_binding binding;
83 	struct callback_data ctx;
84 	static const struct msg_payload send_control_message_payload = {
85 		.hdr = {
86 			.dest = eid_1,
87 			.src = eid_2,
88 			.flags_seq_tag = MCTP_HDR_FLAG_SOM | MCTP_HDR_FLAG_EOM,
89 		},
90 		.ctrl_hdr = {
91 			.ic_msg_type = MCTP_CTRL_HDR_MSG_TYPE,
92 			.rq_dgram_inst = MCTP_CTRL_HDR_FLAG_REQUEST,
93 			.command_code = 0xF2,
94 		},
95 	};
96 
97 	memset(&ctx, 0, sizeof(ctx));
98 	setup_test_binding(&binding, endpoint, &ctx);
99 	ctx.command_code = send_control_message_payload.ctrl_hdr.command_code;
100 	printf("Sending transport control message: 0x%X\n",
101 	       send_control_message_payload.ctrl_hdr.command_code);
102 	rcv_ctrl_msg(&binding, (void *)&send_control_message_payload,
103 		     sizeof(send_control_message_payload));
104 	assert(ctx.invoked == 1);
105 
106 	mctp_destroy(endpoint);
107 }
108 
main(void)109 int main(void)
110 {
111 	send_transport_control_message();
112 
113 	return EXIT_SUCCESS;
114 }
115