xref: /dpdk/lib/pipeline/rte_swx_pipeline_spec.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2022 Intel Corporation
3  */
4 #ifndef __INCLUDE_RTE_SWX_PIPELINE_SPEC_H__
5 #define __INCLUDE_RTE_SWX_PIPELINE_SPEC_H__
6 
7 #include <stdint.h>
8 #include <stdio.h>
9 
10 #include <rte_common.h>
11 
12 #include <rte_swx_pipeline.h>
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 /*
19  * extobj.
20  *
21  * extobj OBJ_NAME instanceof OBJ_TYPE [ pragma OBJ_CREATE_ARGS ]
22  */
23 struct extobj_spec {
24 	char *name;
25 	char *extern_type_name;
26 	char *pragma;
27 };
28 
29 /*
30  * struct.
31  *
32  * struct STRUCT_TYPE_NAME {
33  *	bit<SIZE> | varbit<SIZE> FIELD_NAME
34  *	...
35  * }
36  */
37 struct struct_spec {
38 	char *name;
39 	struct rte_swx_field_params *fields;
40 	uint32_t n_fields;
41 	int varbit;
42 };
43 
44 /*
45  * header.
46  *
47  * header HEADER_NAME instanceof STRUCT_TYPE_NAME
48  */
49 struct header_spec {
50 	char *name;
51 	char *struct_type_name;
52 };
53 
54 /*
55  * metadata.
56  *
57  * metadata instanceof STRUCT_TYPE_NAME
58  */
59 struct metadata_spec {
60 	char *struct_type_name;
61 };
62 
63 /*
64  * action.
65  *
66  * action ACTION_NAME args none | instanceof STRUCT_TYPE_NAME {
67  *	INSTRUCTION
68  *	...
69  * }
70  */
71 struct action_spec {
72 	char *name;
73 	char *args_struct_type_name;
74 	const char **instructions;
75 	uint32_t n_instructions;
76 };
77 
78 /*
79  * table.
80  *
81  * table TABLE_NAME {
82  *	key {
83  *		MATCH_FIELD_NAME exact | wildcard | lpm
84  *		...
85  *	}
86  *	actions {
87  *		ACTION_NAME [ @tableonly | @defaultonly ]
88  *		...
89  *	}
90  *	default_action ACTION_NAME args none | ARG0_NAME ARG0_VALUE ... [ const ]
91  *	hash HASH_FUNCTION_NAME
92  *	instanceof TABLE_TYPE_NAME
93  *	pragma ARGS
94  *	size SIZE
95  * }
96  */
97 struct table_spec {
98 	char *name;
99 	struct rte_swx_pipeline_table_params params;
100 	char *recommended_table_type_name;
101 	char *args;
102 	uint32_t size;
103 };
104 
105 /*
106  * selector.
107  *
108  * selector SELECTOR_NAME {
109  *	group_id FIELD_NAME
110  *	selector {
111  *		FIELD_NAME
112  *		...
113  *	}
114  *	member_id FIELD_NAME
115  *	n_groups N_GROUPS
116  *	n_members_per_group N_MEMBERS_PER_GROUP
117  * }
118  */
119 struct selector_spec {
120 	char *name;
121 	struct rte_swx_pipeline_selector_params params;
122 };
123 
124 /*
125  * learner.
126  *
127  * learner LEARNER_NAME {
128  *	key {
129  *		MATCH_FIELD_NAME
130  *		...
131  *	}
132  *	actions {
133  *		ACTION_NAME [ @tableonly | @defaultonly]
134  *		...
135  *	}
136  *	default_action ACTION_NAME args none | ARG0_NAME ARG0_VALUE ... [ const ]
137  *	hash HASH_FUNCTION_NAME
138  *	size SIZE
139  *	timeout {
140  *		TIMEOUT_IN_SECONDS
141  *		...
142  *	}
143  * }
144  */
145 struct learner_spec {
146 	char *name;
147 	struct rte_swx_pipeline_learner_params params;
148 	uint32_t size;
149 	uint32_t *timeout;
150 	uint32_t n_timeouts;
151 };
152 
153 /*
154  * regarray.
155  *
156  * regarray NAME size SIZE initval INITVAL
157  */
158 struct regarray_spec {
159 	char *name;
160 	uint64_t init_val;
161 	uint32_t size;
162 };
163 
164 /*
165  * metarray.
166  *
167  * metarray NAME size SIZE
168  */
169 struct metarray_spec {
170 	char *name;
171 	uint32_t size;
172 };
173 
174 /*
175  * rss.
176  *
177  * rss NAME
178  */
179 struct rss_spec {
180 	char *name;
181 };
182 
183 /*
184  * apply.
185  *
186  * apply {
187  *	INSTRUCTION
188  *	...
189  * }
190  */
191 struct apply_spec {
192 	const char **instructions;
193 	uint32_t n_instructions;
194 };
195 
196 /*
197  * Pipeline.
198  */
199 struct pipeline_spec {
200 	struct extobj_spec *extobjs;
201 	struct struct_spec *structs;
202 	struct header_spec *headers;
203 	struct metadata_spec *metadata;
204 	struct action_spec *actions;
205 	struct table_spec *tables;
206 	struct selector_spec *selectors;
207 	struct learner_spec *learners;
208 	struct regarray_spec *regarrays;
209 	struct metarray_spec *metarrays;
210 	struct rss_spec *rss;
211 	struct apply_spec *apply;
212 
213 	uint32_t n_extobjs;
214 	uint32_t n_structs;
215 	uint32_t n_headers;
216 	uint32_t n_metadata;
217 	uint32_t n_actions;
218 	uint32_t n_tables;
219 	uint32_t n_selectors;
220 	uint32_t n_learners;
221 	uint32_t n_regarrays;
222 	uint32_t n_metarrays;
223 	uint32_t n_rss;
224 	uint32_t n_apply;
225 };
226 
227 /*
228  * Mirroring:
229  *      mirroring slots <n_slots> sessions <n_sessions>
230  *
231  * Input ports:
232  *      port in <port_id> ethdev <ethdev_name> rxq <queue_id> bsz <burst_size>
233  *      port in <port_id> ring <ring_name> bsz <burst_size>
234  *      port in <port_id> source mempool <mempool_name> file <file_name> loop <n_loops>
235  *                               packets <n_pkts_max>
236  *      port in <port_id> fd <file_descriptor> mtu <mtu> mempool <mempool_name> bsz <burst_size>
237  *
238  * Output ports:
239  *      port out <port_id> ethdev <ethdev_name> txq <queue_id> bsz <burst_size>
240  *      port out <port_id> ring <ring_name> bsz <burst_size>
241  *      port out <port_id> sink file <file_name> | none
242  *      port out <port_id> fd <file_descriptor> bsz <burst_size>
243  */
244 struct pipeline_iospec {
245 	struct rte_swx_pipeline_mirroring_params mirroring_params;
246 
247 	uint32_t *port_in_id;
248 	const char **port_in_type;
249 	void **port_in_params;
250 
251 	uint32_t *port_out_id;
252 	const char **port_out_type;
253 	void **port_out_params;
254 
255 	uint32_t n_ports_in;
256 	uint32_t n_ports_out;
257 };
258 
259 void
260 pipeline_spec_free(struct pipeline_spec *s);
261 
262 void
263 pipeline_spec_codegen(FILE *f,
264 		      struct pipeline_spec *s);
265 
266 struct pipeline_spec *
267 pipeline_spec_parse(FILE *spec,
268 		    uint32_t *err_line,
269 		    const char **err_msg);
270 
271 int
272 pipeline_spec_configure(struct rte_swx_pipeline *p,
273 			struct pipeline_spec *s,
274 			const char **err_msg);
275 
276 void
277 pipeline_iospec_free(struct pipeline_iospec *s);
278 
279 struct pipeline_iospec *
280 pipeline_iospec_parse(FILE *spec,
281 		      uint32_t *err_line,
282 		      const char **err_msg);
283 
284 int
285 pipeline_iospec_configure(struct rte_swx_pipeline *p,
286 			  struct pipeline_iospec *s,
287 			  const char **err_msg);
288 
289 #ifdef __cplusplus
290 }
291 #endif
292 
293 #endif
294