xref: /openbmc/libmctp/tests/test_eid.c (revision e915aad4408efd98e882de3f4512d4a3c8953bd4)
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