1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2019 Intel Corporation
3 */
4
5 #include <sys/queue.h>
6 #include <stdio.h>
7 #include <errno.h>
8 #include <stdint.h>
9 #include <string.h>
10 #include <unistd.h>
11 #include <stdarg.h>
12
13 #include <rte_ether.h>
14 #include <ethdev_driver.h>
15 #include <rte_malloc.h>
16 #include <rte_tailq.h>
17
18 #include "ice_ethdev.h"
19 #include "ice_generic_flow.h"
20
21 /**
22 * Non-pipeline mode, fdir and switch both used as distributor,
23 * fdir used first, switch used as fdir's backup.
24 */
25 #define ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY 0
26 /*Pipeline mode, switch used at permission stage*/
27 #define ICE_FLOW_CLASSIFY_STAGE_PERMISSION 1
28 /*Pipeline mode, fdir used at distributor stage*/
29 #define ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR 2
30
31 static struct ice_engine_list engine_list =
32 TAILQ_HEAD_INITIALIZER(engine_list);
33
34 static int ice_flow_validate(struct rte_eth_dev *dev,
35 const struct rte_flow_attr *attr,
36 const struct rte_flow_item pattern[],
37 const struct rte_flow_action actions[],
38 struct rte_flow_error *error);
39 static struct rte_flow *ice_flow_create(struct rte_eth_dev *dev,
40 const struct rte_flow_attr *attr,
41 const struct rte_flow_item pattern[],
42 const struct rte_flow_action actions[],
43 struct rte_flow_error *error);
44 static int ice_flow_destroy(struct rte_eth_dev *dev,
45 struct rte_flow *flow,
46 struct rte_flow_error *error);
47 static int ice_flow_flush(struct rte_eth_dev *dev,
48 struct rte_flow_error *error);
49 static int ice_flow_query(struct rte_eth_dev *dev,
50 struct rte_flow *flow,
51 const struct rte_flow_action *actions,
52 void *data,
53 struct rte_flow_error *error);
54
55 const struct rte_flow_ops ice_flow_ops = {
56 .validate = ice_flow_validate,
57 .create = ice_flow_create,
58 .destroy = ice_flow_destroy,
59 .flush = ice_flow_flush,
60 .query = ice_flow_query,
61 };
62
63 /* empty */
64 enum rte_flow_item_type pattern_empty[] = {
65 RTE_FLOW_ITEM_TYPE_END,
66 };
67
68 enum rte_flow_item_type pattern_any[] = {
69 RTE_FLOW_ITEM_TYPE_ANY,
70 RTE_FLOW_ITEM_TYPE_END,
71 };
72
73 /* raw */
74 enum rte_flow_item_type pattern_raw[] = {
75 RTE_FLOW_ITEM_TYPE_RAW,
76 RTE_FLOW_ITEM_TYPE_END,
77 };
78
79 /* L2 */
80 enum rte_flow_item_type pattern_ethertype[] = {
81 RTE_FLOW_ITEM_TYPE_ETH,
82 RTE_FLOW_ITEM_TYPE_END,
83 };
84 enum rte_flow_item_type pattern_ethertype_vlan[] = {
85 RTE_FLOW_ITEM_TYPE_ETH,
86 RTE_FLOW_ITEM_TYPE_VLAN,
87 RTE_FLOW_ITEM_TYPE_END,
88 };
89 enum rte_flow_item_type pattern_ethertype_qinq[] = {
90 RTE_FLOW_ITEM_TYPE_ETH,
91 RTE_FLOW_ITEM_TYPE_VLAN,
92 RTE_FLOW_ITEM_TYPE_VLAN,
93 RTE_FLOW_ITEM_TYPE_END,
94 };
95
96 /* ARP */
97 enum rte_flow_item_type pattern_eth_arp[] = {
98 RTE_FLOW_ITEM_TYPE_ETH,
99 RTE_FLOW_ITEM_TYPE_ARP_ETH_IPV4,
100 RTE_FLOW_ITEM_TYPE_END,
101 };
102
103 /* non-tunnel IPv4 */
104 enum rte_flow_item_type pattern_eth_ipv4[] = {
105 RTE_FLOW_ITEM_TYPE_ETH,
106 RTE_FLOW_ITEM_TYPE_IPV4,
107 RTE_FLOW_ITEM_TYPE_END,
108 };
109 enum rte_flow_item_type pattern_eth_vlan_ipv4[] = {
110 RTE_FLOW_ITEM_TYPE_ETH,
111 RTE_FLOW_ITEM_TYPE_VLAN,
112 RTE_FLOW_ITEM_TYPE_IPV4,
113 RTE_FLOW_ITEM_TYPE_END,
114 };
115 enum rte_flow_item_type pattern_eth_qinq_ipv4[] = {
116 RTE_FLOW_ITEM_TYPE_ETH,
117 RTE_FLOW_ITEM_TYPE_VLAN,
118 RTE_FLOW_ITEM_TYPE_VLAN,
119 RTE_FLOW_ITEM_TYPE_IPV4,
120 RTE_FLOW_ITEM_TYPE_END,
121 };
122 enum rte_flow_item_type pattern_eth_ipv4_udp[] = {
123 RTE_FLOW_ITEM_TYPE_ETH,
124 RTE_FLOW_ITEM_TYPE_IPV4,
125 RTE_FLOW_ITEM_TYPE_UDP,
126 RTE_FLOW_ITEM_TYPE_END,
127 };
128 enum rte_flow_item_type pattern_eth_vlan_ipv4_udp[] = {
129 RTE_FLOW_ITEM_TYPE_ETH,
130 RTE_FLOW_ITEM_TYPE_VLAN,
131 RTE_FLOW_ITEM_TYPE_IPV4,
132 RTE_FLOW_ITEM_TYPE_UDP,
133 RTE_FLOW_ITEM_TYPE_END,
134 };
135 enum rte_flow_item_type pattern_eth_qinq_ipv4_udp[] = {
136 RTE_FLOW_ITEM_TYPE_ETH,
137 RTE_FLOW_ITEM_TYPE_VLAN,
138 RTE_FLOW_ITEM_TYPE_VLAN,
139 RTE_FLOW_ITEM_TYPE_IPV4,
140 RTE_FLOW_ITEM_TYPE_UDP,
141 RTE_FLOW_ITEM_TYPE_END,
142 };
143 enum rte_flow_item_type pattern_eth_ipv4_tcp[] = {
144 RTE_FLOW_ITEM_TYPE_ETH,
145 RTE_FLOW_ITEM_TYPE_IPV4,
146 RTE_FLOW_ITEM_TYPE_TCP,
147 RTE_FLOW_ITEM_TYPE_END,
148 };
149 enum rte_flow_item_type pattern_eth_vlan_ipv4_tcp[] = {
150 RTE_FLOW_ITEM_TYPE_ETH,
151 RTE_FLOW_ITEM_TYPE_VLAN,
152 RTE_FLOW_ITEM_TYPE_IPV4,
153 RTE_FLOW_ITEM_TYPE_TCP,
154 RTE_FLOW_ITEM_TYPE_END,
155 };
156 enum rte_flow_item_type pattern_eth_qinq_ipv4_tcp[] = {
157 RTE_FLOW_ITEM_TYPE_ETH,
158 RTE_FLOW_ITEM_TYPE_VLAN,
159 RTE_FLOW_ITEM_TYPE_VLAN,
160 RTE_FLOW_ITEM_TYPE_IPV4,
161 RTE_FLOW_ITEM_TYPE_TCP,
162 RTE_FLOW_ITEM_TYPE_END,
163 };
164 enum rte_flow_item_type pattern_eth_ipv4_sctp[] = {
165 RTE_FLOW_ITEM_TYPE_ETH,
166 RTE_FLOW_ITEM_TYPE_IPV4,
167 RTE_FLOW_ITEM_TYPE_SCTP,
168 RTE_FLOW_ITEM_TYPE_END,
169 };
170 enum rte_flow_item_type pattern_eth_vlan_ipv4_sctp[] = {
171 RTE_FLOW_ITEM_TYPE_ETH,
172 RTE_FLOW_ITEM_TYPE_VLAN,
173 RTE_FLOW_ITEM_TYPE_IPV4,
174 RTE_FLOW_ITEM_TYPE_SCTP,
175 RTE_FLOW_ITEM_TYPE_END,
176 };
177 enum rte_flow_item_type pattern_eth_qinq_ipv4_sctp[] = {
178 RTE_FLOW_ITEM_TYPE_ETH,
179 RTE_FLOW_ITEM_TYPE_VLAN,
180 RTE_FLOW_ITEM_TYPE_VLAN,
181 RTE_FLOW_ITEM_TYPE_IPV4,
182 RTE_FLOW_ITEM_TYPE_SCTP,
183 RTE_FLOW_ITEM_TYPE_END,
184 };
185 enum rte_flow_item_type pattern_eth_ipv4_icmp[] = {
186 RTE_FLOW_ITEM_TYPE_ETH,
187 RTE_FLOW_ITEM_TYPE_IPV4,
188 RTE_FLOW_ITEM_TYPE_ICMP,
189 RTE_FLOW_ITEM_TYPE_END,
190 };
191 enum rte_flow_item_type pattern_eth_vlan_ipv4_icmp[] = {
192 RTE_FLOW_ITEM_TYPE_ETH,
193 RTE_FLOW_ITEM_TYPE_VLAN,
194 RTE_FLOW_ITEM_TYPE_IPV4,
195 RTE_FLOW_ITEM_TYPE_ICMP,
196 RTE_FLOW_ITEM_TYPE_END,
197 };
198 enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[] = {
199 RTE_FLOW_ITEM_TYPE_ETH,
200 RTE_FLOW_ITEM_TYPE_VLAN,
201 RTE_FLOW_ITEM_TYPE_VLAN,
202 RTE_FLOW_ITEM_TYPE_IPV4,
203 RTE_FLOW_ITEM_TYPE_ICMP,
204 RTE_FLOW_ITEM_TYPE_END,
205 };
206
207 /* non-tunnel IPv6 */
208 enum rte_flow_item_type pattern_eth_ipv6[] = {
209 RTE_FLOW_ITEM_TYPE_ETH,
210 RTE_FLOW_ITEM_TYPE_IPV6,
211 RTE_FLOW_ITEM_TYPE_END,
212 };
213 enum rte_flow_item_type pattern_eth_vlan_ipv6[] = {
214 RTE_FLOW_ITEM_TYPE_ETH,
215 RTE_FLOW_ITEM_TYPE_VLAN,
216 RTE_FLOW_ITEM_TYPE_IPV6,
217 RTE_FLOW_ITEM_TYPE_END,
218 };
219 enum rte_flow_item_type pattern_eth_qinq_ipv6[] = {
220 RTE_FLOW_ITEM_TYPE_ETH,
221 RTE_FLOW_ITEM_TYPE_VLAN,
222 RTE_FLOW_ITEM_TYPE_VLAN,
223 RTE_FLOW_ITEM_TYPE_IPV6,
224 RTE_FLOW_ITEM_TYPE_END,
225 };
226 enum rte_flow_item_type pattern_eth_ipv6_frag_ext[] = {
227 RTE_FLOW_ITEM_TYPE_ETH,
228 RTE_FLOW_ITEM_TYPE_IPV6,
229 RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
230 RTE_FLOW_ITEM_TYPE_END,
231 };
232 enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[] = {
233 RTE_FLOW_ITEM_TYPE_ETH,
234 RTE_FLOW_ITEM_TYPE_VLAN,
235 RTE_FLOW_ITEM_TYPE_IPV6,
236 RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
237 RTE_FLOW_ITEM_TYPE_END,
238 };
239 enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[] = {
240 RTE_FLOW_ITEM_TYPE_ETH,
241 RTE_FLOW_ITEM_TYPE_VLAN,
242 RTE_FLOW_ITEM_TYPE_VLAN,
243 RTE_FLOW_ITEM_TYPE_IPV6,
244 RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
245 RTE_FLOW_ITEM_TYPE_END,
246 };
247 enum rte_flow_item_type pattern_eth_ipv6_udp[] = {
248 RTE_FLOW_ITEM_TYPE_ETH,
249 RTE_FLOW_ITEM_TYPE_IPV6,
250 RTE_FLOW_ITEM_TYPE_UDP,
251 RTE_FLOW_ITEM_TYPE_END,
252 };
253 enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[] = {
254 RTE_FLOW_ITEM_TYPE_ETH,
255 RTE_FLOW_ITEM_TYPE_VLAN,
256 RTE_FLOW_ITEM_TYPE_IPV6,
257 RTE_FLOW_ITEM_TYPE_UDP,
258 RTE_FLOW_ITEM_TYPE_END,
259 };
260 enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[] = {
261 RTE_FLOW_ITEM_TYPE_ETH,
262 RTE_FLOW_ITEM_TYPE_VLAN,
263 RTE_FLOW_ITEM_TYPE_VLAN,
264 RTE_FLOW_ITEM_TYPE_IPV6,
265 RTE_FLOW_ITEM_TYPE_UDP,
266 RTE_FLOW_ITEM_TYPE_END,
267 };
268 enum rte_flow_item_type pattern_eth_ipv6_tcp[] = {
269 RTE_FLOW_ITEM_TYPE_ETH,
270 RTE_FLOW_ITEM_TYPE_IPV6,
271 RTE_FLOW_ITEM_TYPE_TCP,
272 RTE_FLOW_ITEM_TYPE_END,
273 };
274 enum rte_flow_item_type pattern_eth_vlan_ipv6_tcp[] = {
275 RTE_FLOW_ITEM_TYPE_ETH,
276 RTE_FLOW_ITEM_TYPE_VLAN,
277 RTE_FLOW_ITEM_TYPE_IPV6,
278 RTE_FLOW_ITEM_TYPE_TCP,
279 RTE_FLOW_ITEM_TYPE_END,
280 };
281 enum rte_flow_item_type pattern_eth_qinq_ipv6_tcp[] = {
282 RTE_FLOW_ITEM_TYPE_ETH,
283 RTE_FLOW_ITEM_TYPE_VLAN,
284 RTE_FLOW_ITEM_TYPE_VLAN,
285 RTE_FLOW_ITEM_TYPE_IPV6,
286 RTE_FLOW_ITEM_TYPE_TCP,
287 RTE_FLOW_ITEM_TYPE_END,
288 };
289 enum rte_flow_item_type pattern_eth_ipv6_sctp[] = {
290 RTE_FLOW_ITEM_TYPE_ETH,
291 RTE_FLOW_ITEM_TYPE_IPV6,
292 RTE_FLOW_ITEM_TYPE_SCTP,
293 RTE_FLOW_ITEM_TYPE_END,
294 };
295 enum rte_flow_item_type pattern_eth_vlan_ipv6_sctp[] = {
296 RTE_FLOW_ITEM_TYPE_ETH,
297 RTE_FLOW_ITEM_TYPE_VLAN,
298 RTE_FLOW_ITEM_TYPE_IPV6,
299 RTE_FLOW_ITEM_TYPE_SCTP,
300 RTE_FLOW_ITEM_TYPE_END,
301 };
302 enum rte_flow_item_type pattern_eth_qinq_ipv6_sctp[] = {
303 RTE_FLOW_ITEM_TYPE_ETH,
304 RTE_FLOW_ITEM_TYPE_VLAN,
305 RTE_FLOW_ITEM_TYPE_VLAN,
306 RTE_FLOW_ITEM_TYPE_IPV6,
307 RTE_FLOW_ITEM_TYPE_SCTP,
308 RTE_FLOW_ITEM_TYPE_END,
309 };
310 enum rte_flow_item_type pattern_eth_ipv6_icmp6[] = {
311 RTE_FLOW_ITEM_TYPE_ETH,
312 RTE_FLOW_ITEM_TYPE_IPV6,
313 RTE_FLOW_ITEM_TYPE_ICMP6,
314 RTE_FLOW_ITEM_TYPE_END,
315 };
316 enum rte_flow_item_type pattern_eth_vlan_ipv6_icmp6[] = {
317 RTE_FLOW_ITEM_TYPE_ETH,
318 RTE_FLOW_ITEM_TYPE_VLAN,
319 RTE_FLOW_ITEM_TYPE_IPV6,
320 RTE_FLOW_ITEM_TYPE_ICMP6,
321 RTE_FLOW_ITEM_TYPE_END,
322 };
323 enum rte_flow_item_type pattern_eth_qinq_ipv6_icmp6[] = {
324 RTE_FLOW_ITEM_TYPE_ETH,
325 RTE_FLOW_ITEM_TYPE_VLAN,
326 RTE_FLOW_ITEM_TYPE_VLAN,
327 RTE_FLOW_ITEM_TYPE_IPV6,
328 RTE_FLOW_ITEM_TYPE_ICMP6,
329 RTE_FLOW_ITEM_TYPE_END,
330 };
331
332 /* IPv4 VXLAN IPv4 */
333 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4[] = {
334 RTE_FLOW_ITEM_TYPE_ETH,
335 RTE_FLOW_ITEM_TYPE_IPV4,
336 RTE_FLOW_ITEM_TYPE_UDP,
337 RTE_FLOW_ITEM_TYPE_VXLAN,
338 RTE_FLOW_ITEM_TYPE_IPV4,
339 RTE_FLOW_ITEM_TYPE_END,
340 };
341 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_udp[] = {
342 RTE_FLOW_ITEM_TYPE_ETH,
343 RTE_FLOW_ITEM_TYPE_IPV4,
344 RTE_FLOW_ITEM_TYPE_UDP,
345 RTE_FLOW_ITEM_TYPE_VXLAN,
346 RTE_FLOW_ITEM_TYPE_IPV4,
347 RTE_FLOW_ITEM_TYPE_UDP,
348 RTE_FLOW_ITEM_TYPE_END,
349 };
350 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_tcp[] = {
351 RTE_FLOW_ITEM_TYPE_ETH,
352 RTE_FLOW_ITEM_TYPE_IPV4,
353 RTE_FLOW_ITEM_TYPE_UDP,
354 RTE_FLOW_ITEM_TYPE_VXLAN,
355 RTE_FLOW_ITEM_TYPE_IPV4,
356 RTE_FLOW_ITEM_TYPE_TCP,
357 RTE_FLOW_ITEM_TYPE_END,
358 };
359 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_sctp[] = {
360 RTE_FLOW_ITEM_TYPE_ETH,
361 RTE_FLOW_ITEM_TYPE_IPV4,
362 RTE_FLOW_ITEM_TYPE_UDP,
363 RTE_FLOW_ITEM_TYPE_VXLAN,
364 RTE_FLOW_ITEM_TYPE_IPV4,
365 RTE_FLOW_ITEM_TYPE_SCTP,
366 RTE_FLOW_ITEM_TYPE_END,
367 };
368 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_icmp[] = {
369 RTE_FLOW_ITEM_TYPE_ETH,
370 RTE_FLOW_ITEM_TYPE_IPV4,
371 RTE_FLOW_ITEM_TYPE_UDP,
372 RTE_FLOW_ITEM_TYPE_VXLAN,
373 RTE_FLOW_ITEM_TYPE_IPV4,
374 RTE_FLOW_ITEM_TYPE_ICMP,
375 RTE_FLOW_ITEM_TYPE_END,
376 };
377
378 /* IPv4 VXLAN MAC IPv4 */
379 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4[] = {
380 RTE_FLOW_ITEM_TYPE_ETH,
381 RTE_FLOW_ITEM_TYPE_IPV4,
382 RTE_FLOW_ITEM_TYPE_UDP,
383 RTE_FLOW_ITEM_TYPE_VXLAN,
384 RTE_FLOW_ITEM_TYPE_ETH,
385 RTE_FLOW_ITEM_TYPE_IPV4,
386 RTE_FLOW_ITEM_TYPE_END,
387 };
388 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp[] = {
389 RTE_FLOW_ITEM_TYPE_ETH,
390 RTE_FLOW_ITEM_TYPE_IPV4,
391 RTE_FLOW_ITEM_TYPE_UDP,
392 RTE_FLOW_ITEM_TYPE_VXLAN,
393 RTE_FLOW_ITEM_TYPE_ETH,
394 RTE_FLOW_ITEM_TYPE_IPV4,
395 RTE_FLOW_ITEM_TYPE_UDP,
396 RTE_FLOW_ITEM_TYPE_END,
397 };
398 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp[] = {
399 RTE_FLOW_ITEM_TYPE_ETH,
400 RTE_FLOW_ITEM_TYPE_IPV4,
401 RTE_FLOW_ITEM_TYPE_UDP,
402 RTE_FLOW_ITEM_TYPE_VXLAN,
403 RTE_FLOW_ITEM_TYPE_ETH,
404 RTE_FLOW_ITEM_TYPE_IPV4,
405 RTE_FLOW_ITEM_TYPE_TCP,
406 RTE_FLOW_ITEM_TYPE_END,
407 };
408 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp[] = {
409 RTE_FLOW_ITEM_TYPE_ETH,
410 RTE_FLOW_ITEM_TYPE_IPV4,
411 RTE_FLOW_ITEM_TYPE_UDP,
412 RTE_FLOW_ITEM_TYPE_VXLAN,
413 RTE_FLOW_ITEM_TYPE_ETH,
414 RTE_FLOW_ITEM_TYPE_IPV4,
415 RTE_FLOW_ITEM_TYPE_SCTP,
416 RTE_FLOW_ITEM_TYPE_END,
417 };
418 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_icmp[] = {
419 RTE_FLOW_ITEM_TYPE_ETH,
420 RTE_FLOW_ITEM_TYPE_IPV4,
421 RTE_FLOW_ITEM_TYPE_UDP,
422 RTE_FLOW_ITEM_TYPE_VXLAN,
423 RTE_FLOW_ITEM_TYPE_ETH,
424 RTE_FLOW_ITEM_TYPE_IPV4,
425 RTE_FLOW_ITEM_TYPE_ICMP,
426 RTE_FLOW_ITEM_TYPE_END,
427 };
428
429 /* IPv6 VXLAN IPv4 */
430 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4[] = {
431 RTE_FLOW_ITEM_TYPE_ETH,
432 RTE_FLOW_ITEM_TYPE_IPV6,
433 RTE_FLOW_ITEM_TYPE_UDP,
434 RTE_FLOW_ITEM_TYPE_VXLAN,
435 RTE_FLOW_ITEM_TYPE_IPV4,
436 RTE_FLOW_ITEM_TYPE_END,
437 };
438 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_tcp[] = {
439 RTE_FLOW_ITEM_TYPE_ETH,
440 RTE_FLOW_ITEM_TYPE_IPV6,
441 RTE_FLOW_ITEM_TYPE_UDP,
442 RTE_FLOW_ITEM_TYPE_VXLAN,
443 RTE_FLOW_ITEM_TYPE_IPV4,
444 RTE_FLOW_ITEM_TYPE_TCP,
445 RTE_FLOW_ITEM_TYPE_END,
446 };
447 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_udp[] = {
448 RTE_FLOW_ITEM_TYPE_ETH,
449 RTE_FLOW_ITEM_TYPE_IPV6,
450 RTE_FLOW_ITEM_TYPE_UDP,
451 RTE_FLOW_ITEM_TYPE_VXLAN,
452 RTE_FLOW_ITEM_TYPE_IPV4,
453 RTE_FLOW_ITEM_TYPE_UDP,
454 RTE_FLOW_ITEM_TYPE_END,
455 };
456 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_sctp[] = {
457 RTE_FLOW_ITEM_TYPE_ETH,
458 RTE_FLOW_ITEM_TYPE_IPV6,
459 RTE_FLOW_ITEM_TYPE_UDP,
460 RTE_FLOW_ITEM_TYPE_VXLAN,
461 RTE_FLOW_ITEM_TYPE_IPV4,
462 RTE_FLOW_ITEM_TYPE_SCTP,
463 RTE_FLOW_ITEM_TYPE_END,
464 };
465 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_icmp[] = {
466 RTE_FLOW_ITEM_TYPE_ETH,
467 RTE_FLOW_ITEM_TYPE_IPV6,
468 RTE_FLOW_ITEM_TYPE_UDP,
469 RTE_FLOW_ITEM_TYPE_VXLAN,
470 RTE_FLOW_ITEM_TYPE_IPV4,
471 RTE_FLOW_ITEM_TYPE_ICMP,
472 RTE_FLOW_ITEM_TYPE_END,
473 };
474
475 /* IPv6 VXLAN MAC IPv4 */
476 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4[] = {
477 RTE_FLOW_ITEM_TYPE_ETH,
478 RTE_FLOW_ITEM_TYPE_IPV6,
479 RTE_FLOW_ITEM_TYPE_UDP,
480 RTE_FLOW_ITEM_TYPE_VXLAN,
481 RTE_FLOW_ITEM_TYPE_ETH,
482 RTE_FLOW_ITEM_TYPE_IPV4,
483 RTE_FLOW_ITEM_TYPE_END,
484 };
485 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_tcp[] = {
486 RTE_FLOW_ITEM_TYPE_ETH,
487 RTE_FLOW_ITEM_TYPE_IPV6,
488 RTE_FLOW_ITEM_TYPE_UDP,
489 RTE_FLOW_ITEM_TYPE_VXLAN,
490 RTE_FLOW_ITEM_TYPE_ETH,
491 RTE_FLOW_ITEM_TYPE_IPV4,
492 RTE_FLOW_ITEM_TYPE_TCP,
493 RTE_FLOW_ITEM_TYPE_END,
494 };
495 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_udp[] = {
496 RTE_FLOW_ITEM_TYPE_ETH,
497 RTE_FLOW_ITEM_TYPE_IPV6,
498 RTE_FLOW_ITEM_TYPE_UDP,
499 RTE_FLOW_ITEM_TYPE_VXLAN,
500 RTE_FLOW_ITEM_TYPE_ETH,
501 RTE_FLOW_ITEM_TYPE_IPV4,
502 RTE_FLOW_ITEM_TYPE_UDP,
503 RTE_FLOW_ITEM_TYPE_END,
504 };
505 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_sctp[] = {
506 RTE_FLOW_ITEM_TYPE_ETH,
507 RTE_FLOW_ITEM_TYPE_IPV6,
508 RTE_FLOW_ITEM_TYPE_UDP,
509 RTE_FLOW_ITEM_TYPE_VXLAN,
510 RTE_FLOW_ITEM_TYPE_ETH,
511 RTE_FLOW_ITEM_TYPE_IPV4,
512 RTE_FLOW_ITEM_TYPE_SCTP,
513 RTE_FLOW_ITEM_TYPE_END,
514 };
515 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_icmp[] = {
516 RTE_FLOW_ITEM_TYPE_ETH,
517 RTE_FLOW_ITEM_TYPE_IPV6,
518 RTE_FLOW_ITEM_TYPE_UDP,
519 RTE_FLOW_ITEM_TYPE_VXLAN,
520 RTE_FLOW_ITEM_TYPE_ETH,
521 RTE_FLOW_ITEM_TYPE_IPV4,
522 RTE_FLOW_ITEM_TYPE_ICMP,
523 RTE_FLOW_ITEM_TYPE_END,
524 };
525
526 /* IPv4 VXLAN IPv6 */
527 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6[] = {
528 RTE_FLOW_ITEM_TYPE_ETH,
529 RTE_FLOW_ITEM_TYPE_IPV4,
530 RTE_FLOW_ITEM_TYPE_UDP,
531 RTE_FLOW_ITEM_TYPE_VXLAN,
532 RTE_FLOW_ITEM_TYPE_IPV6,
533 RTE_FLOW_ITEM_TYPE_END,
534 };
535 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_udp[] = {
536 RTE_FLOW_ITEM_TYPE_ETH,
537 RTE_FLOW_ITEM_TYPE_IPV4,
538 RTE_FLOW_ITEM_TYPE_UDP,
539 RTE_FLOW_ITEM_TYPE_VXLAN,
540 RTE_FLOW_ITEM_TYPE_IPV6,
541 RTE_FLOW_ITEM_TYPE_UDP,
542 RTE_FLOW_ITEM_TYPE_END,
543 };
544 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_tcp[] = {
545 RTE_FLOW_ITEM_TYPE_ETH,
546 RTE_FLOW_ITEM_TYPE_IPV4,
547 RTE_FLOW_ITEM_TYPE_UDP,
548 RTE_FLOW_ITEM_TYPE_VXLAN,
549 RTE_FLOW_ITEM_TYPE_IPV6,
550 RTE_FLOW_ITEM_TYPE_TCP,
551 RTE_FLOW_ITEM_TYPE_END,
552 };
553 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_sctp[] = {
554 RTE_FLOW_ITEM_TYPE_ETH,
555 RTE_FLOW_ITEM_TYPE_IPV4,
556 RTE_FLOW_ITEM_TYPE_UDP,
557 RTE_FLOW_ITEM_TYPE_VXLAN,
558 RTE_FLOW_ITEM_TYPE_IPV6,
559 RTE_FLOW_ITEM_TYPE_SCTP,
560 RTE_FLOW_ITEM_TYPE_END,
561 };
562 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_icmp6[] = {
563 RTE_FLOW_ITEM_TYPE_ETH,
564 RTE_FLOW_ITEM_TYPE_IPV4,
565 RTE_FLOW_ITEM_TYPE_UDP,
566 RTE_FLOW_ITEM_TYPE_VXLAN,
567 RTE_FLOW_ITEM_TYPE_IPV6,
568 RTE_FLOW_ITEM_TYPE_ICMP6,
569 RTE_FLOW_ITEM_TYPE_END,
570 };
571
572 /* IPv4 VXLAN MAC IPv6 */
573 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6[] = {
574 RTE_FLOW_ITEM_TYPE_ETH,
575 RTE_FLOW_ITEM_TYPE_IPV4,
576 RTE_FLOW_ITEM_TYPE_UDP,
577 RTE_FLOW_ITEM_TYPE_VXLAN,
578 RTE_FLOW_ITEM_TYPE_ETH,
579 RTE_FLOW_ITEM_TYPE_IPV6,
580 RTE_FLOW_ITEM_TYPE_END,
581 };
582 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_udp[] = {
583 RTE_FLOW_ITEM_TYPE_ETH,
584 RTE_FLOW_ITEM_TYPE_IPV4,
585 RTE_FLOW_ITEM_TYPE_UDP,
586 RTE_FLOW_ITEM_TYPE_VXLAN,
587 RTE_FLOW_ITEM_TYPE_ETH,
588 RTE_FLOW_ITEM_TYPE_IPV6,
589 RTE_FLOW_ITEM_TYPE_UDP,
590 RTE_FLOW_ITEM_TYPE_END,
591 };
592 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_tcp[] = {
593 RTE_FLOW_ITEM_TYPE_ETH,
594 RTE_FLOW_ITEM_TYPE_IPV4,
595 RTE_FLOW_ITEM_TYPE_UDP,
596 RTE_FLOW_ITEM_TYPE_VXLAN,
597 RTE_FLOW_ITEM_TYPE_ETH,
598 RTE_FLOW_ITEM_TYPE_IPV6,
599 RTE_FLOW_ITEM_TYPE_TCP,
600 RTE_FLOW_ITEM_TYPE_END,
601 };
602 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_sctp[] = {
603 RTE_FLOW_ITEM_TYPE_ETH,
604 RTE_FLOW_ITEM_TYPE_IPV4,
605 RTE_FLOW_ITEM_TYPE_UDP,
606 RTE_FLOW_ITEM_TYPE_VXLAN,
607 RTE_FLOW_ITEM_TYPE_ETH,
608 RTE_FLOW_ITEM_TYPE_IPV6,
609 RTE_FLOW_ITEM_TYPE_SCTP,
610 RTE_FLOW_ITEM_TYPE_END,
611 };
612 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_icmp6[] = {
613 RTE_FLOW_ITEM_TYPE_ETH,
614 RTE_FLOW_ITEM_TYPE_IPV4,
615 RTE_FLOW_ITEM_TYPE_UDP,
616 RTE_FLOW_ITEM_TYPE_VXLAN,
617 RTE_FLOW_ITEM_TYPE_ETH,
618 RTE_FLOW_ITEM_TYPE_IPV6,
619 RTE_FLOW_ITEM_TYPE_ICMP6,
620 RTE_FLOW_ITEM_TYPE_END,
621 };
622
623 /* IPv6 VXLAN IPv6 */
624 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6[] = {
625 RTE_FLOW_ITEM_TYPE_ETH,
626 RTE_FLOW_ITEM_TYPE_IPV6,
627 RTE_FLOW_ITEM_TYPE_UDP,
628 RTE_FLOW_ITEM_TYPE_VXLAN,
629 RTE_FLOW_ITEM_TYPE_IPV6,
630 RTE_FLOW_ITEM_TYPE_END,
631 };
632 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_tcp[] = {
633 RTE_FLOW_ITEM_TYPE_ETH,
634 RTE_FLOW_ITEM_TYPE_IPV6,
635 RTE_FLOW_ITEM_TYPE_UDP,
636 RTE_FLOW_ITEM_TYPE_VXLAN,
637 RTE_FLOW_ITEM_TYPE_IPV6,
638 RTE_FLOW_ITEM_TYPE_TCP,
639 RTE_FLOW_ITEM_TYPE_END,
640 };
641 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_udp[] = {
642 RTE_FLOW_ITEM_TYPE_ETH,
643 RTE_FLOW_ITEM_TYPE_IPV6,
644 RTE_FLOW_ITEM_TYPE_UDP,
645 RTE_FLOW_ITEM_TYPE_VXLAN,
646 RTE_FLOW_ITEM_TYPE_IPV6,
647 RTE_FLOW_ITEM_TYPE_UDP,
648 RTE_FLOW_ITEM_TYPE_END,
649 };
650 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_sctp[] = {
651 RTE_FLOW_ITEM_TYPE_ETH,
652 RTE_FLOW_ITEM_TYPE_IPV6,
653 RTE_FLOW_ITEM_TYPE_UDP,
654 RTE_FLOW_ITEM_TYPE_VXLAN,
655 RTE_FLOW_ITEM_TYPE_IPV6,
656 RTE_FLOW_ITEM_TYPE_SCTP,
657 RTE_FLOW_ITEM_TYPE_END,
658 };
659 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_icmp6[] = {
660 RTE_FLOW_ITEM_TYPE_ETH,
661 RTE_FLOW_ITEM_TYPE_IPV6,
662 RTE_FLOW_ITEM_TYPE_UDP,
663 RTE_FLOW_ITEM_TYPE_VXLAN,
664 RTE_FLOW_ITEM_TYPE_IPV6,
665 RTE_FLOW_ITEM_TYPE_ICMP6,
666 RTE_FLOW_ITEM_TYPE_END,
667 };
668
669 /* IPv6 VXLAN MAC IPv6 */
670 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6[] = {
671 RTE_FLOW_ITEM_TYPE_ETH,
672 RTE_FLOW_ITEM_TYPE_IPV6,
673 RTE_FLOW_ITEM_TYPE_UDP,
674 RTE_FLOW_ITEM_TYPE_VXLAN,
675 RTE_FLOW_ITEM_TYPE_ETH,
676 RTE_FLOW_ITEM_TYPE_IPV6,
677 RTE_FLOW_ITEM_TYPE_END,
678 };
679 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_tcp[] = {
680 RTE_FLOW_ITEM_TYPE_ETH,
681 RTE_FLOW_ITEM_TYPE_IPV6,
682 RTE_FLOW_ITEM_TYPE_UDP,
683 RTE_FLOW_ITEM_TYPE_VXLAN,
684 RTE_FLOW_ITEM_TYPE_ETH,
685 RTE_FLOW_ITEM_TYPE_IPV6,
686 RTE_FLOW_ITEM_TYPE_TCP,
687 RTE_FLOW_ITEM_TYPE_END,
688 };
689 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_udp[] = {
690 RTE_FLOW_ITEM_TYPE_ETH,
691 RTE_FLOW_ITEM_TYPE_IPV6,
692 RTE_FLOW_ITEM_TYPE_UDP,
693 RTE_FLOW_ITEM_TYPE_VXLAN,
694 RTE_FLOW_ITEM_TYPE_ETH,
695 RTE_FLOW_ITEM_TYPE_IPV6,
696 RTE_FLOW_ITEM_TYPE_UDP,
697 RTE_FLOW_ITEM_TYPE_END,
698 };
699 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_sctp[] = {
700 RTE_FLOW_ITEM_TYPE_ETH,
701 RTE_FLOW_ITEM_TYPE_IPV6,
702 RTE_FLOW_ITEM_TYPE_UDP,
703 RTE_FLOW_ITEM_TYPE_VXLAN,
704 RTE_FLOW_ITEM_TYPE_ETH,
705 RTE_FLOW_ITEM_TYPE_IPV6,
706 RTE_FLOW_ITEM_TYPE_SCTP,
707 RTE_FLOW_ITEM_TYPE_END,
708 };
709 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_icmp6[] = {
710 RTE_FLOW_ITEM_TYPE_ETH,
711 RTE_FLOW_ITEM_TYPE_IPV6,
712 RTE_FLOW_ITEM_TYPE_UDP,
713 RTE_FLOW_ITEM_TYPE_VXLAN,
714 RTE_FLOW_ITEM_TYPE_ETH,
715 RTE_FLOW_ITEM_TYPE_IPV6,
716 RTE_FLOW_ITEM_TYPE_ICMP6,
717 RTE_FLOW_ITEM_TYPE_END,
718 };
719
720 /* IPv4 NVGRE IPv4 */
721 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4[] = {
722 RTE_FLOW_ITEM_TYPE_ETH,
723 RTE_FLOW_ITEM_TYPE_IPV4,
724 RTE_FLOW_ITEM_TYPE_NVGRE,
725 RTE_FLOW_ITEM_TYPE_IPV4,
726 RTE_FLOW_ITEM_TYPE_END,
727 };
728 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_udp[] = {
729 RTE_FLOW_ITEM_TYPE_ETH,
730 RTE_FLOW_ITEM_TYPE_IPV4,
731 RTE_FLOW_ITEM_TYPE_NVGRE,
732 RTE_FLOW_ITEM_TYPE_IPV4,
733 RTE_FLOW_ITEM_TYPE_UDP,
734 RTE_FLOW_ITEM_TYPE_END,
735 };
736 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_tcp[] = {
737 RTE_FLOW_ITEM_TYPE_ETH,
738 RTE_FLOW_ITEM_TYPE_IPV4,
739 RTE_FLOW_ITEM_TYPE_NVGRE,
740 RTE_FLOW_ITEM_TYPE_IPV4,
741 RTE_FLOW_ITEM_TYPE_TCP,
742 RTE_FLOW_ITEM_TYPE_END,
743 };
744 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_sctp[] = {
745 RTE_FLOW_ITEM_TYPE_ETH,
746 RTE_FLOW_ITEM_TYPE_IPV4,
747 RTE_FLOW_ITEM_TYPE_NVGRE,
748 RTE_FLOW_ITEM_TYPE_IPV4,
749 RTE_FLOW_ITEM_TYPE_SCTP,
750 RTE_FLOW_ITEM_TYPE_END,
751 };
752 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_icmp[] = {
753 RTE_FLOW_ITEM_TYPE_ETH,
754 RTE_FLOW_ITEM_TYPE_IPV4,
755 RTE_FLOW_ITEM_TYPE_NVGRE,
756 RTE_FLOW_ITEM_TYPE_IPV4,
757 RTE_FLOW_ITEM_TYPE_ICMP,
758 RTE_FLOW_ITEM_TYPE_END,
759 };
760
761 /* IPv4 NVGRE MAC IPv4 */
762 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4[] = {
763 RTE_FLOW_ITEM_TYPE_ETH,
764 RTE_FLOW_ITEM_TYPE_IPV4,
765 RTE_FLOW_ITEM_TYPE_NVGRE,
766 RTE_FLOW_ITEM_TYPE_ETH,
767 RTE_FLOW_ITEM_TYPE_IPV4,
768 RTE_FLOW_ITEM_TYPE_END,
769 };
770 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_udp[] = {
771 RTE_FLOW_ITEM_TYPE_ETH,
772 RTE_FLOW_ITEM_TYPE_IPV4,
773 RTE_FLOW_ITEM_TYPE_NVGRE,
774 RTE_FLOW_ITEM_TYPE_ETH,
775 RTE_FLOW_ITEM_TYPE_IPV4,
776 RTE_FLOW_ITEM_TYPE_UDP,
777 RTE_FLOW_ITEM_TYPE_END,
778 };
779 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_tcp[] = {
780 RTE_FLOW_ITEM_TYPE_ETH,
781 RTE_FLOW_ITEM_TYPE_IPV4,
782 RTE_FLOW_ITEM_TYPE_NVGRE,
783 RTE_FLOW_ITEM_TYPE_ETH,
784 RTE_FLOW_ITEM_TYPE_IPV4,
785 RTE_FLOW_ITEM_TYPE_TCP,
786 RTE_FLOW_ITEM_TYPE_END,
787 };
788 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_sctp[] = {
789 RTE_FLOW_ITEM_TYPE_ETH,
790 RTE_FLOW_ITEM_TYPE_IPV4,
791 RTE_FLOW_ITEM_TYPE_NVGRE,
792 RTE_FLOW_ITEM_TYPE_ETH,
793 RTE_FLOW_ITEM_TYPE_IPV4,
794 RTE_FLOW_ITEM_TYPE_SCTP,
795 RTE_FLOW_ITEM_TYPE_END,
796 };
797 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_icmp[] = {
798 RTE_FLOW_ITEM_TYPE_ETH,
799 RTE_FLOW_ITEM_TYPE_IPV4,
800 RTE_FLOW_ITEM_TYPE_NVGRE,
801 RTE_FLOW_ITEM_TYPE_ETH,
802 RTE_FLOW_ITEM_TYPE_IPV4,
803 RTE_FLOW_ITEM_TYPE_ICMP,
804 RTE_FLOW_ITEM_TYPE_END,
805 };
806
807 /* IPv6 NVGRE IPv4 */
808 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4[] = {
809 RTE_FLOW_ITEM_TYPE_ETH,
810 RTE_FLOW_ITEM_TYPE_IPV6,
811 RTE_FLOW_ITEM_TYPE_NVGRE,
812 RTE_FLOW_ITEM_TYPE_IPV4,
813 RTE_FLOW_ITEM_TYPE_END,
814 };
815 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_tcp[] = {
816 RTE_FLOW_ITEM_TYPE_ETH,
817 RTE_FLOW_ITEM_TYPE_IPV6,
818 RTE_FLOW_ITEM_TYPE_NVGRE,
819 RTE_FLOW_ITEM_TYPE_IPV4,
820 RTE_FLOW_ITEM_TYPE_TCP,
821 RTE_FLOW_ITEM_TYPE_END,
822 };
823 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_udp[] = {
824 RTE_FLOW_ITEM_TYPE_ETH,
825 RTE_FLOW_ITEM_TYPE_IPV6,
826 RTE_FLOW_ITEM_TYPE_NVGRE,
827 RTE_FLOW_ITEM_TYPE_IPV4,
828 RTE_FLOW_ITEM_TYPE_UDP,
829 RTE_FLOW_ITEM_TYPE_END,
830 };
831 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_sctp[] = {
832 RTE_FLOW_ITEM_TYPE_ETH,
833 RTE_FLOW_ITEM_TYPE_IPV6,
834 RTE_FLOW_ITEM_TYPE_NVGRE,
835 RTE_FLOW_ITEM_TYPE_IPV4,
836 RTE_FLOW_ITEM_TYPE_SCTP,
837 RTE_FLOW_ITEM_TYPE_END,
838 };
839 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_icmp[] = {
840 RTE_FLOW_ITEM_TYPE_ETH,
841 RTE_FLOW_ITEM_TYPE_IPV6,
842 RTE_FLOW_ITEM_TYPE_NVGRE,
843 RTE_FLOW_ITEM_TYPE_IPV4,
844 RTE_FLOW_ITEM_TYPE_ICMP,
845 RTE_FLOW_ITEM_TYPE_END,
846 };
847
848 /* IPv6 NVGRE MAC IPv4 */
849 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4[] = {
850 RTE_FLOW_ITEM_TYPE_ETH,
851 RTE_FLOW_ITEM_TYPE_IPV6,
852 RTE_FLOW_ITEM_TYPE_NVGRE,
853 RTE_FLOW_ITEM_TYPE_ETH,
854 RTE_FLOW_ITEM_TYPE_IPV4,
855 RTE_FLOW_ITEM_TYPE_END,
856 };
857 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_tcp[] = {
858 RTE_FLOW_ITEM_TYPE_ETH,
859 RTE_FLOW_ITEM_TYPE_IPV6,
860 RTE_FLOW_ITEM_TYPE_NVGRE,
861 RTE_FLOW_ITEM_TYPE_ETH,
862 RTE_FLOW_ITEM_TYPE_IPV4,
863 RTE_FLOW_ITEM_TYPE_TCP,
864 RTE_FLOW_ITEM_TYPE_END,
865 };
866 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_udp[] = {
867 RTE_FLOW_ITEM_TYPE_ETH,
868 RTE_FLOW_ITEM_TYPE_IPV6,
869 RTE_FLOW_ITEM_TYPE_NVGRE,
870 RTE_FLOW_ITEM_TYPE_ETH,
871 RTE_FLOW_ITEM_TYPE_IPV4,
872 RTE_FLOW_ITEM_TYPE_UDP,
873 RTE_FLOW_ITEM_TYPE_END,
874 };
875 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_sctp[] = {
876 RTE_FLOW_ITEM_TYPE_ETH,
877 RTE_FLOW_ITEM_TYPE_IPV6,
878 RTE_FLOW_ITEM_TYPE_NVGRE,
879 RTE_FLOW_ITEM_TYPE_ETH,
880 RTE_FLOW_ITEM_TYPE_IPV4,
881 RTE_FLOW_ITEM_TYPE_SCTP,
882 RTE_FLOW_ITEM_TYPE_END,
883 };
884 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_icmp[] = {
885 RTE_FLOW_ITEM_TYPE_ETH,
886 RTE_FLOW_ITEM_TYPE_IPV6,
887 RTE_FLOW_ITEM_TYPE_NVGRE,
888 RTE_FLOW_ITEM_TYPE_ETH,
889 RTE_FLOW_ITEM_TYPE_IPV4,
890 RTE_FLOW_ITEM_TYPE_ICMP,
891 RTE_FLOW_ITEM_TYPE_END,
892 };
893
894 /* IPv4 NVGRE IPv6 */
895 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6[] = {
896 RTE_FLOW_ITEM_TYPE_ETH,
897 RTE_FLOW_ITEM_TYPE_IPV4,
898 RTE_FLOW_ITEM_TYPE_NVGRE,
899 RTE_FLOW_ITEM_TYPE_IPV6,
900 RTE_FLOW_ITEM_TYPE_END,
901 };
902 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_udp[] = {
903 RTE_FLOW_ITEM_TYPE_ETH,
904 RTE_FLOW_ITEM_TYPE_IPV4,
905 RTE_FLOW_ITEM_TYPE_NVGRE,
906 RTE_FLOW_ITEM_TYPE_IPV6,
907 RTE_FLOW_ITEM_TYPE_UDP,
908 RTE_FLOW_ITEM_TYPE_END,
909 };
910 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_tcp[] = {
911 RTE_FLOW_ITEM_TYPE_ETH,
912 RTE_FLOW_ITEM_TYPE_IPV4,
913 RTE_FLOW_ITEM_TYPE_NVGRE,
914 RTE_FLOW_ITEM_TYPE_IPV6,
915 RTE_FLOW_ITEM_TYPE_TCP,
916 RTE_FLOW_ITEM_TYPE_END,
917 };
918 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_sctp[] = {
919 RTE_FLOW_ITEM_TYPE_ETH,
920 RTE_FLOW_ITEM_TYPE_IPV4,
921 RTE_FLOW_ITEM_TYPE_NVGRE,
922 RTE_FLOW_ITEM_TYPE_IPV6,
923 RTE_FLOW_ITEM_TYPE_SCTP,
924 RTE_FLOW_ITEM_TYPE_END,
925 };
926 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_icmp6[] = {
927 RTE_FLOW_ITEM_TYPE_ETH,
928 RTE_FLOW_ITEM_TYPE_IPV4,
929 RTE_FLOW_ITEM_TYPE_NVGRE,
930 RTE_FLOW_ITEM_TYPE_IPV6,
931 RTE_FLOW_ITEM_TYPE_ICMP6,
932 RTE_FLOW_ITEM_TYPE_END,
933 };
934
935 /* IPv4 NVGRE MAC IPv6 */
936 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6[] = {
937 RTE_FLOW_ITEM_TYPE_ETH,
938 RTE_FLOW_ITEM_TYPE_IPV4,
939 RTE_FLOW_ITEM_TYPE_NVGRE,
940 RTE_FLOW_ITEM_TYPE_ETH,
941 RTE_FLOW_ITEM_TYPE_IPV6,
942 RTE_FLOW_ITEM_TYPE_END,
943 };
944 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_udp[] = {
945 RTE_FLOW_ITEM_TYPE_ETH,
946 RTE_FLOW_ITEM_TYPE_IPV4,
947 RTE_FLOW_ITEM_TYPE_NVGRE,
948 RTE_FLOW_ITEM_TYPE_ETH,
949 RTE_FLOW_ITEM_TYPE_IPV6,
950 RTE_FLOW_ITEM_TYPE_UDP,
951 RTE_FLOW_ITEM_TYPE_END,
952 };
953 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_tcp[] = {
954 RTE_FLOW_ITEM_TYPE_ETH,
955 RTE_FLOW_ITEM_TYPE_IPV4,
956 RTE_FLOW_ITEM_TYPE_NVGRE,
957 RTE_FLOW_ITEM_TYPE_ETH,
958 RTE_FLOW_ITEM_TYPE_IPV6,
959 RTE_FLOW_ITEM_TYPE_TCP,
960 RTE_FLOW_ITEM_TYPE_END,
961 };
962 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_sctp[] = {
963 RTE_FLOW_ITEM_TYPE_ETH,
964 RTE_FLOW_ITEM_TYPE_IPV4,
965 RTE_FLOW_ITEM_TYPE_NVGRE,
966 RTE_FLOW_ITEM_TYPE_ETH,
967 RTE_FLOW_ITEM_TYPE_IPV6,
968 RTE_FLOW_ITEM_TYPE_SCTP,
969 RTE_FLOW_ITEM_TYPE_END,
970 };
971 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_icmp6[] = {
972 RTE_FLOW_ITEM_TYPE_ETH,
973 RTE_FLOW_ITEM_TYPE_IPV4,
974 RTE_FLOW_ITEM_TYPE_NVGRE,
975 RTE_FLOW_ITEM_TYPE_ETH,
976 RTE_FLOW_ITEM_TYPE_IPV6,
977 RTE_FLOW_ITEM_TYPE_ICMP6,
978 RTE_FLOW_ITEM_TYPE_END,
979 };
980
981 /* IPv6 NVGRE IPv6 */
982 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6[] = {
983 RTE_FLOW_ITEM_TYPE_ETH,
984 RTE_FLOW_ITEM_TYPE_IPV6,
985 RTE_FLOW_ITEM_TYPE_NVGRE,
986 RTE_FLOW_ITEM_TYPE_IPV6,
987 RTE_FLOW_ITEM_TYPE_END,
988 };
989 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_tcp[] = {
990 RTE_FLOW_ITEM_TYPE_ETH,
991 RTE_FLOW_ITEM_TYPE_IPV6,
992 RTE_FLOW_ITEM_TYPE_NVGRE,
993 RTE_FLOW_ITEM_TYPE_IPV6,
994 RTE_FLOW_ITEM_TYPE_TCP,
995 RTE_FLOW_ITEM_TYPE_END,
996 };
997 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_udp[] = {
998 RTE_FLOW_ITEM_TYPE_ETH,
999 RTE_FLOW_ITEM_TYPE_IPV6,
1000 RTE_FLOW_ITEM_TYPE_NVGRE,
1001 RTE_FLOW_ITEM_TYPE_IPV6,
1002 RTE_FLOW_ITEM_TYPE_UDP,
1003 RTE_FLOW_ITEM_TYPE_END,
1004 };
1005 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_sctp[] = {
1006 RTE_FLOW_ITEM_TYPE_ETH,
1007 RTE_FLOW_ITEM_TYPE_IPV6,
1008 RTE_FLOW_ITEM_TYPE_NVGRE,
1009 RTE_FLOW_ITEM_TYPE_IPV6,
1010 RTE_FLOW_ITEM_TYPE_SCTP,
1011 RTE_FLOW_ITEM_TYPE_END,
1012 };
1013 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_icmp6[] = {
1014 RTE_FLOW_ITEM_TYPE_ETH,
1015 RTE_FLOW_ITEM_TYPE_IPV6,
1016 RTE_FLOW_ITEM_TYPE_NVGRE,
1017 RTE_FLOW_ITEM_TYPE_IPV6,
1018 RTE_FLOW_ITEM_TYPE_ICMP6,
1019 RTE_FLOW_ITEM_TYPE_END,
1020 };
1021
1022 /* IPv6 NVGRE MAC IPv6 */
1023 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6[] = {
1024 RTE_FLOW_ITEM_TYPE_ETH,
1025 RTE_FLOW_ITEM_TYPE_IPV6,
1026 RTE_FLOW_ITEM_TYPE_NVGRE,
1027 RTE_FLOW_ITEM_TYPE_ETH,
1028 RTE_FLOW_ITEM_TYPE_IPV6,
1029 RTE_FLOW_ITEM_TYPE_END,
1030 };
1031 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_tcp[] = {
1032 RTE_FLOW_ITEM_TYPE_ETH,
1033 RTE_FLOW_ITEM_TYPE_IPV6,
1034 RTE_FLOW_ITEM_TYPE_NVGRE,
1035 RTE_FLOW_ITEM_TYPE_ETH,
1036 RTE_FLOW_ITEM_TYPE_IPV6,
1037 RTE_FLOW_ITEM_TYPE_TCP,
1038 RTE_FLOW_ITEM_TYPE_END,
1039 };
1040 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_udp[] = {
1041 RTE_FLOW_ITEM_TYPE_ETH,
1042 RTE_FLOW_ITEM_TYPE_IPV6,
1043 RTE_FLOW_ITEM_TYPE_NVGRE,
1044 RTE_FLOW_ITEM_TYPE_ETH,
1045 RTE_FLOW_ITEM_TYPE_IPV6,
1046 RTE_FLOW_ITEM_TYPE_UDP,
1047 RTE_FLOW_ITEM_TYPE_END,
1048 };
1049 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_sctp[] = {
1050 RTE_FLOW_ITEM_TYPE_ETH,
1051 RTE_FLOW_ITEM_TYPE_IPV6,
1052 RTE_FLOW_ITEM_TYPE_NVGRE,
1053 RTE_FLOW_ITEM_TYPE_ETH,
1054 RTE_FLOW_ITEM_TYPE_IPV6,
1055 RTE_FLOW_ITEM_TYPE_SCTP,
1056 RTE_FLOW_ITEM_TYPE_END,
1057 };
1058 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_icmp6[] = {
1059 RTE_FLOW_ITEM_TYPE_ETH,
1060 RTE_FLOW_ITEM_TYPE_IPV6,
1061 RTE_FLOW_ITEM_TYPE_NVGRE,
1062 RTE_FLOW_ITEM_TYPE_ETH,
1063 RTE_FLOW_ITEM_TYPE_IPV6,
1064 RTE_FLOW_ITEM_TYPE_ICMP6,
1065 RTE_FLOW_ITEM_TYPE_END,
1066 };
1067
1068 /*IPv4 GTPU (EH) */
1069 enum rte_flow_item_type pattern_eth_ipv4_gtpu[] = {
1070 RTE_FLOW_ITEM_TYPE_ETH,
1071 RTE_FLOW_ITEM_TYPE_IPV4,
1072 RTE_FLOW_ITEM_TYPE_UDP,
1073 RTE_FLOW_ITEM_TYPE_GTPU,
1074 RTE_FLOW_ITEM_TYPE_END,
1075 };
1076
1077 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh[] = {
1078 RTE_FLOW_ITEM_TYPE_ETH,
1079 RTE_FLOW_ITEM_TYPE_IPV4,
1080 RTE_FLOW_ITEM_TYPE_UDP,
1081 RTE_FLOW_ITEM_TYPE_GTPU,
1082 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1083 RTE_FLOW_ITEM_TYPE_END,
1084 };
1085
1086 /*IPv6 GTPU (EH) */
1087 enum rte_flow_item_type pattern_eth_ipv6_gtpu[] = {
1088 RTE_FLOW_ITEM_TYPE_ETH,
1089 RTE_FLOW_ITEM_TYPE_IPV6,
1090 RTE_FLOW_ITEM_TYPE_UDP,
1091 RTE_FLOW_ITEM_TYPE_GTPU,
1092 RTE_FLOW_ITEM_TYPE_END,
1093 };
1094
1095 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh[] = {
1096 RTE_FLOW_ITEM_TYPE_ETH,
1097 RTE_FLOW_ITEM_TYPE_IPV6,
1098 RTE_FLOW_ITEM_TYPE_UDP,
1099 RTE_FLOW_ITEM_TYPE_GTPU,
1100 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1101 RTE_FLOW_ITEM_TYPE_END,
1102 };
1103
1104 /*IPv4 GTPU IPv4 */
1105 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4[] = {
1106 RTE_FLOW_ITEM_TYPE_ETH,
1107 RTE_FLOW_ITEM_TYPE_IPV4,
1108 RTE_FLOW_ITEM_TYPE_UDP,
1109 RTE_FLOW_ITEM_TYPE_GTPU,
1110 RTE_FLOW_ITEM_TYPE_IPV4,
1111 RTE_FLOW_ITEM_TYPE_END,
1112 };
1113
1114 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4_udp[] = {
1115 RTE_FLOW_ITEM_TYPE_ETH,
1116 RTE_FLOW_ITEM_TYPE_IPV4,
1117 RTE_FLOW_ITEM_TYPE_UDP,
1118 RTE_FLOW_ITEM_TYPE_GTPU,
1119 RTE_FLOW_ITEM_TYPE_IPV4,
1120 RTE_FLOW_ITEM_TYPE_UDP,
1121 RTE_FLOW_ITEM_TYPE_END,
1122 };
1123
1124 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4_tcp[] = {
1125 RTE_FLOW_ITEM_TYPE_ETH,
1126 RTE_FLOW_ITEM_TYPE_IPV4,
1127 RTE_FLOW_ITEM_TYPE_UDP,
1128 RTE_FLOW_ITEM_TYPE_GTPU,
1129 RTE_FLOW_ITEM_TYPE_IPV4,
1130 RTE_FLOW_ITEM_TYPE_TCP,
1131 RTE_FLOW_ITEM_TYPE_END,
1132 };
1133
1134 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4_icmp[] = {
1135 RTE_FLOW_ITEM_TYPE_ETH,
1136 RTE_FLOW_ITEM_TYPE_IPV4,
1137 RTE_FLOW_ITEM_TYPE_UDP,
1138 RTE_FLOW_ITEM_TYPE_GTPU,
1139 RTE_FLOW_ITEM_TYPE_IPV4,
1140 RTE_FLOW_ITEM_TYPE_ICMP,
1141 RTE_FLOW_ITEM_TYPE_END,
1142 };
1143
1144 /*IPv4 GTPU IPv6 */
1145 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6[] = {
1146 RTE_FLOW_ITEM_TYPE_ETH,
1147 RTE_FLOW_ITEM_TYPE_IPV4,
1148 RTE_FLOW_ITEM_TYPE_UDP,
1149 RTE_FLOW_ITEM_TYPE_GTPU,
1150 RTE_FLOW_ITEM_TYPE_IPV6,
1151 RTE_FLOW_ITEM_TYPE_END,
1152 };
1153
1154 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6_udp[] = {
1155 RTE_FLOW_ITEM_TYPE_ETH,
1156 RTE_FLOW_ITEM_TYPE_IPV4,
1157 RTE_FLOW_ITEM_TYPE_UDP,
1158 RTE_FLOW_ITEM_TYPE_GTPU,
1159 RTE_FLOW_ITEM_TYPE_IPV6,
1160 RTE_FLOW_ITEM_TYPE_UDP,
1161 RTE_FLOW_ITEM_TYPE_END,
1162 };
1163
1164 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6_tcp[] = {
1165 RTE_FLOW_ITEM_TYPE_ETH,
1166 RTE_FLOW_ITEM_TYPE_IPV4,
1167 RTE_FLOW_ITEM_TYPE_UDP,
1168 RTE_FLOW_ITEM_TYPE_GTPU,
1169 RTE_FLOW_ITEM_TYPE_IPV6,
1170 RTE_FLOW_ITEM_TYPE_TCP,
1171 RTE_FLOW_ITEM_TYPE_END,
1172 };
1173
1174 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6_icmp[] = {
1175 RTE_FLOW_ITEM_TYPE_ETH,
1176 RTE_FLOW_ITEM_TYPE_IPV4,
1177 RTE_FLOW_ITEM_TYPE_UDP,
1178 RTE_FLOW_ITEM_TYPE_GTPU,
1179 RTE_FLOW_ITEM_TYPE_IPV6,
1180 RTE_FLOW_ITEM_TYPE_ICMP,
1181 RTE_FLOW_ITEM_TYPE_END,
1182 };
1183
1184 /*IPv6 GTPU IPv4 */
1185 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4[] = {
1186 RTE_FLOW_ITEM_TYPE_ETH,
1187 RTE_FLOW_ITEM_TYPE_IPV6,
1188 RTE_FLOW_ITEM_TYPE_UDP,
1189 RTE_FLOW_ITEM_TYPE_GTPU,
1190 RTE_FLOW_ITEM_TYPE_IPV4,
1191 RTE_FLOW_ITEM_TYPE_END,
1192 };
1193
1194 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4_udp[] = {
1195 RTE_FLOW_ITEM_TYPE_ETH,
1196 RTE_FLOW_ITEM_TYPE_IPV6,
1197 RTE_FLOW_ITEM_TYPE_UDP,
1198 RTE_FLOW_ITEM_TYPE_GTPU,
1199 RTE_FLOW_ITEM_TYPE_IPV4,
1200 RTE_FLOW_ITEM_TYPE_UDP,
1201 RTE_FLOW_ITEM_TYPE_END,
1202 };
1203
1204 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4_tcp[] = {
1205 RTE_FLOW_ITEM_TYPE_ETH,
1206 RTE_FLOW_ITEM_TYPE_IPV6,
1207 RTE_FLOW_ITEM_TYPE_UDP,
1208 RTE_FLOW_ITEM_TYPE_GTPU,
1209 RTE_FLOW_ITEM_TYPE_IPV4,
1210 RTE_FLOW_ITEM_TYPE_TCP,
1211 RTE_FLOW_ITEM_TYPE_END,
1212 };
1213
1214 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4_icmp[] = {
1215 RTE_FLOW_ITEM_TYPE_ETH,
1216 RTE_FLOW_ITEM_TYPE_IPV6,
1217 RTE_FLOW_ITEM_TYPE_UDP,
1218 RTE_FLOW_ITEM_TYPE_GTPU,
1219 RTE_FLOW_ITEM_TYPE_IPV4,
1220 RTE_FLOW_ITEM_TYPE_ICMP,
1221 RTE_FLOW_ITEM_TYPE_END,
1222 };
1223
1224 /*IPv6 GTPU IPv6 */
1225 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6[] = {
1226 RTE_FLOW_ITEM_TYPE_ETH,
1227 RTE_FLOW_ITEM_TYPE_IPV6,
1228 RTE_FLOW_ITEM_TYPE_UDP,
1229 RTE_FLOW_ITEM_TYPE_GTPU,
1230 RTE_FLOW_ITEM_TYPE_IPV6,
1231 RTE_FLOW_ITEM_TYPE_END,
1232 };
1233
1234 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6_udp[] = {
1235 RTE_FLOW_ITEM_TYPE_ETH,
1236 RTE_FLOW_ITEM_TYPE_IPV6,
1237 RTE_FLOW_ITEM_TYPE_UDP,
1238 RTE_FLOW_ITEM_TYPE_GTPU,
1239 RTE_FLOW_ITEM_TYPE_IPV6,
1240 RTE_FLOW_ITEM_TYPE_UDP,
1241 RTE_FLOW_ITEM_TYPE_END,
1242 };
1243
1244 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6_tcp[] = {
1245 RTE_FLOW_ITEM_TYPE_ETH,
1246 RTE_FLOW_ITEM_TYPE_IPV6,
1247 RTE_FLOW_ITEM_TYPE_UDP,
1248 RTE_FLOW_ITEM_TYPE_GTPU,
1249 RTE_FLOW_ITEM_TYPE_IPV6,
1250 RTE_FLOW_ITEM_TYPE_TCP,
1251 RTE_FLOW_ITEM_TYPE_END,
1252 };
1253
1254 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6_icmp[] = {
1255 RTE_FLOW_ITEM_TYPE_ETH,
1256 RTE_FLOW_ITEM_TYPE_IPV6,
1257 RTE_FLOW_ITEM_TYPE_UDP,
1258 RTE_FLOW_ITEM_TYPE_GTPU,
1259 RTE_FLOW_ITEM_TYPE_IPV6,
1260 RTE_FLOW_ITEM_TYPE_ICMP,
1261 RTE_FLOW_ITEM_TYPE_END,
1262 };
1263
1264 /*IPv4 GTPU EH IPv4 */
1265 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4[] = {
1266 RTE_FLOW_ITEM_TYPE_ETH,
1267 RTE_FLOW_ITEM_TYPE_IPV4,
1268 RTE_FLOW_ITEM_TYPE_UDP,
1269 RTE_FLOW_ITEM_TYPE_GTPU,
1270 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1271 RTE_FLOW_ITEM_TYPE_IPV4,
1272 RTE_FLOW_ITEM_TYPE_END,
1273 };
1274
1275 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4_udp[] = {
1276 RTE_FLOW_ITEM_TYPE_ETH,
1277 RTE_FLOW_ITEM_TYPE_IPV4,
1278 RTE_FLOW_ITEM_TYPE_UDP,
1279 RTE_FLOW_ITEM_TYPE_GTPU,
1280 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1281 RTE_FLOW_ITEM_TYPE_IPV4,
1282 RTE_FLOW_ITEM_TYPE_UDP,
1283 RTE_FLOW_ITEM_TYPE_END,
1284 };
1285
1286 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4_tcp[] = {
1287 RTE_FLOW_ITEM_TYPE_ETH,
1288 RTE_FLOW_ITEM_TYPE_IPV4,
1289 RTE_FLOW_ITEM_TYPE_UDP,
1290 RTE_FLOW_ITEM_TYPE_GTPU,
1291 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1292 RTE_FLOW_ITEM_TYPE_IPV4,
1293 RTE_FLOW_ITEM_TYPE_TCP,
1294 RTE_FLOW_ITEM_TYPE_END,
1295 };
1296
1297 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4_icmp[] = {
1298 RTE_FLOW_ITEM_TYPE_ETH,
1299 RTE_FLOW_ITEM_TYPE_IPV4,
1300 RTE_FLOW_ITEM_TYPE_UDP,
1301 RTE_FLOW_ITEM_TYPE_GTPU,
1302 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1303 RTE_FLOW_ITEM_TYPE_IPV4,
1304 RTE_FLOW_ITEM_TYPE_ICMP,
1305 RTE_FLOW_ITEM_TYPE_END,
1306 };
1307
1308 /*IPv4 GTPU EH IPv6 */
1309 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6[] = {
1310 RTE_FLOW_ITEM_TYPE_ETH,
1311 RTE_FLOW_ITEM_TYPE_IPV4,
1312 RTE_FLOW_ITEM_TYPE_UDP,
1313 RTE_FLOW_ITEM_TYPE_GTPU,
1314 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1315 RTE_FLOW_ITEM_TYPE_IPV6,
1316 RTE_FLOW_ITEM_TYPE_END,
1317 };
1318
1319 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6_udp[] = {
1320 RTE_FLOW_ITEM_TYPE_ETH,
1321 RTE_FLOW_ITEM_TYPE_IPV4,
1322 RTE_FLOW_ITEM_TYPE_UDP,
1323 RTE_FLOW_ITEM_TYPE_GTPU,
1324 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1325 RTE_FLOW_ITEM_TYPE_IPV6,
1326 RTE_FLOW_ITEM_TYPE_UDP,
1327 RTE_FLOW_ITEM_TYPE_END,
1328 };
1329
1330 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6_tcp[] = {
1331 RTE_FLOW_ITEM_TYPE_ETH,
1332 RTE_FLOW_ITEM_TYPE_IPV4,
1333 RTE_FLOW_ITEM_TYPE_UDP,
1334 RTE_FLOW_ITEM_TYPE_GTPU,
1335 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1336 RTE_FLOW_ITEM_TYPE_IPV6,
1337 RTE_FLOW_ITEM_TYPE_TCP,
1338 RTE_FLOW_ITEM_TYPE_END,
1339 };
1340
1341 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6_icmp[] = {
1342 RTE_FLOW_ITEM_TYPE_ETH,
1343 RTE_FLOW_ITEM_TYPE_IPV4,
1344 RTE_FLOW_ITEM_TYPE_UDP,
1345 RTE_FLOW_ITEM_TYPE_GTPU,
1346 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1347 RTE_FLOW_ITEM_TYPE_IPV6,
1348 RTE_FLOW_ITEM_TYPE_ICMP,
1349 RTE_FLOW_ITEM_TYPE_END,
1350 };
1351
1352 /*IPv6 GTPU EH IPv4 */
1353 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4[] = {
1354 RTE_FLOW_ITEM_TYPE_ETH,
1355 RTE_FLOW_ITEM_TYPE_IPV6,
1356 RTE_FLOW_ITEM_TYPE_UDP,
1357 RTE_FLOW_ITEM_TYPE_GTPU,
1358 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1359 RTE_FLOW_ITEM_TYPE_IPV4,
1360 RTE_FLOW_ITEM_TYPE_END,
1361 };
1362
1363 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4_udp[] = {
1364 RTE_FLOW_ITEM_TYPE_ETH,
1365 RTE_FLOW_ITEM_TYPE_IPV6,
1366 RTE_FLOW_ITEM_TYPE_UDP,
1367 RTE_FLOW_ITEM_TYPE_GTPU,
1368 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1369 RTE_FLOW_ITEM_TYPE_IPV4,
1370 RTE_FLOW_ITEM_TYPE_UDP,
1371 RTE_FLOW_ITEM_TYPE_END,
1372 };
1373
1374 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4_tcp[] = {
1375 RTE_FLOW_ITEM_TYPE_ETH,
1376 RTE_FLOW_ITEM_TYPE_IPV6,
1377 RTE_FLOW_ITEM_TYPE_UDP,
1378 RTE_FLOW_ITEM_TYPE_GTPU,
1379 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1380 RTE_FLOW_ITEM_TYPE_IPV4,
1381 RTE_FLOW_ITEM_TYPE_TCP,
1382 RTE_FLOW_ITEM_TYPE_END,
1383 };
1384
1385 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4_icmp[] = {
1386 RTE_FLOW_ITEM_TYPE_ETH,
1387 RTE_FLOW_ITEM_TYPE_IPV6,
1388 RTE_FLOW_ITEM_TYPE_UDP,
1389 RTE_FLOW_ITEM_TYPE_GTPU,
1390 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1391 RTE_FLOW_ITEM_TYPE_IPV4,
1392 RTE_FLOW_ITEM_TYPE_ICMP,
1393 RTE_FLOW_ITEM_TYPE_END,
1394 };
1395
1396 /*IPv6 GTPU EH IPv6 */
1397 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6[] = {
1398 RTE_FLOW_ITEM_TYPE_ETH,
1399 RTE_FLOW_ITEM_TYPE_IPV6,
1400 RTE_FLOW_ITEM_TYPE_UDP,
1401 RTE_FLOW_ITEM_TYPE_GTPU,
1402 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1403 RTE_FLOW_ITEM_TYPE_IPV6,
1404 RTE_FLOW_ITEM_TYPE_END,
1405 };
1406
1407 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6_udp[] = {
1408 RTE_FLOW_ITEM_TYPE_ETH,
1409 RTE_FLOW_ITEM_TYPE_IPV6,
1410 RTE_FLOW_ITEM_TYPE_UDP,
1411 RTE_FLOW_ITEM_TYPE_GTPU,
1412 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1413 RTE_FLOW_ITEM_TYPE_IPV6,
1414 RTE_FLOW_ITEM_TYPE_UDP,
1415 RTE_FLOW_ITEM_TYPE_END,
1416 };
1417
1418 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6_tcp[] = {
1419 RTE_FLOW_ITEM_TYPE_ETH,
1420 RTE_FLOW_ITEM_TYPE_IPV6,
1421 RTE_FLOW_ITEM_TYPE_UDP,
1422 RTE_FLOW_ITEM_TYPE_GTPU,
1423 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1424 RTE_FLOW_ITEM_TYPE_IPV6,
1425 RTE_FLOW_ITEM_TYPE_TCP,
1426 RTE_FLOW_ITEM_TYPE_END,
1427 };
1428
1429 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6_icmp[] = {
1430 RTE_FLOW_ITEM_TYPE_ETH,
1431 RTE_FLOW_ITEM_TYPE_IPV6,
1432 RTE_FLOW_ITEM_TYPE_UDP,
1433 RTE_FLOW_ITEM_TYPE_GTPU,
1434 RTE_FLOW_ITEM_TYPE_GTP_PSC,
1435 RTE_FLOW_ITEM_TYPE_IPV6,
1436 RTE_FLOW_ITEM_TYPE_ICMP,
1437 RTE_FLOW_ITEM_TYPE_END,
1438 };
1439
1440 /* PPPoE */
1441 enum rte_flow_item_type pattern_eth_pppoed[] = {
1442 RTE_FLOW_ITEM_TYPE_ETH,
1443 RTE_FLOW_ITEM_TYPE_PPPOED,
1444 RTE_FLOW_ITEM_TYPE_END,
1445 };
1446 enum rte_flow_item_type pattern_eth_vlan_pppoed[] = {
1447 RTE_FLOW_ITEM_TYPE_ETH,
1448 RTE_FLOW_ITEM_TYPE_VLAN,
1449 RTE_FLOW_ITEM_TYPE_PPPOED,
1450 RTE_FLOW_ITEM_TYPE_END,
1451 };
1452 enum rte_flow_item_type pattern_eth_qinq_pppoed[] = {
1453 RTE_FLOW_ITEM_TYPE_ETH,
1454 RTE_FLOW_ITEM_TYPE_VLAN,
1455 RTE_FLOW_ITEM_TYPE_VLAN,
1456 RTE_FLOW_ITEM_TYPE_PPPOED,
1457 RTE_FLOW_ITEM_TYPE_END,
1458 };
1459 enum rte_flow_item_type pattern_eth_pppoes[] = {
1460 RTE_FLOW_ITEM_TYPE_ETH,
1461 RTE_FLOW_ITEM_TYPE_PPPOES,
1462 RTE_FLOW_ITEM_TYPE_END,
1463 };
1464 enum rte_flow_item_type pattern_eth_pppoes_proto[] = {
1465 RTE_FLOW_ITEM_TYPE_ETH,
1466 RTE_FLOW_ITEM_TYPE_PPPOES,
1467 RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID,
1468 RTE_FLOW_ITEM_TYPE_END,
1469 };
1470 enum rte_flow_item_type pattern_eth_vlan_pppoes[] = {
1471 RTE_FLOW_ITEM_TYPE_ETH,
1472 RTE_FLOW_ITEM_TYPE_VLAN,
1473 RTE_FLOW_ITEM_TYPE_PPPOES,
1474 RTE_FLOW_ITEM_TYPE_END,
1475 };
1476 enum rte_flow_item_type pattern_eth_vlan_pppoes_proto[] = {
1477 RTE_FLOW_ITEM_TYPE_ETH,
1478 RTE_FLOW_ITEM_TYPE_VLAN,
1479 RTE_FLOW_ITEM_TYPE_PPPOES,
1480 RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID,
1481 RTE_FLOW_ITEM_TYPE_END,
1482 };
1483 enum rte_flow_item_type pattern_eth_qinq_pppoes[] = {
1484 RTE_FLOW_ITEM_TYPE_ETH,
1485 RTE_FLOW_ITEM_TYPE_VLAN,
1486 RTE_FLOW_ITEM_TYPE_VLAN,
1487 RTE_FLOW_ITEM_TYPE_PPPOES,
1488 RTE_FLOW_ITEM_TYPE_END,
1489 };
1490 enum rte_flow_item_type pattern_eth_qinq_pppoes_proto[] = {
1491 RTE_FLOW_ITEM_TYPE_ETH,
1492 RTE_FLOW_ITEM_TYPE_VLAN,
1493 RTE_FLOW_ITEM_TYPE_VLAN,
1494 RTE_FLOW_ITEM_TYPE_PPPOES,
1495 RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID,
1496 RTE_FLOW_ITEM_TYPE_END,
1497 };
1498 enum rte_flow_item_type pattern_eth_pppoes_ipv4[] = {
1499 RTE_FLOW_ITEM_TYPE_ETH,
1500 RTE_FLOW_ITEM_TYPE_PPPOES,
1501 RTE_FLOW_ITEM_TYPE_IPV4,
1502 RTE_FLOW_ITEM_TYPE_END,
1503 };
1504 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4[] = {
1505 RTE_FLOW_ITEM_TYPE_ETH,
1506 RTE_FLOW_ITEM_TYPE_VLAN,
1507 RTE_FLOW_ITEM_TYPE_PPPOES,
1508 RTE_FLOW_ITEM_TYPE_IPV4,
1509 RTE_FLOW_ITEM_TYPE_END,
1510 };
1511 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4[] = {
1512 RTE_FLOW_ITEM_TYPE_ETH,
1513 RTE_FLOW_ITEM_TYPE_VLAN,
1514 RTE_FLOW_ITEM_TYPE_VLAN,
1515 RTE_FLOW_ITEM_TYPE_PPPOES,
1516 RTE_FLOW_ITEM_TYPE_IPV4,
1517 RTE_FLOW_ITEM_TYPE_END,
1518 };
1519 enum rte_flow_item_type pattern_eth_pppoes_ipv4_udp[] = {
1520 RTE_FLOW_ITEM_TYPE_ETH,
1521 RTE_FLOW_ITEM_TYPE_PPPOES,
1522 RTE_FLOW_ITEM_TYPE_IPV4,
1523 RTE_FLOW_ITEM_TYPE_UDP,
1524 RTE_FLOW_ITEM_TYPE_END,
1525 };
1526 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_udp[] = {
1527 RTE_FLOW_ITEM_TYPE_ETH,
1528 RTE_FLOW_ITEM_TYPE_VLAN,
1529 RTE_FLOW_ITEM_TYPE_PPPOES,
1530 RTE_FLOW_ITEM_TYPE_IPV4,
1531 RTE_FLOW_ITEM_TYPE_UDP,
1532 RTE_FLOW_ITEM_TYPE_END,
1533 };
1534 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_udp[] = {
1535 RTE_FLOW_ITEM_TYPE_ETH,
1536 RTE_FLOW_ITEM_TYPE_VLAN,
1537 RTE_FLOW_ITEM_TYPE_VLAN,
1538 RTE_FLOW_ITEM_TYPE_PPPOES,
1539 RTE_FLOW_ITEM_TYPE_IPV4,
1540 RTE_FLOW_ITEM_TYPE_UDP,
1541 RTE_FLOW_ITEM_TYPE_END,
1542 };
1543 enum rte_flow_item_type pattern_eth_pppoes_ipv4_tcp[] = {
1544 RTE_FLOW_ITEM_TYPE_ETH,
1545 RTE_FLOW_ITEM_TYPE_PPPOES,
1546 RTE_FLOW_ITEM_TYPE_IPV4,
1547 RTE_FLOW_ITEM_TYPE_TCP,
1548 RTE_FLOW_ITEM_TYPE_END,
1549 };
1550 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_tcp[] = {
1551 RTE_FLOW_ITEM_TYPE_ETH,
1552 RTE_FLOW_ITEM_TYPE_VLAN,
1553 RTE_FLOW_ITEM_TYPE_PPPOES,
1554 RTE_FLOW_ITEM_TYPE_IPV4,
1555 RTE_FLOW_ITEM_TYPE_TCP,
1556 RTE_FLOW_ITEM_TYPE_END,
1557 };
1558 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_tcp[] = {
1559 RTE_FLOW_ITEM_TYPE_ETH,
1560 RTE_FLOW_ITEM_TYPE_VLAN,
1561 RTE_FLOW_ITEM_TYPE_VLAN,
1562 RTE_FLOW_ITEM_TYPE_PPPOES,
1563 RTE_FLOW_ITEM_TYPE_IPV4,
1564 RTE_FLOW_ITEM_TYPE_TCP,
1565 RTE_FLOW_ITEM_TYPE_END,
1566 };
1567 enum rte_flow_item_type pattern_eth_pppoes_ipv4_sctp[] = {
1568 RTE_FLOW_ITEM_TYPE_ETH,
1569 RTE_FLOW_ITEM_TYPE_PPPOES,
1570 RTE_FLOW_ITEM_TYPE_IPV4,
1571 RTE_FLOW_ITEM_TYPE_SCTP,
1572 RTE_FLOW_ITEM_TYPE_END,
1573 };
1574 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_sctp[] = {
1575 RTE_FLOW_ITEM_TYPE_ETH,
1576 RTE_FLOW_ITEM_TYPE_VLAN,
1577 RTE_FLOW_ITEM_TYPE_PPPOES,
1578 RTE_FLOW_ITEM_TYPE_IPV4,
1579 RTE_FLOW_ITEM_TYPE_SCTP,
1580 RTE_FLOW_ITEM_TYPE_END,
1581 };
1582 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_sctp[] = {
1583 RTE_FLOW_ITEM_TYPE_ETH,
1584 RTE_FLOW_ITEM_TYPE_VLAN,
1585 RTE_FLOW_ITEM_TYPE_VLAN,
1586 RTE_FLOW_ITEM_TYPE_PPPOES,
1587 RTE_FLOW_ITEM_TYPE_IPV4,
1588 RTE_FLOW_ITEM_TYPE_SCTP,
1589 RTE_FLOW_ITEM_TYPE_END,
1590 };
1591 enum rte_flow_item_type pattern_eth_pppoes_ipv4_icmp[] = {
1592 RTE_FLOW_ITEM_TYPE_ETH,
1593 RTE_FLOW_ITEM_TYPE_PPPOES,
1594 RTE_FLOW_ITEM_TYPE_IPV4,
1595 RTE_FLOW_ITEM_TYPE_ICMP,
1596 RTE_FLOW_ITEM_TYPE_END,
1597 };
1598 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_icmp[] = {
1599 RTE_FLOW_ITEM_TYPE_ETH,
1600 RTE_FLOW_ITEM_TYPE_VLAN,
1601 RTE_FLOW_ITEM_TYPE_PPPOES,
1602 RTE_FLOW_ITEM_TYPE_IPV4,
1603 RTE_FLOW_ITEM_TYPE_ICMP,
1604 RTE_FLOW_ITEM_TYPE_END,
1605 };
1606 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_icmp[] = {
1607 RTE_FLOW_ITEM_TYPE_ETH,
1608 RTE_FLOW_ITEM_TYPE_VLAN,
1609 RTE_FLOW_ITEM_TYPE_VLAN,
1610 RTE_FLOW_ITEM_TYPE_PPPOES,
1611 RTE_FLOW_ITEM_TYPE_IPV4,
1612 RTE_FLOW_ITEM_TYPE_ICMP,
1613 RTE_FLOW_ITEM_TYPE_END,
1614 };
1615 enum rte_flow_item_type pattern_eth_pppoes_ipv6[] = {
1616 RTE_FLOW_ITEM_TYPE_ETH,
1617 RTE_FLOW_ITEM_TYPE_PPPOES,
1618 RTE_FLOW_ITEM_TYPE_IPV6,
1619 RTE_FLOW_ITEM_TYPE_END,
1620 };
1621 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6[] = {
1622 RTE_FLOW_ITEM_TYPE_ETH,
1623 RTE_FLOW_ITEM_TYPE_VLAN,
1624 RTE_FLOW_ITEM_TYPE_PPPOES,
1625 RTE_FLOW_ITEM_TYPE_IPV6,
1626 RTE_FLOW_ITEM_TYPE_END,
1627 };
1628 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6[] = {
1629 RTE_FLOW_ITEM_TYPE_ETH,
1630 RTE_FLOW_ITEM_TYPE_VLAN,
1631 RTE_FLOW_ITEM_TYPE_VLAN,
1632 RTE_FLOW_ITEM_TYPE_PPPOES,
1633 RTE_FLOW_ITEM_TYPE_IPV6,
1634 RTE_FLOW_ITEM_TYPE_END,
1635 };
1636 enum rte_flow_item_type pattern_eth_pppoes_ipv6_udp[] = {
1637 RTE_FLOW_ITEM_TYPE_ETH,
1638 RTE_FLOW_ITEM_TYPE_PPPOES,
1639 RTE_FLOW_ITEM_TYPE_IPV6,
1640 RTE_FLOW_ITEM_TYPE_UDP,
1641 RTE_FLOW_ITEM_TYPE_END,
1642 };
1643 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_udp[] = {
1644 RTE_FLOW_ITEM_TYPE_ETH,
1645 RTE_FLOW_ITEM_TYPE_VLAN,
1646 RTE_FLOW_ITEM_TYPE_PPPOES,
1647 RTE_FLOW_ITEM_TYPE_IPV6,
1648 RTE_FLOW_ITEM_TYPE_UDP,
1649 RTE_FLOW_ITEM_TYPE_END,
1650 };
1651 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_udp[] = {
1652 RTE_FLOW_ITEM_TYPE_ETH,
1653 RTE_FLOW_ITEM_TYPE_VLAN,
1654 RTE_FLOW_ITEM_TYPE_VLAN,
1655 RTE_FLOW_ITEM_TYPE_PPPOES,
1656 RTE_FLOW_ITEM_TYPE_IPV6,
1657 RTE_FLOW_ITEM_TYPE_UDP,
1658 RTE_FLOW_ITEM_TYPE_END,
1659 };
1660 enum rte_flow_item_type pattern_eth_pppoes_ipv6_tcp[] = {
1661 RTE_FLOW_ITEM_TYPE_ETH,
1662 RTE_FLOW_ITEM_TYPE_PPPOES,
1663 RTE_FLOW_ITEM_TYPE_IPV6,
1664 RTE_FLOW_ITEM_TYPE_TCP,
1665 RTE_FLOW_ITEM_TYPE_END,
1666 };
1667 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_tcp[] = {
1668 RTE_FLOW_ITEM_TYPE_ETH,
1669 RTE_FLOW_ITEM_TYPE_VLAN,
1670 RTE_FLOW_ITEM_TYPE_PPPOES,
1671 RTE_FLOW_ITEM_TYPE_IPV6,
1672 RTE_FLOW_ITEM_TYPE_TCP,
1673 RTE_FLOW_ITEM_TYPE_END,
1674 };
1675 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_tcp[] = {
1676 RTE_FLOW_ITEM_TYPE_ETH,
1677 RTE_FLOW_ITEM_TYPE_VLAN,
1678 RTE_FLOW_ITEM_TYPE_VLAN,
1679 RTE_FLOW_ITEM_TYPE_PPPOES,
1680 RTE_FLOW_ITEM_TYPE_IPV6,
1681 RTE_FLOW_ITEM_TYPE_TCP,
1682 RTE_FLOW_ITEM_TYPE_END,
1683 };
1684 enum rte_flow_item_type pattern_eth_pppoes_ipv6_sctp[] = {
1685 RTE_FLOW_ITEM_TYPE_ETH,
1686 RTE_FLOW_ITEM_TYPE_PPPOES,
1687 RTE_FLOW_ITEM_TYPE_IPV6,
1688 RTE_FLOW_ITEM_TYPE_SCTP,
1689 RTE_FLOW_ITEM_TYPE_END,
1690 };
1691 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_sctp[] = {
1692 RTE_FLOW_ITEM_TYPE_ETH,
1693 RTE_FLOW_ITEM_TYPE_VLAN,
1694 RTE_FLOW_ITEM_TYPE_PPPOES,
1695 RTE_FLOW_ITEM_TYPE_IPV6,
1696 RTE_FLOW_ITEM_TYPE_SCTP,
1697 RTE_FLOW_ITEM_TYPE_END,
1698 };
1699 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_sctp[] = {
1700 RTE_FLOW_ITEM_TYPE_ETH,
1701 RTE_FLOW_ITEM_TYPE_VLAN,
1702 RTE_FLOW_ITEM_TYPE_VLAN,
1703 RTE_FLOW_ITEM_TYPE_PPPOES,
1704 RTE_FLOW_ITEM_TYPE_IPV6,
1705 RTE_FLOW_ITEM_TYPE_SCTP,
1706 RTE_FLOW_ITEM_TYPE_END,
1707 };
1708 enum rte_flow_item_type pattern_eth_pppoes_ipv6_icmp6[] = {
1709 RTE_FLOW_ITEM_TYPE_ETH,
1710 RTE_FLOW_ITEM_TYPE_PPPOES,
1711 RTE_FLOW_ITEM_TYPE_IPV6,
1712 RTE_FLOW_ITEM_TYPE_ICMP6,
1713 RTE_FLOW_ITEM_TYPE_END,
1714 };
1715 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_icmp6[] = {
1716 RTE_FLOW_ITEM_TYPE_ETH,
1717 RTE_FLOW_ITEM_TYPE_VLAN,
1718 RTE_FLOW_ITEM_TYPE_PPPOES,
1719 RTE_FLOW_ITEM_TYPE_IPV6,
1720 RTE_FLOW_ITEM_TYPE_ICMP6,
1721 RTE_FLOW_ITEM_TYPE_END,
1722 };
1723 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_icmp6[] = {
1724 RTE_FLOW_ITEM_TYPE_ETH,
1725 RTE_FLOW_ITEM_TYPE_VLAN,
1726 RTE_FLOW_ITEM_TYPE_VLAN,
1727 RTE_FLOW_ITEM_TYPE_PPPOES,
1728 RTE_FLOW_ITEM_TYPE_IPV6,
1729 RTE_FLOW_ITEM_TYPE_ICMP6,
1730 RTE_FLOW_ITEM_TYPE_END,
1731 };
1732 enum rte_flow_item_type pattern_eth_ipv4_esp[] = {
1733 RTE_FLOW_ITEM_TYPE_ETH,
1734 RTE_FLOW_ITEM_TYPE_IPV4,
1735 RTE_FLOW_ITEM_TYPE_ESP,
1736 RTE_FLOW_ITEM_TYPE_END,
1737 };
1738 enum rte_flow_item_type pattern_eth_ipv6_esp[] = {
1739 RTE_FLOW_ITEM_TYPE_ETH,
1740 RTE_FLOW_ITEM_TYPE_IPV6,
1741 RTE_FLOW_ITEM_TYPE_ESP,
1742 RTE_FLOW_ITEM_TYPE_END,
1743 };
1744 enum rte_flow_item_type pattern_eth_ipv4_ah[] = {
1745 RTE_FLOW_ITEM_TYPE_ETH,
1746 RTE_FLOW_ITEM_TYPE_IPV4,
1747 RTE_FLOW_ITEM_TYPE_AH,
1748 RTE_FLOW_ITEM_TYPE_END,
1749 };
1750 enum rte_flow_item_type pattern_eth_ipv6_ah[] = {
1751 RTE_FLOW_ITEM_TYPE_ETH,
1752 RTE_FLOW_ITEM_TYPE_IPV6,
1753 RTE_FLOW_ITEM_TYPE_AH,
1754 RTE_FLOW_ITEM_TYPE_END,
1755 };
1756 enum rte_flow_item_type pattern_eth_ipv4_udp_esp[] = {
1757 RTE_FLOW_ITEM_TYPE_ETH,
1758 RTE_FLOW_ITEM_TYPE_IPV4,
1759 RTE_FLOW_ITEM_TYPE_UDP,
1760 RTE_FLOW_ITEM_TYPE_ESP,
1761 RTE_FLOW_ITEM_TYPE_END,
1762 };
1763 enum rte_flow_item_type pattern_eth_ipv6_udp_esp[] = {
1764 RTE_FLOW_ITEM_TYPE_ETH,
1765 RTE_FLOW_ITEM_TYPE_IPV6,
1766 RTE_FLOW_ITEM_TYPE_UDP,
1767 RTE_FLOW_ITEM_TYPE_ESP,
1768 RTE_FLOW_ITEM_TYPE_END,
1769 };
1770 enum rte_flow_item_type pattern_eth_ipv6_udp_ah[] = {
1771 RTE_FLOW_ITEM_TYPE_ETH,
1772 RTE_FLOW_ITEM_TYPE_IPV6,
1773 RTE_FLOW_ITEM_TYPE_UDP,
1774 RTE_FLOW_ITEM_TYPE_AH,
1775 RTE_FLOW_ITEM_TYPE_END,
1776 };
1777 enum rte_flow_item_type pattern_eth_ipv4_l2tp[] = {
1778 RTE_FLOW_ITEM_TYPE_ETH,
1779 RTE_FLOW_ITEM_TYPE_IPV4,
1780 RTE_FLOW_ITEM_TYPE_L2TPV3OIP,
1781 RTE_FLOW_ITEM_TYPE_END,
1782 };
1783 enum rte_flow_item_type pattern_eth_ipv6_l2tp[] = {
1784 RTE_FLOW_ITEM_TYPE_ETH,
1785 RTE_FLOW_ITEM_TYPE_IPV6,
1786 RTE_FLOW_ITEM_TYPE_L2TPV3OIP,
1787 RTE_FLOW_ITEM_TYPE_END,
1788 };
1789 enum rte_flow_item_type pattern_eth_ipv4_pfcp[] = {
1790 RTE_FLOW_ITEM_TYPE_ETH,
1791 RTE_FLOW_ITEM_TYPE_IPV4,
1792 RTE_FLOW_ITEM_TYPE_UDP,
1793 RTE_FLOW_ITEM_TYPE_PFCP,
1794 RTE_FLOW_ITEM_TYPE_END,
1795 };
1796 enum rte_flow_item_type pattern_eth_ipv6_pfcp[] = {
1797 RTE_FLOW_ITEM_TYPE_ETH,
1798 RTE_FLOW_ITEM_TYPE_IPV6,
1799 RTE_FLOW_ITEM_TYPE_UDP,
1800 RTE_FLOW_ITEM_TYPE_PFCP,
1801 RTE_FLOW_ITEM_TYPE_END,
1802 };
1803
1804
1805
1806 typedef struct ice_flow_engine * (*parse_engine_t)(struct ice_adapter *ad,
1807 struct rte_flow *flow,
1808 struct ice_parser_list *parser_list,
1809 uint32_t priority,
1810 const struct rte_flow_item pattern[],
1811 const struct rte_flow_action actions[],
1812 struct rte_flow_error *error);
1813
1814 void
ice_register_flow_engine(struct ice_flow_engine * engine)1815 ice_register_flow_engine(struct ice_flow_engine *engine)
1816 {
1817 TAILQ_INSERT_TAIL(&engine_list, engine, node);
1818 }
1819
1820 int
ice_flow_init(struct ice_adapter * ad)1821 ice_flow_init(struct ice_adapter *ad)
1822 {
1823 int ret;
1824 struct ice_pf *pf = &ad->pf;
1825 void *temp;
1826 struct ice_flow_engine *engine;
1827
1828 TAILQ_INIT(&pf->flow_list);
1829 TAILQ_INIT(&pf->rss_parser_list);
1830 TAILQ_INIT(&pf->perm_parser_list);
1831 TAILQ_INIT(&pf->dist_parser_list);
1832 rte_spinlock_init(&pf->flow_ops_lock);
1833
1834 if (ice_parser_create(&ad->hw, &ad->psr) != ICE_SUCCESS)
1835 PMD_INIT_LOG(WARNING, "Failed to initialize DDP parser, raw packet filter will not be supported");
1836
1837 RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
1838 if (engine->init == NULL) {
1839 PMD_INIT_LOG(ERR, "Invalid engine type (%d)",
1840 engine->type);
1841 return -ENOTSUP;
1842 }
1843
1844 ret = engine->init(ad);
1845 if (ret) {
1846 PMD_INIT_LOG(ERR, "Failed to initialize engine %d",
1847 engine->type);
1848 return ret;
1849 }
1850 }
1851 return 0;
1852 }
1853
1854 void
ice_flow_uninit(struct ice_adapter * ad)1855 ice_flow_uninit(struct ice_adapter *ad)
1856 {
1857 struct ice_pf *pf = &ad->pf;
1858 struct ice_flow_engine *engine;
1859 struct rte_flow *p_flow;
1860 struct ice_flow_parser_node *p_parser;
1861 void *temp;
1862
1863 RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
1864 if (engine->uninit)
1865 engine->uninit(ad);
1866 }
1867
1868 /* Remove all flows */
1869 while ((p_flow = TAILQ_FIRST(&pf->flow_list))) {
1870 TAILQ_REMOVE(&pf->flow_list, p_flow, node);
1871 if (p_flow->engine->free)
1872 p_flow->engine->free(p_flow);
1873 rte_free(p_flow);
1874 }
1875
1876 /* Cleanup parser list */
1877 while ((p_parser = TAILQ_FIRST(&pf->rss_parser_list))) {
1878 TAILQ_REMOVE(&pf->rss_parser_list, p_parser, node);
1879 rte_free(p_parser);
1880 }
1881
1882 while ((p_parser = TAILQ_FIRST(&pf->perm_parser_list))) {
1883 TAILQ_REMOVE(&pf->perm_parser_list, p_parser, node);
1884 rte_free(p_parser);
1885 }
1886
1887 while ((p_parser = TAILQ_FIRST(&pf->dist_parser_list))) {
1888 TAILQ_REMOVE(&pf->dist_parser_list, p_parser, node);
1889 rte_free(p_parser);
1890 }
1891
1892 if (ad->psr != NULL) {
1893 ice_parser_destroy(ad->psr);
1894 ad->psr = NULL;
1895 }
1896 }
1897
1898 static struct ice_parser_list *
ice_get_parser_list(struct ice_flow_parser * parser,struct ice_adapter * ad)1899 ice_get_parser_list(struct ice_flow_parser *parser,
1900 struct ice_adapter *ad)
1901 {
1902 struct ice_parser_list *list;
1903 struct ice_pf *pf = &ad->pf;
1904
1905 switch (parser->stage) {
1906 case ICE_FLOW_STAGE_RSS:
1907 list = &pf->rss_parser_list;
1908 break;
1909 case ICE_FLOW_STAGE_PERMISSION:
1910 list = &pf->perm_parser_list;
1911 break;
1912 case ICE_FLOW_STAGE_DISTRIBUTOR:
1913 list = &pf->dist_parser_list;
1914 break;
1915 default:
1916 return NULL;
1917 }
1918
1919 return list;
1920 }
1921
1922 int
ice_register_parser(struct ice_flow_parser * parser,struct ice_adapter * ad)1923 ice_register_parser(struct ice_flow_parser *parser,
1924 struct ice_adapter *ad)
1925 {
1926 struct ice_parser_list *list;
1927 struct ice_flow_parser_node *parser_node;
1928 struct ice_flow_parser_node *existing_node;
1929 void *temp;
1930
1931 parser_node = rte_zmalloc("ice_parser", sizeof(*parser_node), 0);
1932 if (parser_node == NULL) {
1933 PMD_DRV_LOG(ERR, "Failed to allocate memory.");
1934 return -ENOMEM;
1935 }
1936 parser_node->parser = parser;
1937
1938 list = ice_get_parser_list(parser, ad);
1939 if (list == NULL)
1940 return -EINVAL;
1941
1942 if (ad->devargs.pipe_mode_support) {
1943 TAILQ_INSERT_TAIL(list, parser_node, node);
1944 } else {
1945 if (parser->engine->type == ICE_FLOW_ENGINE_SWITCH) {
1946 RTE_TAILQ_FOREACH_SAFE(existing_node, list,
1947 node, temp) {
1948 if (existing_node->parser->engine->type ==
1949 ICE_FLOW_ENGINE_ACL) {
1950 TAILQ_INSERT_AFTER(list, existing_node,
1951 parser_node, node);
1952 goto DONE;
1953 }
1954 }
1955 TAILQ_INSERT_HEAD(list, parser_node, node);
1956 } else if (parser->engine->type == ICE_FLOW_ENGINE_FDIR) {
1957 RTE_TAILQ_FOREACH_SAFE(existing_node, list,
1958 node, temp) {
1959 if (existing_node->parser->engine->type ==
1960 ICE_FLOW_ENGINE_SWITCH) {
1961 TAILQ_INSERT_AFTER(list, existing_node,
1962 parser_node, node);
1963 goto DONE;
1964 }
1965 }
1966 TAILQ_INSERT_HEAD(list, parser_node, node);
1967 } else if (parser->engine->type == ICE_FLOW_ENGINE_HASH) {
1968 TAILQ_INSERT_TAIL(list, parser_node, node);
1969 } else if (parser->engine->type == ICE_FLOW_ENGINE_ACL) {
1970 TAILQ_INSERT_HEAD(list, parser_node, node);
1971 } else {
1972 return -EINVAL;
1973 }
1974 }
1975 DONE:
1976 return 0;
1977 }
1978
1979 void
ice_unregister_parser(struct ice_flow_parser * parser,struct ice_adapter * ad)1980 ice_unregister_parser(struct ice_flow_parser *parser,
1981 struct ice_adapter *ad)
1982 {
1983 struct ice_parser_list *list;
1984 struct ice_flow_parser_node *p_parser;
1985 void *temp;
1986
1987 list = ice_get_parser_list(parser, ad);
1988 if (list == NULL)
1989 return;
1990
1991 RTE_TAILQ_FOREACH_SAFE(p_parser, list, node, temp) {
1992 if (p_parser->parser->engine->type == parser->engine->type) {
1993 TAILQ_REMOVE(list, p_parser, node);
1994 rte_free(p_parser);
1995 }
1996 }
1997 }
1998
1999 static int
ice_flow_valid_attr(struct ice_adapter * ad,const struct rte_flow_attr * attr,int * ice_pipeline_stage,struct rte_flow_error * error)2000 ice_flow_valid_attr(struct ice_adapter *ad,
2001 const struct rte_flow_attr *attr,
2002 int *ice_pipeline_stage,
2003 struct rte_flow_error *error)
2004 {
2005 /* Must be input direction */
2006 if (!attr->ingress) {
2007 rte_flow_error_set(error, EINVAL,
2008 RTE_FLOW_ERROR_TYPE_ATTR_INGRESS,
2009 attr, "Only support ingress.");
2010 return -rte_errno;
2011 }
2012
2013 /* Not supported */
2014 if (attr->egress) {
2015 rte_flow_error_set(error, EINVAL,
2016 RTE_FLOW_ERROR_TYPE_ATTR_EGRESS,
2017 attr, "Not support egress.");
2018 return -rte_errno;
2019 }
2020
2021 /* Check pipeline mode support to set classification stage */
2022 if (ad->devargs.pipe_mode_support) {
2023 if (attr->priority == 0)
2024 *ice_pipeline_stage =
2025 ICE_FLOW_CLASSIFY_STAGE_PERMISSION;
2026 else
2027 *ice_pipeline_stage =
2028 ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR;
2029 } else {
2030 *ice_pipeline_stage =
2031 ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY;
2032 if (attr->priority > 1) {
2033 rte_flow_error_set(error, EINVAL,
2034 RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,
2035 attr, "Only support priority 0 and 1.");
2036 return -rte_errno;
2037 }
2038 }
2039
2040 /* Not supported */
2041 if (attr->group) {
2042 rte_flow_error_set(error, EINVAL,
2043 RTE_FLOW_ERROR_TYPE_ATTR_GROUP,
2044 attr, "Not support group.");
2045 return -rte_errno;
2046 }
2047
2048 return 0;
2049 }
2050
2051 /* Find the first VOID or non-VOID item pointer */
2052 static const struct rte_flow_item *
ice_find_first_item(const struct rte_flow_item * item,bool is_void)2053 ice_find_first_item(const struct rte_flow_item *item, bool is_void)
2054 {
2055 bool is_find;
2056
2057 while (item->type != RTE_FLOW_ITEM_TYPE_END) {
2058 if (is_void)
2059 is_find = item->type == RTE_FLOW_ITEM_TYPE_VOID;
2060 else
2061 is_find = item->type != RTE_FLOW_ITEM_TYPE_VOID;
2062 if (is_find)
2063 break;
2064 item++;
2065 }
2066 return item;
2067 }
2068
2069 /* Skip all VOID items of the pattern */
2070 static void
ice_pattern_skip_void_item(struct rte_flow_item * items,const struct rte_flow_item * pattern)2071 ice_pattern_skip_void_item(struct rte_flow_item *items,
2072 const struct rte_flow_item *pattern)
2073 {
2074 uint32_t cpy_count = 0;
2075 const struct rte_flow_item *pb = pattern, *pe = pattern;
2076
2077 for (;;) {
2078 /* Find a non-void item first */
2079 pb = ice_find_first_item(pb, false);
2080 if (pb->type == RTE_FLOW_ITEM_TYPE_END) {
2081 pe = pb;
2082 break;
2083 }
2084
2085 /* Find a void item */
2086 pe = ice_find_first_item(pb + 1, true);
2087
2088 cpy_count = pe - pb;
2089 rte_memcpy(items, pb, sizeof(struct rte_flow_item) * cpy_count);
2090
2091 items += cpy_count;
2092
2093 if (pe->type == RTE_FLOW_ITEM_TYPE_END) {
2094 break;
2095 }
2096
2097 pb = pe + 1;
2098 }
2099 /* Copy the END item. */
2100 rte_memcpy(items, pe, sizeof(struct rte_flow_item));
2101 }
2102
2103 /* Check if the pattern matches a supported item type array */
2104 static bool
ice_match_pattern(enum rte_flow_item_type * item_array,const struct rte_flow_item * pattern)2105 ice_match_pattern(enum rte_flow_item_type *item_array,
2106 const struct rte_flow_item *pattern)
2107 {
2108 const struct rte_flow_item *item = pattern;
2109
2110 while ((*item_array == item->type) &&
2111 (*item_array != RTE_FLOW_ITEM_TYPE_END)) {
2112 item_array++;
2113 item++;
2114 }
2115
2116 return (*item_array == RTE_FLOW_ITEM_TYPE_END &&
2117 item->type == RTE_FLOW_ITEM_TYPE_END);
2118 }
2119
2120 struct ice_ptype_match {
2121 enum rte_flow_item_type *pattern_list;
2122 uint16_t hw_ptype;
2123 };
2124
2125 static struct ice_ptype_match ice_ptype_map[] = {
2126 {pattern_raw, ICE_PTYPE_IPV4_PAY},
2127 {pattern_any, ICE_PTYPE_IPV4_PAY},
2128 {pattern_eth_ipv4, ICE_PTYPE_IPV4_PAY},
2129 {pattern_eth_ipv4_udp, ICE_PTYPE_IPV4_UDP_PAY},
2130 {pattern_eth_ipv4_tcp, ICE_PTYPE_IPV4_TCP_PAY},
2131 {pattern_eth_ipv4_sctp, ICE_PTYPE_IPV4_SCTP_PAY},
2132 {pattern_eth_ipv4_gtpu, ICE_MAC_IPV4_GTPU},
2133 {pattern_eth_ipv4_gtpu_eh, ICE_MAC_IPV4_GTPU},
2134 {pattern_eth_ipv4_gtpu_ipv4, ICE_MAC_IPV4_GTPU_IPV4_PAY},
2135 {pattern_eth_ipv4_gtpu_ipv4_udp, ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY},
2136 {pattern_eth_ipv4_gtpu_ipv4_tcp, ICE_MAC_IPV4_GTPU_IPV4_TCP},
2137 {pattern_eth_ipv4_gtpu_ipv6, ICE_MAC_IPV4_GTPU_IPV6_PAY},
2138 {pattern_eth_ipv4_gtpu_ipv6_udp, ICE_MAC_IPV4_GTPU_IPV6_UDP_PAY},
2139 {pattern_eth_ipv4_gtpu_ipv6_tcp, ICE_MAC_IPV4_GTPU_IPV6_TCP},
2140 {pattern_eth_ipv4_gtpu_eh_ipv4, ICE_MAC_IPV4_GTPU_IPV4_PAY},
2141 {pattern_eth_ipv4_gtpu_eh_ipv4_udp, ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY},
2142 {pattern_eth_ipv4_gtpu_eh_ipv4_tcp, ICE_MAC_IPV4_GTPU_IPV4_TCP},
2143 {pattern_eth_ipv4_gtpu_eh_ipv6, ICE_MAC_IPV4_GTPU_IPV6_PAY},
2144 {pattern_eth_ipv4_gtpu_eh_ipv6_udp, ICE_MAC_IPV4_GTPU_IPV6_UDP_PAY},
2145 {pattern_eth_ipv4_gtpu_eh_ipv6_tcp, ICE_MAC_IPV4_GTPU_IPV6_TCP},
2146 {pattern_eth_ipv4_esp, ICE_MAC_IPV4_ESP},
2147 {pattern_eth_ipv4_udp_esp, ICE_MAC_IPV4_NAT_T_ESP},
2148 {pattern_eth_ipv4_ah, ICE_MAC_IPV4_AH},
2149 {pattern_eth_ipv4_l2tp, ICE_MAC_IPV4_L2TPV3},
2150 {pattern_eth_ipv4_pfcp, ICE_MAC_IPV4_PFCP_SESSION},
2151 {pattern_eth_ipv6, ICE_PTYPE_IPV6_PAY},
2152 {pattern_eth_ipv6_udp, ICE_PTYPE_IPV6_UDP_PAY},
2153 {pattern_eth_ipv6_tcp, ICE_PTYPE_IPV6_TCP_PAY},
2154 {pattern_eth_ipv6_sctp, ICE_PTYPE_IPV6_SCTP_PAY},
2155 {pattern_eth_ipv6_frag_ext, ICE_PTYPE_IPV6FRAG_PAY},
2156 {pattern_eth_ipv6_gtpu, ICE_MAC_IPV6_GTPU},
2157 {pattern_eth_ipv6_gtpu_eh, ICE_MAC_IPV6_GTPU},
2158 {pattern_eth_ipv6_gtpu_ipv4, ICE_MAC_IPV6_GTPU_IPV4_PAY},
2159 {pattern_eth_ipv6_gtpu_ipv4_udp, ICE_MAC_IPV6_GTPU_IPV4_UDP_PAY},
2160 {pattern_eth_ipv6_gtpu_ipv4_tcp, ICE_MAC_IPV6_GTPU_IPV4_TCP},
2161 {pattern_eth_ipv6_gtpu_ipv6, ICE_MAC_IPV6_GTPU_IPV6_PAY},
2162 {pattern_eth_ipv6_gtpu_ipv6_udp, ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY},
2163 {pattern_eth_ipv6_gtpu_ipv6_tcp, ICE_MAC_IPV6_GTPU_IPV6_TCP},
2164 {pattern_eth_ipv6_gtpu_eh_ipv4, ICE_MAC_IPV6_GTPU_IPV4_PAY},
2165 {pattern_eth_ipv6_gtpu_eh_ipv4_udp, ICE_MAC_IPV6_GTPU_IPV4_UDP_PAY},
2166 {pattern_eth_ipv6_gtpu_eh_ipv4_tcp, ICE_MAC_IPV6_GTPU_IPV4_TCP},
2167 {pattern_eth_ipv6_gtpu_eh_ipv6, ICE_MAC_IPV6_GTPU_IPV6_PAY},
2168 {pattern_eth_ipv6_gtpu_eh_ipv6_udp, ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY},
2169 {pattern_eth_ipv6_gtpu_eh_ipv6_tcp, ICE_MAC_IPV6_GTPU_IPV6_TCP},
2170 {pattern_eth_ipv6_esp, ICE_MAC_IPV6_ESP},
2171 {pattern_eth_ipv6_udp_esp, ICE_MAC_IPV6_NAT_T_ESP},
2172 {pattern_eth_ipv6_ah, ICE_MAC_IPV6_AH},
2173 {pattern_eth_ipv6_l2tp, ICE_MAC_IPV6_L2TPV3},
2174 {pattern_eth_ipv6_pfcp, ICE_MAC_IPV6_PFCP_SESSION},
2175 {pattern_ethertype, ICE_PTYPE_MAC_PAY},
2176 {pattern_ethertype_vlan, ICE_PTYPE_MAC_PAY},
2177 {pattern_ethertype_qinq, ICE_PTYPE_MAC_PAY},
2178 {pattern_eth_arp, ICE_PTYPE_MAC_PAY},
2179 {pattern_eth_vlan_ipv4, ICE_PTYPE_IPV4_PAY},
2180 {pattern_eth_qinq_ipv4, ICE_PTYPE_IPV4_PAY},
2181 {pattern_eth_qinq_ipv4_udp, ICE_PTYPE_IPV4_UDP_PAY},
2182 {pattern_eth_qinq_ipv4_tcp, ICE_PTYPE_IPV4_TCP_PAY},
2183 {pattern_eth_vlan_ipv4_udp, ICE_PTYPE_IPV4_UDP_PAY},
2184 {pattern_eth_vlan_ipv4_tcp, ICE_PTYPE_IPV4_TCP_PAY},
2185 {pattern_eth_vlan_ipv4_sctp, ICE_PTYPE_IPV4_SCTP_PAY},
2186 {pattern_eth_vlan_ipv6, ICE_PTYPE_IPV6_PAY},
2187 {pattern_eth_qinq_ipv6, ICE_PTYPE_IPV6_PAY},
2188 {pattern_eth_qinq_ipv6_udp, ICE_PTYPE_IPV6_UDP_PAY},
2189 {pattern_eth_qinq_ipv6_tcp, ICE_PTYPE_IPV6_TCP_PAY},
2190 {pattern_eth_vlan_ipv6_udp, ICE_PTYPE_IPV6_UDP_PAY},
2191 {pattern_eth_vlan_ipv6_tcp, ICE_PTYPE_IPV6_TCP_PAY},
2192 {pattern_eth_vlan_ipv6_sctp, ICE_PTYPE_IPV6_SCTP_PAY},
2193 {pattern_eth_pppoes, ICE_MAC_PPPOE_PAY},
2194 {pattern_eth_vlan_pppoes, ICE_MAC_PPPOE_PAY},
2195 {pattern_eth_qinq_pppoes, ICE_MAC_PPPOE_PAY},
2196 {pattern_eth_pppoes_proto, ICE_MAC_PPPOE_PAY},
2197 {pattern_eth_vlan_pppoes_proto, ICE_MAC_PPPOE_PAY},
2198 {pattern_eth_qinq_pppoes_proto, ICE_MAC_PPPOE_PAY},
2199 {pattern_eth_pppoes_ipv4, ICE_MAC_PPPOE_IPV4_PAY},
2200 {pattern_eth_pppoes_ipv4_udp, ICE_MAC_PPPOE_IPV4_UDP_PAY},
2201 {pattern_eth_pppoes_ipv4_tcp, ICE_MAC_PPPOE_IPV4_TCP},
2202 {pattern_eth_vlan_pppoes_ipv4, ICE_MAC_PPPOE_IPV4_PAY},
2203 {pattern_eth_qinq_pppoes_ipv4, ICE_MAC_PPPOE_IPV4_PAY},
2204 {pattern_eth_vlan_pppoes_ipv4_tcp, ICE_MAC_PPPOE_IPV4_TCP},
2205 {pattern_eth_vlan_pppoes_ipv4_udp, ICE_MAC_PPPOE_IPV4_UDP_PAY},
2206 {pattern_eth_pppoes_ipv6, ICE_MAC_PPPOE_IPV6_PAY},
2207 {pattern_eth_pppoes_ipv6_udp, ICE_MAC_PPPOE_IPV6_UDP_PAY},
2208 {pattern_eth_pppoes_ipv6_tcp, ICE_MAC_PPPOE_IPV6_TCP},
2209 {pattern_eth_vlan_pppoes_ipv6, ICE_MAC_PPPOE_IPV6_PAY},
2210 {pattern_eth_qinq_pppoes_ipv6, ICE_MAC_PPPOE_IPV6_PAY},
2211 {pattern_eth_vlan_pppoes_ipv6_tcp, ICE_MAC_PPPOE_IPV6_TCP},
2212 {pattern_eth_vlan_pppoes_ipv6_udp, ICE_MAC_PPPOE_IPV6_UDP_PAY},
2213 {pattern_eth_ipv4_udp_vxlan_ipv4, ICE_MAC_IPV4_TUN_IPV4_PAY},
2214 {pattern_eth_ipv4_udp_vxlan_ipv4_udp, ICE_MAC_IPV4_TUN_IPV4_UDP_PAY},
2215 {pattern_eth_ipv4_udp_vxlan_ipv4_tcp, ICE_MAC_IPV4_TUN_IPV4_TCP},
2216 {pattern_eth_ipv4_udp_vxlan_ipv4_sctp, ICE_MAC_IPV4_TUN_IPV4_SCTP},
2217 {pattern_eth_ipv4_udp_vxlan_eth_ipv4, ICE_MAC_IPV4_TUN_IPV4_PAY},
2218 {pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp, ICE_MAC_IPV4_TUN_IPV4_UDP_PAY},
2219 {pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp, ICE_MAC_IPV4_TUN_IPV4_TCP},
2220 {pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp, ICE_MAC_IPV4_TUN_IPV4_SCTP},
2221 {pattern_eth_ipv4_nvgre_eth_ipv4, ICE_MAC_IPV4_TUN_IPV4_PAY},
2222 {pattern_eth_ipv4_nvgre_eth_ipv4_udp, ICE_MAC_IPV4_TUN_IPV4_UDP_PAY},
2223 {pattern_eth_ipv4_nvgre_eth_ipv4_tcp, ICE_MAC_IPV4_TUN_IPV4_TCP},
2224 {pattern_empty, 0},
2225 };
2226
2227 static bool
ice_pattern_is_supported(__rte_unused struct ice_adapter * ad,const struct rte_flow_item * pattern)2228 ice_pattern_is_supported(__rte_unused struct ice_adapter *ad,
2229 const struct rte_flow_item *pattern)
2230 {
2231 uint16_t i;
2232
2233 for (i = 0; i < RTE_DIM(ice_ptype_map); i++) {
2234 if (ice_match_pattern(ice_ptype_map[i].pattern_list,
2235 pattern)) {
2236 return ice_hw_ptype_ena(&ad->hw,
2237 ice_ptype_map[i].hw_ptype);
2238 }
2239 }
2240
2241 return false;
2242 }
2243
2244 struct ice_pattern_match_item *
ice_search_pattern_match_item(struct ice_adapter * ad,const struct rte_flow_item pattern[],struct ice_pattern_match_item * array,uint32_t array_len,struct rte_flow_error * error)2245 ice_search_pattern_match_item(struct ice_adapter *ad,
2246 const struct rte_flow_item pattern[],
2247 struct ice_pattern_match_item *array,
2248 uint32_t array_len,
2249 struct rte_flow_error *error)
2250 {
2251 struct ice_pattern_match_item *pattern_match_item;
2252 /* need free by each filter */
2253 struct rte_flow_item *items; /* used for pattern without VOID items */
2254 uint32_t item_num = 0; /* non-void item number */
2255 uint16_t i = 0;
2256
2257 /* Get the non-void item number of pattern */
2258 while ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_END) {
2259 if ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_VOID)
2260 item_num++;
2261 i++;
2262 }
2263 item_num++;
2264
2265 items = rte_zmalloc("ice_pattern",
2266 item_num * sizeof(struct rte_flow_item), 0);
2267 if (!items) {
2268 rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
2269 NULL, "No memory for PMD internal items.");
2270 return NULL;
2271 }
2272 pattern_match_item = rte_zmalloc("ice_pattern_match_item",
2273 sizeof(struct ice_pattern_match_item), 0);
2274 if (!pattern_match_item) {
2275 rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_HANDLE,
2276 NULL, "Failed to allocate memory.");
2277 rte_free(items);
2278 return NULL;
2279 }
2280
2281 ice_pattern_skip_void_item(items, pattern);
2282
2283 if (!ice_pattern_is_supported(ad, pattern))
2284 goto unsupported;
2285
2286 for (i = 0; i < array_len; i++) {
2287 if (ice_match_pattern(array[i].pattern_list,
2288 items)) {
2289 pattern_match_item->input_set_mask_o =
2290 array[i].input_set_mask_o;
2291 pattern_match_item->input_set_mask_i =
2292 array[i].input_set_mask_i;
2293 pattern_match_item->pattern_list =
2294 array[i].pattern_list;
2295 pattern_match_item->meta = array[i].meta;
2296 rte_free(items);
2297 return pattern_match_item;
2298 }
2299 }
2300
2301 unsupported:
2302 rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM,
2303 pattern, "Unsupported pattern");
2304 rte_free(items);
2305 rte_free(pattern_match_item);
2306 return NULL;
2307 }
2308
2309 static struct ice_flow_engine *
ice_parse_engine_create(struct ice_adapter * ad,struct rte_flow * flow,struct ice_parser_list * parser_list,uint32_t priority,const struct rte_flow_item pattern[],const struct rte_flow_action actions[],struct rte_flow_error * error)2310 ice_parse_engine_create(struct ice_adapter *ad,
2311 struct rte_flow *flow,
2312 struct ice_parser_list *parser_list,
2313 uint32_t priority,
2314 const struct rte_flow_item pattern[],
2315 const struct rte_flow_action actions[],
2316 struct rte_flow_error *error)
2317 {
2318 struct ice_flow_engine *engine = NULL;
2319 struct ice_flow_parser_node *parser_node;
2320 void *meta = NULL;
2321 void *temp;
2322
2323 RTE_TAILQ_FOREACH_SAFE(parser_node, parser_list, node, temp) {
2324 int ret;
2325
2326 if (parser_node->parser->parse_pattern_action(ad,
2327 parser_node->parser->array,
2328 parser_node->parser->array_len,
2329 pattern, actions, priority, &meta, error) < 0)
2330 continue;
2331
2332 engine = parser_node->parser->engine;
2333 RTE_ASSERT(engine->create != NULL);
2334 ret = engine->create(ad, flow, meta, error);
2335 if (ret == 0)
2336 return engine;
2337 else if (ret == -EEXIST)
2338 return NULL;
2339 }
2340 return NULL;
2341 }
2342
2343 static struct ice_flow_engine *
ice_parse_engine_validate(struct ice_adapter * ad,struct rte_flow * flow __rte_unused,struct ice_parser_list * parser_list,uint32_t priority,const struct rte_flow_item pattern[],const struct rte_flow_action actions[],struct rte_flow_error * error)2344 ice_parse_engine_validate(struct ice_adapter *ad,
2345 struct rte_flow *flow __rte_unused,
2346 struct ice_parser_list *parser_list,
2347 uint32_t priority,
2348 const struct rte_flow_item pattern[],
2349 const struct rte_flow_action actions[],
2350 struct rte_flow_error *error)
2351 {
2352 struct ice_flow_engine *engine = NULL;
2353 struct ice_flow_parser_node *parser_node;
2354 void *temp;
2355
2356 RTE_TAILQ_FOREACH_SAFE(parser_node, parser_list, node, temp) {
2357 if (parser_node->parser->parse_pattern_action(ad,
2358 parser_node->parser->array,
2359 parser_node->parser->array_len,
2360 pattern, actions, priority, NULL, error) < 0)
2361 continue;
2362
2363 engine = parser_node->parser->engine;
2364 break;
2365 }
2366 return engine;
2367 }
2368
2369 static int
ice_flow_process_filter(struct rte_eth_dev * dev,struct rte_flow * flow,const struct rte_flow_attr * attr,const struct rte_flow_item pattern[],const struct rte_flow_action actions[],struct ice_flow_engine ** engine,parse_engine_t ice_parse_engine,struct rte_flow_error * error)2370 ice_flow_process_filter(struct rte_eth_dev *dev,
2371 struct rte_flow *flow,
2372 const struct rte_flow_attr *attr,
2373 const struct rte_flow_item pattern[],
2374 const struct rte_flow_action actions[],
2375 struct ice_flow_engine **engine,
2376 parse_engine_t ice_parse_engine,
2377 struct rte_flow_error *error)
2378 {
2379 int ret = ICE_ERR_NOT_SUPPORTED;
2380 struct ice_adapter *ad =
2381 ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
2382 struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
2383 int ice_pipeline_stage = 0;
2384
2385 if (!pattern) {
2386 rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
2387 NULL, "NULL pattern.");
2388 return -rte_errno;
2389 }
2390
2391 if (!actions || actions->type == RTE_FLOW_ACTION_TYPE_END) {
2392 rte_flow_error_set(error, EINVAL,
2393 RTE_FLOW_ERROR_TYPE_ACTION_NUM,
2394 NULL, "NULL action.");
2395 return -rte_errno;
2396 }
2397
2398 if (!attr) {
2399 rte_flow_error_set(error, EINVAL,
2400 RTE_FLOW_ERROR_TYPE_ATTR,
2401 NULL, "NULL attribute.");
2402 return -rte_errno;
2403 }
2404
2405 ret = ice_flow_valid_attr(ad, attr, &ice_pipeline_stage, error);
2406 if (ret)
2407 return ret;
2408
2409 *engine = ice_parse_engine(ad, flow, &pf->rss_parser_list,
2410 attr->priority, pattern, actions, error);
2411 if (*engine != NULL)
2412 return 0;
2413
2414 switch (ice_pipeline_stage) {
2415 case ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY:
2416 case ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR:
2417 *engine = ice_parse_engine(ad, flow, &pf->dist_parser_list,
2418 attr->priority, pattern, actions, error);
2419 break;
2420 case ICE_FLOW_CLASSIFY_STAGE_PERMISSION:
2421 *engine = ice_parse_engine(ad, flow, &pf->perm_parser_list,
2422 attr->priority, pattern, actions, error);
2423 break;
2424 default:
2425 return -EINVAL;
2426 }
2427
2428 if (*engine == NULL)
2429 return -EINVAL;
2430
2431 return 0;
2432 }
2433
2434 static int
ice_flow_validate(struct rte_eth_dev * dev,const struct rte_flow_attr * attr,const struct rte_flow_item pattern[],const struct rte_flow_action actions[],struct rte_flow_error * error)2435 ice_flow_validate(struct rte_eth_dev *dev,
2436 const struct rte_flow_attr *attr,
2437 const struct rte_flow_item pattern[],
2438 const struct rte_flow_action actions[],
2439 struct rte_flow_error *error)
2440 {
2441 struct ice_flow_engine *engine;
2442
2443 return ice_flow_process_filter(dev, NULL, attr, pattern, actions,
2444 &engine, ice_parse_engine_validate, error);
2445 }
2446
2447 static struct rte_flow *
ice_flow_create(struct rte_eth_dev * dev,const struct rte_flow_attr * attr,const struct rte_flow_item pattern[],const struct rte_flow_action actions[],struct rte_flow_error * error)2448 ice_flow_create(struct rte_eth_dev *dev,
2449 const struct rte_flow_attr *attr,
2450 const struct rte_flow_item pattern[],
2451 const struct rte_flow_action actions[],
2452 struct rte_flow_error *error)
2453 {
2454 struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
2455 struct rte_flow *flow = NULL;
2456 int ret;
2457 struct ice_flow_engine *engine = NULL;
2458
2459 flow = rte_zmalloc("ice_flow", sizeof(struct rte_flow), 0);
2460 if (!flow) {
2461 rte_flow_error_set(error, ENOMEM,
2462 RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
2463 "Failed to allocate memory");
2464 return flow;
2465 }
2466
2467 rte_spinlock_lock(&pf->flow_ops_lock);
2468
2469 ret = ice_flow_process_filter(dev, flow, attr, pattern, actions,
2470 &engine, ice_parse_engine_create, error);
2471 if (ret < 0) {
2472 PMD_DRV_LOG(ERR, "Failed to create flow");
2473 rte_free(flow);
2474 flow = NULL;
2475 goto out;
2476 }
2477
2478 flow->engine = engine;
2479 TAILQ_INSERT_TAIL(&pf->flow_list, flow, node);
2480 PMD_DRV_LOG(INFO, "Succeeded to create (%d) flow", engine->type);
2481
2482 out:
2483 rte_spinlock_unlock(&pf->flow_ops_lock);
2484 return flow;
2485 }
2486
2487 static int
ice_flow_destroy(struct rte_eth_dev * dev,struct rte_flow * flow,struct rte_flow_error * error)2488 ice_flow_destroy(struct rte_eth_dev *dev,
2489 struct rte_flow *flow,
2490 struct rte_flow_error *error)
2491 {
2492 struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
2493 struct ice_adapter *ad =
2494 ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
2495 int ret = 0;
2496
2497 if (!flow || !flow->engine || !flow->engine->destroy) {
2498 rte_flow_error_set(error, EINVAL,
2499 RTE_FLOW_ERROR_TYPE_HANDLE,
2500 NULL, "Invalid flow");
2501 return -rte_errno;
2502 }
2503
2504 rte_spinlock_lock(&pf->flow_ops_lock);
2505
2506 ret = flow->engine->destroy(ad, flow, error);
2507 if (!ret) {
2508 TAILQ_REMOVE(&pf->flow_list, flow, node);
2509 rte_free(flow);
2510 } else {
2511 PMD_DRV_LOG(ERR, "Failed to destroy flow");
2512 }
2513
2514 rte_spinlock_unlock(&pf->flow_ops_lock);
2515
2516 return ret;
2517 }
2518
2519 static int
ice_flow_flush(struct rte_eth_dev * dev,struct rte_flow_error * error)2520 ice_flow_flush(struct rte_eth_dev *dev,
2521 struct rte_flow_error *error)
2522 {
2523 struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
2524 struct rte_flow *p_flow;
2525 void *temp;
2526 int ret = 0;
2527
2528 RTE_TAILQ_FOREACH_SAFE(p_flow, &pf->flow_list, node, temp) {
2529 ret = ice_flow_destroy(dev, p_flow, error);
2530 if (ret) {
2531 PMD_DRV_LOG(ERR, "Failed to flush flows");
2532 if (ret != -EAGAIN)
2533 ret = -EINVAL;
2534 return ret;
2535 }
2536 }
2537
2538 return ret;
2539 }
2540
2541 static int
ice_flow_query(struct rte_eth_dev * dev,struct rte_flow * flow,const struct rte_flow_action * actions,void * data,struct rte_flow_error * error)2542 ice_flow_query(struct rte_eth_dev *dev,
2543 struct rte_flow *flow,
2544 const struct rte_flow_action *actions,
2545 void *data,
2546 struct rte_flow_error *error)
2547 {
2548 int ret = -EINVAL;
2549 struct ice_adapter *ad =
2550 ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
2551 struct rte_flow_query_count *count = data;
2552 struct ice_pf *pf = &ad->pf;
2553
2554 if (!flow || !flow->engine || !flow->engine->query_count) {
2555 rte_flow_error_set(error, EINVAL,
2556 RTE_FLOW_ERROR_TYPE_HANDLE,
2557 NULL, "Invalid flow");
2558 return -rte_errno;
2559 }
2560
2561 rte_spinlock_lock(&pf->flow_ops_lock);
2562
2563 for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
2564 switch (actions->type) {
2565 case RTE_FLOW_ACTION_TYPE_VOID:
2566 break;
2567 case RTE_FLOW_ACTION_TYPE_COUNT:
2568 ret = flow->engine->query_count(ad, flow, count, error);
2569 break;
2570 default:
2571 ret = rte_flow_error_set(error, ENOTSUP,
2572 RTE_FLOW_ERROR_TYPE_ACTION,
2573 actions,
2574 "action not supported");
2575 goto out;
2576 }
2577 }
2578
2579 out:
2580 rte_spinlock_unlock(&pf->flow_ops_lock);
2581 return ret;
2582 }
2583
2584 int
ice_flow_redirect(struct ice_adapter * ad,struct ice_flow_redirect * rd)2585 ice_flow_redirect(struct ice_adapter *ad,
2586 struct ice_flow_redirect *rd)
2587 {
2588 struct ice_pf *pf = &ad->pf;
2589 struct rte_flow *p_flow;
2590 void *temp;
2591 int ret = 0;
2592
2593 rte_spinlock_lock(&pf->flow_ops_lock);
2594
2595 RTE_TAILQ_FOREACH_SAFE(p_flow, &pf->flow_list, node, temp) {
2596 if (!p_flow->engine->redirect)
2597 continue;
2598 ret = p_flow->engine->redirect(ad, p_flow, rd);
2599 if (ret) {
2600 PMD_DRV_LOG(ERR, "Failed to redirect flows");
2601 break;
2602 }
2603 }
2604
2605 rte_spinlock_unlock(&pf->flow_ops_lock);
2606
2607 return ret;
2608 }
2609