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