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