xref: /dpdk/app/test/test_graph.c (revision 6eccb0c9)
16b896504SKiran Kumar K /* SPDX-License-Identifier: BSD-3-Clause
26b896504SKiran Kumar K  * Copyright(C) 2020 Marvell International Ltd.
36b896504SKiran Kumar K  */
43c60274cSJie Zhou 
53c60274cSJie Zhou #include "test.h"
63c60274cSJie Zhou 
76b896504SKiran Kumar K #include <assert.h>
86b896504SKiran Kumar K #include <inttypes.h>
96b896504SKiran Kumar K #include <signal.h>
106b896504SKiran Kumar K #include <stdio.h>
116b896504SKiran Kumar K #include <string.h>
126b896504SKiran Kumar K #include <unistd.h>
136b896504SKiran Kumar K 
146b896504SKiran Kumar K #include <rte_errno.h>
153c60274cSJie Zhou 
163c60274cSJie Zhou #ifdef RTE_EXEC_ENV_WINDOWS
173c60274cSJie Zhou static int
test_node_list_dump(void)183c60274cSJie Zhou test_node_list_dump(void)
193c60274cSJie Zhou {
203c60274cSJie Zhou 	printf("node_list_dump not supported on Windows, skipping test\n");
213c60274cSJie Zhou 	return TEST_SKIPPED;
223c60274cSJie Zhou }
233c60274cSJie Zhou 
243c60274cSJie Zhou #else
253c60274cSJie Zhou 
266b896504SKiran Kumar K #include <rte_graph.h>
276b896504SKiran Kumar K #include <rte_graph_worker.h>
286b896504SKiran Kumar K #include <rte_mbuf.h>
29e2e01583SThomas Monjalon #include <rte_mbuf_dyn.h>
309330521cSKiran Kumar K #include <rte_random.h>
316b896504SKiran Kumar K 
326b896504SKiran Kumar K static uint16_t test_node_worker_source(struct rte_graph *graph,
336b896504SKiran Kumar K 					struct rte_node *node, void **objs,
346b896504SKiran Kumar K 					uint16_t nb_objs);
356b896504SKiran Kumar K 
366b896504SKiran Kumar K static uint16_t test_node0_worker(struct rte_graph *graph,
376b896504SKiran Kumar K 				  struct rte_node *node, void **objs,
386b896504SKiran Kumar K 				  uint16_t nb_objs);
396b896504SKiran Kumar K 
406b896504SKiran Kumar K static uint16_t test_node1_worker(struct rte_graph *graph,
416b896504SKiran Kumar K 				  struct rte_node *node, void **objs,
426b896504SKiran Kumar K 				  uint16_t nb_objs);
436b896504SKiran Kumar K 
446b896504SKiran Kumar K static uint16_t test_node2_worker(struct rte_graph *graph,
456b896504SKiran Kumar K 				  struct rte_node *node, void **objs,
466b896504SKiran Kumar K 				  uint16_t nb_objs);
476b896504SKiran Kumar K 
486b896504SKiran Kumar K static uint16_t test_node3_worker(struct rte_graph *graph,
496b896504SKiran Kumar K 				  struct rte_node *node, void **objs,
506b896504SKiran Kumar K 				  uint16_t nb_objs);
516b896504SKiran Kumar K 
526b896504SKiran Kumar K #define MBUFF_SIZE 512
536b896504SKiran Kumar K #define MAX_NODES  4
546b896504SKiran Kumar K 
55e2e01583SThomas Monjalon typedef uint64_t graph_dynfield_t;
56e2e01583SThomas Monjalon static int graph_dynfield_offset = -1;
57e2e01583SThomas Monjalon 
58e2e01583SThomas Monjalon static inline graph_dynfield_t *
graph_field(struct rte_mbuf * mbuf)59e2e01583SThomas Monjalon graph_field(struct rte_mbuf *mbuf)
60e2e01583SThomas Monjalon {
61e2e01583SThomas Monjalon 	return RTE_MBUF_DYNFIELD(mbuf, \
62e2e01583SThomas Monjalon 			graph_dynfield_offset, graph_dynfield_t *);
63e2e01583SThomas Monjalon }
64e2e01583SThomas Monjalon 
656b896504SKiran Kumar K static struct rte_mbuf mbuf[MAX_NODES + 1][MBUFF_SIZE];
666b896504SKiran Kumar K static void *mbuf_p[MAX_NODES + 1][MBUFF_SIZE];
676b896504SKiran Kumar K static rte_graph_t graph_id;
686b896504SKiran Kumar K static uint64_t obj_stats[MAX_NODES + 1];
696b896504SKiran Kumar K static uint64_t fn_calls[MAX_NODES + 1];
706b896504SKiran Kumar K 
716b896504SKiran Kumar K const char *node_patterns[] = {
726b896504SKiran Kumar K 	"test_node_source1",	   "test_node00",
736b896504SKiran Kumar K 	"test_node00-test_node11", "test_node00-test_node22",
746b896504SKiran Kumar K 	"test_node00-test_node33",
756b896504SKiran Kumar K };
766b896504SKiran Kumar K 
776b896504SKiran Kumar K const char *node_names[] = {
786b896504SKiran Kumar K 	"test_node00",
796b896504SKiran Kumar K 	"test_node00-test_node11",
806b896504SKiran Kumar K 	"test_node00-test_node22",
816b896504SKiran Kumar K 	"test_node00-test_node33",
826b896504SKiran Kumar K };
836b896504SKiran Kumar K 
846b896504SKiran Kumar K struct test_node_register {
856b896504SKiran Kumar K 	char name[RTE_NODE_NAMESIZE];
866b896504SKiran Kumar K 	rte_node_process_t process;
876b896504SKiran Kumar K 	uint16_t nb_edges;
886b896504SKiran Kumar K 	const char *next_nodes[MAX_NODES];
896b896504SKiran Kumar K };
906b896504SKiran Kumar K 
916b896504SKiran Kumar K typedef struct {
926b896504SKiran Kumar K 	uint32_t idx;
936b896504SKiran Kumar K 	struct test_node_register node;
946b896504SKiran Kumar K } test_node_t;
956b896504SKiran Kumar K 
966b896504SKiran Kumar K typedef struct {
976b896504SKiran Kumar K 	test_node_t test_node[MAX_NODES];
986b896504SKiran Kumar K } test_main_t;
996b896504SKiran Kumar K 
1006b896504SKiran Kumar K static test_main_t test_main = {
1016b896504SKiran Kumar K 	.test_node = {
1026b896504SKiran Kumar K 		{
1036b896504SKiran Kumar K 			.node = {
1046b896504SKiran Kumar K 					.name = "test_node00",
1056b896504SKiran Kumar K 					.process = test_node0_worker,
1066b896504SKiran Kumar K 					.nb_edges = 2,
1076b896504SKiran Kumar K 					.next_nodes = {"test_node00-"
1086b896504SKiran Kumar K 						       "test_node11",
1096b896504SKiran Kumar K 						       "test_node00-"
1106b896504SKiran Kumar K 						       "test_node22"},
1116b896504SKiran Kumar K 				},
1126b896504SKiran Kumar K 		},
1136b896504SKiran Kumar K 		{
1146b896504SKiran Kumar K 			.node = {
1156b896504SKiran Kumar K 					.name = "test_node11",
1166b896504SKiran Kumar K 					.process = test_node1_worker,
1176b896504SKiran Kumar K 					.nb_edges = 1,
1186b896504SKiran Kumar K 					.next_nodes = {"test_node00-"
1196b896504SKiran Kumar K 						       "test_node22"},
1206b896504SKiran Kumar K 				},
1216b896504SKiran Kumar K 		},
1226b896504SKiran Kumar K 		{
1236b896504SKiran Kumar K 			.node = {
1246b896504SKiran Kumar K 					.name = "test_node22",
1256b896504SKiran Kumar K 					.process = test_node2_worker,
1266b896504SKiran Kumar K 					.nb_edges = 1,
1276b896504SKiran Kumar K 					.next_nodes = {"test_node00-"
1286b896504SKiran Kumar K 						       "test_node33"},
1296b896504SKiran Kumar K 				},
1306b896504SKiran Kumar K 		},
1316b896504SKiran Kumar K 		{
1326b896504SKiran Kumar K 			.node = {
1336b896504SKiran Kumar K 					.name = "test_node33",
1346b896504SKiran Kumar K 					.process = test_node3_worker,
1356b896504SKiran Kumar K 					.nb_edges = 1,
1366b896504SKiran Kumar K 					.next_nodes = {"test_node00"},
1376b896504SKiran Kumar K 				},
1386b896504SKiran Kumar K 		},
1396b896504SKiran Kumar K 	},
1406b896504SKiran Kumar K };
1416b896504SKiran Kumar K 
1426b896504SKiran Kumar K static int
node_init(const struct rte_graph * graph,struct rte_node * node)1436b896504SKiran Kumar K node_init(const struct rte_graph *graph, struct rte_node *node)
1446b896504SKiran Kumar K {
1456b896504SKiran Kumar K 	RTE_SET_USED(graph);
1466b896504SKiran Kumar K 	*(uint32_t *)node->ctx = node->id;
1476b896504SKiran Kumar K 
1486b896504SKiran Kumar K 	return 0;
1496b896504SKiran Kumar K }
1506b896504SKiran Kumar K 
1516b896504SKiran Kumar K static struct rte_node_register test_node_source = {
1526b896504SKiran Kumar K 	.name = "test_node_source1",
1536b896504SKiran Kumar K 	.process = test_node_worker_source,
1546b896504SKiran Kumar K 	.flags = RTE_NODE_SOURCE_F,
1556b896504SKiran Kumar K 	.nb_edges = 2,
1566b896504SKiran Kumar K 	.init = node_init,
1576b896504SKiran Kumar K 	.next_nodes = {"test_node00", "test_node00-test_node11"},
1586b896504SKiran Kumar K };
1596b896504SKiran Kumar K RTE_NODE_REGISTER(test_node_source);
1606b896504SKiran Kumar K 
1616b896504SKiran Kumar K static struct rte_node_register test_node0 = {
1626b896504SKiran Kumar K 	.name = "test_node00",
1636b896504SKiran Kumar K 	.process = test_node0_worker,
1646b896504SKiran Kumar K 	.init = node_init,
1656b896504SKiran Kumar K };
1666b896504SKiran Kumar K RTE_NODE_REGISTER(test_node0);
1676b896504SKiran Kumar K 
1686b896504SKiran Kumar K uint16_t
test_node_worker_source(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)1696b896504SKiran Kumar K test_node_worker_source(struct rte_graph *graph, struct rte_node *node,
1706b896504SKiran Kumar K 			void **objs, uint16_t nb_objs)
1716b896504SKiran Kumar K {
1729330521cSKiran Kumar K 	uint32_t obj_node0 = rte_rand() % 100, obj_node1;
1736b896504SKiran Kumar K 	test_main_t *tm = &test_main;
1746b896504SKiran Kumar K 	struct rte_mbuf *data;
1756b896504SKiran Kumar K 	void **next_stream;
1766b896504SKiran Kumar K 	rte_node_t next;
1776b896504SKiran Kumar K 	uint32_t i;
1786b896504SKiran Kumar K 
1796b896504SKiran Kumar K 	RTE_SET_USED(objs);
1806b896504SKiran Kumar K 	nb_objs = RTE_GRAPH_BURST_SIZE;
1816b896504SKiran Kumar K 
1826b896504SKiran Kumar K 	/* Prepare stream for next node 0 */
1836b896504SKiran Kumar K 	obj_node0 = nb_objs * obj_node0 * 0.01;
1846b896504SKiran Kumar K 	next = 0;
1856b896504SKiran Kumar K 	next_stream = rte_node_next_stream_get(graph, node, next, obj_node0);
1866b896504SKiran Kumar K 	for (i = 0; i < obj_node0; i++) {
1876b896504SKiran Kumar K 		data = &mbuf[0][i];
188e2e01583SThomas Monjalon 		*graph_field(data) = ((uint64_t)tm->test_node[0].idx << 32) | i;
1896b896504SKiran Kumar K 		if ((i + 1) == obj_node0)
190e2e01583SThomas Monjalon 			*graph_field(data) |= (1 << 16);
1916b896504SKiran Kumar K 		next_stream[i] = &mbuf[0][i];
1926b896504SKiran Kumar K 	}
1936b896504SKiran Kumar K 	rte_node_next_stream_put(graph, node, next, obj_node0);
1946b896504SKiran Kumar K 
1956b896504SKiran Kumar K 	/* Prepare stream for next node 1 */
1966b896504SKiran Kumar K 	obj_node1 = nb_objs - obj_node0;
1976b896504SKiran Kumar K 	next = 1;
1986b896504SKiran Kumar K 	next_stream = rte_node_next_stream_get(graph, node, next, obj_node1);
1996b896504SKiran Kumar K 	for (i = 0; i < obj_node1; i++) {
2006b896504SKiran Kumar K 		data = &mbuf[0][obj_node0 + i];
201e2e01583SThomas Monjalon 		*graph_field(data) = ((uint64_t)tm->test_node[1].idx << 32) | i;
2026b896504SKiran Kumar K 		if ((i + 1) == obj_node1)
203e2e01583SThomas Monjalon 			*graph_field(data) |= (1 << 16);
2046b896504SKiran Kumar K 		next_stream[i] = &mbuf[0][obj_node0 + i];
2056b896504SKiran Kumar K 	}
2066b896504SKiran Kumar K 
2076b896504SKiran Kumar K 	rte_node_next_stream_put(graph, node, next, obj_node1);
2086b896504SKiran Kumar K 	obj_stats[0] += nb_objs;
2096b896504SKiran Kumar K 	fn_calls[0] += 1;
2106b896504SKiran Kumar K 	return nb_objs;
2116b896504SKiran Kumar K }
2126b896504SKiran Kumar K 
2136b896504SKiran Kumar K uint16_t
test_node0_worker(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)2146b896504SKiran Kumar K test_node0_worker(struct rte_graph *graph, struct rte_node *node, void **objs,
2156b896504SKiran Kumar K 		  uint16_t nb_objs)
2166b896504SKiran Kumar K {
2176b896504SKiran Kumar K 	test_main_t *tm = &test_main;
2186b896504SKiran Kumar K 
2196b896504SKiran Kumar K 	if (*(uint32_t *)node->ctx == test_node0.id) {
2209330521cSKiran Kumar K 		uint32_t obj_node0 = rte_rand() % 100, obj_node1;
2216b896504SKiran Kumar K 		struct rte_mbuf *data;
2226b896504SKiran Kumar K 		uint8_t second_pass = 0;
2236b896504SKiran Kumar K 		uint32_t count = 0;
2246b896504SKiran Kumar K 		uint32_t i;
2256b896504SKiran Kumar K 
2266b896504SKiran Kumar K 		obj_stats[1] += nb_objs;
2276b896504SKiran Kumar K 		fn_calls[1] += 1;
2286b896504SKiran Kumar K 
2296b896504SKiran Kumar K 		for (i = 0; i < nb_objs; i++) {
2306b896504SKiran Kumar K 			data = (struct rte_mbuf *)objs[i];
231e2e01583SThomas Monjalon 			if ((*graph_field(data) >> 32) != tm->test_node[0].idx) {
2326b896504SKiran Kumar K 				printf("Data idx miss match at node 0, expected"
2336b896504SKiran Kumar K 				       " = %u got = %u\n",
2346b896504SKiran Kumar K 				       tm->test_node[0].idx,
235e2e01583SThomas Monjalon 				       (uint32_t)(*graph_field(data) >> 32));
2366b896504SKiran Kumar K 				goto end;
2376b896504SKiran Kumar K 			}
2386b896504SKiran Kumar K 
239e2e01583SThomas Monjalon 			if ((*graph_field(data) & 0xffff) != (i - count)) {
2406b896504SKiran Kumar K 				printf("Expected buff count miss match at "
2416b896504SKiran Kumar K 				       "node 0\n");
2426b896504SKiran Kumar K 				goto end;
2436b896504SKiran Kumar K 			}
2446b896504SKiran Kumar K 
245e2e01583SThomas Monjalon 			if (*graph_field(data) & (0x1 << 16))
2466b896504SKiran Kumar K 				count = i + 1;
247e2e01583SThomas Monjalon 			if (*graph_field(data) & (0x1 << 17))
2486b896504SKiran Kumar K 				second_pass = 1;
2496b896504SKiran Kumar K 		}
2506b896504SKiran Kumar K 
2516b896504SKiran Kumar K 		if (count != i) {
2526b896504SKiran Kumar K 			printf("Count mismatch at node 0\n");
2536b896504SKiran Kumar K 			goto end;
2546b896504SKiran Kumar K 		}
2556b896504SKiran Kumar K 
2566b896504SKiran Kumar K 		obj_node0 = nb_objs * obj_node0 * 0.01;
2576b896504SKiran Kumar K 		for (i = 0; i < obj_node0; i++) {
2586b896504SKiran Kumar K 			data = &mbuf[1][i];
259e2e01583SThomas Monjalon 			*graph_field(data) =
2606b896504SKiran Kumar K 				((uint64_t)tm->test_node[1].idx << 32) | i;
2616b896504SKiran Kumar K 			if ((i + 1) == obj_node0)
262e2e01583SThomas Monjalon 				*graph_field(data) |= (1 << 16);
2636b896504SKiran Kumar K 			if (second_pass)
264e2e01583SThomas Monjalon 				*graph_field(data) |= (1 << 17);
2656b896504SKiran Kumar K 		}
2666b896504SKiran Kumar K 		rte_node_enqueue(graph, node, 0, (void **)&mbuf_p[1][0],
2676b896504SKiran Kumar K 				 obj_node0);
2686b896504SKiran Kumar K 
2696b896504SKiran Kumar K 		obj_node1 = nb_objs - obj_node0;
2706b896504SKiran Kumar K 		for (i = 0; i < obj_node1; i++) {
2716b896504SKiran Kumar K 			data = &mbuf[1][obj_node0 + i];
272e2e01583SThomas Monjalon 			*graph_field(data) =
2736b896504SKiran Kumar K 				((uint64_t)tm->test_node[2].idx << 32) | i;
2746b896504SKiran Kumar K 			if ((i + 1) == obj_node1)
275e2e01583SThomas Monjalon 				*graph_field(data) |= (1 << 16);
2766b896504SKiran Kumar K 			if (second_pass)
277e2e01583SThomas Monjalon 				*graph_field(data) |= (1 << 17);
2786b896504SKiran Kumar K 		}
2796b896504SKiran Kumar K 		rte_node_enqueue(graph, node, 1, (void **)&mbuf_p[1][obj_node0],
2806b896504SKiran Kumar K 				 obj_node1);
2816b896504SKiran Kumar K 
2826b896504SKiran Kumar K 	} else if (*(uint32_t *)node->ctx == tm->test_node[1].idx) {
2836b896504SKiran Kumar K 		test_node1_worker(graph, node, objs, nb_objs);
2846b896504SKiran Kumar K 	} else if (*(uint32_t *)node->ctx == tm->test_node[2].idx) {
2856b896504SKiran Kumar K 		test_node2_worker(graph, node, objs, nb_objs);
2866b896504SKiran Kumar K 	} else if (*(uint32_t *)node->ctx == tm->test_node[3].idx) {
2876b896504SKiran Kumar K 		test_node3_worker(graph, node, objs, nb_objs);
2886b896504SKiran Kumar K 	} else {
2896b896504SKiran Kumar K 		printf("Unexpected node context\n");
2906b896504SKiran Kumar K 	}
2916b896504SKiran Kumar K 
2926b896504SKiran Kumar K end:
2936b896504SKiran Kumar K 	return nb_objs;
2946b896504SKiran Kumar K }
2956b896504SKiran Kumar K 
2966b896504SKiran Kumar K uint16_t
test_node1_worker(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)2976b896504SKiran Kumar K test_node1_worker(struct rte_graph *graph, struct rte_node *node, void **objs,
2986b896504SKiran Kumar K 		  uint16_t nb_objs)
2996b896504SKiran Kumar K {
3006b896504SKiran Kumar K 	test_main_t *tm = &test_main;
3016b896504SKiran Kumar K 	uint8_t second_pass = 0;
3026b896504SKiran Kumar K 	uint32_t obj_node0 = 0;
3036b896504SKiran Kumar K 	struct rte_mbuf *data;
3046b896504SKiran Kumar K 	uint32_t count = 0;
3056b896504SKiran Kumar K 	uint32_t i;
3066b896504SKiran Kumar K 
3076b896504SKiran Kumar K 	obj_stats[2] += nb_objs;
3086b896504SKiran Kumar K 	fn_calls[2] += 1;
3096b896504SKiran Kumar K 	for (i = 0; i < nb_objs; i++) {
3106b896504SKiran Kumar K 		data = (struct rte_mbuf *)objs[i];
311e2e01583SThomas Monjalon 		if ((*graph_field(data) >> 32) != tm->test_node[1].idx) {
3126b896504SKiran Kumar K 			printf("Data idx miss match at node 1, expected = %u"
3136b896504SKiran Kumar K 			       " got = %u\n",
3146b896504SKiran Kumar K 			       tm->test_node[1].idx,
315e2e01583SThomas Monjalon 			       (uint32_t)(*graph_field(data) >> 32));
3166b896504SKiran Kumar K 			goto end;
3176b896504SKiran Kumar K 		}
3186b896504SKiran Kumar K 
319e2e01583SThomas Monjalon 		if ((*graph_field(data) & 0xffff) != (i - count)) {
3206b896504SKiran Kumar K 			printf("Expected buff count miss match at node 1\n");
3216b896504SKiran Kumar K 			goto end;
3226b896504SKiran Kumar K 		}
3236b896504SKiran Kumar K 
324e2e01583SThomas Monjalon 		if (*graph_field(data) & (0x1 << 16))
3256b896504SKiran Kumar K 			count = i + 1;
326e2e01583SThomas Monjalon 		if (*graph_field(data) & (0x1 << 17))
3276b896504SKiran Kumar K 			second_pass = 1;
3286b896504SKiran Kumar K 	}
3296b896504SKiran Kumar K 
3306b896504SKiran Kumar K 	if (count != i) {
3316b896504SKiran Kumar K 		printf("Count mismatch at node 1\n");
3326b896504SKiran Kumar K 		goto end;
3336b896504SKiran Kumar K 	}
3346b896504SKiran Kumar K 
3356b896504SKiran Kumar K 	obj_node0 = nb_objs;
3366b896504SKiran Kumar K 	for (i = 0; i < obj_node0; i++) {
3376b896504SKiran Kumar K 		data = &mbuf[2][i];
338e2e01583SThomas Monjalon 		*graph_field(data) = ((uint64_t)tm->test_node[2].idx << 32) | i;
3396b896504SKiran Kumar K 		if ((i + 1) == obj_node0)
340e2e01583SThomas Monjalon 			*graph_field(data) |= (1 << 16);
3416b896504SKiran Kumar K 		if (second_pass)
342e2e01583SThomas Monjalon 			*graph_field(data) |= (1 << 17);
3436b896504SKiran Kumar K 	}
3446b896504SKiran Kumar K 	rte_node_enqueue(graph, node, 0, (void **)&mbuf_p[2][0], obj_node0);
3456b896504SKiran Kumar K 
3466b896504SKiran Kumar K end:
3476b896504SKiran Kumar K 	return nb_objs;
3486b896504SKiran Kumar K }
3496b896504SKiran Kumar K 
3506b896504SKiran Kumar K uint16_t
test_node2_worker(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)3516b896504SKiran Kumar K test_node2_worker(struct rte_graph *graph, struct rte_node *node, void **objs,
3526b896504SKiran Kumar K 		  uint16_t nb_objs)
3536b896504SKiran Kumar K {
3546b896504SKiran Kumar K 	test_main_t *tm = &test_main;
3556b896504SKiran Kumar K 	uint8_t second_pass = 0;
3566b896504SKiran Kumar K 	struct rte_mbuf *data;
3576b896504SKiran Kumar K 	uint32_t count = 0;
3586b896504SKiran Kumar K 	uint32_t obj_node0;
3596b896504SKiran Kumar K 	uint32_t i;
3606b896504SKiran Kumar K 
3616b896504SKiran Kumar K 	obj_stats[3] += nb_objs;
3626b896504SKiran Kumar K 	fn_calls[3] += 1;
3636b896504SKiran Kumar K 	for (i = 0; i < nb_objs; i++) {
3646b896504SKiran Kumar K 		data = (struct rte_mbuf *)objs[i];
365e2e01583SThomas Monjalon 		if ((*graph_field(data) >> 32) != tm->test_node[2].idx) {
3666b896504SKiran Kumar K 			printf("Data idx miss match at node 2, expected = %u"
3676b896504SKiran Kumar K 			       " got = %u\n",
3686b896504SKiran Kumar K 			       tm->test_node[2].idx,
369e2e01583SThomas Monjalon 			       (uint32_t)(*graph_field(data) >> 32));
3706b896504SKiran Kumar K 			goto end;
3716b896504SKiran Kumar K 		}
3726b896504SKiran Kumar K 
373e2e01583SThomas Monjalon 		if ((*graph_field(data) & 0xffff) != (i - count)) {
3746b896504SKiran Kumar K 			printf("Expected buff count miss match at node 2\n");
3756b896504SKiran Kumar K 			goto end;
3766b896504SKiran Kumar K 		}
3776b896504SKiran Kumar K 
378e2e01583SThomas Monjalon 		if (*graph_field(data) & (0x1 << 16))
3796b896504SKiran Kumar K 			count = i + 1;
380e2e01583SThomas Monjalon 		if (*graph_field(data) & (0x1 << 17))
3816b896504SKiran Kumar K 			second_pass = 1;
3826b896504SKiran Kumar K 	}
3836b896504SKiran Kumar K 
3846b896504SKiran Kumar K 	if (count != i) {
3856b896504SKiran Kumar K 		printf("Count mismatch at node 2\n");
3866b896504SKiran Kumar K 		goto end;
3876b896504SKiran Kumar K 	}
3886b896504SKiran Kumar K 
3896b896504SKiran Kumar K 	if (!second_pass) {
3906b896504SKiran Kumar K 		obj_node0 = nb_objs;
3916b896504SKiran Kumar K 		for (i = 0; i < obj_node0; i++) {
3926b896504SKiran Kumar K 			data = &mbuf[3][i];
393e2e01583SThomas Monjalon 			*graph_field(data) =
3946b896504SKiran Kumar K 				((uint64_t)tm->test_node[3].idx << 32) | i;
3956b896504SKiran Kumar K 			if ((i + 1) == obj_node0)
396e2e01583SThomas Monjalon 				*graph_field(data) |= (1 << 16);
3976b896504SKiran Kumar K 		}
3986b896504SKiran Kumar K 		rte_node_enqueue(graph, node, 0, (void **)&mbuf_p[3][0],
3996b896504SKiran Kumar K 				 obj_node0);
4006b896504SKiran Kumar K 	}
4016b896504SKiran Kumar K 
4026b896504SKiran Kumar K end:
4036b896504SKiran Kumar K 	return nb_objs;
4046b896504SKiran Kumar K }
4056b896504SKiran Kumar K 
4066b896504SKiran Kumar K uint16_t
test_node3_worker(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)4076b896504SKiran Kumar K test_node3_worker(struct rte_graph *graph, struct rte_node *node, void **objs,
4086b896504SKiran Kumar K 		  uint16_t nb_objs)
4096b896504SKiran Kumar K {
4106b896504SKiran Kumar K 	test_main_t *tm = &test_main;
4116b896504SKiran Kumar K 	uint8_t second_pass = 0;
4126b896504SKiran Kumar K 	struct rte_mbuf *data;
4136b896504SKiran Kumar K 	uint32_t count = 0;
4146b896504SKiran Kumar K 	uint32_t obj_node0;
4156b896504SKiran Kumar K 	uint32_t i;
4166b896504SKiran Kumar K 
4176b896504SKiran Kumar K 	obj_stats[4] += nb_objs;
4186b896504SKiran Kumar K 	fn_calls[4] += 1;
4196b896504SKiran Kumar K 	for (i = 0; i < nb_objs; i++) {
4206b896504SKiran Kumar K 		data = (struct rte_mbuf *)objs[i];
421e2e01583SThomas Monjalon 		if ((*graph_field(data) >> 32) != tm->test_node[3].idx) {
4226b896504SKiran Kumar K 			printf("Data idx miss match at node 3, expected = %u"
4236b896504SKiran Kumar K 			       " got = %u\n",
4246b896504SKiran Kumar K 			       tm->test_node[3].idx,
425e2e01583SThomas Monjalon 			       (uint32_t)(*graph_field(data) >> 32));
4266b896504SKiran Kumar K 			goto end;
4276b896504SKiran Kumar K 		}
4286b896504SKiran Kumar K 
429e2e01583SThomas Monjalon 		if ((*graph_field(data) & 0xffff) != (i - count)) {
4306b896504SKiran Kumar K 			printf("Expected buff count miss match at node 3\n");
4316b896504SKiran Kumar K 			goto end;
4326b896504SKiran Kumar K 		}
4336b896504SKiran Kumar K 
434e2e01583SThomas Monjalon 		if (*graph_field(data) & (0x1 << 16))
4356b896504SKiran Kumar K 			count = i + 1;
436e2e01583SThomas Monjalon 		if (*graph_field(data) & (0x1 << 17))
4376b896504SKiran Kumar K 			second_pass = 1;
4386b896504SKiran Kumar K 	}
4396b896504SKiran Kumar K 
4406b896504SKiran Kumar K 	if (count != i) {
4416b896504SKiran Kumar K 		printf("Count mismatch at node 3\n");
4426b896504SKiran Kumar K 		goto end;
4436b896504SKiran Kumar K 	}
4446b896504SKiran Kumar K 
4456b896504SKiran Kumar K 	if (second_pass) {
4466b896504SKiran Kumar K 		printf("Unexpected buffers are at node 3\n");
4476b896504SKiran Kumar K 		goto end;
4486b896504SKiran Kumar K 	} else {
4496b896504SKiran Kumar K 		obj_node0 = nb_objs * 2;
4506b896504SKiran Kumar K 		for (i = 0; i < obj_node0; i++) {
4516b896504SKiran Kumar K 			data = &mbuf[4][i];
452e2e01583SThomas Monjalon 			*graph_field(data) =
4536b896504SKiran Kumar K 				((uint64_t)tm->test_node[0].idx << 32) | i;
454e2e01583SThomas Monjalon 			*graph_field(data) |= (1 << 17);
4556b896504SKiran Kumar K 			if ((i + 1) == obj_node0)
456e2e01583SThomas Monjalon 				*graph_field(data) |= (1 << 16);
4576b896504SKiran Kumar K 		}
4586b896504SKiran Kumar K 		rte_node_enqueue(graph, node, 0, (void **)&mbuf_p[4][0],
4596b896504SKiran Kumar K 				 obj_node0);
4606b896504SKiran Kumar K 	}
4616b896504SKiran Kumar K 
4626b896504SKiran Kumar K end:
4636b896504SKiran Kumar K 	return nb_objs;
4646b896504SKiran Kumar K }
4656b896504SKiran Kumar K 
4666b896504SKiran Kumar K static int
test_lookup_functions(void)4676b896504SKiran Kumar K test_lookup_functions(void)
4686b896504SKiran Kumar K {
4696b896504SKiran Kumar K 	test_main_t *tm = &test_main;
4706b896504SKiran Kumar K 	int i;
4716b896504SKiran Kumar K 
4726b896504SKiran Kumar K 	/* Verify the name with ID */
4736b896504SKiran Kumar K 	for (i = 1; i < MAX_NODES; i++) {
4746b896504SKiran Kumar K 		char *name = rte_node_id_to_name(tm->test_node[i].idx);
4756b896504SKiran Kumar K 		if (strcmp(name, node_names[i]) != 0) {
4766b896504SKiran Kumar K 			printf("Test node name verify by ID = %d failed "
4776b896504SKiran Kumar K 			       "Expected = %s, got %s\n",
4786b896504SKiran Kumar K 			       i, node_names[i], name);
4796b896504SKiran Kumar K 			return -1;
4806b896504SKiran Kumar K 		}
4816b896504SKiran Kumar K 	}
4826b896504SKiran Kumar K 
4836b896504SKiran Kumar K 	/* Verify by name */
4846b896504SKiran Kumar K 	for (i = 1; i < MAX_NODES; i++) {
4856b896504SKiran Kumar K 		uint32_t idx = rte_node_from_name(node_names[i]);
4866b896504SKiran Kumar K 		if (idx != tm->test_node[i].idx) {
4876b896504SKiran Kumar K 			printf("Test node ID verify by name = %s failed "
4886b896504SKiran Kumar K 			       "Expected = %d, got %d\n",
4896b896504SKiran Kumar K 			       node_names[i], tm->test_node[i].idx, idx);
4906b896504SKiran Kumar K 			return -1;
4916b896504SKiran Kumar K 		}
4926b896504SKiran Kumar K 	}
4936b896504SKiran Kumar K 
4946b896504SKiran Kumar K 	/* Verify edge count */
4956b896504SKiran Kumar K 	for (i = 1; i < MAX_NODES; i++) {
4966b896504SKiran Kumar K 		uint32_t count = rte_node_edge_count(tm->test_node[i].idx);
4976b896504SKiran Kumar K 		if (count != tm->test_node[i].node.nb_edges) {
4986b896504SKiran Kumar K 			printf("Test number of edges for node = %s failed Expected = %d, got = %d\n",
4996b896504SKiran Kumar K 			       tm->test_node[i].node.name,
5006b896504SKiran Kumar K 			       tm->test_node[i].node.nb_edges, count);
5016b896504SKiran Kumar K 			return -1;
5026b896504SKiran Kumar K 		}
5036b896504SKiran Kumar K 	}
5046b896504SKiran Kumar K 
5056b896504SKiran Kumar K 	/* Verify edge names */
5066b896504SKiran Kumar K 	for (i = 1; i < MAX_NODES; i++) {
5076b896504SKiran Kumar K 		uint32_t j, count;
5086b896504SKiran Kumar K 		char **next_edges;
5096b896504SKiran Kumar K 
5106b896504SKiran Kumar K 		count = rte_node_edge_get(tm->test_node[i].idx, NULL);
5116b896504SKiran Kumar K 		if (count != tm->test_node[i].node.nb_edges * sizeof(char *)) {
5126b896504SKiran Kumar K 			printf("Test number of edge count for node = %s failed Expected = %d, got = %d\n",
5136b896504SKiran Kumar K 			       tm->test_node[i].node.name,
5146b896504SKiran Kumar K 			       tm->test_node[i].node.nb_edges, count);
5156b896504SKiran Kumar K 			return -1;
5166b896504SKiran Kumar K 		}
5176b896504SKiran Kumar K 		next_edges = malloc(count);
5186b896504SKiran Kumar K 		count = rte_node_edge_get(tm->test_node[i].idx, next_edges);
5196b896504SKiran Kumar K 		if (count != tm->test_node[i].node.nb_edges) {
5206b896504SKiran Kumar K 			printf("Test number of edges for node = %s failed Expected = %d, got %d\n",
5216b896504SKiran Kumar K 			       tm->test_node[i].node.name,
5226b896504SKiran Kumar K 			       tm->test_node[i].node.nb_edges, count);
523c5a56c58SKiran Kumar K 			free(next_edges);
5246b896504SKiran Kumar K 			return -1;
5256b896504SKiran Kumar K 		}
5266b896504SKiran Kumar K 
5276b896504SKiran Kumar K 		for (j = 0; j < count; j++) {
5286b896504SKiran Kumar K 			if (strcmp(next_edges[j],
5296b896504SKiran Kumar K 				   tm->test_node[i].node.next_nodes[j]) != 0) {
5306b896504SKiran Kumar K 				printf("Edge name miss match, expected = %s got = %s\n",
5316b896504SKiran Kumar K 				       tm->test_node[i].node.next_nodes[j],
5326b896504SKiran Kumar K 				       next_edges[j]);
533c5a56c58SKiran Kumar K 				free(next_edges);
5346b896504SKiran Kumar K 				return -1;
5356b896504SKiran Kumar K 			}
5366b896504SKiran Kumar K 		}
5376b896504SKiran Kumar K 		free(next_edges);
5386b896504SKiran Kumar K 	}
5396b896504SKiran Kumar K 
5406b896504SKiran Kumar K 	return 0;
5416b896504SKiran Kumar K }
5426b896504SKiran Kumar K 
5436b896504SKiran Kumar K static int
test_node_clone(void)5446b896504SKiran Kumar K test_node_clone(void)
5456b896504SKiran Kumar K {
5466b896504SKiran Kumar K 	test_main_t *tm = &test_main;
5476b896504SKiran Kumar K 	uint32_t node_id, dummy_id;
5486b896504SKiran Kumar K 	int i;
5496b896504SKiran Kumar K 
5506b896504SKiran Kumar K 	node_id = rte_node_from_name("test_node00");
5516b896504SKiran Kumar K 	tm->test_node[0].idx = node_id;
5526b896504SKiran Kumar K 
553*6eccb0c9SHaiyue Wang 	dummy_id = rte_node_clone(node_id, "test_node00");
554*6eccb0c9SHaiyue Wang 	if (rte_node_is_invalid(dummy_id)) {
555*6eccb0c9SHaiyue Wang 		printf("Got invalid id when clone, Expecting fail\n");
556*6eccb0c9SHaiyue Wang 		return -1;
557*6eccb0c9SHaiyue Wang 	}
558*6eccb0c9SHaiyue Wang 
5596b896504SKiran Kumar K 	/* Clone with same name, should fail */
5606b896504SKiran Kumar K 	dummy_id = rte_node_clone(node_id, "test_node00");
5616b896504SKiran Kumar K 	if (!rte_node_is_invalid(dummy_id)) {
5626b896504SKiran Kumar K 		printf("Got valid id when clone with same name, Expecting fail\n");
5636b896504SKiran Kumar K 		return -1;
5646b896504SKiran Kumar K 	}
5656b896504SKiran Kumar K 
5666b896504SKiran Kumar K 	for (i = 1; i < MAX_NODES; i++) {
5676b896504SKiran Kumar K 		tm->test_node[i].idx =
5686b896504SKiran Kumar K 			rte_node_clone(node_id, tm->test_node[i].node.name);
5696b896504SKiran Kumar K 		if (rte_node_is_invalid(tm->test_node[i].idx)) {
5706b896504SKiran Kumar K 			printf("Got invalid node id\n");
5716b896504SKiran Kumar K 			return -1;
5726b896504SKiran Kumar K 		}
5736b896504SKiran Kumar K 	}
5746b896504SKiran Kumar K 
5756b896504SKiran Kumar K 	/* Clone from cloned node should fail */
5766b896504SKiran Kumar K 	dummy_id = rte_node_clone(tm->test_node[1].idx, "dummy_node");
5776b896504SKiran Kumar K 	if (!rte_node_is_invalid(dummy_id)) {
5786b896504SKiran Kumar K 		printf("Got valid node id when cloning from cloned node, expected fail\n");
5796b896504SKiran Kumar K 		return -1;
5806b896504SKiran Kumar K 	}
5816b896504SKiran Kumar K 
5826b896504SKiran Kumar K 	return 0;
5836b896504SKiran Kumar K }
5846b896504SKiran Kumar K 
5856b896504SKiran Kumar K static int
test_update_edges(void)5866b896504SKiran Kumar K test_update_edges(void)
5876b896504SKiran Kumar K {
5886b896504SKiran Kumar K 	test_main_t *tm = &test_main;
5896b896504SKiran Kumar K 	uint32_t node_id;
5906b896504SKiran Kumar K 	uint16_t count;
5916b896504SKiran Kumar K 	int i;
5926b896504SKiran Kumar K 
5936b896504SKiran Kumar K 	node_id = rte_node_from_name("test_node00");
5946b896504SKiran Kumar K 	count = rte_node_edge_update(node_id, 0,
5956b896504SKiran Kumar K 				     tm->test_node[0].node.next_nodes,
5966b896504SKiran Kumar K 				     tm->test_node[0].node.nb_edges);
5976b896504SKiran Kumar K 	if (count != tm->test_node[0].node.nb_edges) {
5986b896504SKiran Kumar K 		printf("Update edges failed expected: %d got = %d\n",
5996b896504SKiran Kumar K 		       tm->test_node[0].node.nb_edges, count);
6006b896504SKiran Kumar K 		return -1;
6016b896504SKiran Kumar K 	}
6026b896504SKiran Kumar K 
6036b896504SKiran Kumar K 	for (i = 1; i < MAX_NODES; i++) {
6046b896504SKiran Kumar K 		count = rte_node_edge_update(tm->test_node[i].idx, 0,
6056b896504SKiran Kumar K 					     tm->test_node[i].node.next_nodes,
6066b896504SKiran Kumar K 					     tm->test_node[i].node.nb_edges);
6076b896504SKiran Kumar K 		if (count != tm->test_node[i].node.nb_edges) {
6086b896504SKiran Kumar K 			printf("Update edges failed expected: %d got = %d\n",
6096b896504SKiran Kumar K 			       tm->test_node[i].node.nb_edges, count);
6106b896504SKiran Kumar K 			return -1;
6116b896504SKiran Kumar K 		}
6126b896504SKiran Kumar K 
6136b896504SKiran Kumar K 		count = rte_node_edge_shrink(tm->test_node[i].idx,
6146b896504SKiran Kumar K 					     tm->test_node[i].node.nb_edges);
6156b896504SKiran Kumar K 		if (count != tm->test_node[i].node.nb_edges) {
6166b896504SKiran Kumar K 			printf("Shrink edges failed\n");
6176b896504SKiran Kumar K 			return -1;
6186b896504SKiran Kumar K 		}
6196b896504SKiran Kumar K 	}
6206b896504SKiran Kumar K 
6216b896504SKiran Kumar K 	return 0;
6226b896504SKiran Kumar K }
6236b896504SKiran Kumar K 
6246b896504SKiran Kumar K static int
test_create_graph(void)6256b896504SKiran Kumar K test_create_graph(void)
6266b896504SKiran Kumar K {
6276b896504SKiran Kumar K 	static const char *node_patterns_dummy[] = {
6286b896504SKiran Kumar K 		"test_node_source1",	   "test_node00",
6296b896504SKiran Kumar K 		"test_node00-test_node11", "test_node00-test_node22",
6306b896504SKiran Kumar K 		"test_node00-test_node33", "test_node00-dummy_node",
6316b896504SKiran Kumar K 	};
6326b896504SKiran Kumar K 	struct rte_graph_param gconf = {
6336b896504SKiran Kumar K 		.socket_id = SOCKET_ID_ANY,
6346b896504SKiran Kumar K 		.nb_node_patterns = 6,
6356b896504SKiran Kumar K 		.node_patterns = node_patterns_dummy,
6366b896504SKiran Kumar K 	};
6376b896504SKiran Kumar K 	uint32_t dummy_node_id;
6386b896504SKiran Kumar K 	uint32_t node_id;
6396b896504SKiran Kumar K 
6406b896504SKiran Kumar K 	node_id = rte_node_from_name("test_node00");
6416b896504SKiran Kumar K 	dummy_node_id = rte_node_clone(node_id, "dummy_node");
6426b896504SKiran Kumar K 	if (rte_node_is_invalid(dummy_node_id)) {
6436b896504SKiran Kumar K 		printf("Got invalid node id\n");
6446b896504SKiran Kumar K 		return -1;
6456b896504SKiran Kumar K 	}
6466b896504SKiran Kumar K 
6476b896504SKiran Kumar K 	graph_id = rte_graph_create("worker0", &gconf);
6486b896504SKiran Kumar K 	if (graph_id != RTE_GRAPH_ID_INVALID) {
6496b896504SKiran Kumar K 		printf("Graph creation success with isolated node, expected graph creation fail\n");
6506b896504SKiran Kumar K 		return -1;
6516b896504SKiran Kumar K 	}
6526b896504SKiran Kumar K 
6536b896504SKiran Kumar K 	gconf.nb_node_patterns = 5;
6546b896504SKiran Kumar K 	gconf.node_patterns = node_patterns;
6556b896504SKiran Kumar K 	graph_id = rte_graph_create("worker0", &gconf);
6566b896504SKiran Kumar K 	if (graph_id == RTE_GRAPH_ID_INVALID) {
6576b896504SKiran Kumar K 		printf("Graph creation failed with error = %d\n", rte_errno);
6586b896504SKiran Kumar K 		return -1;
6596b896504SKiran Kumar K 	}
6606b896504SKiran Kumar K 	return 0;
6616b896504SKiran Kumar K }
6626b896504SKiran Kumar K 
6636b896504SKiran Kumar K static int
test_graph_walk(void)6646b896504SKiran Kumar K test_graph_walk(void)
6656b896504SKiran Kumar K {
6666b896504SKiran Kumar K 	struct rte_graph *graph = rte_graph_lookup("worker0");
6676b896504SKiran Kumar K 	int i;
6686b896504SKiran Kumar K 
6696b896504SKiran Kumar K 	if (!graph) {
6706b896504SKiran Kumar K 		printf("Graph lookup failed\n");
6716b896504SKiran Kumar K 		return -1;
6726b896504SKiran Kumar K 	}
6736b896504SKiran Kumar K 
6746b896504SKiran Kumar K 	for (i = 0; i < 5; i++)
6756b896504SKiran Kumar K 		rte_graph_walk(graph);
6766b896504SKiran Kumar K 	return 0;
6776b896504SKiran Kumar K }
6786b896504SKiran Kumar K 
6796b896504SKiran Kumar K static int
test_graph_lookup_functions(void)6806b896504SKiran Kumar K test_graph_lookup_functions(void)
6816b896504SKiran Kumar K {
6826b896504SKiran Kumar K 	test_main_t *tm = &test_main;
6836b896504SKiran Kumar K 	struct rte_node *node;
6846b896504SKiran Kumar K 	int i;
6856b896504SKiran Kumar K 
6866b896504SKiran Kumar K 	for (i = 0; i < MAX_NODES; i++) {
6876b896504SKiran Kumar K 		node = rte_graph_node_get(graph_id, tm->test_node[i].idx);
6886b896504SKiran Kumar K 		if (!node) {
6896b896504SKiran Kumar K 			printf("rte_graph_node_get, failed for node = %d\n",
6906b896504SKiran Kumar K 			       tm->test_node[i].idx);
6916b896504SKiran Kumar K 			return -1;
6926b896504SKiran Kumar K 		}
6936b896504SKiran Kumar K 
6946b896504SKiran Kumar K 		if (tm->test_node[i].idx != node->id) {
6956b896504SKiran Kumar K 			printf("Node id didn't match, expected = %d got = %d\n",
6966b896504SKiran Kumar K 			       tm->test_node[i].idx, node->id);
6976b896504SKiran Kumar K 			return 0;
6986b896504SKiran Kumar K 		}
6996b896504SKiran Kumar K 
7006b896504SKiran Kumar K 		if (strncmp(node->name, node_names[i], RTE_NODE_NAMESIZE)) {
7016b896504SKiran Kumar K 			printf("Node name didn't match, expected = %s got %s\n",
7026b896504SKiran Kumar K 			       node_names[i], node->name);
7036b896504SKiran Kumar K 			return -1;
7046b896504SKiran Kumar K 		}
7056b896504SKiran Kumar K 	}
7066b896504SKiran Kumar K 
7076b896504SKiran Kumar K 	for (i = 0; i < MAX_NODES; i++) {
7086b896504SKiran Kumar K 		node = rte_graph_node_get_by_name("worker0", node_names[i]);
7096b896504SKiran Kumar K 		if (!node) {
7106b896504SKiran Kumar K 			printf("rte_graph_node_get, failed for node = %d\n",
7116b896504SKiran Kumar K 			       tm->test_node[i].idx);
7126b896504SKiran Kumar K 			return -1;
7136b896504SKiran Kumar K 		}
7146b896504SKiran Kumar K 
7156b896504SKiran Kumar K 		if (tm->test_node[i].idx != node->id) {
7166b896504SKiran Kumar K 			printf("Node id didn't match, expected = %d got = %d\n",
7176b896504SKiran Kumar K 			       tm->test_node[i].idx, node->id);
7186b896504SKiran Kumar K 			return 0;
7196b896504SKiran Kumar K 		}
7206b896504SKiran Kumar K 
7216b896504SKiran Kumar K 		if (strncmp(node->name, node_names[i], RTE_NODE_NAMESIZE)) {
7226b896504SKiran Kumar K 			printf("Node name didn't match, expected = %s got %s\n",
7236b896504SKiran Kumar K 			       node_names[i], node->name);
7246b896504SKiran Kumar K 			return -1;
7256b896504SKiran Kumar K 		}
7266b896504SKiran Kumar K 	}
7276b896504SKiran Kumar K 
7286b896504SKiran Kumar K 	return 0;
7296b896504SKiran Kumar K }
7306b896504SKiran Kumar K 
7316b896504SKiran Kumar K static int
graph_cluster_stats_cb_t(bool is_first,bool is_last,void * cookie,const struct rte_graph_cluster_node_stats * st)7326b896504SKiran Kumar K graph_cluster_stats_cb_t(bool is_first, bool is_last, void *cookie,
7336b896504SKiran Kumar K 			 const struct rte_graph_cluster_node_stats *st)
7346b896504SKiran Kumar K {
7356b896504SKiran Kumar K 	int i;
7366b896504SKiran Kumar K 
7376b896504SKiran Kumar K 	RTE_SET_USED(is_first);
7386b896504SKiran Kumar K 	RTE_SET_USED(is_last);
7396b896504SKiran Kumar K 	RTE_SET_USED(cookie);
7406b896504SKiran Kumar K 
7416b896504SKiran Kumar K 	for (i = 0; i < MAX_NODES + 1; i++) {
7426b896504SKiran Kumar K 		rte_node_t id = rte_node_from_name(node_patterns[i]);
7436b896504SKiran Kumar K 		if (id == st->id) {
7446b896504SKiran Kumar K 			if (obj_stats[i] != st->objs) {
7456b896504SKiran Kumar K 				printf("Obj count miss match for node = %s expected = %"PRId64", got=%"PRId64"\n",
7466b896504SKiran Kumar K 				       node_patterns[i], obj_stats[i],
7476b896504SKiran Kumar K 				       st->objs);
7486b896504SKiran Kumar K 				return -1;
7496b896504SKiran Kumar K 			}
7506b896504SKiran Kumar K 
7516b896504SKiran Kumar K 			if (fn_calls[i] != st->calls) {
7526b896504SKiran Kumar K 				printf("Func call miss match for node = %s expected = %"PRId64", got = %"PRId64"\n",
7536b896504SKiran Kumar K 				       node_patterns[i], fn_calls[i],
7546b896504SKiran Kumar K 				       st->calls);
7556b896504SKiran Kumar K 				return -1;
7566b896504SKiran Kumar K 			}
7576b896504SKiran Kumar K 		}
7586b896504SKiran Kumar K 	}
7596b896504SKiran Kumar K 	return 0;
7606b896504SKiran Kumar K }
7616b896504SKiran Kumar K 
7626b896504SKiran Kumar K static int
test_print_stats(void)7636b896504SKiran Kumar K test_print_stats(void)
7646b896504SKiran Kumar K {
7656b896504SKiran Kumar K 	struct rte_graph_cluster_stats_param s_param;
7666b896504SKiran Kumar K 	struct rte_graph_cluster_stats *stats;
7676b896504SKiran Kumar K 	const char *pattern = "worker0";
7686b896504SKiran Kumar K 
7696b896504SKiran Kumar K 	if (!rte_graph_has_stats_feature())
7706b896504SKiran Kumar K 		return 0;
7716b896504SKiran Kumar K 
7726b896504SKiran Kumar K 	/* Prepare stats object */
7736b896504SKiran Kumar K 	memset(&s_param, 0, sizeof(s_param));
7746b896504SKiran Kumar K 	s_param.f = stdout;
7756b896504SKiran Kumar K 	s_param.socket_id = SOCKET_ID_ANY;
7766b896504SKiran Kumar K 	s_param.graph_patterns = &pattern;
7776b896504SKiran Kumar K 	s_param.nb_graph_patterns = 1;
7786b896504SKiran Kumar K 	s_param.fn = graph_cluster_stats_cb_t;
7796b896504SKiran Kumar K 
7806b896504SKiran Kumar K 	stats = rte_graph_cluster_stats_create(&s_param);
7816b896504SKiran Kumar K 	if (stats == NULL) {
7826b896504SKiran Kumar K 		printf("Unable to get stats\n");
7836b896504SKiran Kumar K 		return -1;
7846b896504SKiran Kumar K 	}
7856b896504SKiran Kumar K 	/* Clear screen and move to top left */
7866b896504SKiran Kumar K 	rte_graph_cluster_stats_get(stats, 0);
7876b896504SKiran Kumar K 	rte_graph_cluster_stats_destroy(stats);
7886b896504SKiran Kumar K 
7896b896504SKiran Kumar K 	return 0;
7906b896504SKiran Kumar K }
7916b896504SKiran Kumar K 
7926b896504SKiran Kumar K static int
graph_setup(void)7936b896504SKiran Kumar K graph_setup(void)
7946b896504SKiran Kumar K {
7956b896504SKiran Kumar K 	int i, j;
7966b896504SKiran Kumar K 
797e2e01583SThomas Monjalon 	static const struct rte_mbuf_dynfield graph_dynfield_desc = {
798e2e01583SThomas Monjalon 		.name = "test_graph_dynfield",
799e2e01583SThomas Monjalon 		.size = sizeof(graph_dynfield_t),
800e2e01583SThomas Monjalon 		.align = __alignof__(graph_dynfield_t),
801e2e01583SThomas Monjalon 	};
802e2e01583SThomas Monjalon 	graph_dynfield_offset =
803e2e01583SThomas Monjalon 		rte_mbuf_dynfield_register(&graph_dynfield_desc);
804e2e01583SThomas Monjalon 	if (graph_dynfield_offset < 0) {
805e2e01583SThomas Monjalon 		printf("Cannot register mbuf field\n");
806e2e01583SThomas Monjalon 		return TEST_FAILED;
807e2e01583SThomas Monjalon 	}
808e2e01583SThomas Monjalon 
8096b896504SKiran Kumar K 	for (i = 0; i <= MAX_NODES; i++) {
8106b896504SKiran Kumar K 		for (j = 0; j < MBUFF_SIZE; j++)
8116b896504SKiran Kumar K 			mbuf_p[i][j] = &mbuf[i][j];
8126b896504SKiran Kumar K 	}
8136b896504SKiran Kumar K 	if (test_node_clone()) {
8146b896504SKiran Kumar K 		printf("test_node_clone: fail\n");
8156b896504SKiran Kumar K 		return -1;
8166b896504SKiran Kumar K 	}
8176b896504SKiran Kumar K 	printf("test_node_clone: pass\n");
8186b896504SKiran Kumar K 
8196b896504SKiran Kumar K 	return 0;
8206b896504SKiran Kumar K }
8216b896504SKiran Kumar K 
8226b896504SKiran Kumar K static void
graph_teardown(void)8236b896504SKiran Kumar K graph_teardown(void)
8246b896504SKiran Kumar K {
8256b896504SKiran Kumar K 	int id;
8266b896504SKiran Kumar K 
8276b896504SKiran Kumar K 	id = rte_graph_destroy(rte_graph_from_name("worker0"));
8286b896504SKiran Kumar K 	if (id)
8296b896504SKiran Kumar K 		printf("Graph Destroy failed\n");
8306b896504SKiran Kumar K }
8316b896504SKiran Kumar K 
8326b896504SKiran Kumar K static struct unit_test_suite graph_testsuite = {
8336b896504SKiran Kumar K 	.suite_name = "Graph library test suite",
8346b896504SKiran Kumar K 	.setup = graph_setup,
8356b896504SKiran Kumar K 	.teardown = graph_teardown,
8366b896504SKiran Kumar K 	.unit_test_cases = {
8376b896504SKiran Kumar K 		TEST_CASE(test_update_edges),
8386b896504SKiran Kumar K 		TEST_CASE(test_lookup_functions),
8396b896504SKiran Kumar K 		TEST_CASE(test_create_graph),
8406b896504SKiran Kumar K 		TEST_CASE(test_graph_lookup_functions),
8416b896504SKiran Kumar K 		TEST_CASE(test_graph_walk),
8426b896504SKiran Kumar K 		TEST_CASE(test_print_stats),
8436b896504SKiran Kumar K 		TEST_CASES_END(), /**< NULL terminate unit test array */
8446b896504SKiran Kumar K 	},
8456b896504SKiran Kumar K };
8466b896504SKiran Kumar K 
8476b896504SKiran Kumar K static int
graph_autotest_fn(void)8486b896504SKiran Kumar K graph_autotest_fn(void)
8496b896504SKiran Kumar K {
8506b896504SKiran Kumar K 	return unit_test_suite_runner(&graph_testsuite);
8516b896504SKiran Kumar K }
8526b896504SKiran Kumar K 
8536b896504SKiran Kumar K REGISTER_TEST_COMMAND(graph_autotest, graph_autotest_fn);
8546b896504SKiran Kumar K 
8556b896504SKiran Kumar K static int
test_node_list_dump(void)8566b896504SKiran Kumar K test_node_list_dump(void)
8576b896504SKiran Kumar K {
8586b896504SKiran Kumar K 	rte_node_list_dump(stdout);
8596b896504SKiran Kumar K 
8606b896504SKiran Kumar K 	return TEST_SUCCESS;
8616b896504SKiran Kumar K }
8623c60274cSJie Zhou 
8633c60274cSJie Zhou #endif /* !RTE_EXEC_ENV_WINDOWS */
8643c60274cSJie Zhou 
8656b896504SKiran Kumar K REGISTER_TEST_COMMAND(node_list_dump, test_node_list_dump);
866