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