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