1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606 * Copyright(C) 2020 Marvell International Ltd.
3*2d9fd380Sjfb8856606 */
4*2d9fd380Sjfb8856606 #include <assert.h>
5*2d9fd380Sjfb8856606 #include <inttypes.h>
6*2d9fd380Sjfb8856606 #include <signal.h>
7*2d9fd380Sjfb8856606 #include <stdio.h>
8*2d9fd380Sjfb8856606 #include <string.h>
9*2d9fd380Sjfb8856606 #include <unistd.h>
10*2d9fd380Sjfb8856606
11*2d9fd380Sjfb8856606 #include <rte_errno.h>
12*2d9fd380Sjfb8856606 #include <rte_graph.h>
13*2d9fd380Sjfb8856606 #include <rte_graph_worker.h>
14*2d9fd380Sjfb8856606 #include <rte_mbuf.h>
15*2d9fd380Sjfb8856606 #include <rte_mbuf_dyn.h>
16*2d9fd380Sjfb8856606 #include <rte_random.h>
17*2d9fd380Sjfb8856606
18*2d9fd380Sjfb8856606 #include "test.h"
19*2d9fd380Sjfb8856606
20*2d9fd380Sjfb8856606 static uint16_t test_node_worker_source(struct rte_graph *graph,
21*2d9fd380Sjfb8856606 struct rte_node *node, void **objs,
22*2d9fd380Sjfb8856606 uint16_t nb_objs);
23*2d9fd380Sjfb8856606
24*2d9fd380Sjfb8856606 static uint16_t test_node0_worker(struct rte_graph *graph,
25*2d9fd380Sjfb8856606 struct rte_node *node, void **objs,
26*2d9fd380Sjfb8856606 uint16_t nb_objs);
27*2d9fd380Sjfb8856606
28*2d9fd380Sjfb8856606 static uint16_t test_node1_worker(struct rte_graph *graph,
29*2d9fd380Sjfb8856606 struct rte_node *node, void **objs,
30*2d9fd380Sjfb8856606 uint16_t nb_objs);
31*2d9fd380Sjfb8856606
32*2d9fd380Sjfb8856606 static uint16_t test_node2_worker(struct rte_graph *graph,
33*2d9fd380Sjfb8856606 struct rte_node *node, void **objs,
34*2d9fd380Sjfb8856606 uint16_t nb_objs);
35*2d9fd380Sjfb8856606
36*2d9fd380Sjfb8856606 static uint16_t test_node3_worker(struct rte_graph *graph,
37*2d9fd380Sjfb8856606 struct rte_node *node, void **objs,
38*2d9fd380Sjfb8856606 uint16_t nb_objs);
39*2d9fd380Sjfb8856606
40*2d9fd380Sjfb8856606 #define MBUFF_SIZE 512
41*2d9fd380Sjfb8856606 #define MAX_NODES 4
42*2d9fd380Sjfb8856606
43*2d9fd380Sjfb8856606 typedef uint64_t graph_dynfield_t;
44*2d9fd380Sjfb8856606 static int graph_dynfield_offset = -1;
45*2d9fd380Sjfb8856606
46*2d9fd380Sjfb8856606 static inline graph_dynfield_t *
graph_field(struct rte_mbuf * mbuf)47*2d9fd380Sjfb8856606 graph_field(struct rte_mbuf *mbuf)
48*2d9fd380Sjfb8856606 {
49*2d9fd380Sjfb8856606 return RTE_MBUF_DYNFIELD(mbuf, \
50*2d9fd380Sjfb8856606 graph_dynfield_offset, graph_dynfield_t *);
51*2d9fd380Sjfb8856606 }
52*2d9fd380Sjfb8856606
53*2d9fd380Sjfb8856606 static struct rte_mbuf mbuf[MAX_NODES + 1][MBUFF_SIZE];
54*2d9fd380Sjfb8856606 static void *mbuf_p[MAX_NODES + 1][MBUFF_SIZE];
55*2d9fd380Sjfb8856606 static rte_graph_t graph_id;
56*2d9fd380Sjfb8856606 static uint64_t obj_stats[MAX_NODES + 1];
57*2d9fd380Sjfb8856606 static uint64_t fn_calls[MAX_NODES + 1];
58*2d9fd380Sjfb8856606
59*2d9fd380Sjfb8856606 const char *node_patterns[] = {
60*2d9fd380Sjfb8856606 "test_node_source1", "test_node00",
61*2d9fd380Sjfb8856606 "test_node00-test_node11", "test_node00-test_node22",
62*2d9fd380Sjfb8856606 "test_node00-test_node33",
63*2d9fd380Sjfb8856606 };
64*2d9fd380Sjfb8856606
65*2d9fd380Sjfb8856606 const char *node_names[] = {
66*2d9fd380Sjfb8856606 "test_node00",
67*2d9fd380Sjfb8856606 "test_node00-test_node11",
68*2d9fd380Sjfb8856606 "test_node00-test_node22",
69*2d9fd380Sjfb8856606 "test_node00-test_node33",
70*2d9fd380Sjfb8856606 };
71*2d9fd380Sjfb8856606
72*2d9fd380Sjfb8856606 struct test_node_register {
73*2d9fd380Sjfb8856606 char name[RTE_NODE_NAMESIZE];
74*2d9fd380Sjfb8856606 rte_node_process_t process;
75*2d9fd380Sjfb8856606 uint16_t nb_edges;
76*2d9fd380Sjfb8856606 const char *next_nodes[MAX_NODES];
77*2d9fd380Sjfb8856606 };
78*2d9fd380Sjfb8856606
79*2d9fd380Sjfb8856606 typedef struct {
80*2d9fd380Sjfb8856606 uint32_t idx;
81*2d9fd380Sjfb8856606 struct test_node_register node;
82*2d9fd380Sjfb8856606 } test_node_t;
83*2d9fd380Sjfb8856606
84*2d9fd380Sjfb8856606 typedef struct {
85*2d9fd380Sjfb8856606 test_node_t test_node[MAX_NODES];
86*2d9fd380Sjfb8856606 } test_main_t;
87*2d9fd380Sjfb8856606
88*2d9fd380Sjfb8856606 static test_main_t test_main = {
89*2d9fd380Sjfb8856606 .test_node = {
90*2d9fd380Sjfb8856606 {
91*2d9fd380Sjfb8856606 .node = {
92*2d9fd380Sjfb8856606 .name = "test_node00",
93*2d9fd380Sjfb8856606 .process = test_node0_worker,
94*2d9fd380Sjfb8856606 .nb_edges = 2,
95*2d9fd380Sjfb8856606 .next_nodes = {"test_node00-"
96*2d9fd380Sjfb8856606 "test_node11",
97*2d9fd380Sjfb8856606 "test_node00-"
98*2d9fd380Sjfb8856606 "test_node22"},
99*2d9fd380Sjfb8856606 },
100*2d9fd380Sjfb8856606 },
101*2d9fd380Sjfb8856606 {
102*2d9fd380Sjfb8856606 .node = {
103*2d9fd380Sjfb8856606 .name = "test_node11",
104*2d9fd380Sjfb8856606 .process = test_node1_worker,
105*2d9fd380Sjfb8856606 .nb_edges = 1,
106*2d9fd380Sjfb8856606 .next_nodes = {"test_node00-"
107*2d9fd380Sjfb8856606 "test_node22"},
108*2d9fd380Sjfb8856606 },
109*2d9fd380Sjfb8856606 },
110*2d9fd380Sjfb8856606 {
111*2d9fd380Sjfb8856606 .node = {
112*2d9fd380Sjfb8856606 .name = "test_node22",
113*2d9fd380Sjfb8856606 .process = test_node2_worker,
114*2d9fd380Sjfb8856606 .nb_edges = 1,
115*2d9fd380Sjfb8856606 .next_nodes = {"test_node00-"
116*2d9fd380Sjfb8856606 "test_node33"},
117*2d9fd380Sjfb8856606 },
118*2d9fd380Sjfb8856606 },
119*2d9fd380Sjfb8856606 {
120*2d9fd380Sjfb8856606 .node = {
121*2d9fd380Sjfb8856606 .name = "test_node33",
122*2d9fd380Sjfb8856606 .process = test_node3_worker,
123*2d9fd380Sjfb8856606 .nb_edges = 1,
124*2d9fd380Sjfb8856606 .next_nodes = {"test_node00"},
125*2d9fd380Sjfb8856606 },
126*2d9fd380Sjfb8856606 },
127*2d9fd380Sjfb8856606 },
128*2d9fd380Sjfb8856606 };
129*2d9fd380Sjfb8856606
130*2d9fd380Sjfb8856606 static int
node_init(const struct rte_graph * graph,struct rte_node * node)131*2d9fd380Sjfb8856606 node_init(const struct rte_graph *graph, struct rte_node *node)
132*2d9fd380Sjfb8856606 {
133*2d9fd380Sjfb8856606 RTE_SET_USED(graph);
134*2d9fd380Sjfb8856606 *(uint32_t *)node->ctx = node->id;
135*2d9fd380Sjfb8856606
136*2d9fd380Sjfb8856606 return 0;
137*2d9fd380Sjfb8856606 }
138*2d9fd380Sjfb8856606
139*2d9fd380Sjfb8856606 static struct rte_node_register test_node_source = {
140*2d9fd380Sjfb8856606 .name = "test_node_source1",
141*2d9fd380Sjfb8856606 .process = test_node_worker_source,
142*2d9fd380Sjfb8856606 .flags = RTE_NODE_SOURCE_F,
143*2d9fd380Sjfb8856606 .nb_edges = 2,
144*2d9fd380Sjfb8856606 .init = node_init,
145*2d9fd380Sjfb8856606 .next_nodes = {"test_node00", "test_node00-test_node11"},
146*2d9fd380Sjfb8856606 };
147*2d9fd380Sjfb8856606 RTE_NODE_REGISTER(test_node_source);
148*2d9fd380Sjfb8856606
149*2d9fd380Sjfb8856606 static struct rte_node_register test_node0 = {
150*2d9fd380Sjfb8856606 .name = "test_node00",
151*2d9fd380Sjfb8856606 .process = test_node0_worker,
152*2d9fd380Sjfb8856606 .init = node_init,
153*2d9fd380Sjfb8856606 };
154*2d9fd380Sjfb8856606 RTE_NODE_REGISTER(test_node0);
155*2d9fd380Sjfb8856606
156*2d9fd380Sjfb8856606 uint16_t
test_node_worker_source(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)157*2d9fd380Sjfb8856606 test_node_worker_source(struct rte_graph *graph, struct rte_node *node,
158*2d9fd380Sjfb8856606 void **objs, uint16_t nb_objs)
159*2d9fd380Sjfb8856606 {
160*2d9fd380Sjfb8856606 uint32_t obj_node0 = rte_rand() % 100, obj_node1;
161*2d9fd380Sjfb8856606 test_main_t *tm = &test_main;
162*2d9fd380Sjfb8856606 struct rte_mbuf *data;
163*2d9fd380Sjfb8856606 void **next_stream;
164*2d9fd380Sjfb8856606 rte_node_t next;
165*2d9fd380Sjfb8856606 uint32_t i;
166*2d9fd380Sjfb8856606
167*2d9fd380Sjfb8856606 RTE_SET_USED(objs);
168*2d9fd380Sjfb8856606 nb_objs = RTE_GRAPH_BURST_SIZE;
169*2d9fd380Sjfb8856606
170*2d9fd380Sjfb8856606 /* Prepare stream for next node 0 */
171*2d9fd380Sjfb8856606 obj_node0 = nb_objs * obj_node0 * 0.01;
172*2d9fd380Sjfb8856606 next = 0;
173*2d9fd380Sjfb8856606 next_stream = rte_node_next_stream_get(graph, node, next, obj_node0);
174*2d9fd380Sjfb8856606 for (i = 0; i < obj_node0; i++) {
175*2d9fd380Sjfb8856606 data = &mbuf[0][i];
176*2d9fd380Sjfb8856606 *graph_field(data) = ((uint64_t)tm->test_node[0].idx << 32) | i;
177*2d9fd380Sjfb8856606 if ((i + 1) == obj_node0)
178*2d9fd380Sjfb8856606 *graph_field(data) |= (1 << 16);
179*2d9fd380Sjfb8856606 next_stream[i] = &mbuf[0][i];
180*2d9fd380Sjfb8856606 }
181*2d9fd380Sjfb8856606 rte_node_next_stream_put(graph, node, next, obj_node0);
182*2d9fd380Sjfb8856606
183*2d9fd380Sjfb8856606 /* Prepare stream for next node 1 */
184*2d9fd380Sjfb8856606 obj_node1 = nb_objs - obj_node0;
185*2d9fd380Sjfb8856606 next = 1;
186*2d9fd380Sjfb8856606 next_stream = rte_node_next_stream_get(graph, node, next, obj_node1);
187*2d9fd380Sjfb8856606 for (i = 0; i < obj_node1; i++) {
188*2d9fd380Sjfb8856606 data = &mbuf[0][obj_node0 + i];
189*2d9fd380Sjfb8856606 *graph_field(data) = ((uint64_t)tm->test_node[1].idx << 32) | i;
190*2d9fd380Sjfb8856606 if ((i + 1) == obj_node1)
191*2d9fd380Sjfb8856606 *graph_field(data) |= (1 << 16);
192*2d9fd380Sjfb8856606 next_stream[i] = &mbuf[0][obj_node0 + i];
193*2d9fd380Sjfb8856606 }
194*2d9fd380Sjfb8856606
195*2d9fd380Sjfb8856606 rte_node_next_stream_put(graph, node, next, obj_node1);
196*2d9fd380Sjfb8856606 obj_stats[0] += nb_objs;
197*2d9fd380Sjfb8856606 fn_calls[0] += 1;
198*2d9fd380Sjfb8856606 return nb_objs;
199*2d9fd380Sjfb8856606 }
200*2d9fd380Sjfb8856606
201*2d9fd380Sjfb8856606 uint16_t
test_node0_worker(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)202*2d9fd380Sjfb8856606 test_node0_worker(struct rte_graph *graph, struct rte_node *node, void **objs,
203*2d9fd380Sjfb8856606 uint16_t nb_objs)
204*2d9fd380Sjfb8856606 {
205*2d9fd380Sjfb8856606 test_main_t *tm = &test_main;
206*2d9fd380Sjfb8856606
207*2d9fd380Sjfb8856606 if (*(uint32_t *)node->ctx == test_node0.id) {
208*2d9fd380Sjfb8856606 uint32_t obj_node0 = rte_rand() % 100, obj_node1;
209*2d9fd380Sjfb8856606 struct rte_mbuf *data;
210*2d9fd380Sjfb8856606 uint8_t second_pass = 0;
211*2d9fd380Sjfb8856606 uint32_t count = 0;
212*2d9fd380Sjfb8856606 uint32_t i;
213*2d9fd380Sjfb8856606
214*2d9fd380Sjfb8856606 obj_stats[1] += nb_objs;
215*2d9fd380Sjfb8856606 fn_calls[1] += 1;
216*2d9fd380Sjfb8856606
217*2d9fd380Sjfb8856606 for (i = 0; i < nb_objs; i++) {
218*2d9fd380Sjfb8856606 data = (struct rte_mbuf *)objs[i];
219*2d9fd380Sjfb8856606 if ((*graph_field(data) >> 32) != tm->test_node[0].idx) {
220*2d9fd380Sjfb8856606 printf("Data idx miss match at node 0, expected"
221*2d9fd380Sjfb8856606 " = %u got = %u\n",
222*2d9fd380Sjfb8856606 tm->test_node[0].idx,
223*2d9fd380Sjfb8856606 (uint32_t)(*graph_field(data) >> 32));
224*2d9fd380Sjfb8856606 goto end;
225*2d9fd380Sjfb8856606 }
226*2d9fd380Sjfb8856606
227*2d9fd380Sjfb8856606 if ((*graph_field(data) & 0xffff) != (i - count)) {
228*2d9fd380Sjfb8856606 printf("Expected buff count miss match at "
229*2d9fd380Sjfb8856606 "node 0\n");
230*2d9fd380Sjfb8856606 goto end;
231*2d9fd380Sjfb8856606 }
232*2d9fd380Sjfb8856606
233*2d9fd380Sjfb8856606 if (*graph_field(data) & (0x1 << 16))
234*2d9fd380Sjfb8856606 count = i + 1;
235*2d9fd380Sjfb8856606 if (*graph_field(data) & (0x1 << 17))
236*2d9fd380Sjfb8856606 second_pass = 1;
237*2d9fd380Sjfb8856606 }
238*2d9fd380Sjfb8856606
239*2d9fd380Sjfb8856606 if (count != i) {
240*2d9fd380Sjfb8856606 printf("Count mismatch at node 0\n");
241*2d9fd380Sjfb8856606 goto end;
242*2d9fd380Sjfb8856606 }
243*2d9fd380Sjfb8856606
244*2d9fd380Sjfb8856606 obj_node0 = nb_objs * obj_node0 * 0.01;
245*2d9fd380Sjfb8856606 for (i = 0; i < obj_node0; i++) {
246*2d9fd380Sjfb8856606 data = &mbuf[1][i];
247*2d9fd380Sjfb8856606 *graph_field(data) =
248*2d9fd380Sjfb8856606 ((uint64_t)tm->test_node[1].idx << 32) | i;
249*2d9fd380Sjfb8856606 if ((i + 1) == obj_node0)
250*2d9fd380Sjfb8856606 *graph_field(data) |= (1 << 16);
251*2d9fd380Sjfb8856606 if (second_pass)
252*2d9fd380Sjfb8856606 *graph_field(data) |= (1 << 17);
253*2d9fd380Sjfb8856606 }
254*2d9fd380Sjfb8856606 rte_node_enqueue(graph, node, 0, (void **)&mbuf_p[1][0],
255*2d9fd380Sjfb8856606 obj_node0);
256*2d9fd380Sjfb8856606
257*2d9fd380Sjfb8856606 obj_node1 = nb_objs - obj_node0;
258*2d9fd380Sjfb8856606 for (i = 0; i < obj_node1; i++) {
259*2d9fd380Sjfb8856606 data = &mbuf[1][obj_node0 + i];
260*2d9fd380Sjfb8856606 *graph_field(data) =
261*2d9fd380Sjfb8856606 ((uint64_t)tm->test_node[2].idx << 32) | i;
262*2d9fd380Sjfb8856606 if ((i + 1) == obj_node1)
263*2d9fd380Sjfb8856606 *graph_field(data) |= (1 << 16);
264*2d9fd380Sjfb8856606 if (second_pass)
265*2d9fd380Sjfb8856606 *graph_field(data) |= (1 << 17);
266*2d9fd380Sjfb8856606 }
267*2d9fd380Sjfb8856606 rte_node_enqueue(graph, node, 1, (void **)&mbuf_p[1][obj_node0],
268*2d9fd380Sjfb8856606 obj_node1);
269*2d9fd380Sjfb8856606
270*2d9fd380Sjfb8856606 } else if (*(uint32_t *)node->ctx == tm->test_node[1].idx) {
271*2d9fd380Sjfb8856606 test_node1_worker(graph, node, objs, nb_objs);
272*2d9fd380Sjfb8856606 } else if (*(uint32_t *)node->ctx == tm->test_node[2].idx) {
273*2d9fd380Sjfb8856606 test_node2_worker(graph, node, objs, nb_objs);
274*2d9fd380Sjfb8856606 } else if (*(uint32_t *)node->ctx == tm->test_node[3].idx) {
275*2d9fd380Sjfb8856606 test_node3_worker(graph, node, objs, nb_objs);
276*2d9fd380Sjfb8856606 } else {
277*2d9fd380Sjfb8856606 printf("Unexpected node context\n");
278*2d9fd380Sjfb8856606 }
279*2d9fd380Sjfb8856606
280*2d9fd380Sjfb8856606 end:
281*2d9fd380Sjfb8856606 return nb_objs;
282*2d9fd380Sjfb8856606 }
283*2d9fd380Sjfb8856606
284*2d9fd380Sjfb8856606 uint16_t
test_node1_worker(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)285*2d9fd380Sjfb8856606 test_node1_worker(struct rte_graph *graph, struct rte_node *node, void **objs,
286*2d9fd380Sjfb8856606 uint16_t nb_objs)
287*2d9fd380Sjfb8856606 {
288*2d9fd380Sjfb8856606 test_main_t *tm = &test_main;
289*2d9fd380Sjfb8856606 uint8_t second_pass = 0;
290*2d9fd380Sjfb8856606 uint32_t obj_node0 = 0;
291*2d9fd380Sjfb8856606 struct rte_mbuf *data;
292*2d9fd380Sjfb8856606 uint32_t count = 0;
293*2d9fd380Sjfb8856606 uint32_t i;
294*2d9fd380Sjfb8856606
295*2d9fd380Sjfb8856606 obj_stats[2] += nb_objs;
296*2d9fd380Sjfb8856606 fn_calls[2] += 1;
297*2d9fd380Sjfb8856606 for (i = 0; i < nb_objs; i++) {
298*2d9fd380Sjfb8856606 data = (struct rte_mbuf *)objs[i];
299*2d9fd380Sjfb8856606 if ((*graph_field(data) >> 32) != tm->test_node[1].idx) {
300*2d9fd380Sjfb8856606 printf("Data idx miss match at node 1, expected = %u"
301*2d9fd380Sjfb8856606 " got = %u\n",
302*2d9fd380Sjfb8856606 tm->test_node[1].idx,
303*2d9fd380Sjfb8856606 (uint32_t)(*graph_field(data) >> 32));
304*2d9fd380Sjfb8856606 goto end;
305*2d9fd380Sjfb8856606 }
306*2d9fd380Sjfb8856606
307*2d9fd380Sjfb8856606 if ((*graph_field(data) & 0xffff) != (i - count)) {
308*2d9fd380Sjfb8856606 printf("Expected buff count miss match at node 1\n");
309*2d9fd380Sjfb8856606 goto end;
310*2d9fd380Sjfb8856606 }
311*2d9fd380Sjfb8856606
312*2d9fd380Sjfb8856606 if (*graph_field(data) & (0x1 << 16))
313*2d9fd380Sjfb8856606 count = i + 1;
314*2d9fd380Sjfb8856606 if (*graph_field(data) & (0x1 << 17))
315*2d9fd380Sjfb8856606 second_pass = 1;
316*2d9fd380Sjfb8856606 }
317*2d9fd380Sjfb8856606
318*2d9fd380Sjfb8856606 if (count != i) {
319*2d9fd380Sjfb8856606 printf("Count mismatch at node 1\n");
320*2d9fd380Sjfb8856606 goto end;
321*2d9fd380Sjfb8856606 }
322*2d9fd380Sjfb8856606
323*2d9fd380Sjfb8856606 obj_node0 = nb_objs;
324*2d9fd380Sjfb8856606 for (i = 0; i < obj_node0; i++) {
325*2d9fd380Sjfb8856606 data = &mbuf[2][i];
326*2d9fd380Sjfb8856606 *graph_field(data) = ((uint64_t)tm->test_node[2].idx << 32) | i;
327*2d9fd380Sjfb8856606 if ((i + 1) == obj_node0)
328*2d9fd380Sjfb8856606 *graph_field(data) |= (1 << 16);
329*2d9fd380Sjfb8856606 if (second_pass)
330*2d9fd380Sjfb8856606 *graph_field(data) |= (1 << 17);
331*2d9fd380Sjfb8856606 }
332*2d9fd380Sjfb8856606 rte_node_enqueue(graph, node, 0, (void **)&mbuf_p[2][0], obj_node0);
333*2d9fd380Sjfb8856606
334*2d9fd380Sjfb8856606 end:
335*2d9fd380Sjfb8856606 return nb_objs;
336*2d9fd380Sjfb8856606 }
337*2d9fd380Sjfb8856606
338*2d9fd380Sjfb8856606 uint16_t
test_node2_worker(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)339*2d9fd380Sjfb8856606 test_node2_worker(struct rte_graph *graph, struct rte_node *node, void **objs,
340*2d9fd380Sjfb8856606 uint16_t nb_objs)
341*2d9fd380Sjfb8856606 {
342*2d9fd380Sjfb8856606 test_main_t *tm = &test_main;
343*2d9fd380Sjfb8856606 uint8_t second_pass = 0;
344*2d9fd380Sjfb8856606 struct rte_mbuf *data;
345*2d9fd380Sjfb8856606 uint32_t count = 0;
346*2d9fd380Sjfb8856606 uint32_t obj_node0;
347*2d9fd380Sjfb8856606 uint32_t i;
348*2d9fd380Sjfb8856606
349*2d9fd380Sjfb8856606 obj_stats[3] += nb_objs;
350*2d9fd380Sjfb8856606 fn_calls[3] += 1;
351*2d9fd380Sjfb8856606 for (i = 0; i < nb_objs; i++) {
352*2d9fd380Sjfb8856606 data = (struct rte_mbuf *)objs[i];
353*2d9fd380Sjfb8856606 if ((*graph_field(data) >> 32) != tm->test_node[2].idx) {
354*2d9fd380Sjfb8856606 printf("Data idx miss match at node 2, expected = %u"
355*2d9fd380Sjfb8856606 " got = %u\n",
356*2d9fd380Sjfb8856606 tm->test_node[2].idx,
357*2d9fd380Sjfb8856606 (uint32_t)(*graph_field(data) >> 32));
358*2d9fd380Sjfb8856606 goto end;
359*2d9fd380Sjfb8856606 }
360*2d9fd380Sjfb8856606
361*2d9fd380Sjfb8856606 if ((*graph_field(data) & 0xffff) != (i - count)) {
362*2d9fd380Sjfb8856606 printf("Expected buff count miss match at node 2\n");
363*2d9fd380Sjfb8856606 goto end;
364*2d9fd380Sjfb8856606 }
365*2d9fd380Sjfb8856606
366*2d9fd380Sjfb8856606 if (*graph_field(data) & (0x1 << 16))
367*2d9fd380Sjfb8856606 count = i + 1;
368*2d9fd380Sjfb8856606 if (*graph_field(data) & (0x1 << 17))
369*2d9fd380Sjfb8856606 second_pass = 1;
370*2d9fd380Sjfb8856606 }
371*2d9fd380Sjfb8856606
372*2d9fd380Sjfb8856606 if (count != i) {
373*2d9fd380Sjfb8856606 printf("Count mismatch at node 2\n");
374*2d9fd380Sjfb8856606 goto end;
375*2d9fd380Sjfb8856606 }
376*2d9fd380Sjfb8856606
377*2d9fd380Sjfb8856606 if (!second_pass) {
378*2d9fd380Sjfb8856606 obj_node0 = nb_objs;
379*2d9fd380Sjfb8856606 for (i = 0; i < obj_node0; i++) {
380*2d9fd380Sjfb8856606 data = &mbuf[3][i];
381*2d9fd380Sjfb8856606 *graph_field(data) =
382*2d9fd380Sjfb8856606 ((uint64_t)tm->test_node[3].idx << 32) | i;
383*2d9fd380Sjfb8856606 if ((i + 1) == obj_node0)
384*2d9fd380Sjfb8856606 *graph_field(data) |= (1 << 16);
385*2d9fd380Sjfb8856606 }
386*2d9fd380Sjfb8856606 rte_node_enqueue(graph, node, 0, (void **)&mbuf_p[3][0],
387*2d9fd380Sjfb8856606 obj_node0);
388*2d9fd380Sjfb8856606 }
389*2d9fd380Sjfb8856606
390*2d9fd380Sjfb8856606 end:
391*2d9fd380Sjfb8856606 return nb_objs;
392*2d9fd380Sjfb8856606 }
393*2d9fd380Sjfb8856606
394*2d9fd380Sjfb8856606 uint16_t
test_node3_worker(struct rte_graph * graph,struct rte_node * node,void ** objs,uint16_t nb_objs)395*2d9fd380Sjfb8856606 test_node3_worker(struct rte_graph *graph, struct rte_node *node, void **objs,
396*2d9fd380Sjfb8856606 uint16_t nb_objs)
397*2d9fd380Sjfb8856606 {
398*2d9fd380Sjfb8856606 test_main_t *tm = &test_main;
399*2d9fd380Sjfb8856606 uint8_t second_pass = 0;
400*2d9fd380Sjfb8856606 struct rte_mbuf *data;
401*2d9fd380Sjfb8856606 uint32_t count = 0;
402*2d9fd380Sjfb8856606 uint32_t obj_node0;
403*2d9fd380Sjfb8856606 uint32_t i;
404*2d9fd380Sjfb8856606
405*2d9fd380Sjfb8856606 obj_stats[4] += nb_objs;
406*2d9fd380Sjfb8856606 fn_calls[4] += 1;
407*2d9fd380Sjfb8856606 for (i = 0; i < nb_objs; i++) {
408*2d9fd380Sjfb8856606 data = (struct rte_mbuf *)objs[i];
409*2d9fd380Sjfb8856606 if ((*graph_field(data) >> 32) != tm->test_node[3].idx) {
410*2d9fd380Sjfb8856606 printf("Data idx miss match at node 3, expected = %u"
411*2d9fd380Sjfb8856606 " got = %u\n",
412*2d9fd380Sjfb8856606 tm->test_node[3].idx,
413*2d9fd380Sjfb8856606 (uint32_t)(*graph_field(data) >> 32));
414*2d9fd380Sjfb8856606 goto end;
415*2d9fd380Sjfb8856606 }
416*2d9fd380Sjfb8856606
417*2d9fd380Sjfb8856606 if ((*graph_field(data) & 0xffff) != (i - count)) {
418*2d9fd380Sjfb8856606 printf("Expected buff count miss match at node 3\n");
419*2d9fd380Sjfb8856606 goto end;
420*2d9fd380Sjfb8856606 }
421*2d9fd380Sjfb8856606
422*2d9fd380Sjfb8856606 if (*graph_field(data) & (0x1 << 16))
423*2d9fd380Sjfb8856606 count = i + 1;
424*2d9fd380Sjfb8856606 if (*graph_field(data) & (0x1 << 17))
425*2d9fd380Sjfb8856606 second_pass = 1;
426*2d9fd380Sjfb8856606 }
427*2d9fd380Sjfb8856606
428*2d9fd380Sjfb8856606 if (count != i) {
429*2d9fd380Sjfb8856606 printf("Count mismatch at node 3\n");
430*2d9fd380Sjfb8856606 goto end;
431*2d9fd380Sjfb8856606 }
432*2d9fd380Sjfb8856606
433*2d9fd380Sjfb8856606 if (second_pass) {
434*2d9fd380Sjfb8856606 printf("Unexpected buffers are at node 3\n");
435*2d9fd380Sjfb8856606 goto end;
436*2d9fd380Sjfb8856606 } else {
437*2d9fd380Sjfb8856606 obj_node0 = nb_objs * 2;
438*2d9fd380Sjfb8856606 for (i = 0; i < obj_node0; i++) {
439*2d9fd380Sjfb8856606 data = &mbuf[4][i];
440*2d9fd380Sjfb8856606 *graph_field(data) =
441*2d9fd380Sjfb8856606 ((uint64_t)tm->test_node[0].idx << 32) | i;
442*2d9fd380Sjfb8856606 *graph_field(data) |= (1 << 17);
443*2d9fd380Sjfb8856606 if ((i + 1) == obj_node0)
444*2d9fd380Sjfb8856606 *graph_field(data) |= (1 << 16);
445*2d9fd380Sjfb8856606 }
446*2d9fd380Sjfb8856606 rte_node_enqueue(graph, node, 0, (void **)&mbuf_p[4][0],
447*2d9fd380Sjfb8856606 obj_node0);
448*2d9fd380Sjfb8856606 }
449*2d9fd380Sjfb8856606
450*2d9fd380Sjfb8856606 end:
451*2d9fd380Sjfb8856606 return nb_objs;
452*2d9fd380Sjfb8856606 }
453*2d9fd380Sjfb8856606
454*2d9fd380Sjfb8856606 static int
test_lookup_functions(void)455*2d9fd380Sjfb8856606 test_lookup_functions(void)
456*2d9fd380Sjfb8856606 {
457*2d9fd380Sjfb8856606 test_main_t *tm = &test_main;
458*2d9fd380Sjfb8856606 int i;
459*2d9fd380Sjfb8856606
460*2d9fd380Sjfb8856606 /* Verify the name with ID */
461*2d9fd380Sjfb8856606 for (i = 1; i < MAX_NODES; i++) {
462*2d9fd380Sjfb8856606 char *name = rte_node_id_to_name(tm->test_node[i].idx);
463*2d9fd380Sjfb8856606 if (strcmp(name, node_names[i]) != 0) {
464*2d9fd380Sjfb8856606 printf("Test node name verify by ID = %d failed "
465*2d9fd380Sjfb8856606 "Expected = %s, got %s\n",
466*2d9fd380Sjfb8856606 i, node_names[i], name);
467*2d9fd380Sjfb8856606 return -1;
468*2d9fd380Sjfb8856606 }
469*2d9fd380Sjfb8856606 }
470*2d9fd380Sjfb8856606
471*2d9fd380Sjfb8856606 /* Verify by name */
472*2d9fd380Sjfb8856606 for (i = 1; i < MAX_NODES; i++) {
473*2d9fd380Sjfb8856606 uint32_t idx = rte_node_from_name(node_names[i]);
474*2d9fd380Sjfb8856606 if (idx != tm->test_node[i].idx) {
475*2d9fd380Sjfb8856606 printf("Test node ID verify by name = %s failed "
476*2d9fd380Sjfb8856606 "Expected = %d, got %d\n",
477*2d9fd380Sjfb8856606 node_names[i], tm->test_node[i].idx, idx);
478*2d9fd380Sjfb8856606 return -1;
479*2d9fd380Sjfb8856606 }
480*2d9fd380Sjfb8856606 }
481*2d9fd380Sjfb8856606
482*2d9fd380Sjfb8856606 /* Verify edge count */
483*2d9fd380Sjfb8856606 for (i = 1; i < MAX_NODES; i++) {
484*2d9fd380Sjfb8856606 uint32_t count = rte_node_edge_count(tm->test_node[i].idx);
485*2d9fd380Sjfb8856606 if (count != tm->test_node[i].node.nb_edges) {
486*2d9fd380Sjfb8856606 printf("Test number of edges for node = %s failed Expected = %d, got = %d\n",
487*2d9fd380Sjfb8856606 tm->test_node[i].node.name,
488*2d9fd380Sjfb8856606 tm->test_node[i].node.nb_edges, count);
489*2d9fd380Sjfb8856606 return -1;
490*2d9fd380Sjfb8856606 }
491*2d9fd380Sjfb8856606 }
492*2d9fd380Sjfb8856606
493*2d9fd380Sjfb8856606 /* Verify edge names */
494*2d9fd380Sjfb8856606 for (i = 1; i < MAX_NODES; i++) {
495*2d9fd380Sjfb8856606 uint32_t j, count;
496*2d9fd380Sjfb8856606 char **next_edges;
497*2d9fd380Sjfb8856606
498*2d9fd380Sjfb8856606 count = rte_node_edge_get(tm->test_node[i].idx, NULL);
499*2d9fd380Sjfb8856606 if (count != tm->test_node[i].node.nb_edges * sizeof(char *)) {
500*2d9fd380Sjfb8856606 printf("Test number of edge count for node = %s failed Expected = %d, got = %d\n",
501*2d9fd380Sjfb8856606 tm->test_node[i].node.name,
502*2d9fd380Sjfb8856606 tm->test_node[i].node.nb_edges, count);
503*2d9fd380Sjfb8856606 return -1;
504*2d9fd380Sjfb8856606 }
505*2d9fd380Sjfb8856606 next_edges = malloc(count);
506*2d9fd380Sjfb8856606 count = rte_node_edge_get(tm->test_node[i].idx, next_edges);
507*2d9fd380Sjfb8856606 if (count != tm->test_node[i].node.nb_edges) {
508*2d9fd380Sjfb8856606 printf("Test number of edges for node = %s failed Expected = %d, got %d\n",
509*2d9fd380Sjfb8856606 tm->test_node[i].node.name,
510*2d9fd380Sjfb8856606 tm->test_node[i].node.nb_edges, count);
511*2d9fd380Sjfb8856606 free(next_edges);
512*2d9fd380Sjfb8856606 return -1;
513*2d9fd380Sjfb8856606 }
514*2d9fd380Sjfb8856606
515*2d9fd380Sjfb8856606 for (j = 0; j < count; j++) {
516*2d9fd380Sjfb8856606 if (strcmp(next_edges[j],
517*2d9fd380Sjfb8856606 tm->test_node[i].node.next_nodes[j]) != 0) {
518*2d9fd380Sjfb8856606 printf("Edge name miss match, expected = %s got = %s\n",
519*2d9fd380Sjfb8856606 tm->test_node[i].node.next_nodes[j],
520*2d9fd380Sjfb8856606 next_edges[j]);
521*2d9fd380Sjfb8856606 free(next_edges);
522*2d9fd380Sjfb8856606 return -1;
523*2d9fd380Sjfb8856606 }
524*2d9fd380Sjfb8856606 }
525*2d9fd380Sjfb8856606 free(next_edges);
526*2d9fd380Sjfb8856606 }
527*2d9fd380Sjfb8856606
528*2d9fd380Sjfb8856606 return 0;
529*2d9fd380Sjfb8856606 }
530*2d9fd380Sjfb8856606
531*2d9fd380Sjfb8856606 static int
test_node_clone(void)532*2d9fd380Sjfb8856606 test_node_clone(void)
533*2d9fd380Sjfb8856606 {
534*2d9fd380Sjfb8856606 test_main_t *tm = &test_main;
535*2d9fd380Sjfb8856606 uint32_t node_id, dummy_id;
536*2d9fd380Sjfb8856606 int i;
537*2d9fd380Sjfb8856606
538*2d9fd380Sjfb8856606 node_id = rte_node_from_name("test_node00");
539*2d9fd380Sjfb8856606 tm->test_node[0].idx = node_id;
540*2d9fd380Sjfb8856606
541*2d9fd380Sjfb8856606 /* Clone with same name, should fail */
542*2d9fd380Sjfb8856606 dummy_id = rte_node_clone(node_id, "test_node00");
543*2d9fd380Sjfb8856606 if (!rte_node_is_invalid(dummy_id)) {
544*2d9fd380Sjfb8856606 printf("Got valid id when clone with same name, Expecting fail\n");
545*2d9fd380Sjfb8856606 return -1;
546*2d9fd380Sjfb8856606 }
547*2d9fd380Sjfb8856606
548*2d9fd380Sjfb8856606 for (i = 1; i < MAX_NODES; i++) {
549*2d9fd380Sjfb8856606 tm->test_node[i].idx =
550*2d9fd380Sjfb8856606 rte_node_clone(node_id, tm->test_node[i].node.name);
551*2d9fd380Sjfb8856606 if (rte_node_is_invalid(tm->test_node[i].idx)) {
552*2d9fd380Sjfb8856606 printf("Got invalid node id\n");
553*2d9fd380Sjfb8856606 return -1;
554*2d9fd380Sjfb8856606 }
555*2d9fd380Sjfb8856606 }
556*2d9fd380Sjfb8856606
557*2d9fd380Sjfb8856606 /* Clone from cloned node should fail */
558*2d9fd380Sjfb8856606 dummy_id = rte_node_clone(tm->test_node[1].idx, "dummy_node");
559*2d9fd380Sjfb8856606 if (!rte_node_is_invalid(dummy_id)) {
560*2d9fd380Sjfb8856606 printf("Got valid node id when cloning from cloned node, expected fail\n");
561*2d9fd380Sjfb8856606 return -1;
562*2d9fd380Sjfb8856606 }
563*2d9fd380Sjfb8856606
564*2d9fd380Sjfb8856606 return 0;
565*2d9fd380Sjfb8856606 }
566*2d9fd380Sjfb8856606
567*2d9fd380Sjfb8856606 static int
test_update_edges(void)568*2d9fd380Sjfb8856606 test_update_edges(void)
569*2d9fd380Sjfb8856606 {
570*2d9fd380Sjfb8856606 test_main_t *tm = &test_main;
571*2d9fd380Sjfb8856606 uint32_t node_id;
572*2d9fd380Sjfb8856606 uint16_t count;
573*2d9fd380Sjfb8856606 int i;
574*2d9fd380Sjfb8856606
575*2d9fd380Sjfb8856606 node_id = rte_node_from_name("test_node00");
576*2d9fd380Sjfb8856606 count = rte_node_edge_update(node_id, 0,
577*2d9fd380Sjfb8856606 tm->test_node[0].node.next_nodes,
578*2d9fd380Sjfb8856606 tm->test_node[0].node.nb_edges);
579*2d9fd380Sjfb8856606 if (count != tm->test_node[0].node.nb_edges) {
580*2d9fd380Sjfb8856606 printf("Update edges failed expected: %d got = %d\n",
581*2d9fd380Sjfb8856606 tm->test_node[0].node.nb_edges, count);
582*2d9fd380Sjfb8856606 return -1;
583*2d9fd380Sjfb8856606 }
584*2d9fd380Sjfb8856606
585*2d9fd380Sjfb8856606 for (i = 1; i < MAX_NODES; i++) {
586*2d9fd380Sjfb8856606 count = rte_node_edge_update(tm->test_node[i].idx, 0,
587*2d9fd380Sjfb8856606 tm->test_node[i].node.next_nodes,
588*2d9fd380Sjfb8856606 tm->test_node[i].node.nb_edges);
589*2d9fd380Sjfb8856606 if (count != tm->test_node[i].node.nb_edges) {
590*2d9fd380Sjfb8856606 printf("Update edges failed expected: %d got = %d\n",
591*2d9fd380Sjfb8856606 tm->test_node[i].node.nb_edges, count);
592*2d9fd380Sjfb8856606 return -1;
593*2d9fd380Sjfb8856606 }
594*2d9fd380Sjfb8856606
595*2d9fd380Sjfb8856606 count = rte_node_edge_shrink(tm->test_node[i].idx,
596*2d9fd380Sjfb8856606 tm->test_node[i].node.nb_edges);
597*2d9fd380Sjfb8856606 if (count != tm->test_node[i].node.nb_edges) {
598*2d9fd380Sjfb8856606 printf("Shrink edges failed\n");
599*2d9fd380Sjfb8856606 return -1;
600*2d9fd380Sjfb8856606 }
601*2d9fd380Sjfb8856606 }
602*2d9fd380Sjfb8856606
603*2d9fd380Sjfb8856606 return 0;
604*2d9fd380Sjfb8856606 }
605*2d9fd380Sjfb8856606
606*2d9fd380Sjfb8856606 static int
test_create_graph(void)607*2d9fd380Sjfb8856606 test_create_graph(void)
608*2d9fd380Sjfb8856606 {
609*2d9fd380Sjfb8856606 static const char *node_patterns_dummy[] = {
610*2d9fd380Sjfb8856606 "test_node_source1", "test_node00",
611*2d9fd380Sjfb8856606 "test_node00-test_node11", "test_node00-test_node22",
612*2d9fd380Sjfb8856606 "test_node00-test_node33", "test_node00-dummy_node",
613*2d9fd380Sjfb8856606 };
614*2d9fd380Sjfb8856606 struct rte_graph_param gconf = {
615*2d9fd380Sjfb8856606 .socket_id = SOCKET_ID_ANY,
616*2d9fd380Sjfb8856606 .nb_node_patterns = 6,
617*2d9fd380Sjfb8856606 .node_patterns = node_patterns_dummy,
618*2d9fd380Sjfb8856606 };
619*2d9fd380Sjfb8856606 uint32_t dummy_node_id;
620*2d9fd380Sjfb8856606 uint32_t node_id;
621*2d9fd380Sjfb8856606
622*2d9fd380Sjfb8856606 node_id = rte_node_from_name("test_node00");
623*2d9fd380Sjfb8856606 dummy_node_id = rte_node_clone(node_id, "dummy_node");
624*2d9fd380Sjfb8856606 if (rte_node_is_invalid(dummy_node_id)) {
625*2d9fd380Sjfb8856606 printf("Got invalid node id\n");
626*2d9fd380Sjfb8856606 return -1;
627*2d9fd380Sjfb8856606 }
628*2d9fd380Sjfb8856606
629*2d9fd380Sjfb8856606 graph_id = rte_graph_create("worker0", &gconf);
630*2d9fd380Sjfb8856606 if (graph_id != RTE_GRAPH_ID_INVALID) {
631*2d9fd380Sjfb8856606 printf("Graph creation success with isolated node, expected graph creation fail\n");
632*2d9fd380Sjfb8856606 return -1;
633*2d9fd380Sjfb8856606 }
634*2d9fd380Sjfb8856606
635*2d9fd380Sjfb8856606 gconf.nb_node_patterns = 5;
636*2d9fd380Sjfb8856606 gconf.node_patterns = node_patterns;
637*2d9fd380Sjfb8856606 graph_id = rte_graph_create("worker0", &gconf);
638*2d9fd380Sjfb8856606 if (graph_id == RTE_GRAPH_ID_INVALID) {
639*2d9fd380Sjfb8856606 printf("Graph creation failed with error = %d\n", rte_errno);
640*2d9fd380Sjfb8856606 return -1;
641*2d9fd380Sjfb8856606 }
642*2d9fd380Sjfb8856606 return 0;
643*2d9fd380Sjfb8856606 }
644*2d9fd380Sjfb8856606
645*2d9fd380Sjfb8856606 static int
test_graph_walk(void)646*2d9fd380Sjfb8856606 test_graph_walk(void)
647*2d9fd380Sjfb8856606 {
648*2d9fd380Sjfb8856606 struct rte_graph *graph = rte_graph_lookup("worker0");
649*2d9fd380Sjfb8856606 int i;
650*2d9fd380Sjfb8856606
651*2d9fd380Sjfb8856606 if (!graph) {
652*2d9fd380Sjfb8856606 printf("Graph lookup failed\n");
653*2d9fd380Sjfb8856606 return -1;
654*2d9fd380Sjfb8856606 }
655*2d9fd380Sjfb8856606
656*2d9fd380Sjfb8856606 for (i = 0; i < 5; i++)
657*2d9fd380Sjfb8856606 rte_graph_walk(graph);
658*2d9fd380Sjfb8856606 return 0;
659*2d9fd380Sjfb8856606 }
660*2d9fd380Sjfb8856606
661*2d9fd380Sjfb8856606 static int
test_graph_lookup_functions(void)662*2d9fd380Sjfb8856606 test_graph_lookup_functions(void)
663*2d9fd380Sjfb8856606 {
664*2d9fd380Sjfb8856606 test_main_t *tm = &test_main;
665*2d9fd380Sjfb8856606 struct rte_node *node;
666*2d9fd380Sjfb8856606 int i;
667*2d9fd380Sjfb8856606
668*2d9fd380Sjfb8856606 for (i = 0; i < MAX_NODES; i++) {
669*2d9fd380Sjfb8856606 node = rte_graph_node_get(graph_id, tm->test_node[i].idx);
670*2d9fd380Sjfb8856606 if (!node) {
671*2d9fd380Sjfb8856606 printf("rte_graph_node_get, failed for node = %d\n",
672*2d9fd380Sjfb8856606 tm->test_node[i].idx);
673*2d9fd380Sjfb8856606 return -1;
674*2d9fd380Sjfb8856606 }
675*2d9fd380Sjfb8856606
676*2d9fd380Sjfb8856606 if (tm->test_node[i].idx != node->id) {
677*2d9fd380Sjfb8856606 printf("Node id didn't match, expected = %d got = %d\n",
678*2d9fd380Sjfb8856606 tm->test_node[i].idx, node->id);
679*2d9fd380Sjfb8856606 return 0;
680*2d9fd380Sjfb8856606 }
681*2d9fd380Sjfb8856606
682*2d9fd380Sjfb8856606 if (strncmp(node->name, node_names[i], RTE_NODE_NAMESIZE)) {
683*2d9fd380Sjfb8856606 printf("Node name didn't match, expected = %s got %s\n",
684*2d9fd380Sjfb8856606 node_names[i], node->name);
685*2d9fd380Sjfb8856606 return -1;
686*2d9fd380Sjfb8856606 }
687*2d9fd380Sjfb8856606 }
688*2d9fd380Sjfb8856606
689*2d9fd380Sjfb8856606 for (i = 0; i < MAX_NODES; i++) {
690*2d9fd380Sjfb8856606 node = rte_graph_node_get_by_name("worker0", node_names[i]);
691*2d9fd380Sjfb8856606 if (!node) {
692*2d9fd380Sjfb8856606 printf("rte_graph_node_get, failed for node = %d\n",
693*2d9fd380Sjfb8856606 tm->test_node[i].idx);
694*2d9fd380Sjfb8856606 return -1;
695*2d9fd380Sjfb8856606 }
696*2d9fd380Sjfb8856606
697*2d9fd380Sjfb8856606 if (tm->test_node[i].idx != node->id) {
698*2d9fd380Sjfb8856606 printf("Node id didn't match, expected = %d got = %d\n",
699*2d9fd380Sjfb8856606 tm->test_node[i].idx, node->id);
700*2d9fd380Sjfb8856606 return 0;
701*2d9fd380Sjfb8856606 }
702*2d9fd380Sjfb8856606
703*2d9fd380Sjfb8856606 if (strncmp(node->name, node_names[i], RTE_NODE_NAMESIZE)) {
704*2d9fd380Sjfb8856606 printf("Node name didn't match, expected = %s got %s\n",
705*2d9fd380Sjfb8856606 node_names[i], node->name);
706*2d9fd380Sjfb8856606 return -1;
707*2d9fd380Sjfb8856606 }
708*2d9fd380Sjfb8856606 }
709*2d9fd380Sjfb8856606
710*2d9fd380Sjfb8856606 return 0;
711*2d9fd380Sjfb8856606 }
712*2d9fd380Sjfb8856606
713*2d9fd380Sjfb8856606 static int
graph_cluster_stats_cb_t(bool is_first,bool is_last,void * cookie,const struct rte_graph_cluster_node_stats * st)714*2d9fd380Sjfb8856606 graph_cluster_stats_cb_t(bool is_first, bool is_last, void *cookie,
715*2d9fd380Sjfb8856606 const struct rte_graph_cluster_node_stats *st)
716*2d9fd380Sjfb8856606 {
717*2d9fd380Sjfb8856606 int i;
718*2d9fd380Sjfb8856606
719*2d9fd380Sjfb8856606 RTE_SET_USED(is_first);
720*2d9fd380Sjfb8856606 RTE_SET_USED(is_last);
721*2d9fd380Sjfb8856606 RTE_SET_USED(cookie);
722*2d9fd380Sjfb8856606
723*2d9fd380Sjfb8856606 for (i = 0; i < MAX_NODES + 1; i++) {
724*2d9fd380Sjfb8856606 rte_node_t id = rte_node_from_name(node_patterns[i]);
725*2d9fd380Sjfb8856606 if (id == st->id) {
726*2d9fd380Sjfb8856606 if (obj_stats[i] != st->objs) {
727*2d9fd380Sjfb8856606 printf("Obj count miss match for node = %s expected = %"PRId64", got=%"PRId64"\n",
728*2d9fd380Sjfb8856606 node_patterns[i], obj_stats[i],
729*2d9fd380Sjfb8856606 st->objs);
730*2d9fd380Sjfb8856606 return -1;
731*2d9fd380Sjfb8856606 }
732*2d9fd380Sjfb8856606
733*2d9fd380Sjfb8856606 if (fn_calls[i] != st->calls) {
734*2d9fd380Sjfb8856606 printf("Func call miss match for node = %s expected = %"PRId64", got = %"PRId64"\n",
735*2d9fd380Sjfb8856606 node_patterns[i], fn_calls[i],
736*2d9fd380Sjfb8856606 st->calls);
737*2d9fd380Sjfb8856606 return -1;
738*2d9fd380Sjfb8856606 }
739*2d9fd380Sjfb8856606 }
740*2d9fd380Sjfb8856606 }
741*2d9fd380Sjfb8856606 return 0;
742*2d9fd380Sjfb8856606 }
743*2d9fd380Sjfb8856606
744*2d9fd380Sjfb8856606 static int
test_print_stats(void)745*2d9fd380Sjfb8856606 test_print_stats(void)
746*2d9fd380Sjfb8856606 {
747*2d9fd380Sjfb8856606 struct rte_graph_cluster_stats_param s_param;
748*2d9fd380Sjfb8856606 struct rte_graph_cluster_stats *stats;
749*2d9fd380Sjfb8856606 const char *pattern = "worker0";
750*2d9fd380Sjfb8856606
751*2d9fd380Sjfb8856606 if (!rte_graph_has_stats_feature())
752*2d9fd380Sjfb8856606 return 0;
753*2d9fd380Sjfb8856606
754*2d9fd380Sjfb8856606 /* Prepare stats object */
755*2d9fd380Sjfb8856606 memset(&s_param, 0, sizeof(s_param));
756*2d9fd380Sjfb8856606 s_param.f = stdout;
757*2d9fd380Sjfb8856606 s_param.socket_id = SOCKET_ID_ANY;
758*2d9fd380Sjfb8856606 s_param.graph_patterns = &pattern;
759*2d9fd380Sjfb8856606 s_param.nb_graph_patterns = 1;
760*2d9fd380Sjfb8856606 s_param.fn = graph_cluster_stats_cb_t;
761*2d9fd380Sjfb8856606
762*2d9fd380Sjfb8856606 stats = rte_graph_cluster_stats_create(&s_param);
763*2d9fd380Sjfb8856606 if (stats == NULL) {
764*2d9fd380Sjfb8856606 printf("Unable to get stats\n");
765*2d9fd380Sjfb8856606 return -1;
766*2d9fd380Sjfb8856606 }
767*2d9fd380Sjfb8856606 /* Clear screen and move to top left */
768*2d9fd380Sjfb8856606 rte_graph_cluster_stats_get(stats, 0);
769*2d9fd380Sjfb8856606 rte_graph_cluster_stats_destroy(stats);
770*2d9fd380Sjfb8856606
771*2d9fd380Sjfb8856606 return 0;
772*2d9fd380Sjfb8856606 }
773*2d9fd380Sjfb8856606
774*2d9fd380Sjfb8856606 static int
graph_setup(void)775*2d9fd380Sjfb8856606 graph_setup(void)
776*2d9fd380Sjfb8856606 {
777*2d9fd380Sjfb8856606 int i, j;
778*2d9fd380Sjfb8856606
779*2d9fd380Sjfb8856606 static const struct rte_mbuf_dynfield graph_dynfield_desc = {
780*2d9fd380Sjfb8856606 .name = "test_graph_dynfield",
781*2d9fd380Sjfb8856606 .size = sizeof(graph_dynfield_t),
782*2d9fd380Sjfb8856606 .align = __alignof__(graph_dynfield_t),
783*2d9fd380Sjfb8856606 };
784*2d9fd380Sjfb8856606 graph_dynfield_offset =
785*2d9fd380Sjfb8856606 rte_mbuf_dynfield_register(&graph_dynfield_desc);
786*2d9fd380Sjfb8856606 if (graph_dynfield_offset < 0) {
787*2d9fd380Sjfb8856606 printf("Cannot register mbuf field\n");
788*2d9fd380Sjfb8856606 return TEST_FAILED;
789*2d9fd380Sjfb8856606 }
790*2d9fd380Sjfb8856606
791*2d9fd380Sjfb8856606 for (i = 0; i <= MAX_NODES; i++) {
792*2d9fd380Sjfb8856606 for (j = 0; j < MBUFF_SIZE; j++)
793*2d9fd380Sjfb8856606 mbuf_p[i][j] = &mbuf[i][j];
794*2d9fd380Sjfb8856606 }
795*2d9fd380Sjfb8856606 if (test_node_clone()) {
796*2d9fd380Sjfb8856606 printf("test_node_clone: fail\n");
797*2d9fd380Sjfb8856606 return -1;
798*2d9fd380Sjfb8856606 }
799*2d9fd380Sjfb8856606 printf("test_node_clone: pass\n");
800*2d9fd380Sjfb8856606
801*2d9fd380Sjfb8856606 return 0;
802*2d9fd380Sjfb8856606 }
803*2d9fd380Sjfb8856606
804*2d9fd380Sjfb8856606 static void
graph_teardown(void)805*2d9fd380Sjfb8856606 graph_teardown(void)
806*2d9fd380Sjfb8856606 {
807*2d9fd380Sjfb8856606 int id;
808*2d9fd380Sjfb8856606
809*2d9fd380Sjfb8856606 id = rte_graph_destroy(rte_graph_from_name("worker0"));
810*2d9fd380Sjfb8856606 if (id)
811*2d9fd380Sjfb8856606 printf("Graph Destroy failed\n");
812*2d9fd380Sjfb8856606 }
813*2d9fd380Sjfb8856606
814*2d9fd380Sjfb8856606 static struct unit_test_suite graph_testsuite = {
815*2d9fd380Sjfb8856606 .suite_name = "Graph library test suite",
816*2d9fd380Sjfb8856606 .setup = graph_setup,
817*2d9fd380Sjfb8856606 .teardown = graph_teardown,
818*2d9fd380Sjfb8856606 .unit_test_cases = {
819*2d9fd380Sjfb8856606 TEST_CASE(test_update_edges),
820*2d9fd380Sjfb8856606 TEST_CASE(test_lookup_functions),
821*2d9fd380Sjfb8856606 TEST_CASE(test_create_graph),
822*2d9fd380Sjfb8856606 TEST_CASE(test_graph_lookup_functions),
823*2d9fd380Sjfb8856606 TEST_CASE(test_graph_walk),
824*2d9fd380Sjfb8856606 TEST_CASE(test_print_stats),
825*2d9fd380Sjfb8856606 TEST_CASES_END(), /**< NULL terminate unit test array */
826*2d9fd380Sjfb8856606 },
827*2d9fd380Sjfb8856606 };
828*2d9fd380Sjfb8856606
829*2d9fd380Sjfb8856606 static int
graph_autotest_fn(void)830*2d9fd380Sjfb8856606 graph_autotest_fn(void)
831*2d9fd380Sjfb8856606 {
832*2d9fd380Sjfb8856606 return unit_test_suite_runner(&graph_testsuite);
833*2d9fd380Sjfb8856606 }
834*2d9fd380Sjfb8856606
835*2d9fd380Sjfb8856606 REGISTER_TEST_COMMAND(graph_autotest, graph_autotest_fn);
836*2d9fd380Sjfb8856606
837*2d9fd380Sjfb8856606 static int
test_node_list_dump(void)838*2d9fd380Sjfb8856606 test_node_list_dump(void)
839*2d9fd380Sjfb8856606 {
840*2d9fd380Sjfb8856606 rte_node_list_dump(stdout);
841*2d9fd380Sjfb8856606
842*2d9fd380Sjfb8856606 return TEST_SUCCESS;
843*2d9fd380Sjfb8856606 }
844*2d9fd380Sjfb8856606 REGISTER_TEST_COMMAND(node_list_dump, test_node_list_dump);
845