13d36ee2eSJeremy Kerr /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
24dc8f953SJeremy Kerr
3*e915aad4SRashmica Gupta #ifdef NDEBUG
4*e915aad4SRashmica Gupta #undef NDEBUG
5*e915aad4SRashmica Gupta #endif
6*e915aad4SRashmica Gupta
74dc8f953SJeremy Kerr #include <assert.h>
84dc8f953SJeremy Kerr #include <stdlib.h>
94dc8f953SJeremy Kerr #include <stdio.h>
104dc8f953SJeremy Kerr #include <string.h>
114dc8f953SJeremy Kerr
125ab78259SAndrew Jeffery #include "compiler.h"
135ab78259SAndrew Jeffery #include "libmctp.h"
144dc8f953SJeremy Kerr #include "test-utils.h"
154dc8f953SJeremy Kerr
164dc8f953SJeremy Kerr struct test_ctx {
174dc8f953SJeremy Kerr struct mctp *mctp;
184dc8f953SJeremy Kerr struct mctp_binding_test *binding;
194dc8f953SJeremy Kerr int rx_count;
204dc8f953SJeremy Kerr mctp_eid_t src_eid;
214dc8f953SJeremy Kerr };
224dc8f953SJeremy Kerr
test_rx(uint8_t eid,bool tag_owner __unused,uint8_t msg_tag __unused,void * data,void * msg __unused,size_t len __unused)23a721c2d8SPatrick Williams static void test_rx(uint8_t eid, bool tag_owner __unused,
24a721c2d8SPatrick Williams uint8_t msg_tag __unused, void *data, void *msg __unused,
25a721c2d8SPatrick Williams size_t len __unused)
264dc8f953SJeremy Kerr {
274dc8f953SJeremy Kerr struct test_ctx *ctx = data;
284dc8f953SJeremy Kerr
294dc8f953SJeremy Kerr (void)msg;
304dc8f953SJeremy Kerr (void)len;
314dc8f953SJeremy Kerr
324dc8f953SJeremy Kerr ctx->rx_count++;
334dc8f953SJeremy Kerr ctx->src_eid = eid;
344dc8f953SJeremy Kerr }
354dc8f953SJeremy Kerr
create_packet(struct mctp_hdr * pkt,mctp_eid_t src,mctp_eid_t dest)36a721c2d8SPatrick Williams static void create_packet(struct mctp_hdr *pkt, mctp_eid_t src, mctp_eid_t dest)
374dc8f953SJeremy Kerr {
384dc8f953SJeremy Kerr memset(pkt, 0, sizeof(*pkt));
394dc8f953SJeremy Kerr pkt->src = src;
404dc8f953SJeremy Kerr pkt->dest = dest;
414dc8f953SJeremy Kerr pkt->flags_seq_tag = MCTP_HDR_FLAG_SOM | MCTP_HDR_FLAG_EOM;
424dc8f953SJeremy Kerr }
434dc8f953SJeremy Kerr
main(void)444dc8f953SJeremy Kerr int main(void)
454dc8f953SJeremy Kerr {
464dc8f953SJeremy Kerr struct test_ctx _ctx, *ctx = &_ctx;
474dc8f953SJeremy Kerr const mctp_eid_t local_eid = 8;
484dc8f953SJeremy Kerr const mctp_eid_t remote_eid = 9;
494dc8f953SJeremy Kerr const mctp_eid_t other_eid = 10;
504dc8f953SJeremy Kerr struct {
514dc8f953SJeremy Kerr struct mctp_hdr hdr;
524dc8f953SJeremy Kerr uint8_t payload[1];
534dc8f953SJeremy Kerr } pktbuf;
544dc8f953SJeremy Kerr
554dc8f953SJeremy Kerr mctp_test_stack_init(&ctx->mctp, &ctx->binding, local_eid);
564dc8f953SJeremy Kerr
574dc8f953SJeremy Kerr mctp_set_rx_all(ctx->mctp, test_rx, ctx);
584dc8f953SJeremy Kerr
594dc8f953SJeremy Kerr /* check a message addressed to us is received */
604dc8f953SJeremy Kerr ctx->rx_count = 0;
614dc8f953SJeremy Kerr
624dc8f953SJeremy Kerr create_packet(&pktbuf.hdr, remote_eid, local_eid);
634dc8f953SJeremy Kerr
644dc8f953SJeremy Kerr mctp_binding_test_rx_raw(ctx->binding, &pktbuf, sizeof(pktbuf));
654dc8f953SJeremy Kerr
664dc8f953SJeremy Kerr assert(ctx->rx_count == 1);
674dc8f953SJeremy Kerr assert(ctx->src_eid == remote_eid);
684dc8f953SJeremy Kerr
694dc8f953SJeremy Kerr /* check a message not addressed to us is not received */
704dc8f953SJeremy Kerr ctx->rx_count = 0;
714dc8f953SJeremy Kerr
724dc8f953SJeremy Kerr create_packet(&pktbuf.hdr, remote_eid, other_eid);
734dc8f953SJeremy Kerr
744dc8f953SJeremy Kerr mctp_binding_test_rx_raw(ctx->binding, &pktbuf, sizeof(pktbuf));
754dc8f953SJeremy Kerr
764dc8f953SJeremy Kerr assert(ctx->rx_count == 0);
774dc8f953SJeremy Kerr
787c73801eSAndrew Jeffery mctp_binding_test_destroy(ctx->binding);
797c73801eSAndrew Jeffery mctp_destroy(ctx->mctp);
807c73801eSAndrew Jeffery
814dc8f953SJeremy Kerr return EXIT_SUCCESS;
824dc8f953SJeremy Kerr }
83