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