net/ice: fix outer L4 checksum in scalar Rx
[dpdk.git] / drivers / net / iavf / iavf_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 "iavf.h"
19 #include "iavf_generic_flow.h"
20
21 static struct iavf_engine_list engine_list =
22                 TAILQ_HEAD_INITIALIZER(engine_list);
23
24 static int iavf_flow_validate(struct rte_eth_dev *dev,
25                 const struct rte_flow_attr *attr,
26                 const struct rte_flow_item pattern[],
27                 const struct rte_flow_action actions[],
28                 struct rte_flow_error *error);
29 static struct rte_flow *iavf_flow_create(struct rte_eth_dev *dev,
30                 const struct rte_flow_attr *attr,
31                 const struct rte_flow_item pattern[],
32                 const struct rte_flow_action actions[],
33                 struct rte_flow_error *error);
34 static int iavf_flow_destroy(struct rte_eth_dev *dev,
35                 struct rte_flow *flow,
36                 struct rte_flow_error *error);
37 static int iavf_flow_query(struct rte_eth_dev *dev,
38                 struct rte_flow *flow,
39                 const struct rte_flow_action *actions,
40                 void *data,
41                 struct rte_flow_error *error);
42
43 const struct rte_flow_ops iavf_flow_ops = {
44         .validate = iavf_flow_validate,
45         .create = iavf_flow_create,
46         .destroy = iavf_flow_destroy,
47         .flush = iavf_flow_flush,
48         .query = iavf_flow_query,
49 };
50
51 /* raw */
52 enum rte_flow_item_type iavf_pattern_raw[] = {
53         RTE_FLOW_ITEM_TYPE_RAW,
54         RTE_FLOW_ITEM_TYPE_END,
55 };
56
57 /* empty */
58 enum rte_flow_item_type iavf_pattern_empty[] = {
59         RTE_FLOW_ITEM_TYPE_END,
60 };
61
62 /* L2 */
63 enum rte_flow_item_type iavf_pattern_ethertype[] = {
64         RTE_FLOW_ITEM_TYPE_ETH,
65         RTE_FLOW_ITEM_TYPE_END,
66 };
67
68 enum rte_flow_item_type iavf_pattern_ethertype_vlan[] = {
69         RTE_FLOW_ITEM_TYPE_ETH,
70         RTE_FLOW_ITEM_TYPE_VLAN,
71         RTE_FLOW_ITEM_TYPE_END,
72 };
73
74 enum rte_flow_item_type iavf_pattern_ethertype_qinq[] = {
75         RTE_FLOW_ITEM_TYPE_ETH,
76         RTE_FLOW_ITEM_TYPE_VLAN,
77         RTE_FLOW_ITEM_TYPE_VLAN,
78         RTE_FLOW_ITEM_TYPE_END,
79 };
80
81 /* ARP */
82 enum rte_flow_item_type iavf_pattern_eth_arp[] = {
83         RTE_FLOW_ITEM_TYPE_ETH,
84         RTE_FLOW_ITEM_TYPE_ARP_ETH_IPV4,
85         RTE_FLOW_ITEM_TYPE_END,
86 };
87
88 /* non-tunnel IPv4 */
89 enum rte_flow_item_type iavf_pattern_eth_ipv4[] = {
90         RTE_FLOW_ITEM_TYPE_ETH,
91         RTE_FLOW_ITEM_TYPE_IPV4,
92         RTE_FLOW_ITEM_TYPE_END,
93 };
94
95 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv4[] = {
96         RTE_FLOW_ITEM_TYPE_ETH,
97         RTE_FLOW_ITEM_TYPE_VLAN,
98         RTE_FLOW_ITEM_TYPE_IPV4,
99         RTE_FLOW_ITEM_TYPE_END,
100 };
101
102 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv4[] = {
103         RTE_FLOW_ITEM_TYPE_ETH,
104         RTE_FLOW_ITEM_TYPE_VLAN,
105         RTE_FLOW_ITEM_TYPE_VLAN,
106         RTE_FLOW_ITEM_TYPE_IPV4,
107         RTE_FLOW_ITEM_TYPE_END,
108 };
109
110 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp[] = {
111         RTE_FLOW_ITEM_TYPE_ETH,
112         RTE_FLOW_ITEM_TYPE_IPV4,
113         RTE_FLOW_ITEM_TYPE_UDP,
114         RTE_FLOW_ITEM_TYPE_END,
115 };
116
117 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv4_udp[] = {
118         RTE_FLOW_ITEM_TYPE_ETH,
119         RTE_FLOW_ITEM_TYPE_VLAN,
120         RTE_FLOW_ITEM_TYPE_IPV4,
121         RTE_FLOW_ITEM_TYPE_UDP,
122         RTE_FLOW_ITEM_TYPE_END,
123 };
124
125 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv4_udp[] = {
126         RTE_FLOW_ITEM_TYPE_ETH,
127         RTE_FLOW_ITEM_TYPE_VLAN,
128         RTE_FLOW_ITEM_TYPE_VLAN,
129         RTE_FLOW_ITEM_TYPE_IPV4,
130         RTE_FLOW_ITEM_TYPE_UDP,
131         RTE_FLOW_ITEM_TYPE_END,
132 };
133
134 enum rte_flow_item_type iavf_pattern_eth_ipv4_tcp[] = {
135         RTE_FLOW_ITEM_TYPE_ETH,
136         RTE_FLOW_ITEM_TYPE_IPV4,
137         RTE_FLOW_ITEM_TYPE_TCP,
138         RTE_FLOW_ITEM_TYPE_END,
139 };
140
141 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv4_tcp[] = {
142         RTE_FLOW_ITEM_TYPE_ETH,
143         RTE_FLOW_ITEM_TYPE_VLAN,
144         RTE_FLOW_ITEM_TYPE_IPV4,
145         RTE_FLOW_ITEM_TYPE_TCP,
146         RTE_FLOW_ITEM_TYPE_END,
147 };
148
149 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv4_tcp[] = {
150         RTE_FLOW_ITEM_TYPE_ETH,
151         RTE_FLOW_ITEM_TYPE_VLAN,
152         RTE_FLOW_ITEM_TYPE_VLAN,
153         RTE_FLOW_ITEM_TYPE_IPV4,
154         RTE_FLOW_ITEM_TYPE_TCP,
155         RTE_FLOW_ITEM_TYPE_END,
156 };
157
158 enum rte_flow_item_type iavf_pattern_eth_ipv4_sctp[] = {
159         RTE_FLOW_ITEM_TYPE_ETH,
160         RTE_FLOW_ITEM_TYPE_IPV4,
161         RTE_FLOW_ITEM_TYPE_SCTP,
162         RTE_FLOW_ITEM_TYPE_END,
163 };
164
165 enum rte_flow_item_type iavf_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
173 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv4_sctp[] = {
174         RTE_FLOW_ITEM_TYPE_ETH,
175         RTE_FLOW_ITEM_TYPE_VLAN,
176         RTE_FLOW_ITEM_TYPE_VLAN,
177         RTE_FLOW_ITEM_TYPE_IPV4,
178         RTE_FLOW_ITEM_TYPE_SCTP,
179         RTE_FLOW_ITEM_TYPE_END,
180 };
181
182 enum rte_flow_item_type iavf_pattern_eth_ipv4_icmp[] = {
183         RTE_FLOW_ITEM_TYPE_ETH,
184         RTE_FLOW_ITEM_TYPE_IPV4,
185         RTE_FLOW_ITEM_TYPE_ICMP,
186         RTE_FLOW_ITEM_TYPE_END,
187 };
188
189 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv4_icmp[] = {
190         RTE_FLOW_ITEM_TYPE_ETH,
191         RTE_FLOW_ITEM_TYPE_VLAN,
192         RTE_FLOW_ITEM_TYPE_IPV4,
193         RTE_FLOW_ITEM_TYPE_ICMP,
194         RTE_FLOW_ITEM_TYPE_END,
195 };
196
197 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv4_icmp[] = {
198         RTE_FLOW_ITEM_TYPE_ETH,
199         RTE_FLOW_ITEM_TYPE_VLAN,
200         RTE_FLOW_ITEM_TYPE_VLAN,
201         RTE_FLOW_ITEM_TYPE_IPV4,
202         RTE_FLOW_ITEM_TYPE_ICMP,
203         RTE_FLOW_ITEM_TYPE_END,
204 };
205
206 /* non-tunnel IPv6 */
207 enum rte_flow_item_type iavf_pattern_eth_ipv6[] = {
208         RTE_FLOW_ITEM_TYPE_ETH,
209         RTE_FLOW_ITEM_TYPE_IPV6,
210         RTE_FLOW_ITEM_TYPE_END,
211 };
212
213 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6[] = {
214         RTE_FLOW_ITEM_TYPE_ETH,
215         RTE_FLOW_ITEM_TYPE_VLAN,
216         RTE_FLOW_ITEM_TYPE_IPV6,
217         RTE_FLOW_ITEM_TYPE_END,
218 };
219
220 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6[] = {
221         RTE_FLOW_ITEM_TYPE_ETH,
222         RTE_FLOW_ITEM_TYPE_VLAN,
223         RTE_FLOW_ITEM_TYPE_VLAN,
224         RTE_FLOW_ITEM_TYPE_IPV6,
225         RTE_FLOW_ITEM_TYPE_END,
226 };
227
228 enum rte_flow_item_type iavf_pattern_eth_ipv6_frag_ext[] = {
229         RTE_FLOW_ITEM_TYPE_ETH,
230         RTE_FLOW_ITEM_TYPE_IPV6,
231         RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
232         RTE_FLOW_ITEM_TYPE_END,
233 };
234
235 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_frag_ext[] = {
236         RTE_FLOW_ITEM_TYPE_ETH,
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
243 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_frag_ext[] = {
244         RTE_FLOW_ITEM_TYPE_ETH,
245         RTE_FLOW_ITEM_TYPE_VLAN,
246         RTE_FLOW_ITEM_TYPE_VLAN,
247         RTE_FLOW_ITEM_TYPE_IPV6,
248         RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
249         RTE_FLOW_ITEM_TYPE_END,
250 };
251
252 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp[] = {
253         RTE_FLOW_ITEM_TYPE_ETH,
254         RTE_FLOW_ITEM_TYPE_IPV6,
255         RTE_FLOW_ITEM_TYPE_UDP,
256         RTE_FLOW_ITEM_TYPE_END,
257 };
258
259 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_udp[] = {
260         RTE_FLOW_ITEM_TYPE_ETH,
261         RTE_FLOW_ITEM_TYPE_VLAN,
262         RTE_FLOW_ITEM_TYPE_IPV6,
263         RTE_FLOW_ITEM_TYPE_UDP,
264         RTE_FLOW_ITEM_TYPE_END,
265 };
266
267 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_udp[] = {
268         RTE_FLOW_ITEM_TYPE_ETH,
269         RTE_FLOW_ITEM_TYPE_VLAN,
270         RTE_FLOW_ITEM_TYPE_VLAN,
271         RTE_FLOW_ITEM_TYPE_IPV6,
272         RTE_FLOW_ITEM_TYPE_UDP,
273         RTE_FLOW_ITEM_TYPE_END,
274 };
275
276 enum rte_flow_item_type iavf_pattern_eth_ipv6_tcp[] = {
277         RTE_FLOW_ITEM_TYPE_ETH,
278         RTE_FLOW_ITEM_TYPE_IPV6,
279         RTE_FLOW_ITEM_TYPE_TCP,
280         RTE_FLOW_ITEM_TYPE_END,
281 };
282
283 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_tcp[] = {
284         RTE_FLOW_ITEM_TYPE_ETH,
285         RTE_FLOW_ITEM_TYPE_VLAN,
286         RTE_FLOW_ITEM_TYPE_IPV6,
287         RTE_FLOW_ITEM_TYPE_TCP,
288         RTE_FLOW_ITEM_TYPE_END,
289 };
290
291 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_tcp[] = {
292         RTE_FLOW_ITEM_TYPE_ETH,
293         RTE_FLOW_ITEM_TYPE_VLAN,
294         RTE_FLOW_ITEM_TYPE_VLAN,
295         RTE_FLOW_ITEM_TYPE_IPV6,
296         RTE_FLOW_ITEM_TYPE_TCP,
297         RTE_FLOW_ITEM_TYPE_END,
298 };
299
300 enum rte_flow_item_type iavf_pattern_eth_ipv6_sctp[] = {
301         RTE_FLOW_ITEM_TYPE_ETH,
302         RTE_FLOW_ITEM_TYPE_IPV6,
303         RTE_FLOW_ITEM_TYPE_SCTP,
304         RTE_FLOW_ITEM_TYPE_END,
305 };
306
307 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_sctp[] = {
308         RTE_FLOW_ITEM_TYPE_ETH,
309         RTE_FLOW_ITEM_TYPE_VLAN,
310         RTE_FLOW_ITEM_TYPE_IPV6,
311         RTE_FLOW_ITEM_TYPE_SCTP,
312         RTE_FLOW_ITEM_TYPE_END,
313 };
314
315 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_sctp[] = {
316         RTE_FLOW_ITEM_TYPE_ETH,
317         RTE_FLOW_ITEM_TYPE_VLAN,
318         RTE_FLOW_ITEM_TYPE_VLAN,
319         RTE_FLOW_ITEM_TYPE_IPV6,
320         RTE_FLOW_ITEM_TYPE_SCTP,
321         RTE_FLOW_ITEM_TYPE_END,
322 };
323
324 enum rte_flow_item_type iavf_pattern_eth_ipv6_icmp6[] = {
325         RTE_FLOW_ITEM_TYPE_ETH,
326         RTE_FLOW_ITEM_TYPE_IPV6,
327         RTE_FLOW_ITEM_TYPE_ICMP6,
328         RTE_FLOW_ITEM_TYPE_END,
329 };
330
331 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_icmp6[] = {
332         RTE_FLOW_ITEM_TYPE_ETH,
333         RTE_FLOW_ITEM_TYPE_VLAN,
334         RTE_FLOW_ITEM_TYPE_IPV6,
335         RTE_FLOW_ITEM_TYPE_ICMP6,
336         RTE_FLOW_ITEM_TYPE_END,
337 };
338
339 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_icmp6[] = {
340         RTE_FLOW_ITEM_TYPE_ETH,
341         RTE_FLOW_ITEM_TYPE_VLAN,
342         RTE_FLOW_ITEM_TYPE_VLAN,
343         RTE_FLOW_ITEM_TYPE_IPV6,
344         RTE_FLOW_ITEM_TYPE_ICMP6,
345         RTE_FLOW_ITEM_TYPE_END,
346 };
347
348 /* IPv4 GTPC */
349 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpc[] = {
350         RTE_FLOW_ITEM_TYPE_ETH,
351         RTE_FLOW_ITEM_TYPE_IPV4,
352         RTE_FLOW_ITEM_TYPE_UDP,
353         RTE_FLOW_ITEM_TYPE_GTPC,
354         RTE_FLOW_ITEM_TYPE_END,
355 };
356
357 /* IPV4 GTPU (EH) */
358 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu[] = {
359         RTE_FLOW_ITEM_TYPE_ETH,
360         RTE_FLOW_ITEM_TYPE_IPV4,
361         RTE_FLOW_ITEM_TYPE_UDP,
362         RTE_FLOW_ITEM_TYPE_GTPU,
363         RTE_FLOW_ITEM_TYPE_END,
364 };
365
366 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh[] = {
367         RTE_FLOW_ITEM_TYPE_ETH,
368         RTE_FLOW_ITEM_TYPE_IPV4,
369         RTE_FLOW_ITEM_TYPE_UDP,
370         RTE_FLOW_ITEM_TYPE_GTPU,
371         RTE_FLOW_ITEM_TYPE_GTP_PSC,
372         RTE_FLOW_ITEM_TYPE_END,
373 };
374
375 /* IPv6 GTPC */
376 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpc[] = {
377         RTE_FLOW_ITEM_TYPE_ETH,
378         RTE_FLOW_ITEM_TYPE_IPV6,
379         RTE_FLOW_ITEM_TYPE_UDP,
380         RTE_FLOW_ITEM_TYPE_GTPC,
381         RTE_FLOW_ITEM_TYPE_END,
382 };
383
384 /* IPV6 GTPU (EH) */
385 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu[] = {
386         RTE_FLOW_ITEM_TYPE_ETH,
387         RTE_FLOW_ITEM_TYPE_IPV6,
388         RTE_FLOW_ITEM_TYPE_UDP,
389         RTE_FLOW_ITEM_TYPE_GTPU,
390         RTE_FLOW_ITEM_TYPE_END,
391 };
392
393 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh[] = {
394         RTE_FLOW_ITEM_TYPE_ETH,
395         RTE_FLOW_ITEM_TYPE_IPV6,
396         RTE_FLOW_ITEM_TYPE_UDP,
397         RTE_FLOW_ITEM_TYPE_GTPU,
398         RTE_FLOW_ITEM_TYPE_GTP_PSC,
399         RTE_FLOW_ITEM_TYPE_END,
400 };
401
402 /* IPV4 GTPU IPv4 */
403 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv4[] = {
404         RTE_FLOW_ITEM_TYPE_ETH,
405         RTE_FLOW_ITEM_TYPE_IPV4,
406         RTE_FLOW_ITEM_TYPE_UDP,
407         RTE_FLOW_ITEM_TYPE_GTPU,
408         RTE_FLOW_ITEM_TYPE_IPV4,
409         RTE_FLOW_ITEM_TYPE_END,
410 };
411
412 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv4_udp[] = {
413         RTE_FLOW_ITEM_TYPE_ETH,
414         RTE_FLOW_ITEM_TYPE_IPV4,
415         RTE_FLOW_ITEM_TYPE_UDP,
416         RTE_FLOW_ITEM_TYPE_GTPU,
417         RTE_FLOW_ITEM_TYPE_IPV4,
418         RTE_FLOW_ITEM_TYPE_UDP,
419         RTE_FLOW_ITEM_TYPE_END,
420 };
421
422 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv4_tcp[] = {
423         RTE_FLOW_ITEM_TYPE_ETH,
424         RTE_FLOW_ITEM_TYPE_IPV4,
425         RTE_FLOW_ITEM_TYPE_UDP,
426         RTE_FLOW_ITEM_TYPE_GTPU,
427         RTE_FLOW_ITEM_TYPE_IPV4,
428         RTE_FLOW_ITEM_TYPE_TCP,
429         RTE_FLOW_ITEM_TYPE_END,
430 };
431
432 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv4_icmp[] = {
433         RTE_FLOW_ITEM_TYPE_ETH,
434         RTE_FLOW_ITEM_TYPE_IPV4,
435         RTE_FLOW_ITEM_TYPE_UDP,
436         RTE_FLOW_ITEM_TYPE_GTPU,
437         RTE_FLOW_ITEM_TYPE_IPV4,
438         RTE_FLOW_ITEM_TYPE_ICMP,
439         RTE_FLOW_ITEM_TYPE_END,
440 };
441
442 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu[] = {
443         RTE_FLOW_ITEM_TYPE_ETH,
444         RTE_FLOW_ITEM_TYPE_IPV4,
445         RTE_FLOW_ITEM_TYPE_GRE,
446         RTE_FLOW_ITEM_TYPE_IPV4,
447         RTE_FLOW_ITEM_TYPE_UDP,
448         RTE_FLOW_ITEM_TYPE_GTPU,
449         RTE_FLOW_ITEM_TYPE_END,
450 };
451
452 /* IPV4 GRE IPv4 UDP GTPU IPv4*/
453 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4[] = {
454         RTE_FLOW_ITEM_TYPE_ETH,
455         RTE_FLOW_ITEM_TYPE_IPV4,
456         RTE_FLOW_ITEM_TYPE_GRE,
457         RTE_FLOW_ITEM_TYPE_IPV4,
458         RTE_FLOW_ITEM_TYPE_UDP,
459         RTE_FLOW_ITEM_TYPE_GTPU,
460         RTE_FLOW_ITEM_TYPE_IPV4,
461         RTE_FLOW_ITEM_TYPE_END,
462 };
463
464 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4_udp[] = {
465         RTE_FLOW_ITEM_TYPE_ETH,
466         RTE_FLOW_ITEM_TYPE_IPV4,
467         RTE_FLOW_ITEM_TYPE_GRE,
468         RTE_FLOW_ITEM_TYPE_IPV4,
469         RTE_FLOW_ITEM_TYPE_UDP,
470         RTE_FLOW_ITEM_TYPE_GTPU,
471         RTE_FLOW_ITEM_TYPE_IPV4,
472         RTE_FLOW_ITEM_TYPE_UDP,
473         RTE_FLOW_ITEM_TYPE_END,
474 };
475
476 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4_tcp[] = {
477         RTE_FLOW_ITEM_TYPE_ETH,
478         RTE_FLOW_ITEM_TYPE_IPV4,
479         RTE_FLOW_ITEM_TYPE_GRE,
480         RTE_FLOW_ITEM_TYPE_IPV4,
481         RTE_FLOW_ITEM_TYPE_UDP,
482         RTE_FLOW_ITEM_TYPE_GTPU,
483         RTE_FLOW_ITEM_TYPE_IPV4,
484         RTE_FLOW_ITEM_TYPE_TCP,
485         RTE_FLOW_ITEM_TYPE_END,
486 };
487
488 /* IPV4 GRE IPv4 UDP GTPU IPv6*/
489 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6[] = {
490         RTE_FLOW_ITEM_TYPE_ETH,
491         RTE_FLOW_ITEM_TYPE_IPV4,
492         RTE_FLOW_ITEM_TYPE_GRE,
493         RTE_FLOW_ITEM_TYPE_IPV4,
494         RTE_FLOW_ITEM_TYPE_UDP,
495         RTE_FLOW_ITEM_TYPE_GTPU,
496         RTE_FLOW_ITEM_TYPE_IPV6,
497         RTE_FLOW_ITEM_TYPE_END,
498 };
499
500 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6_udp[] = {
501         RTE_FLOW_ITEM_TYPE_ETH,
502         RTE_FLOW_ITEM_TYPE_IPV4,
503         RTE_FLOW_ITEM_TYPE_GRE,
504         RTE_FLOW_ITEM_TYPE_IPV4,
505         RTE_FLOW_ITEM_TYPE_UDP,
506         RTE_FLOW_ITEM_TYPE_GTPU,
507         RTE_FLOW_ITEM_TYPE_IPV6,
508         RTE_FLOW_ITEM_TYPE_UDP,
509         RTE_FLOW_ITEM_TYPE_END,
510 };
511
512 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6_tcp[] = {
513         RTE_FLOW_ITEM_TYPE_ETH,
514         RTE_FLOW_ITEM_TYPE_IPV4,
515         RTE_FLOW_ITEM_TYPE_GRE,
516         RTE_FLOW_ITEM_TYPE_IPV4,
517         RTE_FLOW_ITEM_TYPE_UDP,
518         RTE_FLOW_ITEM_TYPE_GTPU,
519         RTE_FLOW_ITEM_TYPE_IPV6,
520         RTE_FLOW_ITEM_TYPE_TCP,
521         RTE_FLOW_ITEM_TYPE_END,
522 };
523
524 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu[] = {
525         RTE_FLOW_ITEM_TYPE_ETH,
526         RTE_FLOW_ITEM_TYPE_IPV4,
527         RTE_FLOW_ITEM_TYPE_GRE,
528         RTE_FLOW_ITEM_TYPE_IPV6,
529         RTE_FLOW_ITEM_TYPE_UDP,
530         RTE_FLOW_ITEM_TYPE_GTPU,
531         RTE_FLOW_ITEM_TYPE_END,
532 };
533
534 /* IPV4 GRE IPv6 UDP GTPU IPv4*/
535 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4[] = {
536         RTE_FLOW_ITEM_TYPE_ETH,
537         RTE_FLOW_ITEM_TYPE_IPV4,
538         RTE_FLOW_ITEM_TYPE_GRE,
539         RTE_FLOW_ITEM_TYPE_IPV6,
540         RTE_FLOW_ITEM_TYPE_UDP,
541         RTE_FLOW_ITEM_TYPE_GTPU,
542         RTE_FLOW_ITEM_TYPE_IPV4,
543         RTE_FLOW_ITEM_TYPE_END,
544 };
545
546 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4_udp[] = {
547         RTE_FLOW_ITEM_TYPE_ETH,
548         RTE_FLOW_ITEM_TYPE_IPV4,
549         RTE_FLOW_ITEM_TYPE_GRE,
550         RTE_FLOW_ITEM_TYPE_IPV6,
551         RTE_FLOW_ITEM_TYPE_UDP,
552         RTE_FLOW_ITEM_TYPE_GTPU,
553         RTE_FLOW_ITEM_TYPE_IPV4,
554         RTE_FLOW_ITEM_TYPE_UDP,
555         RTE_FLOW_ITEM_TYPE_END,
556 };
557
558 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4_tcp[] = {
559         RTE_FLOW_ITEM_TYPE_ETH,
560         RTE_FLOW_ITEM_TYPE_IPV4,
561         RTE_FLOW_ITEM_TYPE_GRE,
562         RTE_FLOW_ITEM_TYPE_IPV6,
563         RTE_FLOW_ITEM_TYPE_UDP,
564         RTE_FLOW_ITEM_TYPE_GTPU,
565         RTE_FLOW_ITEM_TYPE_IPV4,
566         RTE_FLOW_ITEM_TYPE_TCP,
567         RTE_FLOW_ITEM_TYPE_END,
568 };
569
570 /* IPV4 GRE IPv6 UDP GTPU IPv6*/
571 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6[] = {
572         RTE_FLOW_ITEM_TYPE_ETH,
573         RTE_FLOW_ITEM_TYPE_IPV4,
574         RTE_FLOW_ITEM_TYPE_GRE,
575         RTE_FLOW_ITEM_TYPE_IPV6,
576         RTE_FLOW_ITEM_TYPE_UDP,
577         RTE_FLOW_ITEM_TYPE_GTPU,
578         RTE_FLOW_ITEM_TYPE_IPV6,
579         RTE_FLOW_ITEM_TYPE_END,
580 };
581
582 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6_udp[] = {
583         RTE_FLOW_ITEM_TYPE_ETH,
584         RTE_FLOW_ITEM_TYPE_IPV4,
585         RTE_FLOW_ITEM_TYPE_GRE,
586         RTE_FLOW_ITEM_TYPE_IPV6,
587         RTE_FLOW_ITEM_TYPE_UDP,
588         RTE_FLOW_ITEM_TYPE_GTPU,
589         RTE_FLOW_ITEM_TYPE_IPV6,
590         RTE_FLOW_ITEM_TYPE_UDP,
591         RTE_FLOW_ITEM_TYPE_END,
592 };
593
594 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6_tcp[] = {
595         RTE_FLOW_ITEM_TYPE_ETH,
596         RTE_FLOW_ITEM_TYPE_IPV4,
597         RTE_FLOW_ITEM_TYPE_GRE,
598         RTE_FLOW_ITEM_TYPE_IPV6,
599         RTE_FLOW_ITEM_TYPE_UDP,
600         RTE_FLOW_ITEM_TYPE_GTPU,
601         RTE_FLOW_ITEM_TYPE_IPV6,
602         RTE_FLOW_ITEM_TYPE_TCP,
603         RTE_FLOW_ITEM_TYPE_END,
604 };
605
606 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu[] = {
607         RTE_FLOW_ITEM_TYPE_ETH,
608         RTE_FLOW_ITEM_TYPE_IPV6,
609         RTE_FLOW_ITEM_TYPE_GRE,
610         RTE_FLOW_ITEM_TYPE_IPV4,
611         RTE_FLOW_ITEM_TYPE_UDP,
612         RTE_FLOW_ITEM_TYPE_GTPU,
613         RTE_FLOW_ITEM_TYPE_END,
614 };
615
616 /* IPV6 GRE IPv4 UDP GTPU IPv4*/
617 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4[] = {
618         RTE_FLOW_ITEM_TYPE_ETH,
619         RTE_FLOW_ITEM_TYPE_IPV6,
620         RTE_FLOW_ITEM_TYPE_GRE,
621         RTE_FLOW_ITEM_TYPE_IPV4,
622         RTE_FLOW_ITEM_TYPE_UDP,
623         RTE_FLOW_ITEM_TYPE_GTPU,
624         RTE_FLOW_ITEM_TYPE_IPV4,
625         RTE_FLOW_ITEM_TYPE_END,
626 };
627
628 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4_udp[] = {
629         RTE_FLOW_ITEM_TYPE_ETH,
630         RTE_FLOW_ITEM_TYPE_IPV6,
631         RTE_FLOW_ITEM_TYPE_GRE,
632         RTE_FLOW_ITEM_TYPE_IPV4,
633         RTE_FLOW_ITEM_TYPE_UDP,
634         RTE_FLOW_ITEM_TYPE_GTPU,
635         RTE_FLOW_ITEM_TYPE_IPV4,
636         RTE_FLOW_ITEM_TYPE_UDP,
637         RTE_FLOW_ITEM_TYPE_END,
638 };
639
640 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4_tcp[] = {
641         RTE_FLOW_ITEM_TYPE_ETH,
642         RTE_FLOW_ITEM_TYPE_IPV6,
643         RTE_FLOW_ITEM_TYPE_GRE,
644         RTE_FLOW_ITEM_TYPE_IPV4,
645         RTE_FLOW_ITEM_TYPE_UDP,
646         RTE_FLOW_ITEM_TYPE_GTPU,
647         RTE_FLOW_ITEM_TYPE_IPV4,
648         RTE_FLOW_ITEM_TYPE_TCP,
649         RTE_FLOW_ITEM_TYPE_END,
650 };
651
652 /* IPV4 GRE IPv4 UDP GTPU IPv6*/
653 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6[] = {
654         RTE_FLOW_ITEM_TYPE_ETH,
655         RTE_FLOW_ITEM_TYPE_IPV6,
656         RTE_FLOW_ITEM_TYPE_GRE,
657         RTE_FLOW_ITEM_TYPE_IPV4,
658         RTE_FLOW_ITEM_TYPE_UDP,
659         RTE_FLOW_ITEM_TYPE_GTPU,
660         RTE_FLOW_ITEM_TYPE_IPV6,
661         RTE_FLOW_ITEM_TYPE_END,
662 };
663
664 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6_udp[] = {
665         RTE_FLOW_ITEM_TYPE_ETH,
666         RTE_FLOW_ITEM_TYPE_IPV6,
667         RTE_FLOW_ITEM_TYPE_GRE,
668         RTE_FLOW_ITEM_TYPE_IPV4,
669         RTE_FLOW_ITEM_TYPE_UDP,
670         RTE_FLOW_ITEM_TYPE_GTPU,
671         RTE_FLOW_ITEM_TYPE_IPV6,
672         RTE_FLOW_ITEM_TYPE_UDP,
673         RTE_FLOW_ITEM_TYPE_END,
674 };
675
676 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6_tcp[] = {
677         RTE_FLOW_ITEM_TYPE_ETH,
678         RTE_FLOW_ITEM_TYPE_IPV6,
679         RTE_FLOW_ITEM_TYPE_GRE,
680         RTE_FLOW_ITEM_TYPE_IPV4,
681         RTE_FLOW_ITEM_TYPE_UDP,
682         RTE_FLOW_ITEM_TYPE_GTPU,
683         RTE_FLOW_ITEM_TYPE_IPV6,
684         RTE_FLOW_ITEM_TYPE_TCP,
685         RTE_FLOW_ITEM_TYPE_END,
686 };
687
688 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu[] = {
689         RTE_FLOW_ITEM_TYPE_ETH,
690         RTE_FLOW_ITEM_TYPE_IPV6,
691         RTE_FLOW_ITEM_TYPE_GRE,
692         RTE_FLOW_ITEM_TYPE_IPV6,
693         RTE_FLOW_ITEM_TYPE_UDP,
694         RTE_FLOW_ITEM_TYPE_GTPU,
695         RTE_FLOW_ITEM_TYPE_END,
696 };
697
698 /* IPV6 GRE IPv6 UDP GTPU IPv4*/
699 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4[] = {
700         RTE_FLOW_ITEM_TYPE_ETH,
701         RTE_FLOW_ITEM_TYPE_IPV6,
702         RTE_FLOW_ITEM_TYPE_GRE,
703         RTE_FLOW_ITEM_TYPE_IPV6,
704         RTE_FLOW_ITEM_TYPE_UDP,
705         RTE_FLOW_ITEM_TYPE_GTPU,
706         RTE_FLOW_ITEM_TYPE_IPV4,
707         RTE_FLOW_ITEM_TYPE_END,
708 };
709
710 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4_udp[] = {
711         RTE_FLOW_ITEM_TYPE_ETH,
712         RTE_FLOW_ITEM_TYPE_IPV6,
713         RTE_FLOW_ITEM_TYPE_GRE,
714         RTE_FLOW_ITEM_TYPE_IPV6,
715         RTE_FLOW_ITEM_TYPE_UDP,
716         RTE_FLOW_ITEM_TYPE_GTPU,
717         RTE_FLOW_ITEM_TYPE_IPV4,
718         RTE_FLOW_ITEM_TYPE_UDP,
719         RTE_FLOW_ITEM_TYPE_END,
720 };
721
722 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4_tcp[] = {
723         RTE_FLOW_ITEM_TYPE_ETH,
724         RTE_FLOW_ITEM_TYPE_IPV6,
725         RTE_FLOW_ITEM_TYPE_GRE,
726         RTE_FLOW_ITEM_TYPE_IPV6,
727         RTE_FLOW_ITEM_TYPE_UDP,
728         RTE_FLOW_ITEM_TYPE_GTPU,
729         RTE_FLOW_ITEM_TYPE_IPV4,
730         RTE_FLOW_ITEM_TYPE_TCP,
731         RTE_FLOW_ITEM_TYPE_END,
732 };
733
734 /* IPV6 GRE IPv6 UDP GTPU IPv6*/
735 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6[] = {
736         RTE_FLOW_ITEM_TYPE_ETH,
737         RTE_FLOW_ITEM_TYPE_IPV6,
738         RTE_FLOW_ITEM_TYPE_GRE,
739         RTE_FLOW_ITEM_TYPE_IPV6,
740         RTE_FLOW_ITEM_TYPE_UDP,
741         RTE_FLOW_ITEM_TYPE_GTPU,
742         RTE_FLOW_ITEM_TYPE_IPV6,
743         RTE_FLOW_ITEM_TYPE_END,
744 };
745
746 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6_udp[] = {
747         RTE_FLOW_ITEM_TYPE_ETH,
748         RTE_FLOW_ITEM_TYPE_IPV6,
749         RTE_FLOW_ITEM_TYPE_GRE,
750         RTE_FLOW_ITEM_TYPE_IPV6,
751         RTE_FLOW_ITEM_TYPE_UDP,
752         RTE_FLOW_ITEM_TYPE_GTPU,
753         RTE_FLOW_ITEM_TYPE_IPV6,
754         RTE_FLOW_ITEM_TYPE_UDP,
755         RTE_FLOW_ITEM_TYPE_END,
756 };
757
758 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6_tcp[] = {
759         RTE_FLOW_ITEM_TYPE_ETH,
760         RTE_FLOW_ITEM_TYPE_IPV6,
761         RTE_FLOW_ITEM_TYPE_GRE,
762         RTE_FLOW_ITEM_TYPE_IPV6,
763         RTE_FLOW_ITEM_TYPE_UDP,
764         RTE_FLOW_ITEM_TYPE_GTPU,
765         RTE_FLOW_ITEM_TYPE_IPV6,
766         RTE_FLOW_ITEM_TYPE_TCP,
767         RTE_FLOW_ITEM_TYPE_END,
768 };
769
770 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh[] = {
771         RTE_FLOW_ITEM_TYPE_ETH,
772         RTE_FLOW_ITEM_TYPE_IPV4,
773         RTE_FLOW_ITEM_TYPE_GRE,
774         RTE_FLOW_ITEM_TYPE_IPV4,
775         RTE_FLOW_ITEM_TYPE_UDP,
776         RTE_FLOW_ITEM_TYPE_GTPU,
777         RTE_FLOW_ITEM_TYPE_GTP_PSC,
778         RTE_FLOW_ITEM_TYPE_END,
779 };
780
781 /* IPV4 GRE IPv4 UDP GTPU EH IPv4*/
782 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4[] = {
783         RTE_FLOW_ITEM_TYPE_ETH,
784         RTE_FLOW_ITEM_TYPE_IPV4,
785         RTE_FLOW_ITEM_TYPE_GRE,
786         RTE_FLOW_ITEM_TYPE_IPV4,
787         RTE_FLOW_ITEM_TYPE_UDP,
788         RTE_FLOW_ITEM_TYPE_GTPU,
789         RTE_FLOW_ITEM_TYPE_GTP_PSC,
790         RTE_FLOW_ITEM_TYPE_IPV4,
791         RTE_FLOW_ITEM_TYPE_END,
792 };
793
794 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4_udp[] = {
795         RTE_FLOW_ITEM_TYPE_ETH,
796         RTE_FLOW_ITEM_TYPE_IPV4,
797         RTE_FLOW_ITEM_TYPE_GRE,
798         RTE_FLOW_ITEM_TYPE_IPV4,
799         RTE_FLOW_ITEM_TYPE_UDP,
800         RTE_FLOW_ITEM_TYPE_GTPU,
801         RTE_FLOW_ITEM_TYPE_GTP_PSC,
802         RTE_FLOW_ITEM_TYPE_IPV4,
803         RTE_FLOW_ITEM_TYPE_UDP,
804         RTE_FLOW_ITEM_TYPE_END,
805 };
806
807 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4_tcp[] = {
808         RTE_FLOW_ITEM_TYPE_ETH,
809         RTE_FLOW_ITEM_TYPE_IPV4,
810         RTE_FLOW_ITEM_TYPE_GRE,
811         RTE_FLOW_ITEM_TYPE_IPV4,
812         RTE_FLOW_ITEM_TYPE_UDP,
813         RTE_FLOW_ITEM_TYPE_GTPU,
814         RTE_FLOW_ITEM_TYPE_GTP_PSC,
815         RTE_FLOW_ITEM_TYPE_IPV4,
816         RTE_FLOW_ITEM_TYPE_TCP,
817         RTE_FLOW_ITEM_TYPE_END,
818 };
819
820 /* IPV4 GRE IPv4 UDP GTPU IPv6*/
821 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6[] = {
822         RTE_FLOW_ITEM_TYPE_ETH,
823         RTE_FLOW_ITEM_TYPE_IPV4,
824         RTE_FLOW_ITEM_TYPE_GRE,
825         RTE_FLOW_ITEM_TYPE_IPV4,
826         RTE_FLOW_ITEM_TYPE_UDP,
827         RTE_FLOW_ITEM_TYPE_GTPU,
828         RTE_FLOW_ITEM_TYPE_GTP_PSC,
829         RTE_FLOW_ITEM_TYPE_IPV6,
830         RTE_FLOW_ITEM_TYPE_END,
831 };
832
833 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6_udp[] = {
834         RTE_FLOW_ITEM_TYPE_ETH,
835         RTE_FLOW_ITEM_TYPE_IPV4,
836         RTE_FLOW_ITEM_TYPE_GRE,
837         RTE_FLOW_ITEM_TYPE_IPV4,
838         RTE_FLOW_ITEM_TYPE_UDP,
839         RTE_FLOW_ITEM_TYPE_GTPU,
840         RTE_FLOW_ITEM_TYPE_GTP_PSC,
841         RTE_FLOW_ITEM_TYPE_IPV6,
842         RTE_FLOW_ITEM_TYPE_UDP,
843         RTE_FLOW_ITEM_TYPE_END,
844 };
845
846 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6_tcp[] = {
847         RTE_FLOW_ITEM_TYPE_ETH,
848         RTE_FLOW_ITEM_TYPE_IPV4,
849         RTE_FLOW_ITEM_TYPE_GRE,
850         RTE_FLOW_ITEM_TYPE_IPV4,
851         RTE_FLOW_ITEM_TYPE_UDP,
852         RTE_FLOW_ITEM_TYPE_GTPU,
853         RTE_FLOW_ITEM_TYPE_GTP_PSC,
854         RTE_FLOW_ITEM_TYPE_IPV6,
855         RTE_FLOW_ITEM_TYPE_TCP,
856         RTE_FLOW_ITEM_TYPE_END,
857 };
858
859 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh[] = {
860         RTE_FLOW_ITEM_TYPE_ETH,
861         RTE_FLOW_ITEM_TYPE_IPV4,
862         RTE_FLOW_ITEM_TYPE_GRE,
863         RTE_FLOW_ITEM_TYPE_IPV6,
864         RTE_FLOW_ITEM_TYPE_UDP,
865         RTE_FLOW_ITEM_TYPE_GTPU,
866         RTE_FLOW_ITEM_TYPE_GTP_PSC,
867         RTE_FLOW_ITEM_TYPE_END,
868 };
869
870 /* IPV4 GRE IPv6 UDP GTPU EH IPv4*/
871 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4[] = {
872         RTE_FLOW_ITEM_TYPE_ETH,
873         RTE_FLOW_ITEM_TYPE_IPV4,
874         RTE_FLOW_ITEM_TYPE_GRE,
875         RTE_FLOW_ITEM_TYPE_IPV6,
876         RTE_FLOW_ITEM_TYPE_UDP,
877         RTE_FLOW_ITEM_TYPE_GTPU,
878         RTE_FLOW_ITEM_TYPE_GTP_PSC,
879         RTE_FLOW_ITEM_TYPE_IPV4,
880         RTE_FLOW_ITEM_TYPE_END,
881 };
882
883 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4_udp[] = {
884         RTE_FLOW_ITEM_TYPE_ETH,
885         RTE_FLOW_ITEM_TYPE_IPV4,
886         RTE_FLOW_ITEM_TYPE_GRE,
887         RTE_FLOW_ITEM_TYPE_IPV6,
888         RTE_FLOW_ITEM_TYPE_UDP,
889         RTE_FLOW_ITEM_TYPE_GTPU,
890         RTE_FLOW_ITEM_TYPE_GTP_PSC,
891         RTE_FLOW_ITEM_TYPE_IPV4,
892         RTE_FLOW_ITEM_TYPE_UDP,
893         RTE_FLOW_ITEM_TYPE_END,
894 };
895
896 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4_tcp[] = {
897         RTE_FLOW_ITEM_TYPE_ETH,
898         RTE_FLOW_ITEM_TYPE_IPV4,
899         RTE_FLOW_ITEM_TYPE_GRE,
900         RTE_FLOW_ITEM_TYPE_IPV6,
901         RTE_FLOW_ITEM_TYPE_UDP,
902         RTE_FLOW_ITEM_TYPE_GTPU,
903         RTE_FLOW_ITEM_TYPE_GTP_PSC,
904         RTE_FLOW_ITEM_TYPE_IPV4,
905         RTE_FLOW_ITEM_TYPE_TCP,
906         RTE_FLOW_ITEM_TYPE_END,
907 };
908
909 /* IPV4 GRE IPv6 UDP GTPU EH IPv6*/
910 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6[] = {
911         RTE_FLOW_ITEM_TYPE_ETH,
912         RTE_FLOW_ITEM_TYPE_IPV4,
913         RTE_FLOW_ITEM_TYPE_GRE,
914         RTE_FLOW_ITEM_TYPE_IPV6,
915         RTE_FLOW_ITEM_TYPE_UDP,
916         RTE_FLOW_ITEM_TYPE_GTPU,
917         RTE_FLOW_ITEM_TYPE_GTP_PSC,
918         RTE_FLOW_ITEM_TYPE_IPV6,
919         RTE_FLOW_ITEM_TYPE_END,
920 };
921
922 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6_udp[] = {
923         RTE_FLOW_ITEM_TYPE_ETH,
924         RTE_FLOW_ITEM_TYPE_IPV4,
925         RTE_FLOW_ITEM_TYPE_GRE,
926         RTE_FLOW_ITEM_TYPE_IPV6,
927         RTE_FLOW_ITEM_TYPE_UDP,
928         RTE_FLOW_ITEM_TYPE_GTPU,
929         RTE_FLOW_ITEM_TYPE_GTP_PSC,
930         RTE_FLOW_ITEM_TYPE_IPV6,
931         RTE_FLOW_ITEM_TYPE_UDP,
932         RTE_FLOW_ITEM_TYPE_END,
933 };
934
935 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6_tcp[] = {
936         RTE_FLOW_ITEM_TYPE_ETH,
937         RTE_FLOW_ITEM_TYPE_IPV4,
938         RTE_FLOW_ITEM_TYPE_GRE,
939         RTE_FLOW_ITEM_TYPE_IPV6,
940         RTE_FLOW_ITEM_TYPE_UDP,
941         RTE_FLOW_ITEM_TYPE_GTPU,
942         RTE_FLOW_ITEM_TYPE_GTP_PSC,
943         RTE_FLOW_ITEM_TYPE_IPV6,
944         RTE_FLOW_ITEM_TYPE_TCP,
945         RTE_FLOW_ITEM_TYPE_END,
946 };
947
948 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh[] = {
949         RTE_FLOW_ITEM_TYPE_ETH,
950         RTE_FLOW_ITEM_TYPE_IPV6,
951         RTE_FLOW_ITEM_TYPE_GRE,
952         RTE_FLOW_ITEM_TYPE_IPV4,
953         RTE_FLOW_ITEM_TYPE_UDP,
954         RTE_FLOW_ITEM_TYPE_GTPU,
955         RTE_FLOW_ITEM_TYPE_GTP_PSC,
956         RTE_FLOW_ITEM_TYPE_END,
957 };
958
959 /* IPV6 GRE IPv4 UDP GTPU EH IPv4*/
960 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4[] = {
961         RTE_FLOW_ITEM_TYPE_ETH,
962         RTE_FLOW_ITEM_TYPE_IPV6,
963         RTE_FLOW_ITEM_TYPE_GRE,
964         RTE_FLOW_ITEM_TYPE_IPV4,
965         RTE_FLOW_ITEM_TYPE_UDP,
966         RTE_FLOW_ITEM_TYPE_GTPU,
967         RTE_FLOW_ITEM_TYPE_GTP_PSC,
968         RTE_FLOW_ITEM_TYPE_IPV4,
969         RTE_FLOW_ITEM_TYPE_END,
970 };
971
972 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4_udp[] = {
973         RTE_FLOW_ITEM_TYPE_ETH,
974         RTE_FLOW_ITEM_TYPE_IPV6,
975         RTE_FLOW_ITEM_TYPE_GRE,
976         RTE_FLOW_ITEM_TYPE_IPV4,
977         RTE_FLOW_ITEM_TYPE_UDP,
978         RTE_FLOW_ITEM_TYPE_GTPU,
979         RTE_FLOW_ITEM_TYPE_GTP_PSC,
980         RTE_FLOW_ITEM_TYPE_IPV4,
981         RTE_FLOW_ITEM_TYPE_UDP,
982         RTE_FLOW_ITEM_TYPE_END,
983 };
984
985 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4_tcp[] = {
986         RTE_FLOW_ITEM_TYPE_ETH,
987         RTE_FLOW_ITEM_TYPE_IPV6,
988         RTE_FLOW_ITEM_TYPE_GRE,
989         RTE_FLOW_ITEM_TYPE_IPV4,
990         RTE_FLOW_ITEM_TYPE_UDP,
991         RTE_FLOW_ITEM_TYPE_GTPU,
992         RTE_FLOW_ITEM_TYPE_GTP_PSC,
993         RTE_FLOW_ITEM_TYPE_IPV4,
994         RTE_FLOW_ITEM_TYPE_TCP,
995         RTE_FLOW_ITEM_TYPE_END,
996 };
997
998 /* IPV4 GRE IPv4 UDP GTPU EH IPv6*/
999 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6[] = {
1000         RTE_FLOW_ITEM_TYPE_ETH,
1001         RTE_FLOW_ITEM_TYPE_IPV6,
1002         RTE_FLOW_ITEM_TYPE_GRE,
1003         RTE_FLOW_ITEM_TYPE_IPV4,
1004         RTE_FLOW_ITEM_TYPE_UDP,
1005         RTE_FLOW_ITEM_TYPE_GTPU,
1006         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1007         RTE_FLOW_ITEM_TYPE_IPV6,
1008         RTE_FLOW_ITEM_TYPE_END,
1009 };
1010
1011 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6_udp[] = {
1012         RTE_FLOW_ITEM_TYPE_ETH,
1013         RTE_FLOW_ITEM_TYPE_IPV6,
1014         RTE_FLOW_ITEM_TYPE_GRE,
1015         RTE_FLOW_ITEM_TYPE_IPV4,
1016         RTE_FLOW_ITEM_TYPE_UDP,
1017         RTE_FLOW_ITEM_TYPE_GTPU,
1018         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1019         RTE_FLOW_ITEM_TYPE_IPV6,
1020         RTE_FLOW_ITEM_TYPE_UDP,
1021         RTE_FLOW_ITEM_TYPE_END,
1022 };
1023
1024 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6_tcp[] = {
1025         RTE_FLOW_ITEM_TYPE_ETH,
1026         RTE_FLOW_ITEM_TYPE_IPV6,
1027         RTE_FLOW_ITEM_TYPE_GRE,
1028         RTE_FLOW_ITEM_TYPE_IPV4,
1029         RTE_FLOW_ITEM_TYPE_UDP,
1030         RTE_FLOW_ITEM_TYPE_GTPU,
1031         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1032         RTE_FLOW_ITEM_TYPE_IPV6,
1033         RTE_FLOW_ITEM_TYPE_TCP,
1034         RTE_FLOW_ITEM_TYPE_END,
1035 };
1036
1037 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh[] = {
1038         RTE_FLOW_ITEM_TYPE_ETH,
1039         RTE_FLOW_ITEM_TYPE_IPV6,
1040         RTE_FLOW_ITEM_TYPE_GRE,
1041         RTE_FLOW_ITEM_TYPE_IPV6,
1042         RTE_FLOW_ITEM_TYPE_UDP,
1043         RTE_FLOW_ITEM_TYPE_GTPU,
1044         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1045         RTE_FLOW_ITEM_TYPE_END,
1046 };
1047
1048 /* IPV6 GRE IPv6 UDP GTPU EH IPv4*/
1049 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4[] = {
1050         RTE_FLOW_ITEM_TYPE_ETH,
1051         RTE_FLOW_ITEM_TYPE_IPV6,
1052         RTE_FLOW_ITEM_TYPE_GRE,
1053         RTE_FLOW_ITEM_TYPE_IPV6,
1054         RTE_FLOW_ITEM_TYPE_UDP,
1055         RTE_FLOW_ITEM_TYPE_GTPU,
1056         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1057         RTE_FLOW_ITEM_TYPE_IPV4,
1058         RTE_FLOW_ITEM_TYPE_END,
1059 };
1060
1061 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4_udp[] = {
1062         RTE_FLOW_ITEM_TYPE_ETH,
1063         RTE_FLOW_ITEM_TYPE_IPV6,
1064         RTE_FLOW_ITEM_TYPE_GRE,
1065         RTE_FLOW_ITEM_TYPE_IPV6,
1066         RTE_FLOW_ITEM_TYPE_UDP,
1067         RTE_FLOW_ITEM_TYPE_GTPU,
1068         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1069         RTE_FLOW_ITEM_TYPE_IPV4,
1070         RTE_FLOW_ITEM_TYPE_UDP,
1071         RTE_FLOW_ITEM_TYPE_END,
1072 };
1073
1074 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4_tcp[] = {
1075         RTE_FLOW_ITEM_TYPE_ETH,
1076         RTE_FLOW_ITEM_TYPE_IPV6,
1077         RTE_FLOW_ITEM_TYPE_GRE,
1078         RTE_FLOW_ITEM_TYPE_IPV6,
1079         RTE_FLOW_ITEM_TYPE_UDP,
1080         RTE_FLOW_ITEM_TYPE_GTPU,
1081         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1082         RTE_FLOW_ITEM_TYPE_IPV4,
1083         RTE_FLOW_ITEM_TYPE_TCP,
1084         RTE_FLOW_ITEM_TYPE_END,
1085 };
1086
1087 /* IPV6 GRE IPv6 UDP GTPU EH IPv6*/
1088 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6[] = {
1089         RTE_FLOW_ITEM_TYPE_ETH,
1090         RTE_FLOW_ITEM_TYPE_IPV6,
1091         RTE_FLOW_ITEM_TYPE_GRE,
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_IPV6,
1097         RTE_FLOW_ITEM_TYPE_END,
1098 };
1099
1100 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6_udp[] = {
1101         RTE_FLOW_ITEM_TYPE_ETH,
1102         RTE_FLOW_ITEM_TYPE_IPV6,
1103         RTE_FLOW_ITEM_TYPE_GRE,
1104         RTE_FLOW_ITEM_TYPE_IPV6,
1105         RTE_FLOW_ITEM_TYPE_UDP,
1106         RTE_FLOW_ITEM_TYPE_GTPU,
1107         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1108         RTE_FLOW_ITEM_TYPE_IPV6,
1109         RTE_FLOW_ITEM_TYPE_UDP,
1110         RTE_FLOW_ITEM_TYPE_END,
1111 };
1112
1113 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6_tcp[] = {
1114         RTE_FLOW_ITEM_TYPE_ETH,
1115         RTE_FLOW_ITEM_TYPE_IPV6,
1116         RTE_FLOW_ITEM_TYPE_GRE,
1117         RTE_FLOW_ITEM_TYPE_IPV6,
1118         RTE_FLOW_ITEM_TYPE_UDP,
1119         RTE_FLOW_ITEM_TYPE_GTPU,
1120         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1121         RTE_FLOW_ITEM_TYPE_IPV6,
1122         RTE_FLOW_ITEM_TYPE_TCP,
1123         RTE_FLOW_ITEM_TYPE_END,
1124 };
1125
1126 /* IPV4 GTPU IPv6 */
1127 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv6[] = {
1128         RTE_FLOW_ITEM_TYPE_ETH,
1129         RTE_FLOW_ITEM_TYPE_IPV4,
1130         RTE_FLOW_ITEM_TYPE_UDP,
1131         RTE_FLOW_ITEM_TYPE_GTPU,
1132         RTE_FLOW_ITEM_TYPE_IPV6,
1133         RTE_FLOW_ITEM_TYPE_END,
1134 };
1135
1136 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv6_udp[] = {
1137         RTE_FLOW_ITEM_TYPE_ETH,
1138         RTE_FLOW_ITEM_TYPE_IPV4,
1139         RTE_FLOW_ITEM_TYPE_UDP,
1140         RTE_FLOW_ITEM_TYPE_GTPU,
1141         RTE_FLOW_ITEM_TYPE_IPV6,
1142         RTE_FLOW_ITEM_TYPE_UDP,
1143         RTE_FLOW_ITEM_TYPE_END,
1144 };
1145
1146 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv6_tcp[] = {
1147         RTE_FLOW_ITEM_TYPE_ETH,
1148         RTE_FLOW_ITEM_TYPE_IPV4,
1149         RTE_FLOW_ITEM_TYPE_UDP,
1150         RTE_FLOW_ITEM_TYPE_GTPU,
1151         RTE_FLOW_ITEM_TYPE_IPV6,
1152         RTE_FLOW_ITEM_TYPE_TCP,
1153         RTE_FLOW_ITEM_TYPE_END,
1154 };
1155
1156 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv6_icmp[] = {
1157         RTE_FLOW_ITEM_TYPE_ETH,
1158         RTE_FLOW_ITEM_TYPE_IPV4,
1159         RTE_FLOW_ITEM_TYPE_UDP,
1160         RTE_FLOW_ITEM_TYPE_GTPU,
1161         RTE_FLOW_ITEM_TYPE_IPV6,
1162         RTE_FLOW_ITEM_TYPE_ICMP,
1163         RTE_FLOW_ITEM_TYPE_END,
1164 };
1165
1166 /* IPV6 GTPU IPv4 */
1167 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv4[] = {
1168         RTE_FLOW_ITEM_TYPE_ETH,
1169         RTE_FLOW_ITEM_TYPE_IPV6,
1170         RTE_FLOW_ITEM_TYPE_UDP,
1171         RTE_FLOW_ITEM_TYPE_GTPU,
1172         RTE_FLOW_ITEM_TYPE_IPV4,
1173         RTE_FLOW_ITEM_TYPE_END,
1174 };
1175
1176 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv4_udp[] = {
1177         RTE_FLOW_ITEM_TYPE_ETH,
1178         RTE_FLOW_ITEM_TYPE_IPV6,
1179         RTE_FLOW_ITEM_TYPE_UDP,
1180         RTE_FLOW_ITEM_TYPE_GTPU,
1181         RTE_FLOW_ITEM_TYPE_IPV4,
1182         RTE_FLOW_ITEM_TYPE_UDP,
1183         RTE_FLOW_ITEM_TYPE_END,
1184 };
1185
1186 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv4_tcp[] = {
1187         RTE_FLOW_ITEM_TYPE_ETH,
1188         RTE_FLOW_ITEM_TYPE_IPV6,
1189         RTE_FLOW_ITEM_TYPE_UDP,
1190         RTE_FLOW_ITEM_TYPE_GTPU,
1191         RTE_FLOW_ITEM_TYPE_IPV4,
1192         RTE_FLOW_ITEM_TYPE_TCP,
1193         RTE_FLOW_ITEM_TYPE_END,
1194 };
1195
1196 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv4_icmp[] = {
1197         RTE_FLOW_ITEM_TYPE_ETH,
1198         RTE_FLOW_ITEM_TYPE_IPV6,
1199         RTE_FLOW_ITEM_TYPE_UDP,
1200         RTE_FLOW_ITEM_TYPE_GTPU,
1201         RTE_FLOW_ITEM_TYPE_IPV4,
1202         RTE_FLOW_ITEM_TYPE_ICMP,
1203         RTE_FLOW_ITEM_TYPE_END,
1204 };
1205
1206 /* IPV6 GTPU IPv6 */
1207 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv6[] = {
1208         RTE_FLOW_ITEM_TYPE_ETH,
1209         RTE_FLOW_ITEM_TYPE_IPV6,
1210         RTE_FLOW_ITEM_TYPE_UDP,
1211         RTE_FLOW_ITEM_TYPE_GTPU,
1212         RTE_FLOW_ITEM_TYPE_IPV6,
1213         RTE_FLOW_ITEM_TYPE_END,
1214 };
1215
1216 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv6_udp[] = {
1217         RTE_FLOW_ITEM_TYPE_ETH,
1218         RTE_FLOW_ITEM_TYPE_IPV6,
1219         RTE_FLOW_ITEM_TYPE_UDP,
1220         RTE_FLOW_ITEM_TYPE_GTPU,
1221         RTE_FLOW_ITEM_TYPE_IPV6,
1222         RTE_FLOW_ITEM_TYPE_UDP,
1223         RTE_FLOW_ITEM_TYPE_END,
1224 };
1225
1226 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv6_tcp[] = {
1227         RTE_FLOW_ITEM_TYPE_ETH,
1228         RTE_FLOW_ITEM_TYPE_IPV6,
1229         RTE_FLOW_ITEM_TYPE_UDP,
1230         RTE_FLOW_ITEM_TYPE_GTPU,
1231         RTE_FLOW_ITEM_TYPE_IPV6,
1232         RTE_FLOW_ITEM_TYPE_TCP,
1233         RTE_FLOW_ITEM_TYPE_END,
1234 };
1235
1236 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv6_icmp[] = {
1237         RTE_FLOW_ITEM_TYPE_ETH,
1238         RTE_FLOW_ITEM_TYPE_IPV6,
1239         RTE_FLOW_ITEM_TYPE_UDP,
1240         RTE_FLOW_ITEM_TYPE_GTPU,
1241         RTE_FLOW_ITEM_TYPE_IPV6,
1242         RTE_FLOW_ITEM_TYPE_ICMP,
1243         RTE_FLOW_ITEM_TYPE_END,
1244 };
1245
1246 /* IPV4 GTPU EH IPv4 */
1247 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv4[] = {
1248         RTE_FLOW_ITEM_TYPE_ETH,
1249         RTE_FLOW_ITEM_TYPE_IPV4,
1250         RTE_FLOW_ITEM_TYPE_UDP,
1251         RTE_FLOW_ITEM_TYPE_GTPU,
1252         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1253         RTE_FLOW_ITEM_TYPE_IPV4,
1254         RTE_FLOW_ITEM_TYPE_END,
1255 };
1256
1257 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp[] = {
1258         RTE_FLOW_ITEM_TYPE_ETH,
1259         RTE_FLOW_ITEM_TYPE_IPV4,
1260         RTE_FLOW_ITEM_TYPE_UDP,
1261         RTE_FLOW_ITEM_TYPE_GTPU,
1262         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1263         RTE_FLOW_ITEM_TYPE_IPV4,
1264         RTE_FLOW_ITEM_TYPE_UDP,
1265         RTE_FLOW_ITEM_TYPE_END,
1266 };
1267
1268 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp[] = {
1269         RTE_FLOW_ITEM_TYPE_ETH,
1270         RTE_FLOW_ITEM_TYPE_IPV4,
1271         RTE_FLOW_ITEM_TYPE_UDP,
1272         RTE_FLOW_ITEM_TYPE_GTPU,
1273         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1274         RTE_FLOW_ITEM_TYPE_IPV4,
1275         RTE_FLOW_ITEM_TYPE_TCP,
1276         RTE_FLOW_ITEM_TYPE_END,
1277 };
1278
1279 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv4_icmp[] = {
1280         RTE_FLOW_ITEM_TYPE_ETH,
1281         RTE_FLOW_ITEM_TYPE_IPV4,
1282         RTE_FLOW_ITEM_TYPE_UDP,
1283         RTE_FLOW_ITEM_TYPE_GTPU,
1284         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1285         RTE_FLOW_ITEM_TYPE_IPV4,
1286         RTE_FLOW_ITEM_TYPE_ICMP,
1287         RTE_FLOW_ITEM_TYPE_END,
1288 };
1289
1290 /* IPV4 GTPU EH IPv6 */
1291 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv6[] = {
1292         RTE_FLOW_ITEM_TYPE_ETH,
1293         RTE_FLOW_ITEM_TYPE_IPV4,
1294         RTE_FLOW_ITEM_TYPE_UDP,
1295         RTE_FLOW_ITEM_TYPE_GTPU,
1296         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1297         RTE_FLOW_ITEM_TYPE_IPV6,
1298         RTE_FLOW_ITEM_TYPE_END,
1299 };
1300
1301 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv6_udp[] = {
1302         RTE_FLOW_ITEM_TYPE_ETH,
1303         RTE_FLOW_ITEM_TYPE_IPV4,
1304         RTE_FLOW_ITEM_TYPE_UDP,
1305         RTE_FLOW_ITEM_TYPE_GTPU,
1306         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1307         RTE_FLOW_ITEM_TYPE_IPV6,
1308         RTE_FLOW_ITEM_TYPE_UDP,
1309         RTE_FLOW_ITEM_TYPE_END,
1310 };
1311
1312 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv6_tcp[] = {
1313         RTE_FLOW_ITEM_TYPE_ETH,
1314         RTE_FLOW_ITEM_TYPE_IPV4,
1315         RTE_FLOW_ITEM_TYPE_UDP,
1316         RTE_FLOW_ITEM_TYPE_GTPU,
1317         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1318         RTE_FLOW_ITEM_TYPE_IPV6,
1319         RTE_FLOW_ITEM_TYPE_TCP,
1320         RTE_FLOW_ITEM_TYPE_END,
1321 };
1322
1323 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv6_icmp[] = {
1324         RTE_FLOW_ITEM_TYPE_ETH,
1325         RTE_FLOW_ITEM_TYPE_IPV4,
1326         RTE_FLOW_ITEM_TYPE_UDP,
1327         RTE_FLOW_ITEM_TYPE_GTPU,
1328         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1329         RTE_FLOW_ITEM_TYPE_IPV6,
1330         RTE_FLOW_ITEM_TYPE_ICMP,
1331         RTE_FLOW_ITEM_TYPE_END,
1332 };
1333
1334 /* IPV6 GTPU EH IPv4 */
1335 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv4[] = {
1336         RTE_FLOW_ITEM_TYPE_ETH,
1337         RTE_FLOW_ITEM_TYPE_IPV6,
1338         RTE_FLOW_ITEM_TYPE_UDP,
1339         RTE_FLOW_ITEM_TYPE_GTPU,
1340         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1341         RTE_FLOW_ITEM_TYPE_IPV4,
1342         RTE_FLOW_ITEM_TYPE_END,
1343 };
1344
1345 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv4_udp[] = {
1346         RTE_FLOW_ITEM_TYPE_ETH,
1347         RTE_FLOW_ITEM_TYPE_IPV6,
1348         RTE_FLOW_ITEM_TYPE_UDP,
1349         RTE_FLOW_ITEM_TYPE_GTPU,
1350         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1351         RTE_FLOW_ITEM_TYPE_IPV4,
1352         RTE_FLOW_ITEM_TYPE_UDP,
1353         RTE_FLOW_ITEM_TYPE_END,
1354 };
1355
1356 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv4_tcp[] = {
1357         RTE_FLOW_ITEM_TYPE_ETH,
1358         RTE_FLOW_ITEM_TYPE_IPV6,
1359         RTE_FLOW_ITEM_TYPE_UDP,
1360         RTE_FLOW_ITEM_TYPE_GTPU,
1361         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1362         RTE_FLOW_ITEM_TYPE_IPV4,
1363         RTE_FLOW_ITEM_TYPE_TCP,
1364         RTE_FLOW_ITEM_TYPE_END,
1365 };
1366
1367 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv4_icmp[] = {
1368         RTE_FLOW_ITEM_TYPE_ETH,
1369         RTE_FLOW_ITEM_TYPE_IPV6,
1370         RTE_FLOW_ITEM_TYPE_UDP,
1371         RTE_FLOW_ITEM_TYPE_GTPU,
1372         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1373         RTE_FLOW_ITEM_TYPE_IPV4,
1374         RTE_FLOW_ITEM_TYPE_ICMP,
1375         RTE_FLOW_ITEM_TYPE_END,
1376 };
1377
1378 /* IPV6 GTPU EH IPv6 */
1379 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv6[] = {
1380         RTE_FLOW_ITEM_TYPE_ETH,
1381         RTE_FLOW_ITEM_TYPE_IPV6,
1382         RTE_FLOW_ITEM_TYPE_UDP,
1383         RTE_FLOW_ITEM_TYPE_GTPU,
1384         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1385         RTE_FLOW_ITEM_TYPE_IPV6,
1386         RTE_FLOW_ITEM_TYPE_END,
1387 };
1388
1389 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv6_udp[] = {
1390         RTE_FLOW_ITEM_TYPE_ETH,
1391         RTE_FLOW_ITEM_TYPE_IPV6,
1392         RTE_FLOW_ITEM_TYPE_UDP,
1393         RTE_FLOW_ITEM_TYPE_GTPU,
1394         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1395         RTE_FLOW_ITEM_TYPE_IPV6,
1396         RTE_FLOW_ITEM_TYPE_UDP,
1397         RTE_FLOW_ITEM_TYPE_END,
1398 };
1399
1400 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv6_tcp[] = {
1401         RTE_FLOW_ITEM_TYPE_ETH,
1402         RTE_FLOW_ITEM_TYPE_IPV6,
1403         RTE_FLOW_ITEM_TYPE_UDP,
1404         RTE_FLOW_ITEM_TYPE_GTPU,
1405         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1406         RTE_FLOW_ITEM_TYPE_IPV6,
1407         RTE_FLOW_ITEM_TYPE_TCP,
1408         RTE_FLOW_ITEM_TYPE_END,
1409 };
1410
1411 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv6_icmp[] = {
1412         RTE_FLOW_ITEM_TYPE_ETH,
1413         RTE_FLOW_ITEM_TYPE_IPV6,
1414         RTE_FLOW_ITEM_TYPE_UDP,
1415         RTE_FLOW_ITEM_TYPE_GTPU,
1416         RTE_FLOW_ITEM_TYPE_GTP_PSC,
1417         RTE_FLOW_ITEM_TYPE_IPV6,
1418         RTE_FLOW_ITEM_TYPE_ICMP,
1419         RTE_FLOW_ITEM_TYPE_END,
1420 };
1421
1422 /* ESP */
1423 enum rte_flow_item_type iavf_pattern_eth_ipv4_esp[] = {
1424         RTE_FLOW_ITEM_TYPE_ETH,
1425         RTE_FLOW_ITEM_TYPE_IPV4,
1426         RTE_FLOW_ITEM_TYPE_ESP,
1427         RTE_FLOW_ITEM_TYPE_END,
1428 };
1429
1430 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_esp[] = {
1431         RTE_FLOW_ITEM_TYPE_ETH,
1432         RTE_FLOW_ITEM_TYPE_IPV4,
1433         RTE_FLOW_ITEM_TYPE_UDP,
1434         RTE_FLOW_ITEM_TYPE_ESP,
1435         RTE_FLOW_ITEM_TYPE_END,
1436 };
1437
1438 enum rte_flow_item_type iavf_pattern_eth_ipv6_esp[] = {
1439         RTE_FLOW_ITEM_TYPE_ETH,
1440         RTE_FLOW_ITEM_TYPE_IPV6,
1441         RTE_FLOW_ITEM_TYPE_ESP,
1442         RTE_FLOW_ITEM_TYPE_END,
1443 };
1444
1445 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_esp[] = {
1446         RTE_FLOW_ITEM_TYPE_ETH,
1447         RTE_FLOW_ITEM_TYPE_IPV6,
1448         RTE_FLOW_ITEM_TYPE_UDP,
1449         RTE_FLOW_ITEM_TYPE_ESP,
1450         RTE_FLOW_ITEM_TYPE_END,
1451 };
1452
1453 /* AH */
1454 enum rte_flow_item_type iavf_pattern_eth_ipv4_ah[] = {
1455         RTE_FLOW_ITEM_TYPE_ETH,
1456         RTE_FLOW_ITEM_TYPE_IPV4,
1457         RTE_FLOW_ITEM_TYPE_AH,
1458         RTE_FLOW_ITEM_TYPE_END,
1459 };
1460
1461 enum rte_flow_item_type iavf_pattern_eth_ipv6_ah[] = {
1462         RTE_FLOW_ITEM_TYPE_ETH,
1463         RTE_FLOW_ITEM_TYPE_IPV6,
1464         RTE_FLOW_ITEM_TYPE_AH,
1465         RTE_FLOW_ITEM_TYPE_END,
1466 };
1467
1468 /* L2TPV3 */
1469 enum rte_flow_item_type iavf_pattern_eth_ipv4_l2tpv3[] = {
1470         RTE_FLOW_ITEM_TYPE_ETH,
1471         RTE_FLOW_ITEM_TYPE_IPV4,
1472         RTE_FLOW_ITEM_TYPE_L2TPV3OIP,
1473         RTE_FLOW_ITEM_TYPE_END,
1474 };
1475
1476 enum rte_flow_item_type iavf_pattern_eth_ipv6_l2tpv3[] = {
1477         RTE_FLOW_ITEM_TYPE_ETH,
1478         RTE_FLOW_ITEM_TYPE_IPV6,
1479         RTE_FLOW_ITEM_TYPE_L2TPV3OIP,
1480         RTE_FLOW_ITEM_TYPE_END,
1481 };
1482
1483 /* PFCP */
1484 enum rte_flow_item_type iavf_pattern_eth_ipv4_pfcp[] = {
1485         RTE_FLOW_ITEM_TYPE_ETH,
1486         RTE_FLOW_ITEM_TYPE_IPV4,
1487         RTE_FLOW_ITEM_TYPE_UDP,
1488         RTE_FLOW_ITEM_TYPE_PFCP,
1489         RTE_FLOW_ITEM_TYPE_END,
1490 };
1491
1492 enum rte_flow_item_type iavf_pattern_eth_ipv6_pfcp[] = {
1493         RTE_FLOW_ITEM_TYPE_ETH,
1494         RTE_FLOW_ITEM_TYPE_IPV6,
1495         RTE_FLOW_ITEM_TYPE_UDP,
1496         RTE_FLOW_ITEM_TYPE_PFCP,
1497         RTE_FLOW_ITEM_TYPE_END,
1498 };
1499
1500 /* ECPRI */
1501 enum rte_flow_item_type iavf_pattern_eth_ecpri[] = {
1502         RTE_FLOW_ITEM_TYPE_ETH,
1503         RTE_FLOW_ITEM_TYPE_ECPRI,
1504         RTE_FLOW_ITEM_TYPE_END,
1505 };
1506
1507 enum rte_flow_item_type iavf_pattern_eth_ipv4_ecpri[] = {
1508         RTE_FLOW_ITEM_TYPE_ETH,
1509         RTE_FLOW_ITEM_TYPE_IPV4,
1510         RTE_FLOW_ITEM_TYPE_UDP,
1511         RTE_FLOW_ITEM_TYPE_ECPRI,
1512         RTE_FLOW_ITEM_TYPE_END,
1513 };
1514
1515 /* GRE */
1516 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4[] = {
1517         RTE_FLOW_ITEM_TYPE_ETH,
1518         RTE_FLOW_ITEM_TYPE_IPV4,
1519         RTE_FLOW_ITEM_TYPE_GRE,
1520         RTE_FLOW_ITEM_TYPE_IPV4,
1521         RTE_FLOW_ITEM_TYPE_END,
1522 };
1523
1524 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6[] = {
1525         RTE_FLOW_ITEM_TYPE_ETH,
1526         RTE_FLOW_ITEM_TYPE_IPV4,
1527         RTE_FLOW_ITEM_TYPE_GRE,
1528         RTE_FLOW_ITEM_TYPE_IPV6,
1529         RTE_FLOW_ITEM_TYPE_END,
1530 };
1531
1532 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4[] = {
1533         RTE_FLOW_ITEM_TYPE_ETH,
1534         RTE_FLOW_ITEM_TYPE_IPV6,
1535         RTE_FLOW_ITEM_TYPE_GRE,
1536         RTE_FLOW_ITEM_TYPE_IPV4,
1537         RTE_FLOW_ITEM_TYPE_END,
1538 };
1539
1540 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6[] = {
1541         RTE_FLOW_ITEM_TYPE_ETH,
1542         RTE_FLOW_ITEM_TYPE_IPV6,
1543         RTE_FLOW_ITEM_TYPE_GRE,
1544         RTE_FLOW_ITEM_TYPE_IPV6,
1545         RTE_FLOW_ITEM_TYPE_END,
1546 };
1547
1548 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_tcp[] = {
1549         RTE_FLOW_ITEM_TYPE_ETH,
1550         RTE_FLOW_ITEM_TYPE_IPV4,
1551         RTE_FLOW_ITEM_TYPE_GRE,
1552         RTE_FLOW_ITEM_TYPE_IPV4,
1553         RTE_FLOW_ITEM_TYPE_TCP,
1554         RTE_FLOW_ITEM_TYPE_END,
1555 };
1556
1557 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv4_udp[] = {
1558         RTE_FLOW_ITEM_TYPE_ETH,
1559         RTE_FLOW_ITEM_TYPE_IPV4,
1560         RTE_FLOW_ITEM_TYPE_GRE,
1561         RTE_FLOW_ITEM_TYPE_IPV4,
1562         RTE_FLOW_ITEM_TYPE_UDP,
1563         RTE_FLOW_ITEM_TYPE_END,
1564 };
1565
1566 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_tcp[] = {
1567         RTE_FLOW_ITEM_TYPE_ETH,
1568         RTE_FLOW_ITEM_TYPE_IPV4,
1569         RTE_FLOW_ITEM_TYPE_GRE,
1570         RTE_FLOW_ITEM_TYPE_IPV6,
1571         RTE_FLOW_ITEM_TYPE_TCP,
1572         RTE_FLOW_ITEM_TYPE_END,
1573 };
1574
1575 enum rte_flow_item_type iavf_pattern_eth_ipv4_gre_ipv6_udp[] = {
1576         RTE_FLOW_ITEM_TYPE_ETH,
1577         RTE_FLOW_ITEM_TYPE_IPV4,
1578         RTE_FLOW_ITEM_TYPE_GRE,
1579         RTE_FLOW_ITEM_TYPE_IPV6,
1580         RTE_FLOW_ITEM_TYPE_UDP,
1581         RTE_FLOW_ITEM_TYPE_END,
1582 };
1583
1584 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_tcp[] = {
1585         RTE_FLOW_ITEM_TYPE_ETH,
1586         RTE_FLOW_ITEM_TYPE_IPV6,
1587         RTE_FLOW_ITEM_TYPE_GRE,
1588         RTE_FLOW_ITEM_TYPE_IPV4,
1589         RTE_FLOW_ITEM_TYPE_TCP,
1590         RTE_FLOW_ITEM_TYPE_END,
1591 };
1592
1593 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_udp[] = {
1594         RTE_FLOW_ITEM_TYPE_ETH,
1595         RTE_FLOW_ITEM_TYPE_IPV6,
1596         RTE_FLOW_ITEM_TYPE_GRE,
1597         RTE_FLOW_ITEM_TYPE_IPV4,
1598         RTE_FLOW_ITEM_TYPE_UDP,
1599         RTE_FLOW_ITEM_TYPE_END,
1600 };
1601
1602 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_tcp[] = {
1603         RTE_FLOW_ITEM_TYPE_ETH,
1604         RTE_FLOW_ITEM_TYPE_IPV6,
1605         RTE_FLOW_ITEM_TYPE_GRE,
1606         RTE_FLOW_ITEM_TYPE_IPV6,
1607         RTE_FLOW_ITEM_TYPE_TCP,
1608         RTE_FLOW_ITEM_TYPE_END,
1609 };
1610
1611 enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_udp[] = {
1612         RTE_FLOW_ITEM_TYPE_ETH,
1613         RTE_FLOW_ITEM_TYPE_IPV6,
1614         RTE_FLOW_ITEM_TYPE_GRE,
1615         RTE_FLOW_ITEM_TYPE_IPV6,
1616         RTE_FLOW_ITEM_TYPE_UDP,
1617         RTE_FLOW_ITEM_TYPE_END,
1618 };
1619
1620 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2[] = {
1621         RTE_FLOW_ITEM_TYPE_ETH,
1622         RTE_FLOW_ITEM_TYPE_IPV4,
1623         RTE_FLOW_ITEM_TYPE_UDP,
1624         RTE_FLOW_ITEM_TYPE_L2TPV2,
1625         RTE_FLOW_ITEM_TYPE_END,
1626 };
1627
1628 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp[] = {
1629         RTE_FLOW_ITEM_TYPE_ETH,
1630         RTE_FLOW_ITEM_TYPE_IPV4,
1631         RTE_FLOW_ITEM_TYPE_UDP,
1632         RTE_FLOW_ITEM_TYPE_L2TPV2,
1633         RTE_FLOW_ITEM_TYPE_PPP,
1634         RTE_FLOW_ITEM_TYPE_END,
1635 };
1636
1637 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2[] = {
1638         RTE_FLOW_ITEM_TYPE_ETH,
1639         RTE_FLOW_ITEM_TYPE_IPV6,
1640         RTE_FLOW_ITEM_TYPE_UDP,
1641         RTE_FLOW_ITEM_TYPE_L2TPV2,
1642         RTE_FLOW_ITEM_TYPE_END,
1643 };
1644
1645 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp[] = {
1646         RTE_FLOW_ITEM_TYPE_ETH,
1647         RTE_FLOW_ITEM_TYPE_IPV6,
1648         RTE_FLOW_ITEM_TYPE_UDP,
1649         RTE_FLOW_ITEM_TYPE_L2TPV2,
1650         RTE_FLOW_ITEM_TYPE_PPP,
1651         RTE_FLOW_ITEM_TYPE_END,
1652 };
1653
1654 /* PPPoL2TPv2oUDP */
1655 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4[] = {
1656         RTE_FLOW_ITEM_TYPE_ETH,
1657         RTE_FLOW_ITEM_TYPE_IPV4,
1658         RTE_FLOW_ITEM_TYPE_UDP,
1659         RTE_FLOW_ITEM_TYPE_L2TPV2,
1660         RTE_FLOW_ITEM_TYPE_PPP,
1661         RTE_FLOW_ITEM_TYPE_IPV4,
1662         RTE_FLOW_ITEM_TYPE_END,
1663 };
1664
1665 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6[] = {
1666         RTE_FLOW_ITEM_TYPE_ETH,
1667         RTE_FLOW_ITEM_TYPE_IPV4,
1668         RTE_FLOW_ITEM_TYPE_UDP,
1669         RTE_FLOW_ITEM_TYPE_L2TPV2,
1670         RTE_FLOW_ITEM_TYPE_PPP,
1671         RTE_FLOW_ITEM_TYPE_IPV6,
1672         RTE_FLOW_ITEM_TYPE_END,
1673 };
1674
1675 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp[] = {
1676         RTE_FLOW_ITEM_TYPE_ETH,
1677         RTE_FLOW_ITEM_TYPE_IPV4,
1678         RTE_FLOW_ITEM_TYPE_UDP,
1679         RTE_FLOW_ITEM_TYPE_L2TPV2,
1680         RTE_FLOW_ITEM_TYPE_PPP,
1681         RTE_FLOW_ITEM_TYPE_IPV4,
1682         RTE_FLOW_ITEM_TYPE_UDP,
1683         RTE_FLOW_ITEM_TYPE_END,
1684 };
1685
1686 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp[] = {
1687         RTE_FLOW_ITEM_TYPE_ETH,
1688         RTE_FLOW_ITEM_TYPE_IPV4,
1689         RTE_FLOW_ITEM_TYPE_UDP,
1690         RTE_FLOW_ITEM_TYPE_L2TPV2,
1691         RTE_FLOW_ITEM_TYPE_PPP,
1692         RTE_FLOW_ITEM_TYPE_IPV4,
1693         RTE_FLOW_ITEM_TYPE_TCP,
1694         RTE_FLOW_ITEM_TYPE_END,
1695 };
1696
1697 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp[] = {
1698         RTE_FLOW_ITEM_TYPE_ETH,
1699         RTE_FLOW_ITEM_TYPE_IPV4,
1700         RTE_FLOW_ITEM_TYPE_UDP,
1701         RTE_FLOW_ITEM_TYPE_L2TPV2,
1702         RTE_FLOW_ITEM_TYPE_PPP,
1703         RTE_FLOW_ITEM_TYPE_IPV6,
1704         RTE_FLOW_ITEM_TYPE_UDP,
1705         RTE_FLOW_ITEM_TYPE_END,
1706 };
1707
1708 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp[] = {
1709         RTE_FLOW_ITEM_TYPE_ETH,
1710         RTE_FLOW_ITEM_TYPE_IPV4,
1711         RTE_FLOW_ITEM_TYPE_UDP,
1712         RTE_FLOW_ITEM_TYPE_L2TPV2,
1713         RTE_FLOW_ITEM_TYPE_PPP,
1714         RTE_FLOW_ITEM_TYPE_IPV6,
1715         RTE_FLOW_ITEM_TYPE_TCP,
1716         RTE_FLOW_ITEM_TYPE_END,
1717 };
1718
1719 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4[] = {
1720         RTE_FLOW_ITEM_TYPE_ETH,
1721         RTE_FLOW_ITEM_TYPE_IPV6,
1722         RTE_FLOW_ITEM_TYPE_UDP,
1723         RTE_FLOW_ITEM_TYPE_L2TPV2,
1724         RTE_FLOW_ITEM_TYPE_PPP,
1725         RTE_FLOW_ITEM_TYPE_IPV4,
1726         RTE_FLOW_ITEM_TYPE_END,
1727 };
1728
1729 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6[] = {
1730         RTE_FLOW_ITEM_TYPE_ETH,
1731         RTE_FLOW_ITEM_TYPE_IPV6,
1732         RTE_FLOW_ITEM_TYPE_UDP,
1733         RTE_FLOW_ITEM_TYPE_L2TPV2,
1734         RTE_FLOW_ITEM_TYPE_PPP,
1735         RTE_FLOW_ITEM_TYPE_IPV6,
1736         RTE_FLOW_ITEM_TYPE_END,
1737 };
1738
1739 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_udp[] = {
1740         RTE_FLOW_ITEM_TYPE_ETH,
1741         RTE_FLOW_ITEM_TYPE_IPV6,
1742         RTE_FLOW_ITEM_TYPE_UDP,
1743         RTE_FLOW_ITEM_TYPE_L2TPV2,
1744         RTE_FLOW_ITEM_TYPE_PPP,
1745         RTE_FLOW_ITEM_TYPE_IPV4,
1746         RTE_FLOW_ITEM_TYPE_UDP,
1747         RTE_FLOW_ITEM_TYPE_END,
1748 };
1749
1750 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_tcp[] = {
1751         RTE_FLOW_ITEM_TYPE_ETH,
1752         RTE_FLOW_ITEM_TYPE_IPV6,
1753         RTE_FLOW_ITEM_TYPE_UDP,
1754         RTE_FLOW_ITEM_TYPE_L2TPV2,
1755         RTE_FLOW_ITEM_TYPE_PPP,
1756         RTE_FLOW_ITEM_TYPE_IPV4,
1757         RTE_FLOW_ITEM_TYPE_TCP,
1758         RTE_FLOW_ITEM_TYPE_END,
1759 };
1760
1761 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_udp[] = {
1762         RTE_FLOW_ITEM_TYPE_ETH,
1763         RTE_FLOW_ITEM_TYPE_IPV6,
1764         RTE_FLOW_ITEM_TYPE_UDP,
1765         RTE_FLOW_ITEM_TYPE_L2TPV2,
1766         RTE_FLOW_ITEM_TYPE_PPP,
1767         RTE_FLOW_ITEM_TYPE_IPV6,
1768         RTE_FLOW_ITEM_TYPE_UDP,
1769         RTE_FLOW_ITEM_TYPE_END,
1770 };
1771
1772 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_tcp[] = {
1773         RTE_FLOW_ITEM_TYPE_ETH,
1774         RTE_FLOW_ITEM_TYPE_IPV6,
1775         RTE_FLOW_ITEM_TYPE_UDP,
1776         RTE_FLOW_ITEM_TYPE_L2TPV2,
1777         RTE_FLOW_ITEM_TYPE_PPP,
1778         RTE_FLOW_ITEM_TYPE_IPV6,
1779         RTE_FLOW_ITEM_TYPE_TCP,
1780         RTE_FLOW_ITEM_TYPE_END,
1781 };
1782
1783
1784
1785 typedef struct iavf_flow_engine * (*parse_engine_t)(struct iavf_adapter *ad,
1786                 struct rte_flow *flow,
1787                 struct iavf_parser_list *parser_list,
1788                 const struct rte_flow_item pattern[],
1789                 const struct rte_flow_action actions[],
1790                 struct rte_flow_error *error);
1791
1792 void
1793 iavf_register_flow_engine(struct iavf_flow_engine *engine)
1794 {
1795         TAILQ_INSERT_TAIL(&engine_list, engine, node);
1796 }
1797
1798 int
1799 iavf_flow_init(struct iavf_adapter *ad)
1800 {
1801         int ret;
1802         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
1803         void *temp;
1804         struct iavf_flow_engine *engine;
1805
1806         TAILQ_INIT(&vf->flow_list);
1807         TAILQ_INIT(&vf->rss_parser_list);
1808         TAILQ_INIT(&vf->dist_parser_list);
1809         TAILQ_INIT(&vf->ipsec_crypto_parser_list);
1810         rte_spinlock_init(&vf->flow_ops_lock);
1811
1812         RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
1813                 if (engine->init == NULL) {
1814                         PMD_INIT_LOG(ERR, "Invalid engine type (%d)",
1815                                      engine->type);
1816                         return -ENOTSUP;
1817                 }
1818
1819                 ret = engine->init(ad);
1820                 if (ret && ret != -ENOTSUP) {
1821                         PMD_INIT_LOG(ERR, "Failed to initialize engine %d",
1822                                      engine->type);
1823                         return ret;
1824                 }
1825         }
1826         return 0;
1827 }
1828
1829 void
1830 iavf_flow_uninit(struct iavf_adapter *ad)
1831 {
1832         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
1833         struct iavf_flow_engine *engine;
1834         struct rte_flow *p_flow;
1835         struct iavf_flow_parser_node *p_parser;
1836         void *temp;
1837
1838         RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
1839                 if (engine->uninit)
1840                         engine->uninit(ad);
1841         }
1842
1843         /* Remove all flows */
1844         while ((p_flow = TAILQ_FIRST(&vf->flow_list))) {
1845                 TAILQ_REMOVE(&vf->flow_list, p_flow, node);
1846                 if (p_flow->engine->free)
1847                         p_flow->engine->free(p_flow);
1848                 rte_free(p_flow);
1849         }
1850
1851         /* Cleanup parser list */
1852         while ((p_parser = TAILQ_FIRST(&vf->rss_parser_list))) {
1853                 TAILQ_REMOVE(&vf->rss_parser_list, p_parser, node);
1854                 rte_free(p_parser);
1855         }
1856
1857         while ((p_parser = TAILQ_FIRST(&vf->dist_parser_list))) {
1858                 TAILQ_REMOVE(&vf->dist_parser_list, p_parser, node);
1859                 rte_free(p_parser);
1860         }
1861 }
1862
1863 int
1864 iavf_register_parser(struct iavf_flow_parser *parser,
1865                      struct iavf_adapter *ad)
1866 {
1867         struct iavf_parser_list *list = NULL;
1868         struct iavf_flow_parser_node *parser_node;
1869         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
1870
1871         parser_node = rte_zmalloc("iavf_parser", sizeof(*parser_node), 0);
1872         if (parser_node == NULL) {
1873                 PMD_DRV_LOG(ERR, "Failed to allocate memory.");
1874                 return -ENOMEM;
1875         }
1876         parser_node->parser = parser;
1877
1878         if (parser->engine->type == IAVF_FLOW_ENGINE_HASH) {
1879                 list = &vf->rss_parser_list;
1880                 TAILQ_INSERT_TAIL(list, parser_node, node);
1881         } else if (parser->engine->type == IAVF_FLOW_ENGINE_FDIR) {
1882                 list = &vf->dist_parser_list;
1883                 TAILQ_INSERT_HEAD(list, parser_node, node);
1884         } else if (parser->engine->type == IAVF_FLOW_ENGINE_IPSEC_CRYPTO) {
1885                 list = &vf->ipsec_crypto_parser_list;
1886                 TAILQ_INSERT_HEAD(list, parser_node, node);
1887         } else {
1888                 return -EINVAL;
1889         }
1890
1891         return 0;
1892 }
1893
1894 void
1895 iavf_unregister_parser(struct iavf_flow_parser *parser,
1896                        struct iavf_adapter *ad)
1897 {
1898         struct iavf_parser_list *list = NULL;
1899         struct iavf_flow_parser_node *p_parser;
1900         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
1901         void *temp;
1902
1903         if (parser->engine->type == IAVF_FLOW_ENGINE_HASH)
1904                 list = &vf->rss_parser_list;
1905         else if (parser->engine->type == IAVF_FLOW_ENGINE_FDIR)
1906                 list = &vf->dist_parser_list;
1907
1908         if (list == NULL)
1909                 return;
1910
1911         RTE_TAILQ_FOREACH_SAFE(p_parser, list, node, temp) {
1912                 if (p_parser->parser->engine->type == parser->engine->type) {
1913                         TAILQ_REMOVE(list, p_parser, node);
1914                         rte_free(p_parser);
1915                 }
1916         }
1917 }
1918
1919 static int
1920 iavf_flow_valid_attr(const struct rte_flow_attr *attr,
1921                      struct rte_flow_error *error)
1922 {
1923         /* Must be input direction */
1924         if (!attr->ingress) {
1925                 rte_flow_error_set(error, EINVAL,
1926                                 RTE_FLOW_ERROR_TYPE_ATTR_INGRESS,
1927                                 attr, "Only support ingress.");
1928                 return -rte_errno;
1929         }
1930
1931         /* Not supported */
1932         if (attr->egress) {
1933                 rte_flow_error_set(error, EINVAL,
1934                                 RTE_FLOW_ERROR_TYPE_ATTR_EGRESS,
1935                                 attr, "Not support egress.");
1936                 return -rte_errno;
1937         }
1938
1939         /* Not supported */
1940         if (attr->priority) {
1941                 rte_flow_error_set(error, EINVAL,
1942                                 RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,
1943                                 attr, "Not support priority.");
1944                 return -rte_errno;
1945         }
1946
1947         /* Not supported */
1948         if (attr->group) {
1949                 rte_flow_error_set(error, EINVAL,
1950                                 RTE_FLOW_ERROR_TYPE_ATTR_GROUP,
1951                                 attr, "Not support group.");
1952                 return -rte_errno;
1953         }
1954
1955         return 0;
1956 }
1957
1958 /* Find the first VOID or non-VOID item pointer */
1959 static const struct rte_flow_item *
1960 iavf_find_first_item(const struct rte_flow_item *item, bool is_void)
1961 {
1962         bool is_find;
1963
1964         while (item->type != RTE_FLOW_ITEM_TYPE_END) {
1965                 if (is_void)
1966                         is_find = item->type == RTE_FLOW_ITEM_TYPE_VOID;
1967                 else
1968                         is_find = item->type != RTE_FLOW_ITEM_TYPE_VOID;
1969                 if (is_find)
1970                         break;
1971                 item++;
1972         }
1973         return item;
1974 }
1975
1976 /* Skip all VOID items of the pattern */
1977 static void
1978 iavf_pattern_skip_void_item(struct rte_flow_item *items,
1979                         const struct rte_flow_item *pattern)
1980 {
1981         uint32_t cpy_count = 0;
1982         const struct rte_flow_item *pb = pattern, *pe = pattern;
1983
1984         for (;;) {
1985                 /* Find a non-void item first */
1986                 pb = iavf_find_first_item(pb, false);
1987                 if (pb->type == RTE_FLOW_ITEM_TYPE_END) {
1988                         pe = pb;
1989                         break;
1990                 }
1991
1992                 /* Find a void item */
1993                 pe = iavf_find_first_item(pb + 1, true);
1994
1995                 cpy_count = pe - pb;
1996                 rte_memcpy(items, pb, sizeof(struct rte_flow_item) * cpy_count);
1997
1998                 items += cpy_count;
1999
2000                 if (pe->type == RTE_FLOW_ITEM_TYPE_END)
2001                         break;
2002
2003                 pb = pe + 1;
2004         }
2005         /* Copy the END item. */
2006         rte_memcpy(items, pe, sizeof(struct rte_flow_item));
2007 }
2008
2009 /* Check if the pattern matches a supported item type array */
2010 static bool
2011 iavf_match_pattern(enum rte_flow_item_type *item_array,
2012                    const struct rte_flow_item *pattern)
2013 {
2014         const struct rte_flow_item *item = pattern;
2015
2016         while ((*item_array == item->type) &&
2017                (*item_array != RTE_FLOW_ITEM_TYPE_END)) {
2018                 item_array++;
2019                 item++;
2020         }
2021
2022         return (*item_array == RTE_FLOW_ITEM_TYPE_END &&
2023                 item->type == RTE_FLOW_ITEM_TYPE_END);
2024 }
2025
2026 struct iavf_pattern_match_item *
2027 iavf_search_pattern_match_item(const struct rte_flow_item pattern[],
2028                 struct iavf_pattern_match_item *array,
2029                 uint32_t array_len,
2030                 struct rte_flow_error *error)
2031 {
2032         uint16_t i = 0;
2033         struct iavf_pattern_match_item *pattern_match_item;
2034         /* need free by each filter */
2035         struct rte_flow_item *items; /* used for pattern without VOID items */
2036         uint32_t item_num = 0; /* non-void item number */
2037
2038         /* Get the non-void item number of pattern */
2039         while ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_END) {
2040                 if ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_VOID)
2041                         item_num++;
2042                 i++;
2043         }
2044         item_num++;
2045
2046         items = rte_zmalloc("iavf_pattern",
2047                             item_num * sizeof(struct rte_flow_item), 0);
2048         if (!items) {
2049                 rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
2050                                    NULL, "No memory for PMD internal items.");
2051                 return NULL;
2052         }
2053         pattern_match_item = rte_zmalloc("iavf_pattern_match_item",
2054                                 sizeof(struct iavf_pattern_match_item), 0);
2055         if (!pattern_match_item) {
2056                 rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_HANDLE,
2057                                    NULL, "Failed to allocate memory.");
2058                 return NULL;
2059         }
2060
2061         iavf_pattern_skip_void_item(items, pattern);
2062
2063         for (i = 0; i < array_len; i++)
2064                 if (iavf_match_pattern(array[i].pattern_list,
2065                                        items)) {
2066                         pattern_match_item->input_set_mask =
2067                                 array[i].input_set_mask;
2068                         pattern_match_item->pattern_list =
2069                                 array[i].pattern_list;
2070                         pattern_match_item->meta = array[i].meta;
2071                         rte_free(items);
2072                         return pattern_match_item;
2073                 }
2074         rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM,
2075                            pattern, "Unsupported pattern");
2076
2077         rte_free(items);
2078         rte_free(pattern_match_item);
2079         return NULL;
2080 }
2081
2082 static struct iavf_flow_engine *
2083 iavf_parse_engine_create(struct iavf_adapter *ad,
2084                 struct rte_flow *flow,
2085                 struct iavf_parser_list *parser_list,
2086                 const struct rte_flow_item pattern[],
2087                 const struct rte_flow_action actions[],
2088                 struct rte_flow_error *error)
2089 {
2090         struct iavf_flow_engine *engine = NULL;
2091         struct iavf_flow_parser_node *parser_node;
2092         void *temp;
2093         void *meta = NULL;
2094
2095         RTE_TAILQ_FOREACH_SAFE(parser_node, parser_list, node, temp) {
2096                 if (parser_node->parser->parse_pattern_action(ad,
2097                                 parser_node->parser->array,
2098                                 parser_node->parser->array_len,
2099                                 pattern, actions, &meta, error) < 0)
2100                         continue;
2101
2102                 engine = parser_node->parser->engine;
2103
2104                 RTE_ASSERT(engine->create != NULL);
2105                 if (!(engine->create(ad, flow, meta, error)))
2106                         return engine;
2107         }
2108         return NULL;
2109 }
2110
2111 static struct iavf_flow_engine *
2112 iavf_parse_engine_validate(struct iavf_adapter *ad,
2113                 struct rte_flow *flow,
2114                 struct iavf_parser_list *parser_list,
2115                 const struct rte_flow_item pattern[],
2116                 const struct rte_flow_action actions[],
2117                 struct rte_flow_error *error)
2118 {
2119         struct iavf_flow_engine *engine = NULL;
2120         struct iavf_flow_parser_node *parser_node;
2121         void *temp;
2122         void *meta = NULL;
2123
2124         RTE_TAILQ_FOREACH_SAFE(parser_node, parser_list, node, temp) {
2125                 if (parser_node->parser->parse_pattern_action(ad,
2126                                 parser_node->parser->array,
2127                                 parser_node->parser->array_len,
2128                                 pattern, actions, &meta,  error) < 0)
2129                         continue;
2130
2131                 engine = parser_node->parser->engine;
2132                 if (engine->validation == NULL) {
2133                         rte_flow_error_set(error, EINVAL,
2134                                 RTE_FLOW_ERROR_TYPE_HANDLE,
2135                                 NULL, "Validation not support");
2136                         continue;
2137                 }
2138
2139                 if (engine->validation(ad, flow, meta, error)) {
2140                         rte_flow_error_set(error, EINVAL,
2141                                 RTE_FLOW_ERROR_TYPE_HANDLE,
2142                                 NULL, "Validation failed");
2143                         break;
2144                 }
2145         }
2146         return engine;
2147 }
2148
2149
2150 static int
2151 iavf_flow_process_filter(struct rte_eth_dev *dev,
2152                 struct rte_flow *flow,
2153                 const struct rte_flow_attr *attr,
2154                 const struct rte_flow_item pattern[],
2155                 const struct rte_flow_action actions[],
2156                 struct iavf_flow_engine **engine,
2157                 parse_engine_t iavf_parse_engine,
2158                 struct rte_flow_error *error)
2159 {
2160         int ret = IAVF_ERR_CONFIG;
2161         struct iavf_adapter *ad =
2162                 IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
2163         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
2164
2165         if (!pattern) {
2166                 rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
2167                                    NULL, "NULL pattern.");
2168                 return -rte_errno;
2169         }
2170
2171         if (!actions) {
2172                 rte_flow_error_set(error, EINVAL,
2173                                    RTE_FLOW_ERROR_TYPE_ACTION_NUM,
2174                                    NULL, "NULL action.");
2175                 return -rte_errno;
2176         }
2177
2178         if (!attr) {
2179                 rte_flow_error_set(error, EINVAL,
2180                                    RTE_FLOW_ERROR_TYPE_ATTR,
2181                                    NULL, "NULL attribute.");
2182                 return -rte_errno;
2183         }
2184
2185         ret = iavf_flow_valid_attr(attr, error);
2186         if (ret)
2187                 return ret;
2188
2189         *engine = iavf_parse_engine(ad, flow, &vf->rss_parser_list, pattern,
2190                                     actions, error);
2191         if (*engine)
2192                 return 0;
2193
2194         *engine = iavf_parse_engine(ad, flow, &vf->dist_parser_list, pattern,
2195                                     actions, error);
2196         if (*engine)
2197                 return 0;
2198
2199         *engine = iavf_parse_engine(ad, flow, &vf->ipsec_crypto_parser_list,
2200                         pattern, actions, error);
2201         if (*engine)
2202                 return 0;
2203
2204         if (!*engine) {
2205                 rte_flow_error_set(error, EINVAL,
2206                                    RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
2207                                    "Failed to create parser engine.");
2208                 return -rte_errno;
2209         }
2210
2211         return 0;
2212 }
2213
2214 static int
2215 iavf_flow_validate(struct rte_eth_dev *dev,
2216                 const struct rte_flow_attr *attr,
2217                 const struct rte_flow_item pattern[],
2218                 const struct rte_flow_action actions[],
2219                 struct rte_flow_error *error)
2220 {
2221         struct iavf_flow_engine *engine;
2222
2223         return iavf_flow_process_filter(dev, NULL, attr, pattern, actions,
2224                         &engine, iavf_parse_engine_validate, error);
2225 }
2226
2227 static struct rte_flow *
2228 iavf_flow_create(struct rte_eth_dev *dev,
2229                  const struct rte_flow_attr *attr,
2230                  const struct rte_flow_item pattern[],
2231                  const struct rte_flow_action actions[],
2232                  struct rte_flow_error *error)
2233 {
2234         struct iavf_adapter *ad =
2235                 IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
2236         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
2237         struct iavf_flow_engine *engine = NULL;
2238         struct rte_flow *flow = NULL;
2239         int ret;
2240
2241         flow = rte_zmalloc("iavf_flow", sizeof(struct rte_flow), 0);
2242         if (!flow) {
2243                 rte_flow_error_set(error, ENOMEM,
2244                                    RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
2245                                    "Failed to allocate memory");
2246                 return flow;
2247         }
2248
2249         /* Special case for inline crypto egress flows */
2250         if (attr->egress && actions[0].type == RTE_FLOW_ACTION_TYPE_SECURITY)
2251                 goto free_flow;
2252
2253         ret = iavf_flow_process_filter(dev, flow, attr, pattern, actions,
2254                         &engine, iavf_parse_engine_create, error);
2255         if (ret < 0) {
2256                 PMD_DRV_LOG(ERR, "Failed to create flow");
2257                 rte_free(flow);
2258                 flow = NULL;
2259                 goto free_flow;
2260         }
2261
2262         flow->engine = engine;
2263         TAILQ_INSERT_TAIL(&vf->flow_list, flow, node);
2264         PMD_DRV_LOG(INFO, "Succeeded to create (%d) flow", engine->type);
2265
2266 free_flow:
2267         rte_spinlock_unlock(&vf->flow_ops_lock);
2268         return flow;
2269 }
2270
2271 static bool
2272 iavf_flow_is_valid(struct rte_flow *flow)
2273 {
2274         struct iavf_flow_engine *engine;
2275         void *temp;
2276
2277         if (flow && flow->engine) {
2278                 RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
2279                         if (engine == flow->engine)
2280                                 return true;
2281                 }
2282         }
2283
2284         return false;
2285 }
2286
2287 static int
2288 iavf_flow_destroy(struct rte_eth_dev *dev,
2289                   struct rte_flow *flow,
2290                   struct rte_flow_error *error)
2291 {
2292         struct iavf_adapter *ad =
2293                 IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
2294         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
2295         int ret = 0;
2296
2297         if (!iavf_flow_is_valid(flow) || !flow->engine->destroy) {
2298                 rte_flow_error_set(error, EINVAL,
2299                                    RTE_FLOW_ERROR_TYPE_HANDLE,
2300                                    NULL, "Invalid flow destroy");
2301                 return -rte_errno;
2302         }
2303
2304         rte_spinlock_lock(&vf->flow_ops_lock);
2305
2306         ret = flow->engine->destroy(ad, flow, error);
2307
2308         if (!ret) {
2309                 TAILQ_REMOVE(&vf->flow_list, flow, node);
2310                 rte_free(flow);
2311         } else {
2312                 PMD_DRV_LOG(ERR, "Failed to destroy flow");
2313         }
2314
2315         rte_spinlock_unlock(&vf->flow_ops_lock);
2316
2317         return ret;
2318 }
2319
2320 int
2321 iavf_flow_flush(struct rte_eth_dev *dev,
2322                 struct rte_flow_error *error)
2323 {
2324         struct iavf_adapter *ad =
2325                 IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
2326         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
2327         struct rte_flow *p_flow;
2328         void *temp;
2329         int ret = 0;
2330
2331         RTE_TAILQ_FOREACH_SAFE(p_flow, &vf->flow_list, node, temp) {
2332                 ret = iavf_flow_destroy(dev, p_flow, error);
2333                 if (ret) {
2334                         PMD_DRV_LOG(ERR, "Failed to flush flows");
2335                         return -EINVAL;
2336                 }
2337         }
2338
2339         return ret;
2340 }
2341
2342 static int
2343 iavf_flow_query(struct rte_eth_dev *dev,
2344                 struct rte_flow *flow,
2345                 const struct rte_flow_action *actions,
2346                 void *data,
2347                 struct rte_flow_error *error)
2348 {
2349         int ret = -EINVAL;
2350         struct iavf_adapter *ad =
2351                 IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
2352         struct rte_flow_query_count *count = data;
2353
2354         if (!iavf_flow_is_valid(flow) || !flow->engine->query_count) {
2355                 rte_flow_error_set(error, EINVAL,
2356                                    RTE_FLOW_ERROR_TYPE_HANDLE,
2357                                    NULL, "Invalid flow query");
2358                 return -rte_errno;
2359         }
2360
2361         for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
2362                 switch (actions->type) {
2363                 case RTE_FLOW_ACTION_TYPE_VOID:
2364                         break;
2365                 case RTE_FLOW_ACTION_TYPE_COUNT:
2366                         ret = flow->engine->query_count(ad, flow, count, error);
2367                         break;
2368                 default:
2369                         return rte_flow_error_set(error, ENOTSUP,
2370                                         RTE_FLOW_ERROR_TYPE_ACTION,
2371                                         actions,
2372                                         "action not supported");
2373                 }
2374         }
2375         return ret;
2376 }