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