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 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 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 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)]; 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 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 109 int main(void) 110 { 111 send_transport_control_message(); 112 113 return EXIT_SUCCESS; 114 } 115