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>
1008966fe7STyler Retzlaff #include <stdalign.h>
116b896504SKiran Kumar K #include <stdio.h>
126b896504SKiran Kumar K #include <string.h>
136b896504SKiran Kumar K #include <unistd.h>
146b896504SKiran Kumar K
156b896504SKiran Kumar K #include <rte_errno.h>
163c60274cSJie Zhou
173c60274cSJie Zhou #ifdef RTE_EXEC_ENV_WINDOWS
183c60274cSJie Zhou static int
test_node_list_dump(void)193c60274cSJie Zhou test_node_list_dump(void)
203c60274cSJie Zhou {
213c60274cSJie Zhou printf("node_list_dump not supported on Windows, skipping test\n");
223c60274cSJie Zhou return TEST_SKIPPED;
233c60274cSJie Zhou }
243c60274cSJie Zhou
253c60274cSJie Zhou #else
263c60274cSJie Zhou
276b896504SKiran Kumar K #include <rte_graph.h>
28a2bc0584SZhirun Yan #include <rte_graph_worker.h>
296b896504SKiran Kumar K #include <rte_mbuf.h>
30e2e01583SThomas Monjalon #include <rte_mbuf_dyn.h>
319330521cSKiran Kumar K #include <rte_random.h>
326b896504SKiran Kumar K
336b896504SKiran Kumar K static uint16_t test_node_worker_source(struct rte_graph *graph,
346b896504SKiran Kumar K struct rte_node *node, void **objs,
356b896504SKiran Kumar K uint16_t nb_objs);
366b896504SKiran Kumar K
376b896504SKiran Kumar K static uint16_t test_node0_worker(struct rte_graph *graph,
386b896504SKiran Kumar K struct rte_node *node, void **objs,
396b896504SKiran Kumar K uint16_t nb_objs);
406b896504SKiran Kumar K
416b896504SKiran Kumar K static uint16_t test_node1_worker(struct rte_graph *graph,
426b896504SKiran Kumar K struct rte_node *node, void **objs,
436b896504SKiran Kumar K uint16_t nb_objs);
446b896504SKiran Kumar K
456b896504SKiran Kumar K static uint16_t test_node2_worker(struct rte_graph *graph,
466b896504SKiran Kumar K struct rte_node *node, void **objs,
476b896504SKiran Kumar K uint16_t nb_objs);
486b896504SKiran Kumar K
496b896504SKiran Kumar K static uint16_t test_node3_worker(struct rte_graph *graph,
506b896504SKiran Kumar K struct rte_node *node, void **objs,
516b896504SKiran Kumar K uint16_t nb_objs);
526b896504SKiran Kumar K
536b896504SKiran Kumar K #define MBUFF_SIZE 512
546b896504SKiran Kumar K #define MAX_NODES 4
556b896504SKiran Kumar K
56e2e01583SThomas Monjalon typedef uint64_t graph_dynfield_t;
57e2e01583SThomas Monjalon static int graph_dynfield_offset = -1;
58e2e01583SThomas Monjalon
59e2e01583SThomas Monjalon static inline graph_dynfield_t *
graph_field(struct rte_mbuf * mbuf)60e2e01583SThomas Monjalon graph_field(struct rte_mbuf *mbuf)
61e2e01583SThomas Monjalon {
62e2e01583SThomas Monjalon return RTE_MBUF_DYNFIELD(mbuf, \
63e2e01583SThomas Monjalon graph_dynfield_offset, graph_dynfield_t *);
64e2e01583SThomas Monjalon }
65e2e01583SThomas Monjalon
666b896504SKiran Kumar K static struct rte_mbuf mbuf[MAX_NODES + 1][MBUFF_SIZE];
676b896504SKiran Kumar K static void *mbuf_p[MAX_NODES + 1][MBUFF_SIZE];
686b896504SKiran Kumar K static rte_graph_t graph_id;
696b896504SKiran Kumar K static uint64_t obj_stats[MAX_NODES + 1];
706b896504SKiran Kumar K static uint64_t fn_calls[MAX_NODES + 1];
716b896504SKiran Kumar K
726b896504SKiran Kumar K const char *node_patterns[] = {
736b896504SKiran Kumar K "test_node_source1", "test_node00",
746b896504SKiran Kumar K "test_node00-test_node11", "test_node00-test_node22",
756b896504SKiran Kumar K "test_node00-test_node33",
766b896504SKiran Kumar K };
776b896504SKiran Kumar K
786b896504SKiran Kumar K const char *node_names[] = {
796b896504SKiran Kumar K "test_node00",
806b896504SKiran Kumar K "test_node00-test_node11",
816b896504SKiran Kumar K "test_node00-test_node22",
826b896504SKiran Kumar K "test_node00-test_node33",
836b896504SKiran Kumar K };
846b896504SKiran Kumar K
856b896504SKiran Kumar K struct test_node_register {
866b896504SKiran Kumar K char name[RTE_NODE_NAMESIZE];
876b896504SKiran Kumar K rte_node_process_t process;
886b896504SKiran Kumar K uint16_t nb_edges;
896b896504SKiran Kumar K const char *next_nodes[MAX_NODES];
906b896504SKiran Kumar K };
916b896504SKiran Kumar K
926b896504SKiran Kumar K typedef struct {
936b896504SKiran Kumar K uint32_t idx;
946b896504SKiran Kumar K struct test_node_register node;
956b896504SKiran Kumar K } test_node_t;
966b896504SKiran Kumar K
976b896504SKiran Kumar K typedef struct {
986b896504SKiran Kumar K test_node_t test_node[MAX_NODES];
996b896504SKiran Kumar K } test_main_t;
1006b896504SKiran Kumar K
1016b896504SKiran Kumar K static test_main_t test_main = {
1026b896504SKiran Kumar K .test_node = {
1036b896504SKiran Kumar K {
1046b896504SKiran Kumar K .node = {
1056b896504SKiran Kumar K .name = "test_node00",
1066b896504SKiran Kumar K .process = test_node0_worker,
1076b896504SKiran Kumar K .nb_edges = 2,
1086b896504SKiran Kumar K .next_nodes = {"test_node00-"
1096b896504SKiran Kumar K "test_node11",
1106b896504SKiran Kumar K "test_node00-"
1116b896504SKiran Kumar K "test_node22"},
1126b896504SKiran Kumar K },
1136b896504SKiran Kumar K },
1146b896504SKiran Kumar K {
1156b896504SKiran Kumar K .node = {
1166b896504SKiran Kumar K .name = "test_node11",
1176b896504SKiran Kumar K .process = test_node1_worker,
1186b896504SKiran Kumar K .nb_edges = 1,
1196b896504SKiran Kumar K .next_nodes = {"test_node00-"
1206b896504SKiran Kumar K "test_node22"},
1216b896504SKiran Kumar K },
1226b896504SKiran Kumar K },
1236b896504SKiran Kumar K {
1246b896504SKiran Kumar K .node = {
1256b896504SKiran Kumar K .name = "test_node22",
1266b896504SKiran Kumar K .process = test_node2_worker,
1276b896504SKiran Kumar K .nb_edges = 1,
1286b896504SKiran Kumar K .next_nodes = {"test_node00-"
1296b896504SKiran Kumar K "test_node33"},
1306b896504SKiran Kumar K },
1316b896504SKiran Kumar K },
1326b896504SKiran Kumar K {
1336b896504SKiran Kumar K .node = {
1346b896504SKiran Kumar K .name = "test_node33",
1356b896504SKiran Kumar K .process = test_node3_worker,
1366b896504SKiran Kumar K .nb_edges = 1,
1376b896504SKiran Kumar K .next_nodes = {"test_node00"},
1386b896504SKiran Kumar K },
1396b896504SKiran Kumar K },
1406b896504SKiran Kumar K },
1416b896504SKiran Kumar K };
1426b896504SKiran Kumar K
1436b896504SKiran Kumar K static int
node_init(const struct rte_graph * graph,struct rte_node * node)1446b896504SKiran Kumar K node_init(const struct rte_graph *graph, struct rte_node *node)
1456b896504SKiran Kumar K {
1466b896504SKiran Kumar K RTE_SET_USED(graph);
1476b896504SKiran Kumar K *(uint32_t *)node->ctx = node->id;
1486b896504SKiran Kumar K
1496b896504SKiran Kumar K return 0;
1506b896504SKiran Kumar K }
1516b896504SKiran Kumar K
1526b896504SKiran Kumar K static struct rte_node_register test_node_source = {
1536b896504SKiran Kumar K .name = "test_node_source1",
1546b896504SKiran Kumar K .process = test_node_worker_source,
1556b896504SKiran Kumar K .flags = RTE_NODE_SOURCE_F,
1566b896504SKiran Kumar K .nb_edges = 2,
1576b896504SKiran Kumar K .init = node_init,
1586b896504SKiran Kumar K .next_nodes = {"test_node00", "test_node00-test_node11"},
1596b896504SKiran Kumar K };
1606b896504SKiran Kumar K RTE_NODE_REGISTER(test_node_source);
1616b896504SKiran Kumar K
1626b896504SKiran Kumar K static struct rte_node_register test_node0 = {
1636b896504SKiran Kumar K .name = "test_node00",
1646b896504SKiran Kumar K .process = test_node0_worker,
1656b896504SKiran Kumar K .init = node_init,
1666b896504SKiran Kumar K };
1676b896504SKiran Kumar K RTE_NODE_REGISTER(test_node0);
1686b896504SKiran Kumar K
1696b896504SKiran Kumar K uint16_t
test_node_worker_source(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)1706b896504SKiran Kumar K test_node_worker_source(struct rte_graph *graph, struct rte_node *node,
1716b896504SKiran Kumar K void **objs, uint16_t nb_objs)
1726b896504SKiran Kumar K {
1739330521cSKiran Kumar K uint32_t obj_node0 = rte_rand() % 100, obj_node1;
1746b896504SKiran Kumar K test_main_t *tm = &test_main;
1756b896504SKiran Kumar K struct rte_mbuf *data;
1766b896504SKiran Kumar K void **next_stream;
1776b896504SKiran Kumar K rte_node_t next;
1786b896504SKiran Kumar K uint32_t i;
1796b896504SKiran Kumar K
1806b896504SKiran Kumar K RTE_SET_USED(objs);
1816b896504SKiran Kumar K nb_objs = RTE_GRAPH_BURST_SIZE;
1826b896504SKiran Kumar K
1836b896504SKiran Kumar K /* Prepare stream for next node 0 */
1846b896504SKiran Kumar K obj_node0 = nb_objs * obj_node0 * 0.01;
1856b896504SKiran Kumar K next = 0;
1866b896504SKiran Kumar K next_stream = rte_node_next_stream_get(graph, node, next, obj_node0);
1876b896504SKiran Kumar K for (i = 0; i < obj_node0; i++) {
1886b896504SKiran Kumar K data = &mbuf[0][i];
189e2e01583SThomas Monjalon *graph_field(data) = ((uint64_t)tm->test_node[0].idx << 32) | i;
1906b896504SKiran Kumar K if ((i + 1) == obj_node0)
191e2e01583SThomas Monjalon *graph_field(data) |= (1 << 16);
1926b896504SKiran Kumar K next_stream[i] = &mbuf[0][i];
1936b896504SKiran Kumar K }
1946b896504SKiran Kumar K rte_node_next_stream_put(graph, node, next, obj_node0);
1956b896504SKiran Kumar K
1966b896504SKiran Kumar K /* Prepare stream for next node 1 */
1976b896504SKiran Kumar K obj_node1 = nb_objs - obj_node0;
1986b896504SKiran Kumar K next = 1;
1996b896504SKiran Kumar K next_stream = rte_node_next_stream_get(graph, node, next, obj_node1);
2006b896504SKiran Kumar K for (i = 0; i < obj_node1; i++) {
2016b896504SKiran Kumar K data = &mbuf[0][obj_node0 + i];
202e2e01583SThomas Monjalon *graph_field(data) = ((uint64_t)tm->test_node[1].idx << 32) | i;
2036b896504SKiran Kumar K if ((i + 1) == obj_node1)
204e2e01583SThomas Monjalon *graph_field(data) |= (1 << 16);
2056b896504SKiran Kumar K next_stream[i] = &mbuf[0][obj_node0 + i];
2066b896504SKiran Kumar K }
2076b896504SKiran Kumar K
2086b896504SKiran Kumar K rte_node_next_stream_put(graph, node, next, obj_node1);
2096b896504SKiran Kumar K obj_stats[0] += nb_objs;
2106b896504SKiran Kumar K fn_calls[0] += 1;
2116b896504SKiran Kumar K return nb_objs;
2126b896504SKiran Kumar K }
2136b896504SKiran Kumar K
2146b896504SKiran Kumar K uint16_t
test_node0_worker(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)2156b896504SKiran Kumar K test_node0_worker(struct rte_graph *graph, struct rte_node *node, void **objs,
2166b896504SKiran Kumar K uint16_t nb_objs)
2176b896504SKiran Kumar K {
2186b896504SKiran Kumar K test_main_t *tm = &test_main;
2196b896504SKiran Kumar K
2206b896504SKiran Kumar K if (*(uint32_t *)node->ctx == test_node0.id) {
2219330521cSKiran Kumar K uint32_t obj_node0 = rte_rand() % 100, obj_node1;
2226b896504SKiran Kumar K struct rte_mbuf *data;
2236b896504SKiran Kumar K uint8_t second_pass = 0;
2246b896504SKiran Kumar K uint32_t count = 0;
2256b896504SKiran Kumar K uint32_t i;
2266b896504SKiran Kumar K
2276b896504SKiran Kumar K obj_stats[1] += nb_objs;
2286b896504SKiran Kumar K fn_calls[1] += 1;
2296b896504SKiran Kumar K
2306b896504SKiran Kumar K for (i = 0; i < nb_objs; i++) {
2316b896504SKiran Kumar K data = (struct rte_mbuf *)objs[i];
232e2e01583SThomas Monjalon if ((*graph_field(data) >> 32) != tm->test_node[0].idx) {
2336b896504SKiran Kumar K printf("Data idx miss match at node 0, expected"
2346b896504SKiran Kumar K " = %u got = %u\n",
2356b896504SKiran Kumar K tm->test_node[0].idx,
236e2e01583SThomas Monjalon (uint32_t)(*graph_field(data) >> 32));
2376b896504SKiran Kumar K goto end;
2386b896504SKiran Kumar K }
2396b896504SKiran Kumar K
240e2e01583SThomas Monjalon if ((*graph_field(data) & 0xffff) != (i - count)) {
2416b896504SKiran Kumar K printf("Expected buff count miss match at "
2426b896504SKiran Kumar K "node 0\n");
2436b896504SKiran Kumar K goto end;
2446b896504SKiran Kumar K }
2456b896504SKiran Kumar K
246e2e01583SThomas Monjalon if (*graph_field(data) & (0x1 << 16))
2476b896504SKiran Kumar K count = i + 1;
248e2e01583SThomas Monjalon if (*graph_field(data) & (0x1 << 17))
2496b896504SKiran Kumar K second_pass = 1;
2506b896504SKiran Kumar K }
2516b896504SKiran Kumar K
2526b896504SKiran Kumar K if (count != i) {
2536b896504SKiran Kumar K printf("Count mismatch at node 0\n");
2546b896504SKiran Kumar K goto end;
2556b896504SKiran Kumar K }
2566b896504SKiran Kumar K
2576b896504SKiran Kumar K obj_node0 = nb_objs * obj_node0 * 0.01;
2586b896504SKiran Kumar K for (i = 0; i < obj_node0; i++) {
2596b896504SKiran Kumar K data = &mbuf[1][i];
260e2e01583SThomas Monjalon *graph_field(data) =
2616b896504SKiran Kumar K ((uint64_t)tm->test_node[1].idx << 32) | i;
2626b896504SKiran Kumar K if ((i + 1) == obj_node0)
263e2e01583SThomas Monjalon *graph_field(data) |= (1 << 16);
2646b896504SKiran Kumar K if (second_pass)
265e2e01583SThomas Monjalon *graph_field(data) |= (1 << 17);
2666b896504SKiran Kumar K }
2676b896504SKiran Kumar K rte_node_enqueue(graph, node, 0, (void **)&mbuf_p[1][0],
2686b896504SKiran Kumar K obj_node0);
2696b896504SKiran Kumar K
2706b896504SKiran Kumar K obj_node1 = nb_objs - obj_node0;
2716b896504SKiran Kumar K for (i = 0; i < obj_node1; i++) {
2726b896504SKiran Kumar K data = &mbuf[1][obj_node0 + i];
273e2e01583SThomas Monjalon *graph_field(data) =
2746b896504SKiran Kumar K ((uint64_t)tm->test_node[2].idx << 32) | i;
2756b896504SKiran Kumar K if ((i + 1) == obj_node1)
276e2e01583SThomas Monjalon *graph_field(data) |= (1 << 16);
2776b896504SKiran Kumar K if (second_pass)
278e2e01583SThomas Monjalon *graph_field(data) |= (1 << 17);
2796b896504SKiran Kumar K }
2806b896504SKiran Kumar K rte_node_enqueue(graph, node, 1, (void **)&mbuf_p[1][obj_node0],
2816b896504SKiran Kumar K obj_node1);
2826b896504SKiran Kumar K
2836b896504SKiran Kumar K } else if (*(uint32_t *)node->ctx == tm->test_node[1].idx) {
2846b896504SKiran Kumar K test_node1_worker(graph, node, objs, nb_objs);
2856b896504SKiran Kumar K } else if (*(uint32_t *)node->ctx == tm->test_node[2].idx) {
2866b896504SKiran Kumar K test_node2_worker(graph, node, objs, nb_objs);
2876b896504SKiran Kumar K } else if (*(uint32_t *)node->ctx == tm->test_node[3].idx) {
2886b896504SKiran Kumar K test_node3_worker(graph, node, objs, nb_objs);
2896b896504SKiran Kumar K } else {
2906b896504SKiran Kumar K printf("Unexpected node context\n");
2916b896504SKiran Kumar K }
2926b896504SKiran Kumar K
2936b896504SKiran Kumar K end:
2946b896504SKiran Kumar K return nb_objs;
2956b896504SKiran Kumar K }
2966b896504SKiran Kumar K
2976b896504SKiran Kumar K uint16_t
test_node1_worker(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)2986b896504SKiran Kumar K test_node1_worker(struct rte_graph *graph, struct rte_node *node, void **objs,
2996b896504SKiran Kumar K uint16_t nb_objs)
3006b896504SKiran Kumar K {
3016b896504SKiran Kumar K test_main_t *tm = &test_main;
3026b896504SKiran Kumar K uint8_t second_pass = 0;
3036b896504SKiran Kumar K uint32_t obj_node0 = 0;
3046b896504SKiran Kumar K struct rte_mbuf *data;
3056b896504SKiran Kumar K uint32_t count = 0;
3066b896504SKiran Kumar K uint32_t i;
3076b896504SKiran Kumar K
3086b896504SKiran Kumar K obj_stats[2] += nb_objs;
3096b896504SKiran Kumar K fn_calls[2] += 1;
3106b896504SKiran Kumar K for (i = 0; i < nb_objs; i++) {
3116b896504SKiran Kumar K data = (struct rte_mbuf *)objs[i];
312e2e01583SThomas Monjalon if ((*graph_field(data) >> 32) != tm->test_node[1].idx) {
3136b896504SKiran Kumar K printf("Data idx miss match at node 1, expected = %u"
3146b896504SKiran Kumar K " got = %u\n",
3156b896504SKiran Kumar K tm->test_node[1].idx,
316e2e01583SThomas Monjalon (uint32_t)(*graph_field(data) >> 32));
3176b896504SKiran Kumar K goto end;
3186b896504SKiran Kumar K }
3196b896504SKiran Kumar K
320e2e01583SThomas Monjalon if ((*graph_field(data) & 0xffff) != (i - count)) {
3216b896504SKiran Kumar K printf("Expected buff count miss match at node 1\n");
3226b896504SKiran Kumar K goto end;
3236b896504SKiran Kumar K }
3246b896504SKiran Kumar K
325e2e01583SThomas Monjalon if (*graph_field(data) & (0x1 << 16))
3266b896504SKiran Kumar K count = i + 1;
327e2e01583SThomas Monjalon if (*graph_field(data) & (0x1 << 17))
3286b896504SKiran Kumar K second_pass = 1;
3296b896504SKiran Kumar K }
3306b896504SKiran Kumar K
3316b896504SKiran Kumar K if (count != i) {
3326b896504SKiran Kumar K printf("Count mismatch at node 1\n");
3336b896504SKiran Kumar K goto end;
3346b896504SKiran Kumar K }
3356b896504SKiran Kumar K
3366b896504SKiran Kumar K obj_node0 = nb_objs;
3376b896504SKiran Kumar K for (i = 0; i < obj_node0; i++) {
3386b896504SKiran Kumar K data = &mbuf[2][i];
339e2e01583SThomas Monjalon *graph_field(data) = ((uint64_t)tm->test_node[2].idx << 32) | i;
3406b896504SKiran Kumar K if ((i + 1) == obj_node0)
341e2e01583SThomas Monjalon *graph_field(data) |= (1 << 16);
3426b896504SKiran Kumar K if (second_pass)
343e2e01583SThomas Monjalon *graph_field(data) |= (1 << 17);
3446b896504SKiran Kumar K }
3456b896504SKiran Kumar K rte_node_enqueue(graph, node, 0, (void **)&mbuf_p[2][0], obj_node0);
3466b896504SKiran Kumar K
3476b896504SKiran Kumar K end:
3486b896504SKiran Kumar K return nb_objs;
3496b896504SKiran Kumar K }
3506b896504SKiran Kumar K
3516b896504SKiran Kumar K uint16_t
test_node2_worker(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)3526b896504SKiran Kumar K test_node2_worker(struct rte_graph *graph, struct rte_node *node, void **objs,
3536b896504SKiran Kumar K uint16_t nb_objs)
3546b896504SKiran Kumar K {
3556b896504SKiran Kumar K test_main_t *tm = &test_main;
3566b896504SKiran Kumar K uint8_t second_pass = 0;
3576b896504SKiran Kumar K struct rte_mbuf *data;
3586b896504SKiran Kumar K uint32_t count = 0;
3596b896504SKiran Kumar K uint32_t obj_node0;
3606b896504SKiran Kumar K uint32_t i;
3616b896504SKiran Kumar K
3626b896504SKiran Kumar K obj_stats[3] += nb_objs;
3636b896504SKiran Kumar K fn_calls[3] += 1;
3646b896504SKiran Kumar K for (i = 0; i < nb_objs; i++) {
3656b896504SKiran Kumar K data = (struct rte_mbuf *)objs[i];
366e2e01583SThomas Monjalon if ((*graph_field(data) >> 32) != tm->test_node[2].idx) {
3676b896504SKiran Kumar K printf("Data idx miss match at node 2, expected = %u"
3686b896504SKiran Kumar K " got = %u\n",
3696b896504SKiran Kumar K tm->test_node[2].idx,
370e2e01583SThomas Monjalon (uint32_t)(*graph_field(data) >> 32));
3716b896504SKiran Kumar K goto end;
3726b896504SKiran Kumar K }
3736b896504SKiran Kumar K
374e2e01583SThomas Monjalon if ((*graph_field(data) & 0xffff) != (i - count)) {
3756b896504SKiran Kumar K printf("Expected buff count miss match at node 2\n");
3766b896504SKiran Kumar K goto end;
3776b896504SKiran Kumar K }
3786b896504SKiran Kumar K
379e2e01583SThomas Monjalon if (*graph_field(data) & (0x1 << 16))
3806b896504SKiran Kumar K count = i + 1;
381e2e01583SThomas Monjalon if (*graph_field(data) & (0x1 << 17))
3826b896504SKiran Kumar K second_pass = 1;
3836b896504SKiran Kumar K }
3846b896504SKiran Kumar K
3856b896504SKiran Kumar K if (count != i) {
3866b896504SKiran Kumar K printf("Count mismatch at node 2\n");
3876b896504SKiran Kumar K goto end;
3886b896504SKiran Kumar K }
3896b896504SKiran Kumar K
3906b896504SKiran Kumar K if (!second_pass) {
3916b896504SKiran Kumar K obj_node0 = nb_objs;
3926b896504SKiran Kumar K for (i = 0; i < obj_node0; i++) {
3936b896504SKiran Kumar K data = &mbuf[3][i];
394e2e01583SThomas Monjalon *graph_field(data) =
3956b896504SKiran Kumar K ((uint64_t)tm->test_node[3].idx << 32) | i;
3966b896504SKiran Kumar K if ((i + 1) == obj_node0)
397e2e01583SThomas Monjalon *graph_field(data) |= (1 << 16);
3986b896504SKiran Kumar K }
3996b896504SKiran Kumar K rte_node_enqueue(graph, node, 0, (void **)&mbuf_p[3][0],
4006b896504SKiran Kumar K obj_node0);
4016b896504SKiran Kumar K }
4026b896504SKiran Kumar K
4036b896504SKiran Kumar K end:
4046b896504SKiran Kumar K return nb_objs;
4056b896504SKiran Kumar K }
4066b896504SKiran Kumar K
4076b896504SKiran Kumar K uint16_t
test_node3_worker(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)4086b896504SKiran Kumar K test_node3_worker(struct rte_graph *graph, struct rte_node *node, void **objs,
4096b896504SKiran Kumar K uint16_t nb_objs)
4106b896504SKiran Kumar K {
4116b896504SKiran Kumar K test_main_t *tm = &test_main;
4126b896504SKiran Kumar K uint8_t second_pass = 0;
4136b896504SKiran Kumar K struct rte_mbuf *data;
4146b896504SKiran Kumar K uint32_t count = 0;
4156b896504SKiran Kumar K uint32_t obj_node0;
4166b896504SKiran Kumar K uint32_t i;
4176b896504SKiran Kumar K
4186b896504SKiran Kumar K obj_stats[4] += nb_objs;
4196b896504SKiran Kumar K fn_calls[4] += 1;
4206b896504SKiran Kumar K for (i = 0; i < nb_objs; i++) {
4216b896504SKiran Kumar K data = (struct rte_mbuf *)objs[i];
422e2e01583SThomas Monjalon if ((*graph_field(data) >> 32) != tm->test_node[3].idx) {
4236b896504SKiran Kumar K printf("Data idx miss match at node 3, expected = %u"
4246b896504SKiran Kumar K " got = %u\n",
4256b896504SKiran Kumar K tm->test_node[3].idx,
426e2e01583SThomas Monjalon (uint32_t)(*graph_field(data) >> 32));
4276b896504SKiran Kumar K goto end;
4286b896504SKiran Kumar K }
4296b896504SKiran Kumar K
430e2e01583SThomas Monjalon if ((*graph_field(data) & 0xffff) != (i - count)) {
4316b896504SKiran Kumar K printf("Expected buff count miss match at node 3\n");
4326b896504SKiran Kumar K goto end;
4336b896504SKiran Kumar K }
4346b896504SKiran Kumar K
435e2e01583SThomas Monjalon if (*graph_field(data) & (0x1 << 16))
4366b896504SKiran Kumar K count = i + 1;
437e2e01583SThomas Monjalon if (*graph_field(data) & (0x1 << 17))
4386b896504SKiran Kumar K second_pass = 1;
4396b896504SKiran Kumar K }
4406b896504SKiran Kumar K
4416b896504SKiran Kumar K if (count != i) {
4426b896504SKiran Kumar K printf("Count mismatch at node 3\n");
4436b896504SKiran Kumar K goto end;
4446b896504SKiran Kumar K }
4456b896504SKiran Kumar K
4466b896504SKiran Kumar K if (second_pass) {
4476b896504SKiran Kumar K printf("Unexpected buffers are at node 3\n");
4486b896504SKiran Kumar K goto end;
4496b896504SKiran Kumar K } else {
4506b896504SKiran Kumar K obj_node0 = nb_objs * 2;
4516b896504SKiran Kumar K for (i = 0; i < obj_node0; i++) {
4526b896504SKiran Kumar K data = &mbuf[4][i];
453e2e01583SThomas Monjalon *graph_field(data) =
4546b896504SKiran Kumar K ((uint64_t)tm->test_node[0].idx << 32) | i;
455e2e01583SThomas Monjalon *graph_field(data) |= (1 << 17);
4566b896504SKiran Kumar K if ((i + 1) == obj_node0)
457e2e01583SThomas Monjalon *graph_field(data) |= (1 << 16);
4586b896504SKiran Kumar K }
4596b896504SKiran Kumar K rte_node_enqueue(graph, node, 0, (void **)&mbuf_p[4][0],
4606b896504SKiran Kumar K obj_node0);
4616b896504SKiran Kumar K }
4626b896504SKiran Kumar K
4636b896504SKiran Kumar K end:
4646b896504SKiran Kumar K return nb_objs;
4656b896504SKiran Kumar K }
4666b896504SKiran Kumar K
4676b896504SKiran Kumar K static int
test_lookup_functions(void)4686b896504SKiran Kumar K test_lookup_functions(void)
4696b896504SKiran Kumar K {
4706b896504SKiran Kumar K test_main_t *tm = &test_main;
4716b896504SKiran Kumar K int i;
4726b896504SKiran Kumar K
4736b896504SKiran Kumar K /* Verify the name with ID */
4746b896504SKiran Kumar K for (i = 1; i < MAX_NODES; i++) {
4756b896504SKiran Kumar K char *name = rte_node_id_to_name(tm->test_node[i].idx);
4766b896504SKiran Kumar K if (strcmp(name, node_names[i]) != 0) {
4776b896504SKiran Kumar K printf("Test node name verify by ID = %d failed "
4786b896504SKiran Kumar K "Expected = %s, got %s\n",
4796b896504SKiran Kumar K i, node_names[i], name);
4806b896504SKiran Kumar K return -1;
4816b896504SKiran Kumar K }
4826b896504SKiran Kumar K }
4836b896504SKiran Kumar K
4846b896504SKiran Kumar K /* Verify by name */
4856b896504SKiran Kumar K for (i = 1; i < MAX_NODES; i++) {
4866b896504SKiran Kumar K uint32_t idx = rte_node_from_name(node_names[i]);
4876b896504SKiran Kumar K if (idx != tm->test_node[i].idx) {
4886b896504SKiran Kumar K printf("Test node ID verify by name = %s failed "
4896b896504SKiran Kumar K "Expected = %d, got %d\n",
4906b896504SKiran Kumar K node_names[i], tm->test_node[i].idx, idx);
4916b896504SKiran Kumar K return -1;
4926b896504SKiran Kumar K }
4936b896504SKiran Kumar K }
4946b896504SKiran Kumar K
4956b896504SKiran Kumar K /* Verify edge count */
4966b896504SKiran Kumar K for (i = 1; i < MAX_NODES; i++) {
4976b896504SKiran Kumar K uint32_t count = rte_node_edge_count(tm->test_node[i].idx);
4986b896504SKiran Kumar K if (count != tm->test_node[i].node.nb_edges) {
4996b896504SKiran Kumar K printf("Test number of edges for node = %s failed Expected = %d, got = %d\n",
5006b896504SKiran Kumar K tm->test_node[i].node.name,
5016b896504SKiran Kumar K tm->test_node[i].node.nb_edges, count);
5026b896504SKiran Kumar K return -1;
5036b896504SKiran Kumar K }
5046b896504SKiran Kumar K }
5056b896504SKiran Kumar K
5066b896504SKiran Kumar K /* Verify edge names */
5076b896504SKiran Kumar K for (i = 1; i < MAX_NODES; i++) {
5086b896504SKiran Kumar K uint32_t j, count;
5096b896504SKiran Kumar K char **next_edges;
5106b896504SKiran Kumar K
5116b896504SKiran Kumar K count = rte_node_edge_get(tm->test_node[i].idx, NULL);
5126b896504SKiran Kumar K if (count != tm->test_node[i].node.nb_edges * sizeof(char *)) {
5136b896504SKiran Kumar K printf("Test number of edge count for node = %s failed Expected = %d, got = %d\n",
5146b896504SKiran Kumar K tm->test_node[i].node.name,
5156b896504SKiran Kumar K tm->test_node[i].node.nb_edges, count);
5166b896504SKiran Kumar K return -1;
5176b896504SKiran Kumar K }
5186b896504SKiran Kumar K next_edges = malloc(count);
5196b896504SKiran Kumar K count = rte_node_edge_get(tm->test_node[i].idx, next_edges);
5206b896504SKiran Kumar K if (count != tm->test_node[i].node.nb_edges) {
5216b896504SKiran Kumar K printf("Test number of edges for node = %s failed Expected = %d, got %d\n",
5226b896504SKiran Kumar K tm->test_node[i].node.name,
5236b896504SKiran Kumar K tm->test_node[i].node.nb_edges, count);
524c5a56c58SKiran Kumar K free(next_edges);
5256b896504SKiran Kumar K return -1;
5266b896504SKiran Kumar K }
5276b896504SKiran Kumar K
5286b896504SKiran Kumar K for (j = 0; j < count; j++) {
5296b896504SKiran Kumar K if (strcmp(next_edges[j],
5306b896504SKiran Kumar K tm->test_node[i].node.next_nodes[j]) != 0) {
5316b896504SKiran Kumar K printf("Edge name miss match, expected = %s got = %s\n",
5326b896504SKiran Kumar K tm->test_node[i].node.next_nodes[j],
5336b896504SKiran Kumar K next_edges[j]);
534c5a56c58SKiran Kumar K free(next_edges);
5356b896504SKiran Kumar K return -1;
5366b896504SKiran Kumar K }
5376b896504SKiran Kumar K }
5386b896504SKiran Kumar K free(next_edges);
5396b896504SKiran Kumar K }
5406b896504SKiran Kumar K
5416b896504SKiran Kumar K return 0;
5426b896504SKiran Kumar K }
5436b896504SKiran Kumar K
5446b896504SKiran Kumar K static int
test_node_clone(void)5456b896504SKiran Kumar K test_node_clone(void)
5466b896504SKiran Kumar K {
5476b896504SKiran Kumar K test_main_t *tm = &test_main;
5486b896504SKiran Kumar K uint32_t node_id, dummy_id;
5496b896504SKiran Kumar K int i;
5506b896504SKiran Kumar K
5516b896504SKiran Kumar K node_id = rte_node_from_name("test_node00");
5526b896504SKiran Kumar K tm->test_node[0].idx = node_id;
5536b896504SKiran Kumar K
5546eccb0c9SHaiyue Wang dummy_id = rte_node_clone(node_id, "test_node00");
5556eccb0c9SHaiyue Wang if (rte_node_is_invalid(dummy_id)) {
5566eccb0c9SHaiyue Wang printf("Got invalid id when clone, Expecting fail\n");
5576eccb0c9SHaiyue Wang return -1;
5586eccb0c9SHaiyue Wang }
5596eccb0c9SHaiyue Wang
5606b896504SKiran Kumar K /* Clone with same name, should fail */
5616b896504SKiran Kumar K dummy_id = rte_node_clone(node_id, "test_node00");
5626b896504SKiran Kumar K if (!rte_node_is_invalid(dummy_id)) {
5636b896504SKiran Kumar K printf("Got valid id when clone with same name, Expecting fail\n");
5646b896504SKiran Kumar K return -1;
5656b896504SKiran Kumar K }
5666b896504SKiran Kumar K
5676b896504SKiran Kumar K for (i = 1; i < MAX_NODES; i++) {
5686b896504SKiran Kumar K tm->test_node[i].idx =
5696b896504SKiran Kumar K rte_node_clone(node_id, tm->test_node[i].node.name);
5706b896504SKiran Kumar K if (rte_node_is_invalid(tm->test_node[i].idx)) {
5716b896504SKiran Kumar K printf("Got invalid node id\n");
5726b896504SKiran Kumar K return -1;
5736b896504SKiran Kumar K }
5746b896504SKiran Kumar K }
5756b896504SKiran Kumar K
5766b896504SKiran Kumar K /* Clone from cloned node should fail */
5776b896504SKiran Kumar K dummy_id = rte_node_clone(tm->test_node[1].idx, "dummy_node");
5786b896504SKiran Kumar K if (!rte_node_is_invalid(dummy_id)) {
5796b896504SKiran Kumar K printf("Got valid node id when cloning from cloned node, expected fail\n");
5806b896504SKiran Kumar K return -1;
5816b896504SKiran Kumar K }
5826b896504SKiran Kumar K
5836b896504SKiran Kumar K return 0;
5846b896504SKiran Kumar K }
5856b896504SKiran Kumar K
5866b896504SKiran Kumar K static int
test_update_edges(void)5876b896504SKiran Kumar K test_update_edges(void)
5886b896504SKiran Kumar K {
5896b896504SKiran Kumar K test_main_t *tm = &test_main;
5906b896504SKiran Kumar K uint32_t node_id;
5916b896504SKiran Kumar K uint16_t count;
5926b896504SKiran Kumar K int i;
5936b896504SKiran Kumar K
5946b896504SKiran Kumar K node_id = rte_node_from_name("test_node00");
5956b896504SKiran Kumar K count = rte_node_edge_update(node_id, 0,
5966b896504SKiran Kumar K tm->test_node[0].node.next_nodes,
5976b896504SKiran Kumar K tm->test_node[0].node.nb_edges);
5986b896504SKiran Kumar K if (count != tm->test_node[0].node.nb_edges) {
5996b896504SKiran Kumar K printf("Update edges failed expected: %d got = %d\n",
6006b896504SKiran Kumar K tm->test_node[0].node.nb_edges, count);
6016b896504SKiran Kumar K return -1;
6026b896504SKiran Kumar K }
6036b896504SKiran Kumar K
6046b896504SKiran Kumar K for (i = 1; i < MAX_NODES; i++) {
6056b896504SKiran Kumar K count = rte_node_edge_update(tm->test_node[i].idx, 0,
6066b896504SKiran Kumar K tm->test_node[i].node.next_nodes,
6076b896504SKiran Kumar K tm->test_node[i].node.nb_edges);
6086b896504SKiran Kumar K if (count != tm->test_node[i].node.nb_edges) {
6096b896504SKiran Kumar K printf("Update edges failed expected: %d got = %d\n",
6106b896504SKiran Kumar K tm->test_node[i].node.nb_edges, count);
6116b896504SKiran Kumar K return -1;
6126b896504SKiran Kumar K }
6136b896504SKiran Kumar K
6146b896504SKiran Kumar K count = rte_node_edge_shrink(tm->test_node[i].idx,
6156b896504SKiran Kumar K tm->test_node[i].node.nb_edges);
6166b896504SKiran Kumar K if (count != tm->test_node[i].node.nb_edges) {
6176b896504SKiran Kumar K printf("Shrink edges failed\n");
6186b896504SKiran Kumar K return -1;
6196b896504SKiran Kumar K }
6206b896504SKiran Kumar K }
6216b896504SKiran Kumar K
6226b896504SKiran Kumar K return 0;
6236b896504SKiran Kumar K }
6246b896504SKiran Kumar K
6256b896504SKiran Kumar K static int
test_create_graph(void)6266b896504SKiran Kumar K test_create_graph(void)
6276b896504SKiran Kumar K {
6286b896504SKiran Kumar K static const char *node_patterns_dummy[] = {
6296b896504SKiran Kumar K "test_node_source1", "test_node00",
6306b896504SKiran Kumar K "test_node00-test_node11", "test_node00-test_node22",
6316b896504SKiran Kumar K "test_node00-test_node33", "test_node00-dummy_node",
6326b896504SKiran Kumar K };
6336b896504SKiran Kumar K struct rte_graph_param gconf = {
6346b896504SKiran Kumar K .socket_id = SOCKET_ID_ANY,
6356b896504SKiran Kumar K .nb_node_patterns = 6,
6366b896504SKiran Kumar K .node_patterns = node_patterns_dummy,
6376b896504SKiran Kumar K };
6386b896504SKiran Kumar K uint32_t dummy_node_id;
6396b896504SKiran Kumar K uint32_t node_id;
6406b896504SKiran Kumar K
6416b896504SKiran Kumar K node_id = rte_node_from_name("test_node00");
6426b896504SKiran Kumar K dummy_node_id = rte_node_clone(node_id, "dummy_node");
6436b896504SKiran Kumar K if (rte_node_is_invalid(dummy_node_id)) {
6446b896504SKiran Kumar K printf("Got invalid node id\n");
6456b896504SKiran Kumar K return -1;
6466b896504SKiran Kumar K }
6476b896504SKiran Kumar K
6486b896504SKiran Kumar K graph_id = rte_graph_create("worker0", &gconf);
6496b896504SKiran Kumar K if (graph_id != RTE_GRAPH_ID_INVALID) {
6506b896504SKiran Kumar K printf("Graph creation success with isolated node, expected graph creation fail\n");
6516b896504SKiran Kumar K return -1;
6526b896504SKiran Kumar K }
6536b896504SKiran Kumar K
6546b896504SKiran Kumar K gconf.nb_node_patterns = 5;
6556b896504SKiran Kumar K gconf.node_patterns = node_patterns;
6566b896504SKiran Kumar K graph_id = rte_graph_create("worker0", &gconf);
6576b896504SKiran Kumar K if (graph_id == RTE_GRAPH_ID_INVALID) {
6586b896504SKiran Kumar K printf("Graph creation failed with error = %d\n", rte_errno);
6596b896504SKiran Kumar K return -1;
6606b896504SKiran Kumar K }
6616b896504SKiran Kumar K return 0;
6626b896504SKiran Kumar K }
6636b896504SKiran Kumar K
6646b896504SKiran Kumar K static int
test_graph_clone(void)66567e2303cSZhirun Yan test_graph_clone(void)
66667e2303cSZhirun Yan {
66767e2303cSZhirun Yan rte_graph_t cloned_graph_id = RTE_GRAPH_ID_INVALID;
66867e2303cSZhirun Yan rte_graph_t main_graph_id = RTE_GRAPH_ID_INVALID;
669a7f73e53SZhirun Yan struct rte_graph_param graph_conf = {0};
67067e2303cSZhirun Yan int ret = 0;
67167e2303cSZhirun Yan
67267e2303cSZhirun Yan main_graph_id = rte_graph_from_name("worker0");
67367e2303cSZhirun Yan if (main_graph_id == RTE_GRAPH_ID_INVALID) {
67467e2303cSZhirun Yan printf("Must create main graph first\n");
67567e2303cSZhirun Yan ret = -1;
67667e2303cSZhirun Yan }
67767e2303cSZhirun Yan
67867e2303cSZhirun Yan graph_conf.dispatch.mp_capacity = 1024;
67967e2303cSZhirun Yan graph_conf.dispatch.wq_size_max = 32;
68067e2303cSZhirun Yan
68167e2303cSZhirun Yan cloned_graph_id = rte_graph_clone(main_graph_id, "cloned-test0", &graph_conf);
68267e2303cSZhirun Yan
68367e2303cSZhirun Yan if (cloned_graph_id == RTE_GRAPH_ID_INVALID) {
68467e2303cSZhirun Yan printf("Graph creation failed with error = %d\n", rte_errno);
68567e2303cSZhirun Yan ret = -1;
68667e2303cSZhirun Yan }
68767e2303cSZhirun Yan
68867e2303cSZhirun Yan if (strcmp(rte_graph_id_to_name(cloned_graph_id), "worker0-cloned-test0")) {
68967e2303cSZhirun Yan printf("Cloned graph should name as %s but get %s\n", "worker0-cloned-test",
69067e2303cSZhirun Yan rte_graph_id_to_name(cloned_graph_id));
69167e2303cSZhirun Yan ret = -1;
69267e2303cSZhirun Yan }
69367e2303cSZhirun Yan
69467e2303cSZhirun Yan rte_graph_destroy(cloned_graph_id);
69567e2303cSZhirun Yan
69667e2303cSZhirun Yan return ret;
69767e2303cSZhirun Yan }
69867e2303cSZhirun Yan
69967e2303cSZhirun Yan static int
test_graph_id_collisions(void)700*d5c8b6bbSRobin Jarry test_graph_id_collisions(void)
701*d5c8b6bbSRobin Jarry {
702*d5c8b6bbSRobin Jarry static const char *node_patterns[] = {"test_node_source1", "test_node00"};
703*d5c8b6bbSRobin Jarry struct rte_graph_param gconf = {
704*d5c8b6bbSRobin Jarry .socket_id = SOCKET_ID_ANY,
705*d5c8b6bbSRobin Jarry .nb_node_patterns = 2,
706*d5c8b6bbSRobin Jarry .node_patterns = node_patterns,
707*d5c8b6bbSRobin Jarry };
708*d5c8b6bbSRobin Jarry rte_graph_t g1, g2, g3, g4;
709*d5c8b6bbSRobin Jarry
710*d5c8b6bbSRobin Jarry g1 = rte_graph_create("worker1", &gconf);
711*d5c8b6bbSRobin Jarry if (g1 == RTE_GRAPH_ID_INVALID) {
712*d5c8b6bbSRobin Jarry printf("Graph 1 creation failed with error = %d\n", rte_errno);
713*d5c8b6bbSRobin Jarry return -1;
714*d5c8b6bbSRobin Jarry }
715*d5c8b6bbSRobin Jarry g2 = rte_graph_create("worker2", &gconf);
716*d5c8b6bbSRobin Jarry if (g2 == RTE_GRAPH_ID_INVALID) {
717*d5c8b6bbSRobin Jarry printf("Graph 2 creation failed with error = %d\n", rte_errno);
718*d5c8b6bbSRobin Jarry return -1;
719*d5c8b6bbSRobin Jarry }
720*d5c8b6bbSRobin Jarry g3 = rte_graph_create("worker3", &gconf);
721*d5c8b6bbSRobin Jarry if (g3 == RTE_GRAPH_ID_INVALID) {
722*d5c8b6bbSRobin Jarry printf("Graph 3 creation failed with error = %d\n", rte_errno);
723*d5c8b6bbSRobin Jarry return -1;
724*d5c8b6bbSRobin Jarry }
725*d5c8b6bbSRobin Jarry if (g1 == g2 || g2 == g3 || g1 == g3) {
726*d5c8b6bbSRobin Jarry printf("Graph ids should be different\n");
727*d5c8b6bbSRobin Jarry return -1;
728*d5c8b6bbSRobin Jarry }
729*d5c8b6bbSRobin Jarry if (rte_graph_destroy(g2) < 0) {
730*d5c8b6bbSRobin Jarry printf("Graph 2 suppression failed\n");
731*d5c8b6bbSRobin Jarry return -1;
732*d5c8b6bbSRobin Jarry }
733*d5c8b6bbSRobin Jarry g4 = rte_graph_create("worker4", &gconf);
734*d5c8b6bbSRobin Jarry if (g4 == RTE_GRAPH_ID_INVALID) {
735*d5c8b6bbSRobin Jarry printf("Graph 4 creation failed with error = %d\n", rte_errno);
736*d5c8b6bbSRobin Jarry return -1;
737*d5c8b6bbSRobin Jarry }
738*d5c8b6bbSRobin Jarry if (g1 == g3 || g1 == g4 || g3 == g4) {
739*d5c8b6bbSRobin Jarry printf("Graph ids should be different\n");
740*d5c8b6bbSRobin Jarry return -1;
741*d5c8b6bbSRobin Jarry }
742*d5c8b6bbSRobin Jarry g2 = rte_graph_clone(g1, "worker2", &gconf);
743*d5c8b6bbSRobin Jarry if (g2 == RTE_GRAPH_ID_INVALID) {
744*d5c8b6bbSRobin Jarry printf("Graph 4 creation failed with error = %d\n", rte_errno);
745*d5c8b6bbSRobin Jarry return -1;
746*d5c8b6bbSRobin Jarry }
747*d5c8b6bbSRobin Jarry if (g1 == g2 || g1 == g3 || g1 == g4 || g2 == g3 || g2 == g4 || g3 == g4) {
748*d5c8b6bbSRobin Jarry printf("Graph ids should be different\n");
749*d5c8b6bbSRobin Jarry return -1;
750*d5c8b6bbSRobin Jarry }
751*d5c8b6bbSRobin Jarry if (rte_graph_destroy(g1) < 0) {
752*d5c8b6bbSRobin Jarry printf("Graph 1 suppression failed\n");
753*d5c8b6bbSRobin Jarry return -1;
754*d5c8b6bbSRobin Jarry }
755*d5c8b6bbSRobin Jarry if (rte_graph_destroy(g2) < 0) {
756*d5c8b6bbSRobin Jarry printf("Graph 2 suppression failed\n");
757*d5c8b6bbSRobin Jarry return -1;
758*d5c8b6bbSRobin Jarry }
759*d5c8b6bbSRobin Jarry if (rte_graph_destroy(g3) < 0) {
760*d5c8b6bbSRobin Jarry printf("Graph 3 suppression failed\n");
761*d5c8b6bbSRobin Jarry return -1;
762*d5c8b6bbSRobin Jarry }
763*d5c8b6bbSRobin Jarry if (rte_graph_destroy(g4) < 0) {
764*d5c8b6bbSRobin Jarry printf("Graph 4 suppression failed\n");
765*d5c8b6bbSRobin Jarry return -1;
766*d5c8b6bbSRobin Jarry }
767*d5c8b6bbSRobin Jarry return 0;
768*d5c8b6bbSRobin Jarry }
769*d5c8b6bbSRobin Jarry
770*d5c8b6bbSRobin Jarry static int
test_graph_model_mcore_dispatch_node_lcore_affinity_set(void)77167e2303cSZhirun Yan test_graph_model_mcore_dispatch_node_lcore_affinity_set(void)
77267e2303cSZhirun Yan {
77367e2303cSZhirun Yan rte_graph_t cloned_graph_id = RTE_GRAPH_ID_INVALID;
77467e2303cSZhirun Yan unsigned int worker_lcore = RTE_MAX_LCORE;
775a7f73e53SZhirun Yan struct rte_graph_param graph_conf = {0};
77667e2303cSZhirun Yan rte_node_t nid = RTE_NODE_ID_INVALID;
77767e2303cSZhirun Yan char node_name[64] = "test_node00";
77867e2303cSZhirun Yan struct rte_node *node;
77967e2303cSZhirun Yan int ret = 0;
78067e2303cSZhirun Yan
78167e2303cSZhirun Yan worker_lcore = rte_get_next_lcore(worker_lcore, true, 1);
78267e2303cSZhirun Yan ret = rte_graph_model_mcore_dispatch_node_lcore_affinity_set(node_name, worker_lcore);
78367e2303cSZhirun Yan if (ret == 0)
78467e2303cSZhirun Yan printf("Set node %s affinity to lcore %u\n", node_name, worker_lcore);
78567e2303cSZhirun Yan
78667e2303cSZhirun Yan nid = rte_node_from_name(node_name);
787a7f73e53SZhirun Yan cloned_graph_id = rte_graph_clone(graph_id, "cloned-test1", &graph_conf);
78867e2303cSZhirun Yan node = rte_graph_node_get(cloned_graph_id, nid);
78967e2303cSZhirun Yan
79067e2303cSZhirun Yan if (node->dispatch.lcore_id != worker_lcore) {
79167e2303cSZhirun Yan printf("set node affinity failed\n");
79267e2303cSZhirun Yan ret = -1;
79367e2303cSZhirun Yan }
79467e2303cSZhirun Yan
79567e2303cSZhirun Yan rte_graph_destroy(cloned_graph_id);
79667e2303cSZhirun Yan
79767e2303cSZhirun Yan return ret;
79867e2303cSZhirun Yan }
79967e2303cSZhirun Yan
80067e2303cSZhirun Yan static int
test_graph_model_mcore_dispatch_core_bind_unbind(void)80167e2303cSZhirun Yan test_graph_model_mcore_dispatch_core_bind_unbind(void)
80267e2303cSZhirun Yan {
80367e2303cSZhirun Yan rte_graph_t cloned_graph_id = RTE_GRAPH_ID_INVALID;
80467e2303cSZhirun Yan unsigned int worker_lcore = RTE_MAX_LCORE;
805a7f73e53SZhirun Yan struct rte_graph_param graph_conf = {0};
80667e2303cSZhirun Yan struct rte_graph *graph;
80767e2303cSZhirun Yan int ret = 0;
80867e2303cSZhirun Yan
80967e2303cSZhirun Yan worker_lcore = rte_get_next_lcore(worker_lcore, true, 1);
810a7f73e53SZhirun Yan cloned_graph_id = rte_graph_clone(graph_id, "cloned-test2", &graph_conf);
81167e2303cSZhirun Yan
81215f483feSZhirun Yan ret = rte_graph_worker_model_set(RTE_GRAPH_MODEL_MCORE_DISPATCH);
81315f483feSZhirun Yan if (ret != 0) {
81415f483feSZhirun Yan printf("Set graph mcore dispatch model failed\n");
815c381cd34SZhirun Yan goto fail;
81615f483feSZhirun Yan }
81715f483feSZhirun Yan
81867e2303cSZhirun Yan ret = rte_graph_model_mcore_dispatch_core_bind(cloned_graph_id, worker_lcore);
81967e2303cSZhirun Yan if (ret != 0) {
82067e2303cSZhirun Yan printf("bind graph %d to lcore %u failed\n", graph_id, worker_lcore);
821c381cd34SZhirun Yan goto fail;
82267e2303cSZhirun Yan }
82367e2303cSZhirun Yan
82467e2303cSZhirun Yan graph = rte_graph_lookup("worker0-cloned-test2");
82567e2303cSZhirun Yan
82667e2303cSZhirun Yan if (graph->dispatch.lcore_id != worker_lcore) {
82767e2303cSZhirun Yan printf("bind graph %s(id:%d) with lcore %u failed\n",
82867e2303cSZhirun Yan graph->name, graph->id, worker_lcore);
82967e2303cSZhirun Yan ret = -1;
830c381cd34SZhirun Yan goto fail;
83167e2303cSZhirun Yan }
83267e2303cSZhirun Yan
83367e2303cSZhirun Yan rte_graph_model_mcore_dispatch_core_unbind(cloned_graph_id);
83467e2303cSZhirun Yan if (graph->dispatch.lcore_id != RTE_MAX_LCORE) {
83567e2303cSZhirun Yan printf("unbind graph %s(id:%d) failed %d\n",
83667e2303cSZhirun Yan graph->name, graph->id, graph->dispatch.lcore_id);
83767e2303cSZhirun Yan ret = -1;
83867e2303cSZhirun Yan }
83967e2303cSZhirun Yan
840c381cd34SZhirun Yan fail:
84167e2303cSZhirun Yan rte_graph_destroy(cloned_graph_id);
84267e2303cSZhirun Yan
84367e2303cSZhirun Yan return ret;
84467e2303cSZhirun Yan }
84567e2303cSZhirun Yan
84667e2303cSZhirun Yan static int
test_graph_worker_model_set_get(void)84767e2303cSZhirun Yan test_graph_worker_model_set_get(void)
84867e2303cSZhirun Yan {
84967e2303cSZhirun Yan rte_graph_t cloned_graph_id = RTE_GRAPH_ID_INVALID;
850a7f73e53SZhirun Yan struct rte_graph_param graph_conf = {0};
85167e2303cSZhirun Yan struct rte_graph *graph;
85267e2303cSZhirun Yan int ret = 0;
85367e2303cSZhirun Yan
854a7f73e53SZhirun Yan cloned_graph_id = rte_graph_clone(graph_id, "cloned-test3", &graph_conf);
85567e2303cSZhirun Yan ret = rte_graph_worker_model_set(RTE_GRAPH_MODEL_MCORE_DISPATCH);
85667e2303cSZhirun Yan if (ret != 0) {
85767e2303cSZhirun Yan printf("Set graph mcore dispatch model failed\n");
858c381cd34SZhirun Yan goto fail;
85967e2303cSZhirun Yan }
86067e2303cSZhirun Yan
86167e2303cSZhirun Yan graph = rte_graph_lookup("worker0-cloned-test3");
86267e2303cSZhirun Yan if (rte_graph_worker_model_get(graph) != RTE_GRAPH_MODEL_MCORE_DISPATCH) {
86367e2303cSZhirun Yan printf("Get graph worker model failed\n");
86467e2303cSZhirun Yan ret = -1;
86567e2303cSZhirun Yan }
86667e2303cSZhirun Yan
867c381cd34SZhirun Yan fail:
86867e2303cSZhirun Yan rte_graph_destroy(cloned_graph_id);
86967e2303cSZhirun Yan
870c381cd34SZhirun Yan return ret;
87167e2303cSZhirun Yan }
87267e2303cSZhirun Yan
87367e2303cSZhirun Yan static int
test_graph_walk(void)8746b896504SKiran Kumar K test_graph_walk(void)
8756b896504SKiran Kumar K {
8766b896504SKiran Kumar K struct rte_graph *graph = rte_graph_lookup("worker0");
8776b896504SKiran Kumar K int i;
8786b896504SKiran Kumar K
8796b896504SKiran Kumar K if (!graph) {
8806b896504SKiran Kumar K printf("Graph lookup failed\n");
8816b896504SKiran Kumar K return -1;
8826b896504SKiran Kumar K }
8836b896504SKiran Kumar K
8846b896504SKiran Kumar K for (i = 0; i < 5; i++)
8856b896504SKiran Kumar K rte_graph_walk(graph);
8866b896504SKiran Kumar K return 0;
8876b896504SKiran Kumar K }
8886b896504SKiran Kumar K
8896b896504SKiran Kumar K static int
test_graph_lookup_functions(void)8906b896504SKiran Kumar K test_graph_lookup_functions(void)
8916b896504SKiran Kumar K {
8926b896504SKiran Kumar K test_main_t *tm = &test_main;
8936b896504SKiran Kumar K struct rte_node *node;
8946b896504SKiran Kumar K int i;
8956b896504SKiran Kumar K
8966b896504SKiran Kumar K for (i = 0; i < MAX_NODES; i++) {
8976b896504SKiran Kumar K node = rte_graph_node_get(graph_id, tm->test_node[i].idx);
8986b896504SKiran Kumar K if (!node) {
8996b896504SKiran Kumar K printf("rte_graph_node_get, failed for node = %d\n",
9006b896504SKiran Kumar K tm->test_node[i].idx);
9016b896504SKiran Kumar K return -1;
9026b896504SKiran Kumar K }
9036b896504SKiran Kumar K
9046b896504SKiran Kumar K if (tm->test_node[i].idx != node->id) {
9056b896504SKiran Kumar K printf("Node id didn't match, expected = %d got = %d\n",
9066b896504SKiran Kumar K tm->test_node[i].idx, node->id);
9076b896504SKiran Kumar K return 0;
9086b896504SKiran Kumar K }
9096b896504SKiran Kumar K
9106b896504SKiran Kumar K if (strncmp(node->name, node_names[i], RTE_NODE_NAMESIZE)) {
9116b896504SKiran Kumar K printf("Node name didn't match, expected = %s got %s\n",
9126b896504SKiran Kumar K node_names[i], node->name);
9136b896504SKiran Kumar K return -1;
9146b896504SKiran Kumar K }
9156b896504SKiran Kumar K }
9166b896504SKiran Kumar K
9176b896504SKiran Kumar K for (i = 0; i < MAX_NODES; i++) {
9186b896504SKiran Kumar K node = rte_graph_node_get_by_name("worker0", node_names[i]);
9196b896504SKiran Kumar K if (!node) {
9206b896504SKiran Kumar K printf("rte_graph_node_get, failed for node = %d\n",
9216b896504SKiran Kumar K tm->test_node[i].idx);
9226b896504SKiran Kumar K return -1;
9236b896504SKiran Kumar K }
9246b896504SKiran Kumar K
9256b896504SKiran Kumar K if (tm->test_node[i].idx != node->id) {
9266b896504SKiran Kumar K printf("Node id didn't match, expected = %d got = %d\n",
9276b896504SKiran Kumar K tm->test_node[i].idx, node->id);
9286b896504SKiran Kumar K return 0;
9296b896504SKiran Kumar K }
9306b896504SKiran Kumar K
9316b896504SKiran Kumar K if (strncmp(node->name, node_names[i], RTE_NODE_NAMESIZE)) {
9326b896504SKiran Kumar K printf("Node name didn't match, expected = %s got %s\n",
9336b896504SKiran Kumar K node_names[i], node->name);
9346b896504SKiran Kumar K return -1;
9356b896504SKiran Kumar K }
9366b896504SKiran Kumar K }
9376b896504SKiran Kumar K
9386b896504SKiran Kumar K return 0;
9396b896504SKiran Kumar K }
9406b896504SKiran Kumar K
9416b896504SKiran 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)9426b896504SKiran Kumar K graph_cluster_stats_cb_t(bool is_first, bool is_last, void *cookie,
9436b896504SKiran Kumar K const struct rte_graph_cluster_node_stats *st)
9446b896504SKiran Kumar K {
9456b896504SKiran Kumar K int i;
9466b896504SKiran Kumar K
9476b896504SKiran Kumar K RTE_SET_USED(is_first);
9486b896504SKiran Kumar K RTE_SET_USED(is_last);
9496b896504SKiran Kumar K RTE_SET_USED(cookie);
9506b896504SKiran Kumar K
9516b896504SKiran Kumar K for (i = 0; i < MAX_NODES + 1; i++) {
9526b896504SKiran Kumar K rte_node_t id = rte_node_from_name(node_patterns[i]);
9536b896504SKiran Kumar K if (id == st->id) {
9546b896504SKiran Kumar K if (obj_stats[i] != st->objs) {
9556b896504SKiran Kumar K printf("Obj count miss match for node = %s expected = %"PRId64", got=%"PRId64"\n",
9566b896504SKiran Kumar K node_patterns[i], obj_stats[i],
9576b896504SKiran Kumar K st->objs);
9586b896504SKiran Kumar K return -1;
9596b896504SKiran Kumar K }
9606b896504SKiran Kumar K
9616b896504SKiran Kumar K if (fn_calls[i] != st->calls) {
9626b896504SKiran Kumar K printf("Func call miss match for node = %s expected = %"PRId64", got = %"PRId64"\n",
9636b896504SKiran Kumar K node_patterns[i], fn_calls[i],
9646b896504SKiran Kumar K st->calls);
9656b896504SKiran Kumar K return -1;
9666b896504SKiran Kumar K }
9676b896504SKiran Kumar K }
9686b896504SKiran Kumar K }
9696b896504SKiran Kumar K return 0;
9706b896504SKiran Kumar K }
9716b896504SKiran Kumar K
9726b896504SKiran Kumar K static int
test_print_stats(void)9736b896504SKiran Kumar K test_print_stats(void)
9746b896504SKiran Kumar K {
9756b896504SKiran Kumar K struct rte_graph_cluster_stats_param s_param;
9766b896504SKiran Kumar K struct rte_graph_cluster_stats *stats;
9776b896504SKiran Kumar K const char *pattern = "worker0";
9786b896504SKiran Kumar K
9796b896504SKiran Kumar K if (!rte_graph_has_stats_feature())
9806b896504SKiran Kumar K return 0;
9816b896504SKiran Kumar K
9826b896504SKiran Kumar K /* Prepare stats object */
9836b896504SKiran Kumar K memset(&s_param, 0, sizeof(s_param));
9846b896504SKiran Kumar K s_param.f = stdout;
9856b896504SKiran Kumar K s_param.socket_id = SOCKET_ID_ANY;
9866b896504SKiran Kumar K s_param.graph_patterns = &pattern;
9876b896504SKiran Kumar K s_param.nb_graph_patterns = 1;
9886b896504SKiran Kumar K s_param.fn = graph_cluster_stats_cb_t;
9896b896504SKiran Kumar K
9906b896504SKiran Kumar K stats = rte_graph_cluster_stats_create(&s_param);
9916b896504SKiran Kumar K if (stats == NULL) {
9926b896504SKiran Kumar K printf("Unable to get stats\n");
9936b896504SKiran Kumar K return -1;
9946b896504SKiran Kumar K }
9956b896504SKiran Kumar K /* Clear screen and move to top left */
9966b896504SKiran Kumar K rte_graph_cluster_stats_get(stats, 0);
9976b896504SKiran Kumar K rte_graph_cluster_stats_destroy(stats);
9986b896504SKiran Kumar K
9996b896504SKiran Kumar K return 0;
10006b896504SKiran Kumar K }
10016b896504SKiran Kumar K
10026b896504SKiran Kumar K static int
graph_setup(void)10036b896504SKiran Kumar K graph_setup(void)
10046b896504SKiran Kumar K {
10056b896504SKiran Kumar K int i, j;
10066b896504SKiran Kumar K
1007e2e01583SThomas Monjalon static const struct rte_mbuf_dynfield graph_dynfield_desc = {
1008e2e01583SThomas Monjalon .name = "test_graph_dynfield",
1009e2e01583SThomas Monjalon .size = sizeof(graph_dynfield_t),
101008966fe7STyler Retzlaff .align = alignof(graph_dynfield_t),
1011e2e01583SThomas Monjalon };
1012e2e01583SThomas Monjalon graph_dynfield_offset =
1013e2e01583SThomas Monjalon rte_mbuf_dynfield_register(&graph_dynfield_desc);
1014e2e01583SThomas Monjalon if (graph_dynfield_offset < 0) {
1015e2e01583SThomas Monjalon printf("Cannot register mbuf field\n");
1016e2e01583SThomas Monjalon return TEST_FAILED;
1017e2e01583SThomas Monjalon }
1018e2e01583SThomas Monjalon
10196b896504SKiran Kumar K for (i = 0; i <= MAX_NODES; i++) {
10206b896504SKiran Kumar K for (j = 0; j < MBUFF_SIZE; j++)
10216b896504SKiran Kumar K mbuf_p[i][j] = &mbuf[i][j];
10226b896504SKiran Kumar K }
10236b896504SKiran Kumar K if (test_node_clone()) {
10246b896504SKiran Kumar K printf("test_node_clone: fail\n");
10256b896504SKiran Kumar K return -1;
10266b896504SKiran Kumar K }
10276b896504SKiran Kumar K printf("test_node_clone: pass\n");
10286b896504SKiran Kumar K
10296b896504SKiran Kumar K return 0;
10306b896504SKiran Kumar K }
10316b896504SKiran Kumar K
10326b896504SKiran Kumar K static void
graph_teardown(void)10336b896504SKiran Kumar K graph_teardown(void)
10346b896504SKiran Kumar K {
10356b896504SKiran Kumar K int id;
10366b896504SKiran Kumar K
10376b896504SKiran Kumar K id = rte_graph_destroy(rte_graph_from_name("worker0"));
10386b896504SKiran Kumar K if (id)
10396b896504SKiran Kumar K printf("Graph Destroy failed\n");
10406b896504SKiran Kumar K }
10416b896504SKiran Kumar K
10426b896504SKiran Kumar K static struct unit_test_suite graph_testsuite = {
10436b896504SKiran Kumar K .suite_name = "Graph library test suite",
10446b896504SKiran Kumar K .setup = graph_setup,
10456b896504SKiran Kumar K .teardown = graph_teardown,
10466b896504SKiran Kumar K .unit_test_cases = {
10476b896504SKiran Kumar K TEST_CASE(test_update_edges),
10486b896504SKiran Kumar K TEST_CASE(test_lookup_functions),
10496b896504SKiran Kumar K TEST_CASE(test_create_graph),
105067e2303cSZhirun Yan TEST_CASE(test_graph_clone),
1051*d5c8b6bbSRobin Jarry TEST_CASE(test_graph_id_collisions),
105267e2303cSZhirun Yan TEST_CASE(test_graph_model_mcore_dispatch_node_lcore_affinity_set),
105367e2303cSZhirun Yan TEST_CASE(test_graph_model_mcore_dispatch_core_bind_unbind),
105467e2303cSZhirun Yan TEST_CASE(test_graph_worker_model_set_get),
10556b896504SKiran Kumar K TEST_CASE(test_graph_lookup_functions),
10566b896504SKiran Kumar K TEST_CASE(test_graph_walk),
10576b896504SKiran Kumar K TEST_CASE(test_print_stats),
10586b896504SKiran Kumar K TEST_CASES_END(), /**< NULL terminate unit test array */
10596b896504SKiran Kumar K },
10606b896504SKiran Kumar K };
10616b896504SKiran Kumar K
10626b896504SKiran Kumar K static int
graph_autotest_fn(void)10636b896504SKiran Kumar K graph_autotest_fn(void)
10646b896504SKiran Kumar K {
10656b896504SKiran Kumar K return unit_test_suite_runner(&graph_testsuite);
10666b896504SKiran Kumar K }
10676b896504SKiran Kumar K
1068d83fb967SDavid Marchand REGISTER_FAST_TEST(graph_autotest, true, true, graph_autotest_fn);
10696b896504SKiran Kumar K
10706b896504SKiran Kumar K static int
test_node_list_dump(void)10716b896504SKiran Kumar K test_node_list_dump(void)
10726b896504SKiran Kumar K {
10736b896504SKiran Kumar K rte_node_list_dump(stdout);
10746b896504SKiran Kumar K
10756b896504SKiran Kumar K return TEST_SUCCESS;
10766b896504SKiran Kumar K }
10773c60274cSJie Zhou
10783c60274cSJie Zhou #endif /* !RTE_EXEC_ENV_WINDOWS */
10793c60274cSJie Zhou
1080d83fb967SDavid Marchand REGISTER_FAST_TEST(node_list_dump, true, true, test_node_list_dump);
1081