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