blob: 2646b8c1f4fab5ac0fd94d8ab913ad9399aa397a [file] [log] [blame]
Wiktor Gołgowskiba6727e2020-03-13 18:25:01 +01001/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2
3#include "test-utils.h"
4
Andrew Jeffery5ab78252022-02-17 21:04:59 +10305#include "compiler.h"
6#include "libmctp.h"
7#include "libmctp-alloc.h"
8#include "libmctp-cmds.h"
9
Wiktor Gołgowskiba6727e2020-03-13 18:25:01 +010010#include <stdio.h>
11#include <string.h>
12#include <assert.h>
13
Wiktor Gołgowskiba6727e2020-03-13 18:25:01 +010014#ifdef NDEBUG
15#undef NDEBUG
16#endif
17
18static const mctp_eid_t eid_1 = 9;
19static const mctp_eid_t eid_2 = 10;
20
21struct msg_payload {
22 struct mctp_hdr hdr;
23 struct mctp_ctrl_msg_hdr ctrl_hdr;
24};
25
26struct callback_data {
27 uint8_t invoked;
28 union {
29 uint8_t command_code;
30 uint8_t completion_code;
31 };
32};
33
Andrew Jefferyb93b6112020-06-05 14:13:44 +093034static void control_message_transport_callback(mctp_eid_t src __unused,
Sumanth Bhatf39c3852022-01-10 17:04:10 +053035 bool tag_owner __unused,
36 uint8_t msg_tag __unused,
Andrew Jefferyb93b6112020-06-05 14:13:44 +093037 void *data, void *buf,
38 size_t len __unused)
Wiktor Gołgowskiba6727e2020-03-13 18:25:01 +010039{
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
48static 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);
Matt Johnston4a09e1d2024-09-13 14:55:58 +080053 mctp_pktbuf_free(pkt);
Wiktor Gołgowskiba6727e2020-03-13 18:25:01 +010054}
55
56static 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
Matt Johnston4a09e1d2024-09-13 14:55:58 +080063 uint8_t tx_storage[MCTP_PKTBUF_SIZE(MCTP_BTU)];
Wiktor Gołgowskiba6727e2020-03-13 18:25:01 +010064 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);
Andrew Jeffery39da3d02021-03-12 16:51:26 +103069 test_binding->pkt_header = 0;
70 test_binding->pkt_trailer = 0;
Wiktor Gołgowskiba6727e2020-03-13 18:25:01 +010071 test_binding->control_rx = control_message_transport_callback;
72 test_binding->control_rx_data = callback_ctx;
Matt Johnston4a09e1d2024-09-13 14:55:58 +080073 test_binding->tx_storage = tx_storage;
Wiktor Gołgowskiba6727e2020-03-13 18:25:01 +010074
75 mctp_register_bus(test_endpoint, test_binding, eid_1);
76 mctp_binding_set_tx_enabled(test_binding, true);
77}
78
79static 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
Andrew Jefferyb93b6112020-06-05 14:13:44 +0930109int main(void)
Wiktor Gołgowskiba6727e2020-03-13 18:25:01 +0100110{
111 send_transport_control_message();
112
113 return EXIT_SUCCESS;
114}