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