xref: /f-stack/dpdk/lib/librte_graph/rte_graph.h (revision 2d9fd380)
1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606  * Copyright(C) 2020 Marvell International Ltd.
3*2d9fd380Sjfb8856606  */
4*2d9fd380Sjfb8856606 
5*2d9fd380Sjfb8856606 #ifndef _RTE_GRAPH_H_
6*2d9fd380Sjfb8856606 #define _RTE_GRAPH_H_
7*2d9fd380Sjfb8856606 
8*2d9fd380Sjfb8856606 /**
9*2d9fd380Sjfb8856606  * @file rte_graph.h
10*2d9fd380Sjfb8856606  *
11*2d9fd380Sjfb8856606  * @warning
12*2d9fd380Sjfb8856606  * @b EXPERIMENTAL:
13*2d9fd380Sjfb8856606  * All functions in this file may be changed or removed without prior notice.
14*2d9fd380Sjfb8856606  *
15*2d9fd380Sjfb8856606  * Graph architecture abstracts the data processing functions as
16*2d9fd380Sjfb8856606  * "node" and "link" them together to create a complex "graph" to enable
17*2d9fd380Sjfb8856606  * reusable/modular data processing functions.
18*2d9fd380Sjfb8856606  *
19*2d9fd380Sjfb8856606  * This API enables graph framework operations such as create, lookup,
20*2d9fd380Sjfb8856606  * dump and destroy on graph and node operations such as clone,
21*2d9fd380Sjfb8856606  * edge update, and edge shrink, etc. The API also allows to create the stats
22*2d9fd380Sjfb8856606  * cluster to monitor per graph and per node stats.
23*2d9fd380Sjfb8856606  *
24*2d9fd380Sjfb8856606  */
25*2d9fd380Sjfb8856606 
26*2d9fd380Sjfb8856606 #include <stdbool.h>
27*2d9fd380Sjfb8856606 #include <stdio.h>
28*2d9fd380Sjfb8856606 
29*2d9fd380Sjfb8856606 #include <rte_common.h>
30*2d9fd380Sjfb8856606 #include <rte_compat.h>
31*2d9fd380Sjfb8856606 
32*2d9fd380Sjfb8856606 #ifdef __cplusplus
33*2d9fd380Sjfb8856606 extern "C" {
34*2d9fd380Sjfb8856606 #endif
35*2d9fd380Sjfb8856606 
36*2d9fd380Sjfb8856606 #define RTE_GRAPH_NAMESIZE 64 /**< Max length of graph name. */
37*2d9fd380Sjfb8856606 #define RTE_NODE_NAMESIZE 64  /**< Max length of node name. */
38*2d9fd380Sjfb8856606 #define RTE_GRAPH_OFF_INVALID UINT32_MAX /**< Invalid graph offset. */
39*2d9fd380Sjfb8856606 #define RTE_NODE_ID_INVALID UINT32_MAX   /**< Invalid node id. */
40*2d9fd380Sjfb8856606 #define RTE_EDGE_ID_INVALID UINT16_MAX   /**< Invalid edge id. */
41*2d9fd380Sjfb8856606 #define RTE_GRAPH_ID_INVALID UINT16_MAX  /**< Invalid graph id. */
42*2d9fd380Sjfb8856606 #define RTE_GRAPH_FENCE 0xdeadbeef12345678ULL /**< Graph fence data. */
43*2d9fd380Sjfb8856606 
44*2d9fd380Sjfb8856606 typedef uint32_t rte_graph_off_t;  /**< Graph offset type. */
45*2d9fd380Sjfb8856606 typedef uint32_t rte_node_t;       /**< Node id type. */
46*2d9fd380Sjfb8856606 typedef uint16_t rte_edge_t;       /**< Edge id type. */
47*2d9fd380Sjfb8856606 typedef uint16_t rte_graph_t;      /**< Graph id type. */
48*2d9fd380Sjfb8856606 
49*2d9fd380Sjfb8856606 /** Burst size in terms of log2 */
50*2d9fd380Sjfb8856606 #if RTE_GRAPH_BURST_SIZE == 1
51*2d9fd380Sjfb8856606 #define RTE_GRAPH_BURST_SIZE_LOG2 0  /**< Object burst size of 1. */
52*2d9fd380Sjfb8856606 #elif RTE_GRAPH_BURST_SIZE == 2
53*2d9fd380Sjfb8856606 #define RTE_GRAPH_BURST_SIZE_LOG2 1  /**< Object burst size of 2. */
54*2d9fd380Sjfb8856606 #elif RTE_GRAPH_BURST_SIZE == 4
55*2d9fd380Sjfb8856606 #define RTE_GRAPH_BURST_SIZE_LOG2 2  /**< Object burst size of 4. */
56*2d9fd380Sjfb8856606 #elif RTE_GRAPH_BURST_SIZE == 8
57*2d9fd380Sjfb8856606 #define RTE_GRAPH_BURST_SIZE_LOG2 3  /**< Object burst size of 8. */
58*2d9fd380Sjfb8856606 #elif RTE_GRAPH_BURST_SIZE == 16
59*2d9fd380Sjfb8856606 #define RTE_GRAPH_BURST_SIZE_LOG2 4  /**< Object burst size of 16. */
60*2d9fd380Sjfb8856606 #elif RTE_GRAPH_BURST_SIZE == 32
61*2d9fd380Sjfb8856606 #define RTE_GRAPH_BURST_SIZE_LOG2 5  /**< Object burst size of 32. */
62*2d9fd380Sjfb8856606 #elif RTE_GRAPH_BURST_SIZE == 64
63*2d9fd380Sjfb8856606 #define RTE_GRAPH_BURST_SIZE_LOG2 6  /**< Object burst size of 64. */
64*2d9fd380Sjfb8856606 #elif RTE_GRAPH_BURST_SIZE == 128
65*2d9fd380Sjfb8856606 #define RTE_GRAPH_BURST_SIZE_LOG2 7  /**< Object burst size of 128. */
66*2d9fd380Sjfb8856606 #elif RTE_GRAPH_BURST_SIZE == 256
67*2d9fd380Sjfb8856606 #define RTE_GRAPH_BURST_SIZE_LOG2 8  /**< Object burst size of 256. */
68*2d9fd380Sjfb8856606 #else
69*2d9fd380Sjfb8856606 #error "Unsupported burst size"
70*2d9fd380Sjfb8856606 #endif
71*2d9fd380Sjfb8856606 
72*2d9fd380Sjfb8856606 /* Forward declaration */
73*2d9fd380Sjfb8856606 struct rte_node;  /**< Node object */
74*2d9fd380Sjfb8856606 struct rte_graph; /**< Graph object */
75*2d9fd380Sjfb8856606 struct rte_graph_cluster_stats;      /**< Stats for Cluster of graphs */
76*2d9fd380Sjfb8856606 struct rte_graph_cluster_node_stats; /**< Node stats within cluster of graphs */
77*2d9fd380Sjfb8856606 
78*2d9fd380Sjfb8856606 /**
79*2d9fd380Sjfb8856606  * Node process function.
80*2d9fd380Sjfb8856606  *
81*2d9fd380Sjfb8856606  * The function invoked when the worker thread walks on nodes using
82*2d9fd380Sjfb8856606  * rte_graph_walk().
83*2d9fd380Sjfb8856606  *
84*2d9fd380Sjfb8856606  * @param graph
85*2d9fd380Sjfb8856606  *   Pointer to the graph object.
86*2d9fd380Sjfb8856606  * @param node
87*2d9fd380Sjfb8856606  *   Pointer to the node object.
88*2d9fd380Sjfb8856606  * @param objs
89*2d9fd380Sjfb8856606  *   Pointer to an array of objects to be processed.
90*2d9fd380Sjfb8856606  * @param nb_objs
91*2d9fd380Sjfb8856606  *   Number of objects in the array.
92*2d9fd380Sjfb8856606  *
93*2d9fd380Sjfb8856606  * @return
94*2d9fd380Sjfb8856606  *   Number of objects processed.
95*2d9fd380Sjfb8856606  *
96*2d9fd380Sjfb8856606  * @see rte_graph_walk()
97*2d9fd380Sjfb8856606  *
98*2d9fd380Sjfb8856606  */
99*2d9fd380Sjfb8856606 typedef uint16_t (*rte_node_process_t)(struct rte_graph *graph,
100*2d9fd380Sjfb8856606 				       struct rte_node *node, void **objs,
101*2d9fd380Sjfb8856606 				       uint16_t nb_objs);
102*2d9fd380Sjfb8856606 
103*2d9fd380Sjfb8856606 /**
104*2d9fd380Sjfb8856606  * Node initialization function.
105*2d9fd380Sjfb8856606  *
106*2d9fd380Sjfb8856606  * The function invoked when the user creates the graph using rte_graph_create()
107*2d9fd380Sjfb8856606  *
108*2d9fd380Sjfb8856606  * @param graph
109*2d9fd380Sjfb8856606  *   Pointer to the graph object.
110*2d9fd380Sjfb8856606  * @param node
111*2d9fd380Sjfb8856606  *   Pointer to the node object.
112*2d9fd380Sjfb8856606  *
113*2d9fd380Sjfb8856606  * @return
114*2d9fd380Sjfb8856606  *   - 0: Success.
115*2d9fd380Sjfb8856606  *   -<0: Failure.
116*2d9fd380Sjfb8856606  *
117*2d9fd380Sjfb8856606  * @see rte_graph_create()
118*2d9fd380Sjfb8856606  */
119*2d9fd380Sjfb8856606 typedef int (*rte_node_init_t)(const struct rte_graph *graph,
120*2d9fd380Sjfb8856606 			       struct rte_node *node);
121*2d9fd380Sjfb8856606 
122*2d9fd380Sjfb8856606 /**
123*2d9fd380Sjfb8856606  * Node finalization function.
124*2d9fd380Sjfb8856606  *
125*2d9fd380Sjfb8856606  * The function invoked when the user destroys the graph using
126*2d9fd380Sjfb8856606  * rte_graph_destroy().
127*2d9fd380Sjfb8856606  *
128*2d9fd380Sjfb8856606  * @param graph
129*2d9fd380Sjfb8856606  *   Pointer to the graph object.
130*2d9fd380Sjfb8856606  * @param node
131*2d9fd380Sjfb8856606  *   Pointer to the node object.
132*2d9fd380Sjfb8856606  *
133*2d9fd380Sjfb8856606  * @see rte_graph_destroy()
134*2d9fd380Sjfb8856606  */
135*2d9fd380Sjfb8856606 typedef void (*rte_node_fini_t)(const struct rte_graph *graph,
136*2d9fd380Sjfb8856606 				struct rte_node *node);
137*2d9fd380Sjfb8856606 
138*2d9fd380Sjfb8856606 /**
139*2d9fd380Sjfb8856606  * Graph cluster stats callback.
140*2d9fd380Sjfb8856606  *
141*2d9fd380Sjfb8856606  * @param is_first
142*2d9fd380Sjfb8856606  *   Flag to denote that stats are of the first node.
143*2d9fd380Sjfb8856606  * @param is_last
144*2d9fd380Sjfb8856606  *   Flag to denote that stats are of the last node.
145*2d9fd380Sjfb8856606  * @param cookie
146*2d9fd380Sjfb8856606  *   Cookie supplied during stats creation.
147*2d9fd380Sjfb8856606  * @param stats
148*2d9fd380Sjfb8856606  *   Node cluster stats data.
149*2d9fd380Sjfb8856606  *
150*2d9fd380Sjfb8856606  * @return
151*2d9fd380Sjfb8856606  *   - 0: Success.
152*2d9fd380Sjfb8856606  *   -<0: Failure.
153*2d9fd380Sjfb8856606  */
154*2d9fd380Sjfb8856606 typedef int (*rte_graph_cluster_stats_cb_t)(bool is_first, bool is_last,
155*2d9fd380Sjfb8856606 	     void *cookie, const struct rte_graph_cluster_node_stats *stats);
156*2d9fd380Sjfb8856606 
157*2d9fd380Sjfb8856606 /**
158*2d9fd380Sjfb8856606  * Structure to hold configuration parameters for creating the graph.
159*2d9fd380Sjfb8856606  *
160*2d9fd380Sjfb8856606  * @see rte_graph_create()
161*2d9fd380Sjfb8856606  */
162*2d9fd380Sjfb8856606 struct rte_graph_param {
163*2d9fd380Sjfb8856606 	int socket_id; /**< Socket id where memory is allocated. */
164*2d9fd380Sjfb8856606 	uint16_t nb_node_patterns;  /**< Number of node patterns. */
165*2d9fd380Sjfb8856606 	const char **node_patterns;
166*2d9fd380Sjfb8856606 	/**< Array of node patterns based on shell pattern. */
167*2d9fd380Sjfb8856606 };
168*2d9fd380Sjfb8856606 
169*2d9fd380Sjfb8856606 /**
170*2d9fd380Sjfb8856606  * Structure to hold configuration parameters for graph cluster stats create.
171*2d9fd380Sjfb8856606  *
172*2d9fd380Sjfb8856606  * @see rte_graph_cluster_stats_create()
173*2d9fd380Sjfb8856606  */
174*2d9fd380Sjfb8856606 struct rte_graph_cluster_stats_param {
175*2d9fd380Sjfb8856606 	int socket_id;
176*2d9fd380Sjfb8856606 	/**< Socket id where memory is allocated */
177*2d9fd380Sjfb8856606 	rte_graph_cluster_stats_cb_t fn;
178*2d9fd380Sjfb8856606 	/**< Stats print callback function. NULL value allowed, in that case,
179*2d9fd380Sjfb8856606 	 *   default print stat function used.
180*2d9fd380Sjfb8856606 	 */
181*2d9fd380Sjfb8856606 	RTE_STD_C11
182*2d9fd380Sjfb8856606 	union {
183*2d9fd380Sjfb8856606 		void *cookie;
184*2d9fd380Sjfb8856606 		FILE *f; /**< File pointer to dump the stats when fn == NULL. */
185*2d9fd380Sjfb8856606 	};
186*2d9fd380Sjfb8856606 	uint16_t nb_graph_patterns;  /**< Number of graph patterns. */
187*2d9fd380Sjfb8856606 	const char **graph_patterns;
188*2d9fd380Sjfb8856606 	/**< Array of graph patterns based on shell pattern. */
189*2d9fd380Sjfb8856606 };
190*2d9fd380Sjfb8856606 
191*2d9fd380Sjfb8856606 /**
192*2d9fd380Sjfb8856606  * Node cluster stats data structure.
193*2d9fd380Sjfb8856606  *
194*2d9fd380Sjfb8856606  * @see struct rte_graph_cluster_stats_param::fn
195*2d9fd380Sjfb8856606  */
196*2d9fd380Sjfb8856606 struct rte_graph_cluster_node_stats {
197*2d9fd380Sjfb8856606 	uint64_t ts;	    /**< Current timestamp. */
198*2d9fd380Sjfb8856606 	uint64_t calls;	    /**< Current number of calls made. */
199*2d9fd380Sjfb8856606 	uint64_t objs;      /**< Current number of objs processed. */
200*2d9fd380Sjfb8856606 	uint64_t cycles;    /**< Current number of cycles. */
201*2d9fd380Sjfb8856606 
202*2d9fd380Sjfb8856606 	uint64_t prev_ts;	/**< Previous call timestamp. */
203*2d9fd380Sjfb8856606 	uint64_t prev_calls;	/**< Previous number of calls. */
204*2d9fd380Sjfb8856606 	uint64_t prev_objs;	/**< Previous number of processed objs. */
205*2d9fd380Sjfb8856606 	uint64_t prev_cycles;	/**< Previous number of cycles. */
206*2d9fd380Sjfb8856606 
207*2d9fd380Sjfb8856606 	uint64_t realloc_count; /**< Realloc count. */
208*2d9fd380Sjfb8856606 
209*2d9fd380Sjfb8856606 	rte_node_t id;	/**< Node identifier of stats. */
210*2d9fd380Sjfb8856606 	uint64_t hz;	/**< Cycles per seconds. */
211*2d9fd380Sjfb8856606 	char name[RTE_NODE_NAMESIZE];	/**< Name of the node. */
212*2d9fd380Sjfb8856606 } __rte_cache_aligned;
213*2d9fd380Sjfb8856606 
214*2d9fd380Sjfb8856606 /**
215*2d9fd380Sjfb8856606  * Create Graph.
216*2d9fd380Sjfb8856606  *
217*2d9fd380Sjfb8856606  * Create memory reel, detect loops and find isolated nodes.
218*2d9fd380Sjfb8856606  *
219*2d9fd380Sjfb8856606  * @param name
220*2d9fd380Sjfb8856606  *   Unique name for this graph.
221*2d9fd380Sjfb8856606  * @param prm
222*2d9fd380Sjfb8856606  *   Graph parameter, includes node names and count to be included
223*2d9fd380Sjfb8856606  *   in this graph.
224*2d9fd380Sjfb8856606  *
225*2d9fd380Sjfb8856606  * @return
226*2d9fd380Sjfb8856606  *   Unique graph id on success, RTE_GRAPH_ID_INVALID otherwise.
227*2d9fd380Sjfb8856606  */
228*2d9fd380Sjfb8856606 __rte_experimental
229*2d9fd380Sjfb8856606 rte_graph_t rte_graph_create(const char *name, struct rte_graph_param *prm);
230*2d9fd380Sjfb8856606 
231*2d9fd380Sjfb8856606 /**
232*2d9fd380Sjfb8856606  * Destroy Graph.
233*2d9fd380Sjfb8856606  *
234*2d9fd380Sjfb8856606  * Free Graph memory reel.
235*2d9fd380Sjfb8856606  *
236*2d9fd380Sjfb8856606  * @param id
237*2d9fd380Sjfb8856606  *   id of the graph to destroy.
238*2d9fd380Sjfb8856606  *
239*2d9fd380Sjfb8856606  * @return
240*2d9fd380Sjfb8856606  *   0 on success, error otherwise.
241*2d9fd380Sjfb8856606  */
242*2d9fd380Sjfb8856606 __rte_experimental
243*2d9fd380Sjfb8856606 int rte_graph_destroy(rte_graph_t id);
244*2d9fd380Sjfb8856606 
245*2d9fd380Sjfb8856606 /**
246*2d9fd380Sjfb8856606  * Get graph id from graph name.
247*2d9fd380Sjfb8856606  *
248*2d9fd380Sjfb8856606  * @param name
249*2d9fd380Sjfb8856606  *   Name of the graph to get id.
250*2d9fd380Sjfb8856606  *
251*2d9fd380Sjfb8856606  * @return
252*2d9fd380Sjfb8856606  *   Graph id on success, RTE_GRAPH_ID_INVALID otherwise.
253*2d9fd380Sjfb8856606  */
254*2d9fd380Sjfb8856606 __rte_experimental
255*2d9fd380Sjfb8856606 rte_graph_t rte_graph_from_name(const char *name);
256*2d9fd380Sjfb8856606 
257*2d9fd380Sjfb8856606 /**
258*2d9fd380Sjfb8856606  * Get graph name from graph id.
259*2d9fd380Sjfb8856606  *
260*2d9fd380Sjfb8856606  * @param id
261*2d9fd380Sjfb8856606  *   id of the graph to get name.
262*2d9fd380Sjfb8856606  *
263*2d9fd380Sjfb8856606  * @return
264*2d9fd380Sjfb8856606  *   Graph name on success, NULL otherwise.
265*2d9fd380Sjfb8856606  */
266*2d9fd380Sjfb8856606 __rte_experimental
267*2d9fd380Sjfb8856606 char *rte_graph_id_to_name(rte_graph_t id);
268*2d9fd380Sjfb8856606 
269*2d9fd380Sjfb8856606 /**
270*2d9fd380Sjfb8856606  * Export the graph as graph viz dot file
271*2d9fd380Sjfb8856606  *
272*2d9fd380Sjfb8856606  * @param name
273*2d9fd380Sjfb8856606  *   Name of the graph to export.
274*2d9fd380Sjfb8856606  * @param f
275*2d9fd380Sjfb8856606  *   File pointer to export the graph.
276*2d9fd380Sjfb8856606  *
277*2d9fd380Sjfb8856606  * @return
278*2d9fd380Sjfb8856606  *   0 on success, error otherwise.
279*2d9fd380Sjfb8856606  */
280*2d9fd380Sjfb8856606 __rte_experimental
281*2d9fd380Sjfb8856606 int rte_graph_export(const char *name, FILE *f);
282*2d9fd380Sjfb8856606 
283*2d9fd380Sjfb8856606 /**
284*2d9fd380Sjfb8856606  * Get graph object from its name.
285*2d9fd380Sjfb8856606  *
286*2d9fd380Sjfb8856606  * Typical usage of this API to get graph objects in the worker thread and
287*2d9fd380Sjfb8856606  * followed calling rte_graph_walk() in a loop.
288*2d9fd380Sjfb8856606  *
289*2d9fd380Sjfb8856606  * @param name
290*2d9fd380Sjfb8856606  *   Name of the graph.
291*2d9fd380Sjfb8856606  *
292*2d9fd380Sjfb8856606  * @return
293*2d9fd380Sjfb8856606  *   Graph pointer on success, NULL otherwise.
294*2d9fd380Sjfb8856606  *
295*2d9fd380Sjfb8856606  * @see rte_graph_walk()
296*2d9fd380Sjfb8856606  */
297*2d9fd380Sjfb8856606 __rte_experimental
298*2d9fd380Sjfb8856606 struct rte_graph *rte_graph_lookup(const char *name);
299*2d9fd380Sjfb8856606 
300*2d9fd380Sjfb8856606 /**
301*2d9fd380Sjfb8856606  * Get maximum number of graph available.
302*2d9fd380Sjfb8856606  *
303*2d9fd380Sjfb8856606  * @return
304*2d9fd380Sjfb8856606  *   Maximum graph count.
305*2d9fd380Sjfb8856606  */
306*2d9fd380Sjfb8856606 __rte_experimental
307*2d9fd380Sjfb8856606 rte_graph_t rte_graph_max_count(void);
308*2d9fd380Sjfb8856606 
309*2d9fd380Sjfb8856606 /**
310*2d9fd380Sjfb8856606  * Dump the graph information to file.
311*2d9fd380Sjfb8856606  *
312*2d9fd380Sjfb8856606  * @param f
313*2d9fd380Sjfb8856606  *   File pointer to dump graph info.
314*2d9fd380Sjfb8856606  * @param id
315*2d9fd380Sjfb8856606  *   Graph id to get graph info.
316*2d9fd380Sjfb8856606  */
317*2d9fd380Sjfb8856606 __rte_experimental
318*2d9fd380Sjfb8856606 void rte_graph_dump(FILE *f, rte_graph_t id);
319*2d9fd380Sjfb8856606 
320*2d9fd380Sjfb8856606 /**
321*2d9fd380Sjfb8856606  * Dump all graphs information to file
322*2d9fd380Sjfb8856606  *
323*2d9fd380Sjfb8856606  * @param f
324*2d9fd380Sjfb8856606  *   File pointer to dump graph info.
325*2d9fd380Sjfb8856606  */
326*2d9fd380Sjfb8856606 __rte_experimental
327*2d9fd380Sjfb8856606 void rte_graph_list_dump(FILE *f);
328*2d9fd380Sjfb8856606 
329*2d9fd380Sjfb8856606 /**
330*2d9fd380Sjfb8856606  * Dump graph information along with node info to file
331*2d9fd380Sjfb8856606  *
332*2d9fd380Sjfb8856606  * @param f
333*2d9fd380Sjfb8856606  *   File pointer to dump graph info.
334*2d9fd380Sjfb8856606  * @param graph
335*2d9fd380Sjfb8856606  *   Graph pointer to get graph info.
336*2d9fd380Sjfb8856606  * @param all
337*2d9fd380Sjfb8856606  *   true to dump nodes in the graph.
338*2d9fd380Sjfb8856606  */
339*2d9fd380Sjfb8856606 __rte_experimental
340*2d9fd380Sjfb8856606 void rte_graph_obj_dump(FILE *f, struct rte_graph *graph, bool all);
341*2d9fd380Sjfb8856606 
342*2d9fd380Sjfb8856606 /** Macro to browse rte_node object after the graph creation */
343*2d9fd380Sjfb8856606 #define rte_graph_foreach_node(count, off, graph, node)                        \
344*2d9fd380Sjfb8856606 	for (count = 0, off = graph->nodes_start,                              \
345*2d9fd380Sjfb8856606 	     node = RTE_PTR_ADD(graph, off);                                   \
346*2d9fd380Sjfb8856606 	     count < graph->nb_nodes;                                          \
347*2d9fd380Sjfb8856606 	     off = node->next, node = RTE_PTR_ADD(graph, off), count++)
348*2d9fd380Sjfb8856606 
349*2d9fd380Sjfb8856606 /**
350*2d9fd380Sjfb8856606  * Get node object with in graph from id.
351*2d9fd380Sjfb8856606  *
352*2d9fd380Sjfb8856606  * @param graph_id
353*2d9fd380Sjfb8856606  *   Graph id to get node pointer from.
354*2d9fd380Sjfb8856606  * @param node_id
355*2d9fd380Sjfb8856606  *   Node id to get node pointer.
356*2d9fd380Sjfb8856606  *
357*2d9fd380Sjfb8856606  * @return
358*2d9fd380Sjfb8856606  *   Node pointer on success, NULL otherwise.
359*2d9fd380Sjfb8856606  */
360*2d9fd380Sjfb8856606 __rte_experimental
361*2d9fd380Sjfb8856606 struct rte_node *rte_graph_node_get(rte_graph_t graph_id, rte_node_t node_id);
362*2d9fd380Sjfb8856606 
363*2d9fd380Sjfb8856606 /**
364*2d9fd380Sjfb8856606  * Get node pointer with in graph from name.
365*2d9fd380Sjfb8856606  *
366*2d9fd380Sjfb8856606  * @param graph
367*2d9fd380Sjfb8856606  *   Graph name to get node pointer from.
368*2d9fd380Sjfb8856606  * @param name
369*2d9fd380Sjfb8856606  *   Node name to get the node pointer.
370*2d9fd380Sjfb8856606  *
371*2d9fd380Sjfb8856606  * @return
372*2d9fd380Sjfb8856606  *   Node pointer on success, NULL otherwise.
373*2d9fd380Sjfb8856606  */
374*2d9fd380Sjfb8856606 __rte_experimental
375*2d9fd380Sjfb8856606 struct rte_node *rte_graph_node_get_by_name(const char *graph,
376*2d9fd380Sjfb8856606 					    const char *name);
377*2d9fd380Sjfb8856606 
378*2d9fd380Sjfb8856606 /**
379*2d9fd380Sjfb8856606  * Create graph stats cluster to aggregate runtime node stats.
380*2d9fd380Sjfb8856606  *
381*2d9fd380Sjfb8856606  * @param prm
382*2d9fd380Sjfb8856606  *   Parameters including file pointer to dump stats,
383*2d9fd380Sjfb8856606  *   Graph pattern to create cluster and callback function.
384*2d9fd380Sjfb8856606  *
385*2d9fd380Sjfb8856606  * @return
386*2d9fd380Sjfb8856606  *   Valid pointer on success, NULL otherwise.
387*2d9fd380Sjfb8856606  */
388*2d9fd380Sjfb8856606 __rte_experimental
389*2d9fd380Sjfb8856606 struct rte_graph_cluster_stats *rte_graph_cluster_stats_create(
390*2d9fd380Sjfb8856606 			const struct rte_graph_cluster_stats_param *prm);
391*2d9fd380Sjfb8856606 
392*2d9fd380Sjfb8856606 /**
393*2d9fd380Sjfb8856606  * Destroy cluster stats.
394*2d9fd380Sjfb8856606  *
395*2d9fd380Sjfb8856606  * @param stat
396*2d9fd380Sjfb8856606  *    Valid cluster pointer to destroy.
397*2d9fd380Sjfb8856606  */
398*2d9fd380Sjfb8856606 __rte_experimental
399*2d9fd380Sjfb8856606 void rte_graph_cluster_stats_destroy(struct rte_graph_cluster_stats *stat);
400*2d9fd380Sjfb8856606 
401*2d9fd380Sjfb8856606 /**
402*2d9fd380Sjfb8856606  * Get stats to application.
403*2d9fd380Sjfb8856606  *
404*2d9fd380Sjfb8856606  * @param[out] stat
405*2d9fd380Sjfb8856606  *   Cluster status.
406*2d9fd380Sjfb8856606  * @param skip_cb
407*2d9fd380Sjfb8856606  *   true to skip callback function invocation.
408*2d9fd380Sjfb8856606  */
409*2d9fd380Sjfb8856606 __rte_experimental
410*2d9fd380Sjfb8856606 void rte_graph_cluster_stats_get(struct rte_graph_cluster_stats *stat,
411*2d9fd380Sjfb8856606 				 bool skip_cb);
412*2d9fd380Sjfb8856606 
413*2d9fd380Sjfb8856606 /**
414*2d9fd380Sjfb8856606  * Reset cluster stats to zero.
415*2d9fd380Sjfb8856606  *
416*2d9fd380Sjfb8856606  * @param stat
417*2d9fd380Sjfb8856606  *   Valid cluster stats pointer.
418*2d9fd380Sjfb8856606  */
419*2d9fd380Sjfb8856606 __rte_experimental
420*2d9fd380Sjfb8856606 void rte_graph_cluster_stats_reset(struct rte_graph_cluster_stats *stat);
421*2d9fd380Sjfb8856606 
422*2d9fd380Sjfb8856606 /**
423*2d9fd380Sjfb8856606  * Structure defines the node registration parameters.
424*2d9fd380Sjfb8856606  *
425*2d9fd380Sjfb8856606  * @see __rte_node_register(), RTE_NODE_REGISTER()
426*2d9fd380Sjfb8856606  */
427*2d9fd380Sjfb8856606 struct rte_node_register {
428*2d9fd380Sjfb8856606 	char name[RTE_NODE_NAMESIZE]; /**< Name of the node. */
429*2d9fd380Sjfb8856606 	uint64_t flags;		      /**< Node configuration flag. */
430*2d9fd380Sjfb8856606 #define RTE_NODE_SOURCE_F (1ULL << 0) /**< Node type is source. */
431*2d9fd380Sjfb8856606 	rte_node_process_t process; /**< Node process function. */
432*2d9fd380Sjfb8856606 	rte_node_init_t init;       /**< Node init function. */
433*2d9fd380Sjfb8856606 	rte_node_fini_t fini;       /**< Node fini function. */
434*2d9fd380Sjfb8856606 	rte_node_t id;		    /**< Node Identifier. */
435*2d9fd380Sjfb8856606 	rte_node_t parent_id;       /**< Identifier of parent node. */
436*2d9fd380Sjfb8856606 	rte_edge_t nb_edges;        /**< Number of edges from this node. */
437*2d9fd380Sjfb8856606 	const char *next_nodes[];   /**< Names of next nodes. */
438*2d9fd380Sjfb8856606 };
439*2d9fd380Sjfb8856606 
440*2d9fd380Sjfb8856606 /**
441*2d9fd380Sjfb8856606  * Register new packet processing node. Nodes can be registered
442*2d9fd380Sjfb8856606  * dynamically via this call or statically via the RTE_NODE_REGISTER
443*2d9fd380Sjfb8856606  * macro.
444*2d9fd380Sjfb8856606  *
445*2d9fd380Sjfb8856606  * @param node
446*2d9fd380Sjfb8856606  *   Valid node pointer with name, process function and next_nodes.
447*2d9fd380Sjfb8856606  *
448*2d9fd380Sjfb8856606  * @return
449*2d9fd380Sjfb8856606  *   Valid node id on success, RTE_NODE_ID_INVALID otherwise.
450*2d9fd380Sjfb8856606  *
451*2d9fd380Sjfb8856606  * @see RTE_NODE_REGISTER()
452*2d9fd380Sjfb8856606  */
453*2d9fd380Sjfb8856606 __rte_experimental
454*2d9fd380Sjfb8856606 rte_node_t __rte_node_register(const struct rte_node_register *node);
455*2d9fd380Sjfb8856606 
456*2d9fd380Sjfb8856606 /**
457*2d9fd380Sjfb8856606  * Register a static node.
458*2d9fd380Sjfb8856606  *
459*2d9fd380Sjfb8856606  * The static node is registered through the constructor scheme, thereby, it can
460*2d9fd380Sjfb8856606  * be used in a multi-process scenario.
461*2d9fd380Sjfb8856606  *
462*2d9fd380Sjfb8856606  * @param node
463*2d9fd380Sjfb8856606  *   Valid node pointer with name, process function, and next_nodes.
464*2d9fd380Sjfb8856606  */
465*2d9fd380Sjfb8856606 #define RTE_NODE_REGISTER(node)                                                \
466*2d9fd380Sjfb8856606 	RTE_INIT(rte_node_register_##node)                                     \
467*2d9fd380Sjfb8856606 	{                                                                      \
468*2d9fd380Sjfb8856606 		node.parent_id = RTE_NODE_ID_INVALID;                          \
469*2d9fd380Sjfb8856606 		node.id = __rte_node_register(&node);                          \
470*2d9fd380Sjfb8856606 	}
471*2d9fd380Sjfb8856606 
472*2d9fd380Sjfb8856606 /**
473*2d9fd380Sjfb8856606  * Clone a node from static node(node created from RTE_NODE_REGISTER).
474*2d9fd380Sjfb8856606  *
475*2d9fd380Sjfb8856606  * @param id
476*2d9fd380Sjfb8856606  *   Static node id to clone from.
477*2d9fd380Sjfb8856606  * @param name
478*2d9fd380Sjfb8856606  *   Name of the new node. The library prepends the parent node name to the
479*2d9fd380Sjfb8856606  * user-specified name. The final node name will be,
480*2d9fd380Sjfb8856606  * "parent node name" + "-" + name.
481*2d9fd380Sjfb8856606  *
482*2d9fd380Sjfb8856606  * @return
483*2d9fd380Sjfb8856606  *   Valid node id on success, RTE_NODE_ID_INVALID otherwise.
484*2d9fd380Sjfb8856606  */
485*2d9fd380Sjfb8856606 __rte_experimental
486*2d9fd380Sjfb8856606 rte_node_t rte_node_clone(rte_node_t id, const char *name);
487*2d9fd380Sjfb8856606 
488*2d9fd380Sjfb8856606 /**
489*2d9fd380Sjfb8856606  * Get node id from node name.
490*2d9fd380Sjfb8856606  *
491*2d9fd380Sjfb8856606  * @param name
492*2d9fd380Sjfb8856606  *   Valid node name. In the case of the cloned node, the name will be
493*2d9fd380Sjfb8856606  * "parent node name" + "-" + name.
494*2d9fd380Sjfb8856606  *
495*2d9fd380Sjfb8856606  * @return
496*2d9fd380Sjfb8856606  *   Valid node id on success, RTE_NODE_ID_INVALID otherwise.
497*2d9fd380Sjfb8856606  */
498*2d9fd380Sjfb8856606 __rte_experimental
499*2d9fd380Sjfb8856606 rte_node_t rte_node_from_name(const char *name);
500*2d9fd380Sjfb8856606 
501*2d9fd380Sjfb8856606 /**
502*2d9fd380Sjfb8856606  * Get node name from node id.
503*2d9fd380Sjfb8856606  *
504*2d9fd380Sjfb8856606  * @param id
505*2d9fd380Sjfb8856606  *   Valid node id.
506*2d9fd380Sjfb8856606  *
507*2d9fd380Sjfb8856606  * @return
508*2d9fd380Sjfb8856606  *   Valid node name on success, NULL otherwise.
509*2d9fd380Sjfb8856606  */
510*2d9fd380Sjfb8856606 __rte_experimental
511*2d9fd380Sjfb8856606 char *rte_node_id_to_name(rte_node_t id);
512*2d9fd380Sjfb8856606 
513*2d9fd380Sjfb8856606 /**
514*2d9fd380Sjfb8856606  * Get the number of edges(next-nodes) for a node from node id.
515*2d9fd380Sjfb8856606  *
516*2d9fd380Sjfb8856606  * @param id
517*2d9fd380Sjfb8856606  *   Valid node id.
518*2d9fd380Sjfb8856606  *
519*2d9fd380Sjfb8856606  * @return
520*2d9fd380Sjfb8856606  *   Valid edge count on success, RTE_EDGE_ID_INVALID otherwise.
521*2d9fd380Sjfb8856606  */
522*2d9fd380Sjfb8856606 __rte_experimental
523*2d9fd380Sjfb8856606 rte_edge_t rte_node_edge_count(rte_node_t id);
524*2d9fd380Sjfb8856606 
525*2d9fd380Sjfb8856606 /**
526*2d9fd380Sjfb8856606  * Update the edges for a node from node id.
527*2d9fd380Sjfb8856606  *
528*2d9fd380Sjfb8856606  * @param id
529*2d9fd380Sjfb8856606  *   Valid node id.
530*2d9fd380Sjfb8856606  * @param from
531*2d9fd380Sjfb8856606  *   Index to update the edges from. RTE_EDGE_ID_INVALID is valid,
532*2d9fd380Sjfb8856606  * in that case, it will be added to the end of the list.
533*2d9fd380Sjfb8856606  * @param next_nodes
534*2d9fd380Sjfb8856606  *   Name of the edges to update.
535*2d9fd380Sjfb8856606  * @param nb_edges
536*2d9fd380Sjfb8856606  *   Number of edges to update.
537*2d9fd380Sjfb8856606  *
538*2d9fd380Sjfb8856606  * @return
539*2d9fd380Sjfb8856606  *   Valid edge count on success, 0 otherwise.
540*2d9fd380Sjfb8856606  */
541*2d9fd380Sjfb8856606 __rte_experimental
542*2d9fd380Sjfb8856606 rte_edge_t rte_node_edge_update(rte_node_t id, rte_edge_t from,
543*2d9fd380Sjfb8856606 				const char **next_nodes, uint16_t nb_edges);
544*2d9fd380Sjfb8856606 
545*2d9fd380Sjfb8856606 /**
546*2d9fd380Sjfb8856606  * Shrink the edges to a given size.
547*2d9fd380Sjfb8856606  *
548*2d9fd380Sjfb8856606  * @param id
549*2d9fd380Sjfb8856606  *   Valid node id.
550*2d9fd380Sjfb8856606  * @param size
551*2d9fd380Sjfb8856606  *   New size to shrink the edges.
552*2d9fd380Sjfb8856606  *
553*2d9fd380Sjfb8856606  * @return
554*2d9fd380Sjfb8856606  *   New size on success, RTE_EDGE_ID_INVALID otherwise.
555*2d9fd380Sjfb8856606  */
556*2d9fd380Sjfb8856606 __rte_experimental
557*2d9fd380Sjfb8856606 rte_edge_t rte_node_edge_shrink(rte_node_t id, rte_edge_t size);
558*2d9fd380Sjfb8856606 
559*2d9fd380Sjfb8856606 /**
560*2d9fd380Sjfb8856606  * Get the edge names from a given node.
561*2d9fd380Sjfb8856606  *
562*2d9fd380Sjfb8856606  * @param id
563*2d9fd380Sjfb8856606  *   Valid node id.
564*2d9fd380Sjfb8856606  * @param[out] next_nodes
565*2d9fd380Sjfb8856606  *   Buffer to copy the edge names. The NULL value is allowed in that case,
566*2d9fd380Sjfb8856606  * the function returns the size of the array that needs to be allocated.
567*2d9fd380Sjfb8856606  *
568*2d9fd380Sjfb8856606  * @return
569*2d9fd380Sjfb8856606  *   When next_nodes == NULL, it returns the size of the array else
570*2d9fd380Sjfb8856606  *  number of item copied.
571*2d9fd380Sjfb8856606  */
572*2d9fd380Sjfb8856606 __rte_experimental
573*2d9fd380Sjfb8856606 rte_node_t rte_node_edge_get(rte_node_t id, char *next_nodes[]);
574*2d9fd380Sjfb8856606 
575*2d9fd380Sjfb8856606 /**
576*2d9fd380Sjfb8856606  * Get maximum nodes available.
577*2d9fd380Sjfb8856606  *
578*2d9fd380Sjfb8856606  * @return
579*2d9fd380Sjfb8856606  *   Maximum nodes count.
580*2d9fd380Sjfb8856606  */
581*2d9fd380Sjfb8856606 __rte_experimental
582*2d9fd380Sjfb8856606 rte_node_t rte_node_max_count(void);
583*2d9fd380Sjfb8856606 
584*2d9fd380Sjfb8856606 /**
585*2d9fd380Sjfb8856606  * Dump node info to file.
586*2d9fd380Sjfb8856606  *
587*2d9fd380Sjfb8856606  * @param f
588*2d9fd380Sjfb8856606  *   File pointer to dump the node info.
589*2d9fd380Sjfb8856606  * @param id
590*2d9fd380Sjfb8856606  *   Node id to get the info.
591*2d9fd380Sjfb8856606  */
592*2d9fd380Sjfb8856606 __rte_experimental
593*2d9fd380Sjfb8856606 void rte_node_dump(FILE *f, rte_node_t id);
594*2d9fd380Sjfb8856606 
595*2d9fd380Sjfb8856606 /**
596*2d9fd380Sjfb8856606  * Dump all node info to file.
597*2d9fd380Sjfb8856606  *
598*2d9fd380Sjfb8856606  * @param f
599*2d9fd380Sjfb8856606  *   File pointer to dump the node info.
600*2d9fd380Sjfb8856606  */
601*2d9fd380Sjfb8856606 __rte_experimental
602*2d9fd380Sjfb8856606 void rte_node_list_dump(FILE *f);
603*2d9fd380Sjfb8856606 
604*2d9fd380Sjfb8856606 /**
605*2d9fd380Sjfb8856606  * Test the validity of node id.
606*2d9fd380Sjfb8856606  *
607*2d9fd380Sjfb8856606  * @param id
608*2d9fd380Sjfb8856606  *   Node id to check.
609*2d9fd380Sjfb8856606  *
610*2d9fd380Sjfb8856606  * @return
611*2d9fd380Sjfb8856606  *   1 if valid id, 0 otherwise.
612*2d9fd380Sjfb8856606  */
613*2d9fd380Sjfb8856606 static __rte_always_inline int
rte_node_is_invalid(rte_node_t id)614*2d9fd380Sjfb8856606 rte_node_is_invalid(rte_node_t id)
615*2d9fd380Sjfb8856606 {
616*2d9fd380Sjfb8856606 	return (id == RTE_NODE_ID_INVALID);
617*2d9fd380Sjfb8856606 }
618*2d9fd380Sjfb8856606 
619*2d9fd380Sjfb8856606 /**
620*2d9fd380Sjfb8856606  * Test the validity of edge id.
621*2d9fd380Sjfb8856606  *
622*2d9fd380Sjfb8856606  * @param id
623*2d9fd380Sjfb8856606  *   Edge node id to check.
624*2d9fd380Sjfb8856606  *
625*2d9fd380Sjfb8856606  * @return
626*2d9fd380Sjfb8856606  *   1 if valid id, 0 otherwise.
627*2d9fd380Sjfb8856606  */
628*2d9fd380Sjfb8856606 static __rte_always_inline int
rte_edge_is_invalid(rte_edge_t id)629*2d9fd380Sjfb8856606 rte_edge_is_invalid(rte_edge_t id)
630*2d9fd380Sjfb8856606 {
631*2d9fd380Sjfb8856606 	return (id == RTE_EDGE_ID_INVALID);
632*2d9fd380Sjfb8856606 }
633*2d9fd380Sjfb8856606 
634*2d9fd380Sjfb8856606 /**
635*2d9fd380Sjfb8856606  * Test the validity of graph id.
636*2d9fd380Sjfb8856606  *
637*2d9fd380Sjfb8856606  * @param id
638*2d9fd380Sjfb8856606  *   Graph id to check.
639*2d9fd380Sjfb8856606  *
640*2d9fd380Sjfb8856606  * @return
641*2d9fd380Sjfb8856606  *   1 if valid id, 0 otherwise.
642*2d9fd380Sjfb8856606  */
643*2d9fd380Sjfb8856606 static __rte_always_inline int
rte_graph_is_invalid(rte_graph_t id)644*2d9fd380Sjfb8856606 rte_graph_is_invalid(rte_graph_t id)
645*2d9fd380Sjfb8856606 {
646*2d9fd380Sjfb8856606 	return (id == RTE_GRAPH_ID_INVALID);
647*2d9fd380Sjfb8856606 }
648*2d9fd380Sjfb8856606 
649*2d9fd380Sjfb8856606 /**
650*2d9fd380Sjfb8856606  * Test stats feature support.
651*2d9fd380Sjfb8856606  *
652*2d9fd380Sjfb8856606  * @return
653*2d9fd380Sjfb8856606  *   1 if stats enabled, 0 otherwise.
654*2d9fd380Sjfb8856606  */
655*2d9fd380Sjfb8856606 static __rte_always_inline int
rte_graph_has_stats_feature(void)656*2d9fd380Sjfb8856606 rte_graph_has_stats_feature(void)
657*2d9fd380Sjfb8856606 {
658*2d9fd380Sjfb8856606 #ifdef RTE_LIBRTE_GRAPH_STATS
659*2d9fd380Sjfb8856606 	return RTE_LIBRTE_GRAPH_STATS;
660*2d9fd380Sjfb8856606 #else
661*2d9fd380Sjfb8856606 	return 0;
662*2d9fd380Sjfb8856606 #endif
663*2d9fd380Sjfb8856606 }
664*2d9fd380Sjfb8856606 
665*2d9fd380Sjfb8856606 #ifdef __cplusplus
666*2d9fd380Sjfb8856606 }
667*2d9fd380Sjfb8856606 #endif
668*2d9fd380Sjfb8856606 
669*2d9fd380Sjfb8856606 #endif /* _RTE_GRAPH_H_ */
670