New upstream version 18.02
[deb_dpdk.git] / examples / ip_pipeline / pipeline_be.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2016 Intel Corporation
3  */
4
5 #ifndef __INCLUDE_PIPELINE_BE_H__
6 #define __INCLUDE_PIPELINE_BE_H__
7
8 #include <rte_port_ethdev.h>
9 #include <rte_port_ring.h>
10 #include <rte_port_frag.h>
11 #include <rte_port_ras.h>
12 #include <rte_port_sched.h>
13 #include <rte_port_fd.h>
14 #include <rte_port_source_sink.h>
15 #ifdef RTE_LIBRTE_KNI
16 #include <rte_port_kni.h>
17 #endif
18 #include <rte_pipeline.h>
19
20 enum pipeline_port_in_type {
21         PIPELINE_PORT_IN_ETHDEV_READER,
22         PIPELINE_PORT_IN_RING_READER,
23         PIPELINE_PORT_IN_RING_MULTI_READER,
24         PIPELINE_PORT_IN_RING_READER_IPV4_FRAG,
25         PIPELINE_PORT_IN_RING_READER_IPV6_FRAG,
26         PIPELINE_PORT_IN_SCHED_READER,
27         PIPELINE_PORT_IN_FD_READER,
28         PIPELINE_PORT_IN_KNI_READER,
29         PIPELINE_PORT_IN_SOURCE,
30 };
31
32 struct pipeline_port_in_params {
33         enum pipeline_port_in_type type;
34         union {
35                 struct rte_port_ethdev_reader_params ethdev;
36                 struct rte_port_ring_reader_params ring;
37                 struct rte_port_ring_multi_reader_params ring_multi;
38                 struct rte_port_ring_reader_ipv4_frag_params ring_ipv4_frag;
39                 struct rte_port_ring_reader_ipv6_frag_params ring_ipv6_frag;
40                 struct rte_port_sched_reader_params sched;
41                 struct rte_port_fd_reader_params fd;
42 #ifdef RTE_LIBRTE_KNI
43                 struct rte_port_kni_reader_params kni;
44 #endif
45                 struct rte_port_source_params source;
46         } params;
47         uint32_t burst_size;
48 };
49
50 static inline void *
51 pipeline_port_in_params_convert(struct pipeline_port_in_params  *p)
52 {
53         switch (p->type) {
54         case PIPELINE_PORT_IN_ETHDEV_READER:
55                 return (void *) &p->params.ethdev;
56         case PIPELINE_PORT_IN_RING_READER:
57                 return (void *) &p->params.ring;
58         case PIPELINE_PORT_IN_RING_MULTI_READER:
59                 return (void *) &p->params.ring_multi;
60         case PIPELINE_PORT_IN_RING_READER_IPV4_FRAG:
61                 return (void *) &p->params.ring_ipv4_frag;
62         case PIPELINE_PORT_IN_RING_READER_IPV6_FRAG:
63                 return (void *) &p->params.ring_ipv6_frag;
64         case PIPELINE_PORT_IN_SCHED_READER:
65                 return (void *) &p->params.sched;
66         case PIPELINE_PORT_IN_FD_READER:
67                 return (void *) &p->params.fd;
68 #ifdef RTE_LIBRTE_KNI
69         case PIPELINE_PORT_IN_KNI_READER:
70                 return (void *) &p->params.kni;
71 #endif
72         case PIPELINE_PORT_IN_SOURCE:
73                 return (void *) &p->params.source;
74         default:
75                 return NULL;
76         }
77 }
78
79 static inline struct rte_port_in_ops *
80 pipeline_port_in_params_get_ops(struct pipeline_port_in_params  *p)
81 {
82         switch (p->type) {
83         case PIPELINE_PORT_IN_ETHDEV_READER:
84                 return &rte_port_ethdev_reader_ops;
85         case PIPELINE_PORT_IN_RING_READER:
86                 return &rte_port_ring_reader_ops;
87         case PIPELINE_PORT_IN_RING_MULTI_READER:
88                 return &rte_port_ring_multi_reader_ops;
89         case PIPELINE_PORT_IN_RING_READER_IPV4_FRAG:
90                 return &rte_port_ring_reader_ipv4_frag_ops;
91         case PIPELINE_PORT_IN_RING_READER_IPV6_FRAG:
92                 return &rte_port_ring_reader_ipv6_frag_ops;
93         case PIPELINE_PORT_IN_SCHED_READER:
94                 return &rte_port_sched_reader_ops;
95         case PIPELINE_PORT_IN_FD_READER:
96                 return &rte_port_fd_reader_ops;
97 #ifdef RTE_LIBRTE_KNI
98         case PIPELINE_PORT_IN_KNI_READER:
99                 return &rte_port_kni_reader_ops;
100 #endif
101         case PIPELINE_PORT_IN_SOURCE:
102                 return &rte_port_source_ops;
103         default:
104                 return NULL;
105         }
106 }
107
108 enum pipeline_port_out_type {
109         PIPELINE_PORT_OUT_ETHDEV_WRITER,
110         PIPELINE_PORT_OUT_ETHDEV_WRITER_NODROP,
111         PIPELINE_PORT_OUT_RING_WRITER,
112         PIPELINE_PORT_OUT_RING_MULTI_WRITER,
113         PIPELINE_PORT_OUT_RING_WRITER_NODROP,
114         PIPELINE_PORT_OUT_RING_MULTI_WRITER_NODROP,
115         PIPELINE_PORT_OUT_RING_WRITER_IPV4_RAS,
116         PIPELINE_PORT_OUT_RING_WRITER_IPV6_RAS,
117         PIPELINE_PORT_OUT_SCHED_WRITER,
118         PIPELINE_PORT_OUT_FD_WRITER,
119         PIPELINE_PORT_OUT_KNI_WRITER,
120         PIPELINE_PORT_OUT_KNI_WRITER_NODROP,
121         PIPELINE_PORT_OUT_SINK,
122 };
123
124 struct pipeline_port_out_params {
125         enum pipeline_port_out_type type;
126         union {
127                 struct rte_port_ethdev_writer_params ethdev;
128                 struct rte_port_ethdev_writer_nodrop_params ethdev_nodrop;
129                 struct rte_port_ring_writer_params ring;
130                 struct rte_port_ring_multi_writer_params ring_multi;
131                 struct rte_port_ring_writer_nodrop_params ring_nodrop;
132                 struct rte_port_ring_multi_writer_nodrop_params ring_multi_nodrop;
133                 struct rte_port_ring_writer_ipv4_ras_params ring_ipv4_ras;
134                 struct rte_port_ring_writer_ipv6_ras_params ring_ipv6_ras;
135                 struct rte_port_sched_writer_params sched;
136                 struct rte_port_fd_writer_params fd;
137 #ifdef RTE_LIBRTE_KNI
138                 struct rte_port_kni_writer_params kni;
139                 struct rte_port_kni_writer_nodrop_params kni_nodrop;
140 #endif
141                 struct rte_port_sink_params sink;
142         } params;
143 };
144
145 static inline void *
146 pipeline_port_out_params_convert(struct pipeline_port_out_params  *p)
147 {
148         switch (p->type) {
149         case PIPELINE_PORT_OUT_ETHDEV_WRITER:
150                 return (void *) &p->params.ethdev;
151         case PIPELINE_PORT_OUT_ETHDEV_WRITER_NODROP:
152                 return (void *) &p->params.ethdev_nodrop;
153         case PIPELINE_PORT_OUT_RING_WRITER:
154                 return (void *) &p->params.ring;
155         case PIPELINE_PORT_OUT_RING_MULTI_WRITER:
156                 return (void *) &p->params.ring_multi;
157         case PIPELINE_PORT_OUT_RING_WRITER_NODROP:
158                 return (void *) &p->params.ring_nodrop;
159         case PIPELINE_PORT_OUT_RING_MULTI_WRITER_NODROP:
160                 return (void *) &p->params.ring_multi_nodrop;
161         case PIPELINE_PORT_OUT_RING_WRITER_IPV4_RAS:
162                 return (void *) &p->params.ring_ipv4_ras;
163         case PIPELINE_PORT_OUT_RING_WRITER_IPV6_RAS:
164                 return (void *) &p->params.ring_ipv6_ras;
165         case PIPELINE_PORT_OUT_SCHED_WRITER:
166                 return (void *) &p->params.sched;
167         case PIPELINE_PORT_OUT_FD_WRITER:
168                 return (void *) &p->params.fd;
169 #ifdef RTE_LIBRTE_KNI
170         case PIPELINE_PORT_OUT_KNI_WRITER:
171                 return (void *) &p->params.kni;
172         case PIPELINE_PORT_OUT_KNI_WRITER_NODROP:
173                 return (void *) &p->params.kni_nodrop;
174 #endif
175         case PIPELINE_PORT_OUT_SINK:
176                 return (void *) &p->params.sink;
177         default:
178                 return NULL;
179         }
180 }
181
182 static inline void *
183 pipeline_port_out_params_get_ops(struct pipeline_port_out_params  *p)
184 {
185         switch (p->type) {
186         case PIPELINE_PORT_OUT_ETHDEV_WRITER:
187                 return &rte_port_ethdev_writer_ops;
188         case PIPELINE_PORT_OUT_ETHDEV_WRITER_NODROP:
189                 return &rte_port_ethdev_writer_nodrop_ops;
190         case PIPELINE_PORT_OUT_RING_WRITER:
191                 return &rte_port_ring_writer_ops;
192         case PIPELINE_PORT_OUT_RING_MULTI_WRITER:
193                 return &rte_port_ring_multi_writer_ops;
194         case PIPELINE_PORT_OUT_RING_WRITER_NODROP:
195                 return &rte_port_ring_writer_nodrop_ops;
196         case PIPELINE_PORT_OUT_RING_MULTI_WRITER_NODROP:
197                 return &rte_port_ring_multi_writer_nodrop_ops;
198         case PIPELINE_PORT_OUT_RING_WRITER_IPV4_RAS:
199                 return &rte_port_ring_writer_ipv4_ras_ops;
200         case PIPELINE_PORT_OUT_RING_WRITER_IPV6_RAS:
201                 return &rte_port_ring_writer_ipv6_ras_ops;
202         case PIPELINE_PORT_OUT_SCHED_WRITER:
203                 return &rte_port_sched_writer_ops;
204         case PIPELINE_PORT_OUT_FD_WRITER:
205                 return &rte_port_fd_writer_ops;
206 #ifdef RTE_LIBRTE_KNI
207         case PIPELINE_PORT_OUT_KNI_WRITER:
208                 return &rte_port_kni_writer_ops;
209         case PIPELINE_PORT_OUT_KNI_WRITER_NODROP:
210                 return &rte_port_kni_writer_nodrop_ops;
211 #endif
212         case PIPELINE_PORT_OUT_SINK:
213                 return &rte_port_sink_ops;
214         default:
215                 return NULL;
216         }
217 }
218
219 #ifndef PIPELINE_NAME_SIZE
220 #define PIPELINE_NAME_SIZE                       64
221 #endif
222
223 #ifndef PIPELINE_TYPE_SIZE
224 #define PIPELINE_TYPE_SIZE                       64
225 #endif
226
227 #ifndef PIPELINE_MAX_PORT_IN
228 #define PIPELINE_MAX_PORT_IN                     64
229 #endif
230
231 #ifndef PIPELINE_MAX_PORT_OUT
232 #define PIPELINE_MAX_PORT_OUT                    64
233 #endif
234
235 #ifndef PIPELINE_MAX_TABLES
236 #define PIPELINE_MAX_TABLES                      16
237 #endif
238
239 #ifndef PIPELINE_MAX_MSGQ_IN
240 #define PIPELINE_MAX_MSGQ_IN                     16
241 #endif
242
243 #ifndef PIPELINE_MAX_MSGQ_OUT
244 #define PIPELINE_MAX_MSGQ_OUT                    16
245 #endif
246
247 #ifndef PIPELINE_MAX_ARGS
248 #define PIPELINE_MAX_ARGS                        64
249 #endif
250
251 struct pipeline_params {
252         char name[PIPELINE_NAME_SIZE];
253         char type[PIPELINE_TYPE_SIZE];
254
255         struct pipeline_port_in_params port_in[PIPELINE_MAX_PORT_IN];
256         struct pipeline_port_out_params port_out[PIPELINE_MAX_PORT_OUT];
257         struct rte_ring *msgq_in[PIPELINE_MAX_MSGQ_IN];
258         struct rte_ring *msgq_out[PIPELINE_MAX_MSGQ_OUT];
259
260         uint32_t n_ports_in;
261         uint32_t n_ports_out;
262         uint32_t n_msgq;
263
264         int socket_id;
265
266         char *args_name[PIPELINE_MAX_ARGS];
267         char *args_value[PIPELINE_MAX_ARGS];
268         uint32_t n_args;
269
270         uint32_t log_level;
271 };
272
273 /*
274  * Pipeline type back-end operations
275  */
276
277 typedef void* (*pipeline_be_op_init)(struct pipeline_params *params,
278         void *arg);
279
280 typedef int (*pipeline_be_op_free)(void *pipeline);
281
282 typedef int (*pipeline_be_op_run)(void *pipeline);
283
284 typedef int (*pipeline_be_op_timer)(void *pipeline);
285
286 struct pipeline_be_ops {
287         pipeline_be_op_init f_init;
288         pipeline_be_op_free f_free;
289         pipeline_be_op_run f_run;
290         pipeline_be_op_timer f_timer;
291 };
292
293 /* Pipeline specific config parse error messages */
294 #define PIPELINE_ARG_CHECK(exp, fmt, ...)                               \
295 do {                                                                    \
296         if (!(exp)) {                                                   \
297                 fprintf(stderr, fmt "\n", ## __VA_ARGS__);              \
298                 return -1;                                              \
299         }                                                               \
300 } while (0)
301
302 #define PIPELINE_PARSE_ERR_INV_VAL(exp, section, entry, val)            \
303 PIPELINE_ARG_CHECK(exp, "Parse error in section \"%s\": entry \"%s\" "  \
304         "has invalid value (\"%s\")", section, entry, val)
305
306 #define PIPELINE_PARSE_ERR_OUT_RNG(exp, section, entry, val)            \
307 PIPELINE_ARG_CHECK(exp, "Parse error in section \"%s\": entry \"%s\" "  \
308         "value is out of range (\"%s\")", section, entry, val)
309
310 #define PIPELINE_PARSE_ERR_DUPLICATE(exp, section, entry)               \
311 PIPELINE_ARG_CHECK(exp, "Parse error in section \"%s\": duplicated "    \
312         "entry \"%s\"", section, entry)
313
314 #define PIPELINE_PARSE_ERR_INV_ENT(exp, section, entry)                 \
315 PIPELINE_ARG_CHECK(exp, "Parse error in section \"%s\": invalid entry " \
316         "\"%s\"", section, entry)
317
318 #define PIPELINE_PARSE_ERR_MANDATORY(exp, section, entry)               \
319 PIPELINE_ARG_CHECK(exp, "Parse error in section \"%s\": mandatory "     \
320         "entry \"%s\" is missing", section, entry)
321
322 #endif