1 /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2
3 #ifdef NDEBUG
4 #undef NDEBUG
5 #endif
6
7 #include <assert.h>
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <string.h>
11
12 #include "compiler.h"
13 #include "libmctp.h"
14 #include "test-utils.h"
15
16 struct test_ctx {
17 struct mctp *mctp;
18 struct mctp_binding_test *binding;
19 int rx_count;
20 mctp_eid_t src_eid;
21 };
22
test_rx(uint8_t eid,bool tag_owner __unused,uint8_t msg_tag __unused,void * data,void * msg __unused,size_t len __unused)23 static void test_rx(uint8_t eid, bool tag_owner __unused,
24 uint8_t msg_tag __unused, void *data, void *msg __unused,
25 size_t len __unused)
26 {
27 struct test_ctx *ctx = data;
28
29 (void)msg;
30 (void)len;
31
32 ctx->rx_count++;
33 ctx->src_eid = eid;
34 }
35
create_packet(struct mctp_hdr * pkt,mctp_eid_t src,mctp_eid_t dest)36 static void create_packet(struct mctp_hdr *pkt, mctp_eid_t src, mctp_eid_t dest)
37 {
38 memset(pkt, 0, sizeof(*pkt));
39 pkt->src = src;
40 pkt->dest = dest;
41 pkt->flags_seq_tag = MCTP_HDR_FLAG_SOM | MCTP_HDR_FLAG_EOM;
42 }
43
main(void)44 int main(void)
45 {
46 struct test_ctx _ctx, *ctx = &_ctx;
47 const mctp_eid_t local_eid = 8;
48 const mctp_eid_t remote_eid = 9;
49 const mctp_eid_t other_eid = 10;
50 struct {
51 struct mctp_hdr hdr;
52 uint8_t payload[1];
53 } pktbuf;
54
55 mctp_test_stack_init(&ctx->mctp, &ctx->binding, local_eid);
56
57 mctp_set_rx_all(ctx->mctp, test_rx, ctx);
58
59 /* check a message addressed to us is received */
60 ctx->rx_count = 0;
61
62 create_packet(&pktbuf.hdr, remote_eid, local_eid);
63
64 mctp_binding_test_rx_raw(ctx->binding, &pktbuf, sizeof(pktbuf));
65
66 assert(ctx->rx_count == 1);
67 assert(ctx->src_eid == remote_eid);
68
69 /* check a message not addressed to us is not received */
70 ctx->rx_count = 0;
71
72 create_packet(&pktbuf.hdr, remote_eid, other_eid);
73
74 mctp_binding_test_rx_raw(ctx->binding, &pktbuf, sizeof(pktbuf));
75
76 assert(ctx->rx_count == 0);
77
78 mctp_binding_test_destroy(ctx->binding);
79 mctp_destroy(ctx->mctp);
80
81 return EXIT_SUCCESS;
82 }
83