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