xref: /dpdk/drivers/net/ice/ice_generic_flow.c (revision 29fd052d)
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
1815 ice_register_flow_engine(struct ice_flow_engine *engine)
1816 {
1817 	TAILQ_INSERT_TAIL(&engine_list, engine, node);
1818 }
1819 
1820 int
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 	RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
1835 		if (engine->init == NULL) {
1836 			PMD_INIT_LOG(ERR, "Invalid engine type (%d)",
1837 					engine->type);
1838 			return -ENOTSUP;
1839 		}
1840 
1841 		ret = engine->init(ad);
1842 		if (ret) {
1843 			PMD_INIT_LOG(ERR, "Failed to initialize engine %d",
1844 					engine->type);
1845 			return ret;
1846 		}
1847 	}
1848 	return 0;
1849 }
1850 
1851 void
1852 ice_flow_uninit(struct ice_adapter *ad)
1853 {
1854 	struct ice_pf *pf = &ad->pf;
1855 	struct ice_flow_engine *engine;
1856 	struct rte_flow *p_flow;
1857 	struct ice_flow_parser_node *p_parser;
1858 	void *temp;
1859 
1860 	RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
1861 		if (engine->uninit)
1862 			engine->uninit(ad);
1863 	}
1864 
1865 	/* Remove all flows */
1866 	while ((p_flow = TAILQ_FIRST(&pf->flow_list))) {
1867 		TAILQ_REMOVE(&pf->flow_list, p_flow, node);
1868 		if (p_flow->engine->free)
1869 			p_flow->engine->free(p_flow);
1870 		rte_free(p_flow);
1871 	}
1872 
1873 	/* Cleanup parser list */
1874 	while ((p_parser = TAILQ_FIRST(&pf->rss_parser_list))) {
1875 		TAILQ_REMOVE(&pf->rss_parser_list, p_parser, node);
1876 		rte_free(p_parser);
1877 	}
1878 
1879 	while ((p_parser = TAILQ_FIRST(&pf->perm_parser_list))) {
1880 		TAILQ_REMOVE(&pf->perm_parser_list, p_parser, node);
1881 		rte_free(p_parser);
1882 	}
1883 
1884 	while ((p_parser = TAILQ_FIRST(&pf->dist_parser_list))) {
1885 		TAILQ_REMOVE(&pf->dist_parser_list, p_parser, node);
1886 		rte_free(p_parser);
1887 	}
1888 }
1889 
1890 static struct ice_parser_list *
1891 ice_get_parser_list(struct ice_flow_parser *parser,
1892 		struct ice_adapter *ad)
1893 {
1894 	struct ice_parser_list *list;
1895 	struct ice_pf *pf = &ad->pf;
1896 
1897 	switch (parser->stage) {
1898 	case ICE_FLOW_STAGE_RSS:
1899 		list = &pf->rss_parser_list;
1900 		break;
1901 	case ICE_FLOW_STAGE_PERMISSION:
1902 		list = &pf->perm_parser_list;
1903 		break;
1904 	case ICE_FLOW_STAGE_DISTRIBUTOR:
1905 		list = &pf->dist_parser_list;
1906 		break;
1907 	default:
1908 		return NULL;
1909 	}
1910 
1911 	return list;
1912 }
1913 
1914 int
1915 ice_register_parser(struct ice_flow_parser *parser,
1916 		struct ice_adapter *ad)
1917 {
1918 	struct ice_parser_list *list;
1919 	struct ice_flow_parser_node *parser_node;
1920 	struct ice_flow_parser_node *existing_node;
1921 	void *temp;
1922 
1923 	parser_node = rte_zmalloc("ice_parser", sizeof(*parser_node), 0);
1924 	if (parser_node == NULL) {
1925 		PMD_DRV_LOG(ERR, "Failed to allocate memory.");
1926 		return -ENOMEM;
1927 	}
1928 	parser_node->parser = parser;
1929 
1930 	list = ice_get_parser_list(parser, ad);
1931 	if (list == NULL)
1932 		return -EINVAL;
1933 
1934 	if (ad->devargs.pipe_mode_support) {
1935 		TAILQ_INSERT_TAIL(list, parser_node, node);
1936 	} else {
1937 		if (parser->engine->type == ICE_FLOW_ENGINE_SWITCH) {
1938 			RTE_TAILQ_FOREACH_SAFE(existing_node, list,
1939 					       node, temp) {
1940 				if (existing_node->parser->engine->type ==
1941 				    ICE_FLOW_ENGINE_ACL) {
1942 					TAILQ_INSERT_AFTER(list, existing_node,
1943 							   parser_node, node);
1944 					goto DONE;
1945 				}
1946 			}
1947 			TAILQ_INSERT_HEAD(list, parser_node, node);
1948 		} else if (parser->engine->type == ICE_FLOW_ENGINE_FDIR) {
1949 			RTE_TAILQ_FOREACH_SAFE(existing_node, list,
1950 					       node, temp) {
1951 				if (existing_node->parser->engine->type ==
1952 				    ICE_FLOW_ENGINE_SWITCH) {
1953 					TAILQ_INSERT_AFTER(list, existing_node,
1954 							   parser_node, node);
1955 					goto DONE;
1956 				}
1957 			}
1958 			TAILQ_INSERT_HEAD(list, parser_node, node);
1959 		} else if (parser->engine->type == ICE_FLOW_ENGINE_HASH) {
1960 			TAILQ_INSERT_TAIL(list, parser_node, node);
1961 		} else if (parser->engine->type == ICE_FLOW_ENGINE_ACL) {
1962 			TAILQ_INSERT_HEAD(list, parser_node, node);
1963 		} else {
1964 			return -EINVAL;
1965 		}
1966 	}
1967 DONE:
1968 	return 0;
1969 }
1970 
1971 void
1972 ice_unregister_parser(struct ice_flow_parser *parser,
1973 		struct ice_adapter *ad)
1974 {
1975 	struct ice_parser_list *list;
1976 	struct ice_flow_parser_node *p_parser;
1977 	void *temp;
1978 
1979 	list = ice_get_parser_list(parser, ad);
1980 	if (list == NULL)
1981 		return;
1982 
1983 	RTE_TAILQ_FOREACH_SAFE(p_parser, list, node, temp) {
1984 		if (p_parser->parser->engine->type == parser->engine->type) {
1985 			TAILQ_REMOVE(list, p_parser, node);
1986 			rte_free(p_parser);
1987 		}
1988 	}
1989 }
1990 
1991 static int
1992 ice_flow_valid_attr(struct ice_adapter *ad,
1993 		const struct rte_flow_attr *attr,
1994 		int *ice_pipeline_stage,
1995 		struct rte_flow_error *error)
1996 {
1997 	/* Must be input direction */
1998 	if (!attr->ingress) {
1999 		rte_flow_error_set(error, EINVAL,
2000 				RTE_FLOW_ERROR_TYPE_ATTR_INGRESS,
2001 				attr, "Only support ingress.");
2002 		return -rte_errno;
2003 	}
2004 
2005 	/* Not supported */
2006 	if (attr->egress) {
2007 		rte_flow_error_set(error, EINVAL,
2008 				RTE_FLOW_ERROR_TYPE_ATTR_EGRESS,
2009 				attr, "Not support egress.");
2010 		return -rte_errno;
2011 	}
2012 
2013 	/* Check pipeline mode support to set classification stage */
2014 	if (ad->devargs.pipe_mode_support) {
2015 		if (attr->priority == 0)
2016 			*ice_pipeline_stage =
2017 				ICE_FLOW_CLASSIFY_STAGE_PERMISSION;
2018 		else
2019 			*ice_pipeline_stage =
2020 				ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR;
2021 	} else {
2022 		*ice_pipeline_stage =
2023 			ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY;
2024 		if (attr->priority > 1) {
2025 			rte_flow_error_set(error, EINVAL,
2026 					RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,
2027 					attr, "Only support priority 0 and 1.");
2028 			return -rte_errno;
2029 		}
2030 	}
2031 
2032 	/* Not supported */
2033 	if (attr->group) {
2034 		rte_flow_error_set(error, EINVAL,
2035 				RTE_FLOW_ERROR_TYPE_ATTR_GROUP,
2036 				attr, "Not support group.");
2037 		return -rte_errno;
2038 	}
2039 
2040 	return 0;
2041 }
2042 
2043 /* Find the first VOID or non-VOID item pointer */
2044 static const struct rte_flow_item *
2045 ice_find_first_item(const struct rte_flow_item *item, bool is_void)
2046 {
2047 	bool is_find;
2048 
2049 	while (item->type != RTE_FLOW_ITEM_TYPE_END) {
2050 		if (is_void)
2051 			is_find = item->type == RTE_FLOW_ITEM_TYPE_VOID;
2052 		else
2053 			is_find = item->type != RTE_FLOW_ITEM_TYPE_VOID;
2054 		if (is_find)
2055 			break;
2056 		item++;
2057 	}
2058 	return item;
2059 }
2060 
2061 /* Skip all VOID items of the pattern */
2062 static void
2063 ice_pattern_skip_void_item(struct rte_flow_item *items,
2064 			const struct rte_flow_item *pattern)
2065 {
2066 	uint32_t cpy_count = 0;
2067 	const struct rte_flow_item *pb = pattern, *pe = pattern;
2068 
2069 	for (;;) {
2070 		/* Find a non-void item first */
2071 		pb = ice_find_first_item(pb, false);
2072 		if (pb->type == RTE_FLOW_ITEM_TYPE_END) {
2073 			pe = pb;
2074 			break;
2075 		}
2076 
2077 		/* Find a void item */
2078 		pe = ice_find_first_item(pb + 1, true);
2079 
2080 		cpy_count = pe - pb;
2081 		rte_memcpy(items, pb, sizeof(struct rte_flow_item) * cpy_count);
2082 
2083 		items += cpy_count;
2084 
2085 		if (pe->type == RTE_FLOW_ITEM_TYPE_END) {
2086 			break;
2087 		}
2088 
2089 		pb = pe + 1;
2090 	}
2091 	/* Copy the END item. */
2092 	rte_memcpy(items, pe, sizeof(struct rte_flow_item));
2093 }
2094 
2095 /* Check if the pattern matches a supported item type array */
2096 static bool
2097 ice_match_pattern(enum rte_flow_item_type *item_array,
2098 		const struct rte_flow_item *pattern)
2099 {
2100 	const struct rte_flow_item *item = pattern;
2101 
2102 	while ((*item_array == item->type) &&
2103 	       (*item_array != RTE_FLOW_ITEM_TYPE_END)) {
2104 		item_array++;
2105 		item++;
2106 	}
2107 
2108 	return (*item_array == RTE_FLOW_ITEM_TYPE_END &&
2109 		item->type == RTE_FLOW_ITEM_TYPE_END);
2110 }
2111 
2112 struct ice_ptype_match {
2113 	enum rte_flow_item_type *pattern_list;
2114 	uint16_t hw_ptype;
2115 };
2116 
2117 static struct ice_ptype_match ice_ptype_map[] = {
2118 	{pattern_raw,					ICE_PTYPE_IPV4_PAY},
2119 	{pattern_any,					ICE_PTYPE_IPV4_PAY},
2120 	{pattern_eth_ipv4,				ICE_PTYPE_IPV4_PAY},
2121 	{pattern_eth_ipv4_udp,				ICE_PTYPE_IPV4_UDP_PAY},
2122 	{pattern_eth_ipv4_tcp,				ICE_PTYPE_IPV4_TCP_PAY},
2123 	{pattern_eth_ipv4_sctp,				ICE_PTYPE_IPV4_SCTP_PAY},
2124 	{pattern_eth_ipv4_gtpu,				ICE_MAC_IPV4_GTPU},
2125 	{pattern_eth_ipv4_gtpu_eh,			ICE_MAC_IPV4_GTPU},
2126 	{pattern_eth_ipv4_gtpu_ipv4,			ICE_MAC_IPV4_GTPU_IPV4_PAY},
2127 	{pattern_eth_ipv4_gtpu_ipv4_udp,		ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY},
2128 	{pattern_eth_ipv4_gtpu_ipv4_tcp,		ICE_MAC_IPV4_GTPU_IPV4_TCP},
2129 	{pattern_eth_ipv4_gtpu_ipv6,			ICE_MAC_IPV4_GTPU_IPV6_PAY},
2130 	{pattern_eth_ipv4_gtpu_ipv6_udp,		ICE_MAC_IPV4_GTPU_IPV6_UDP_PAY},
2131 	{pattern_eth_ipv4_gtpu_ipv6_tcp,		ICE_MAC_IPV4_GTPU_IPV6_TCP},
2132 	{pattern_eth_ipv4_gtpu_eh_ipv4,			ICE_MAC_IPV4_GTPU_IPV4_PAY},
2133 	{pattern_eth_ipv4_gtpu_eh_ipv4_udp,		ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY},
2134 	{pattern_eth_ipv4_gtpu_eh_ipv4_tcp,		ICE_MAC_IPV4_GTPU_IPV4_TCP},
2135 	{pattern_eth_ipv4_gtpu_eh_ipv6,			ICE_MAC_IPV4_GTPU_IPV6_PAY},
2136 	{pattern_eth_ipv4_gtpu_eh_ipv6_udp,		ICE_MAC_IPV4_GTPU_IPV6_UDP_PAY},
2137 	{pattern_eth_ipv4_gtpu_eh_ipv6_tcp,		ICE_MAC_IPV4_GTPU_IPV6_TCP},
2138 	{pattern_eth_ipv4_esp,				ICE_MAC_IPV4_ESP},
2139 	{pattern_eth_ipv4_udp_esp,			ICE_MAC_IPV4_NAT_T_ESP},
2140 	{pattern_eth_ipv4_ah,				ICE_MAC_IPV4_AH},
2141 	{pattern_eth_ipv4_l2tp,				ICE_MAC_IPV4_L2TPV3},
2142 	{pattern_eth_ipv4_pfcp,				ICE_MAC_IPV4_PFCP_SESSION},
2143 	{pattern_eth_ipv6,				ICE_PTYPE_IPV6_PAY},
2144 	{pattern_eth_ipv6_udp,				ICE_PTYPE_IPV6_UDP_PAY},
2145 	{pattern_eth_ipv6_tcp,				ICE_PTYPE_IPV6_TCP_PAY},
2146 	{pattern_eth_ipv6_sctp,				ICE_PTYPE_IPV6_SCTP_PAY},
2147 	{pattern_eth_ipv6_frag_ext,			ICE_PTYPE_IPV6FRAG_PAY},
2148 	{pattern_eth_ipv6_gtpu,				ICE_MAC_IPV6_GTPU},
2149 	{pattern_eth_ipv6_gtpu_eh,			ICE_MAC_IPV6_GTPU},
2150 	{pattern_eth_ipv6_gtpu_ipv4,			ICE_MAC_IPV6_GTPU_IPV4_PAY},
2151 	{pattern_eth_ipv6_gtpu_ipv4_udp,		ICE_MAC_IPV6_GTPU_IPV4_UDP_PAY},
2152 	{pattern_eth_ipv6_gtpu_ipv4_tcp,		ICE_MAC_IPV6_GTPU_IPV4_TCP},
2153 	{pattern_eth_ipv6_gtpu_ipv6,			ICE_MAC_IPV6_GTPU_IPV6_PAY},
2154 	{pattern_eth_ipv6_gtpu_ipv6_udp,		ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY},
2155 	{pattern_eth_ipv6_gtpu_ipv6_tcp,		ICE_MAC_IPV6_GTPU_IPV6_TCP},
2156 	{pattern_eth_ipv6_gtpu_eh_ipv4,			ICE_MAC_IPV6_GTPU_IPV4_PAY},
2157 	{pattern_eth_ipv6_gtpu_eh_ipv4_udp,		ICE_MAC_IPV6_GTPU_IPV4_UDP_PAY},
2158 	{pattern_eth_ipv6_gtpu_eh_ipv4_tcp,		ICE_MAC_IPV6_GTPU_IPV4_TCP},
2159 	{pattern_eth_ipv6_gtpu_eh_ipv6,			ICE_MAC_IPV6_GTPU_IPV6_PAY},
2160 	{pattern_eth_ipv6_gtpu_eh_ipv6_udp,		ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY},
2161 	{pattern_eth_ipv6_gtpu_eh_ipv6_tcp,		ICE_MAC_IPV6_GTPU_IPV6_TCP},
2162 	{pattern_eth_ipv6_esp,				ICE_MAC_IPV6_ESP},
2163 	{pattern_eth_ipv6_udp_esp,			ICE_MAC_IPV6_NAT_T_ESP},
2164 	{pattern_eth_ipv6_ah,				ICE_MAC_IPV6_AH},
2165 	{pattern_eth_ipv6_l2tp,				ICE_MAC_IPV6_L2TPV3},
2166 	{pattern_eth_ipv6_pfcp,				ICE_MAC_IPV6_PFCP_SESSION},
2167 	{pattern_ethertype,				ICE_PTYPE_MAC_PAY},
2168 	{pattern_ethertype_vlan,			ICE_PTYPE_MAC_PAY},
2169 	{pattern_ethertype_qinq,			ICE_PTYPE_MAC_PAY},
2170 	{pattern_eth_arp,				ICE_PTYPE_MAC_PAY},
2171 	{pattern_eth_vlan_ipv4,				ICE_PTYPE_IPV4_PAY},
2172 	{pattern_eth_qinq_ipv4,				ICE_PTYPE_IPV4_PAY},
2173 	{pattern_eth_qinq_ipv4_udp,			ICE_PTYPE_IPV4_UDP_PAY},
2174 	{pattern_eth_qinq_ipv4_tcp,			ICE_PTYPE_IPV4_TCP_PAY},
2175 	{pattern_eth_vlan_ipv4_udp,			ICE_PTYPE_IPV4_UDP_PAY},
2176 	{pattern_eth_vlan_ipv4_tcp,			ICE_PTYPE_IPV4_TCP_PAY},
2177 	{pattern_eth_vlan_ipv4_sctp,			ICE_PTYPE_IPV4_SCTP_PAY},
2178 	{pattern_eth_vlan_ipv6,				ICE_PTYPE_IPV6_PAY},
2179 	{pattern_eth_qinq_ipv6,				ICE_PTYPE_IPV6_PAY},
2180 	{pattern_eth_qinq_ipv6_udp,			ICE_PTYPE_IPV6_UDP_PAY},
2181 	{pattern_eth_qinq_ipv6_tcp,			ICE_PTYPE_IPV6_TCP_PAY},
2182 	{pattern_eth_vlan_ipv6_udp,			ICE_PTYPE_IPV6_UDP_PAY},
2183 	{pattern_eth_vlan_ipv6_tcp,			ICE_PTYPE_IPV6_TCP_PAY},
2184 	{pattern_eth_vlan_ipv6_sctp,			ICE_PTYPE_IPV6_SCTP_PAY},
2185 	{pattern_eth_pppoes,				ICE_MAC_PPPOE_PAY},
2186 	{pattern_eth_vlan_pppoes,			ICE_MAC_PPPOE_PAY},
2187 	{pattern_eth_qinq_pppoes,			ICE_MAC_PPPOE_PAY},
2188 	{pattern_eth_pppoes_proto,			ICE_MAC_PPPOE_PAY},
2189 	{pattern_eth_vlan_pppoes_proto,			ICE_MAC_PPPOE_PAY},
2190 	{pattern_eth_qinq_pppoes_proto,			ICE_MAC_PPPOE_PAY},
2191 	{pattern_eth_pppoes_ipv4,			ICE_MAC_PPPOE_IPV4_PAY},
2192 	{pattern_eth_pppoes_ipv4_udp,			ICE_MAC_PPPOE_IPV4_UDP_PAY},
2193 	{pattern_eth_pppoes_ipv4_tcp,			ICE_MAC_PPPOE_IPV4_TCP},
2194 	{pattern_eth_vlan_pppoes_ipv4,			ICE_MAC_PPPOE_IPV4_PAY},
2195 	{pattern_eth_qinq_pppoes_ipv4,			ICE_MAC_PPPOE_IPV4_PAY},
2196 	{pattern_eth_vlan_pppoes_ipv4_tcp,		ICE_MAC_PPPOE_IPV4_TCP},
2197 	{pattern_eth_vlan_pppoes_ipv4_udp,		ICE_MAC_PPPOE_IPV4_UDP_PAY},
2198 	{pattern_eth_pppoes_ipv6,			ICE_MAC_PPPOE_IPV6_PAY},
2199 	{pattern_eth_pppoes_ipv6_udp,			ICE_MAC_PPPOE_IPV6_UDP_PAY},
2200 	{pattern_eth_pppoes_ipv6_tcp,			ICE_MAC_PPPOE_IPV6_TCP},
2201 	{pattern_eth_vlan_pppoes_ipv6,			ICE_MAC_PPPOE_IPV6_PAY},
2202 	{pattern_eth_qinq_pppoes_ipv6,			ICE_MAC_PPPOE_IPV6_PAY},
2203 	{pattern_eth_vlan_pppoes_ipv6_tcp,		ICE_MAC_PPPOE_IPV6_TCP},
2204 	{pattern_eth_vlan_pppoes_ipv6_udp,		ICE_MAC_PPPOE_IPV6_UDP_PAY},
2205 	{pattern_eth_ipv4_udp_vxlan_ipv4,		ICE_MAC_IPV4_TUN_IPV4_PAY},
2206 	{pattern_eth_ipv4_udp_vxlan_ipv4_udp,		ICE_MAC_IPV4_TUN_IPV4_UDP_PAY},
2207 	{pattern_eth_ipv4_udp_vxlan_ipv4_tcp,		ICE_MAC_IPV4_TUN_IPV4_TCP},
2208 	{pattern_eth_ipv4_udp_vxlan_ipv4_sctp,		ICE_MAC_IPV4_TUN_IPV4_SCTP},
2209 	{pattern_eth_ipv4_udp_vxlan_eth_ipv4,		ICE_MAC_IPV4_TUN_IPV4_PAY},
2210 	{pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp,	ICE_MAC_IPV4_TUN_IPV4_UDP_PAY},
2211 	{pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp,	ICE_MAC_IPV4_TUN_IPV4_TCP},
2212 	{pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp,	ICE_MAC_IPV4_TUN_IPV4_SCTP},
2213 	{pattern_eth_ipv4_nvgre_eth_ipv4,		ICE_MAC_IPV4_TUN_IPV4_PAY},
2214 	{pattern_eth_ipv4_nvgre_eth_ipv4_udp,		ICE_MAC_IPV4_TUN_IPV4_UDP_PAY},
2215 	{pattern_eth_ipv4_nvgre_eth_ipv4_tcp,		ICE_MAC_IPV4_TUN_IPV4_TCP},
2216 	{pattern_empty,					0},
2217 };
2218 
2219 static bool
2220 ice_pattern_is_supported(__rte_unused struct ice_adapter *ad,
2221 			 const struct rte_flow_item *pattern)
2222 {
2223 	uint16_t i;
2224 
2225 	for (i = 0; i < RTE_DIM(ice_ptype_map); i++) {
2226 		if (ice_match_pattern(ice_ptype_map[i].pattern_list,
2227 				      pattern)) {
2228 			return ice_hw_ptype_ena(&ad->hw,
2229 						ice_ptype_map[i].hw_ptype);
2230 		}
2231 	}
2232 
2233 	return false;
2234 }
2235 
2236 struct ice_pattern_match_item *
2237 ice_search_pattern_match_item(struct ice_adapter *ad,
2238 			      const struct rte_flow_item pattern[],
2239 			      struct ice_pattern_match_item *array,
2240 			      uint32_t array_len,
2241 			      struct rte_flow_error *error)
2242 {
2243 	struct ice_pattern_match_item *pattern_match_item;
2244 	/* need free by each filter */
2245 	struct rte_flow_item *items; /* used for pattern without VOID items */
2246 	uint32_t item_num = 0; /* non-void item number */
2247 	uint16_t i = 0;
2248 
2249 	/* Get the non-void item number of pattern */
2250 	while ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_END) {
2251 		if ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_VOID)
2252 			item_num++;
2253 		i++;
2254 	}
2255 	item_num++;
2256 
2257 	items = rte_zmalloc("ice_pattern",
2258 			    item_num * sizeof(struct rte_flow_item), 0);
2259 	if (!items) {
2260 		rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
2261 				   NULL, "No memory for PMD internal items.");
2262 		return NULL;
2263 	}
2264 	pattern_match_item = rte_zmalloc("ice_pattern_match_item",
2265 			sizeof(struct ice_pattern_match_item), 0);
2266 	if (!pattern_match_item) {
2267 		rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_HANDLE,
2268 				NULL, "Failed to allocate memory.");
2269 		rte_free(items);
2270 		return NULL;
2271 	}
2272 
2273 	ice_pattern_skip_void_item(items, pattern);
2274 
2275 	if (!ice_pattern_is_supported(ad, pattern))
2276 		goto unsupported;
2277 
2278 	for (i = 0; i < array_len; i++) {
2279 		if (ice_match_pattern(array[i].pattern_list,
2280 				      items)) {
2281 			pattern_match_item->input_set_mask_o =
2282 				array[i].input_set_mask_o;
2283 			pattern_match_item->input_set_mask_i =
2284 				array[i].input_set_mask_i;
2285 			pattern_match_item->pattern_list =
2286 				array[i].pattern_list;
2287 			pattern_match_item->meta = array[i].meta;
2288 			rte_free(items);
2289 			return pattern_match_item;
2290 		}
2291 	}
2292 
2293 unsupported:
2294 	rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM,
2295 			   pattern, "Unsupported pattern");
2296 	rte_free(items);
2297 	rte_free(pattern_match_item);
2298 	return NULL;
2299 }
2300 
2301 static struct ice_flow_engine *
2302 ice_parse_engine_create(struct ice_adapter *ad,
2303 		struct rte_flow *flow,
2304 		struct ice_parser_list *parser_list,
2305 		uint32_t priority,
2306 		const struct rte_flow_item pattern[],
2307 		const struct rte_flow_action actions[],
2308 		struct rte_flow_error *error)
2309 {
2310 	struct ice_flow_engine *engine = NULL;
2311 	struct ice_flow_parser_node *parser_node;
2312 	void *meta = NULL;
2313 	void *temp;
2314 
2315 	RTE_TAILQ_FOREACH_SAFE(parser_node, parser_list, node, temp) {
2316 		int ret;
2317 
2318 		if (parser_node->parser->parse_pattern_action(ad,
2319 				parser_node->parser->array,
2320 				parser_node->parser->array_len,
2321 				pattern, actions, priority, &meta, error) < 0)
2322 			continue;
2323 
2324 		engine = parser_node->parser->engine;
2325 		RTE_ASSERT(engine->create != NULL);
2326 		ret = engine->create(ad, flow, meta, error);
2327 		if (ret == 0)
2328 			return engine;
2329 		else if (ret == -EEXIST)
2330 			return NULL;
2331 	}
2332 	return NULL;
2333 }
2334 
2335 static struct ice_flow_engine *
2336 ice_parse_engine_validate(struct ice_adapter *ad,
2337 		struct rte_flow *flow __rte_unused,
2338 		struct ice_parser_list *parser_list,
2339 		uint32_t priority,
2340 		const struct rte_flow_item pattern[],
2341 		const struct rte_flow_action actions[],
2342 		struct rte_flow_error *error)
2343 {
2344 	struct ice_flow_engine *engine = NULL;
2345 	struct ice_flow_parser_node *parser_node;
2346 	void *temp;
2347 
2348 	RTE_TAILQ_FOREACH_SAFE(parser_node, parser_list, node, temp) {
2349 		if (parser_node->parser->parse_pattern_action(ad,
2350 				parser_node->parser->array,
2351 				parser_node->parser->array_len,
2352 				pattern, actions, priority, NULL, error) < 0)
2353 			continue;
2354 
2355 		engine = parser_node->parser->engine;
2356 		break;
2357 	}
2358 	return engine;
2359 }
2360 
2361 static int
2362 ice_flow_process_filter(struct rte_eth_dev *dev,
2363 		struct rte_flow *flow,
2364 		const struct rte_flow_attr *attr,
2365 		const struct rte_flow_item pattern[],
2366 		const struct rte_flow_action actions[],
2367 		struct ice_flow_engine **engine,
2368 		parse_engine_t ice_parse_engine,
2369 		struct rte_flow_error *error)
2370 {
2371 	int ret = ICE_ERR_NOT_SUPPORTED;
2372 	struct ice_adapter *ad =
2373 		ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
2374 	struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
2375 	int ice_pipeline_stage = 0;
2376 
2377 	if (!pattern) {
2378 		rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
2379 				   NULL, "NULL pattern.");
2380 		return -rte_errno;
2381 	}
2382 
2383 	if (!actions || actions->type == RTE_FLOW_ACTION_TYPE_END) {
2384 		rte_flow_error_set(error, EINVAL,
2385 				   RTE_FLOW_ERROR_TYPE_ACTION_NUM,
2386 				   NULL, "NULL action.");
2387 		return -rte_errno;
2388 	}
2389 
2390 	if (!attr) {
2391 		rte_flow_error_set(error, EINVAL,
2392 				   RTE_FLOW_ERROR_TYPE_ATTR,
2393 				   NULL, "NULL attribute.");
2394 		return -rte_errno;
2395 	}
2396 
2397 	ret = ice_flow_valid_attr(ad, attr, &ice_pipeline_stage, error);
2398 	if (ret)
2399 		return ret;
2400 
2401 	*engine = ice_parse_engine(ad, flow, &pf->rss_parser_list,
2402 			attr->priority, pattern, actions, error);
2403 	if (*engine != NULL)
2404 		return 0;
2405 
2406 	switch (ice_pipeline_stage) {
2407 	case ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY:
2408 	case ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR:
2409 		*engine = ice_parse_engine(ad, flow, &pf->dist_parser_list,
2410 				attr->priority, pattern, actions, error);
2411 		break;
2412 	case ICE_FLOW_CLASSIFY_STAGE_PERMISSION:
2413 		*engine = ice_parse_engine(ad, flow, &pf->perm_parser_list,
2414 				attr->priority, pattern, actions, error);
2415 		break;
2416 	default:
2417 		return -EINVAL;
2418 	}
2419 
2420 	if (*engine == NULL)
2421 		return -EINVAL;
2422 
2423 	return 0;
2424 }
2425 
2426 static int
2427 ice_flow_validate(struct rte_eth_dev *dev,
2428 		const struct rte_flow_attr *attr,
2429 		const struct rte_flow_item pattern[],
2430 		const struct rte_flow_action actions[],
2431 		struct rte_flow_error *error)
2432 {
2433 	struct ice_flow_engine *engine;
2434 
2435 	return ice_flow_process_filter(dev, NULL, attr, pattern, actions,
2436 			&engine, ice_parse_engine_validate, error);
2437 }
2438 
2439 static struct rte_flow *
2440 ice_flow_create(struct rte_eth_dev *dev,
2441 		const struct rte_flow_attr *attr,
2442 		const struct rte_flow_item pattern[],
2443 		const struct rte_flow_action actions[],
2444 		struct rte_flow_error *error)
2445 {
2446 	struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
2447 	struct rte_flow *flow = NULL;
2448 	int ret;
2449 	struct ice_flow_engine *engine = NULL;
2450 
2451 	flow = rte_zmalloc("ice_flow", sizeof(struct rte_flow), 0);
2452 	if (!flow) {
2453 		rte_flow_error_set(error, ENOMEM,
2454 				   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
2455 				   "Failed to allocate memory");
2456 		return flow;
2457 	}
2458 
2459 	rte_spinlock_lock(&pf->flow_ops_lock);
2460 
2461 	ret = ice_flow_process_filter(dev, flow, attr, pattern, actions,
2462 			&engine, ice_parse_engine_create, error);
2463 	if (ret < 0) {
2464 		PMD_DRV_LOG(ERR, "Failed to create flow");
2465 		rte_free(flow);
2466 		flow = NULL;
2467 		goto out;
2468 	}
2469 
2470 	flow->engine = engine;
2471 	TAILQ_INSERT_TAIL(&pf->flow_list, flow, node);
2472 	PMD_DRV_LOG(INFO, "Succeeded to create (%d) flow", engine->type);
2473 
2474 out:
2475 	rte_spinlock_unlock(&pf->flow_ops_lock);
2476 	return flow;
2477 }
2478 
2479 static int
2480 ice_flow_destroy(struct rte_eth_dev *dev,
2481 		struct rte_flow *flow,
2482 		struct rte_flow_error *error)
2483 {
2484 	struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
2485 	struct ice_adapter *ad =
2486 		ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
2487 	int ret = 0;
2488 
2489 	if (!flow || !flow->engine || !flow->engine->destroy) {
2490 		rte_flow_error_set(error, EINVAL,
2491 				RTE_FLOW_ERROR_TYPE_HANDLE,
2492 				NULL, "Invalid flow");
2493 		return -rte_errno;
2494 	}
2495 
2496 	rte_spinlock_lock(&pf->flow_ops_lock);
2497 
2498 	ret = flow->engine->destroy(ad, flow, error);
2499 	if (!ret) {
2500 		TAILQ_REMOVE(&pf->flow_list, flow, node);
2501 		rte_free(flow);
2502 	} else {
2503 		PMD_DRV_LOG(ERR, "Failed to destroy flow");
2504 	}
2505 
2506 	rte_spinlock_unlock(&pf->flow_ops_lock);
2507 
2508 	return ret;
2509 }
2510 
2511 static int
2512 ice_flow_flush(struct rte_eth_dev *dev,
2513 		struct rte_flow_error *error)
2514 {
2515 	struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
2516 	struct rte_flow *p_flow;
2517 	void *temp;
2518 	int ret = 0;
2519 
2520 	RTE_TAILQ_FOREACH_SAFE(p_flow, &pf->flow_list, node, temp) {
2521 		ret = ice_flow_destroy(dev, p_flow, error);
2522 		if (ret) {
2523 			PMD_DRV_LOG(ERR, "Failed to flush flows");
2524 			if (ret != -EAGAIN)
2525 				ret = -EINVAL;
2526 			return ret;
2527 		}
2528 	}
2529 
2530 	return ret;
2531 }
2532 
2533 static int
2534 ice_flow_query(struct rte_eth_dev *dev,
2535 		struct rte_flow *flow,
2536 		const struct rte_flow_action *actions,
2537 		void *data,
2538 		struct rte_flow_error *error)
2539 {
2540 	int ret = -EINVAL;
2541 	struct ice_adapter *ad =
2542 		ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
2543 	struct rte_flow_query_count *count = data;
2544 	struct ice_pf *pf = &ad->pf;
2545 
2546 	if (!flow || !flow->engine || !flow->engine->query_count) {
2547 		rte_flow_error_set(error, EINVAL,
2548 				RTE_FLOW_ERROR_TYPE_HANDLE,
2549 				NULL, "Invalid flow");
2550 		return -rte_errno;
2551 	}
2552 
2553 	rte_spinlock_lock(&pf->flow_ops_lock);
2554 
2555 	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
2556 		switch (actions->type) {
2557 		case RTE_FLOW_ACTION_TYPE_VOID:
2558 			break;
2559 		case RTE_FLOW_ACTION_TYPE_COUNT:
2560 			ret = flow->engine->query_count(ad, flow, count, error);
2561 			break;
2562 		default:
2563 			ret = rte_flow_error_set(error, ENOTSUP,
2564 					RTE_FLOW_ERROR_TYPE_ACTION,
2565 					actions,
2566 					"action not supported");
2567 			goto out;
2568 		}
2569 	}
2570 
2571 out:
2572 	rte_spinlock_unlock(&pf->flow_ops_lock);
2573 	return ret;
2574 }
2575 
2576 int
2577 ice_flow_redirect(struct ice_adapter *ad,
2578 		  struct ice_flow_redirect *rd)
2579 {
2580 	struct ice_pf *pf = &ad->pf;
2581 	struct rte_flow *p_flow;
2582 	void *temp;
2583 	int ret = 0;
2584 
2585 	rte_spinlock_lock(&pf->flow_ops_lock);
2586 
2587 	RTE_TAILQ_FOREACH_SAFE(p_flow, &pf->flow_list, node, temp) {
2588 		if (!p_flow->engine->redirect)
2589 			continue;
2590 		ret = p_flow->engine->redirect(ad, p_flow, rd);
2591 		if (ret) {
2592 			PMD_DRV_LOG(ERR, "Failed to redirect flows");
2593 			break;
2594 		}
2595 	}
2596 
2597 	rte_spinlock_unlock(&pf->flow_ops_lock);
2598 
2599 	return ret;
2600 }
2601