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