xref: /dpdk/drivers/net/i40e/i40e_flow.c (revision 7f12dfdc)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2016-2017 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_debug.h>
14 #include <rte_ether.h>
15 #include <rte_ethdev_driver.h>
16 #include <rte_log.h>
17 #include <rte_malloc.h>
18 #include <rte_tailq.h>
19 #include <rte_flow_driver.h>
20 
21 #include "i40e_logs.h"
22 #include "base/i40e_type.h"
23 #include "base/i40e_prototype.h"
24 #include "i40e_ethdev.h"
25 
26 #define I40E_IPV6_TC_MASK	(0xFF << I40E_FDIR_IPv6_TC_OFFSET)
27 #define I40E_IPV6_FRAG_HEADER	44
28 #define I40E_TENANT_ARRAY_NUM	3
29 #define I40E_TCI_MASK		0xFFFF
30 
31 static int i40e_flow_validate(struct rte_eth_dev *dev,
32 			      const struct rte_flow_attr *attr,
33 			      const struct rte_flow_item pattern[],
34 			      const struct rte_flow_action actions[],
35 			      struct rte_flow_error *error);
36 static struct rte_flow *i40e_flow_create(struct rte_eth_dev *dev,
37 					 const struct rte_flow_attr *attr,
38 					 const struct rte_flow_item pattern[],
39 					 const struct rte_flow_action actions[],
40 					 struct rte_flow_error *error);
41 static int i40e_flow_destroy(struct rte_eth_dev *dev,
42 			     struct rte_flow *flow,
43 			     struct rte_flow_error *error);
44 static int i40e_flow_flush(struct rte_eth_dev *dev,
45 			   struct rte_flow_error *error);
46 static int
47 i40e_flow_parse_ethertype_pattern(struct rte_eth_dev *dev,
48 				  const struct rte_flow_item *pattern,
49 				  struct rte_flow_error *error,
50 				  struct rte_eth_ethertype_filter *filter);
51 static int i40e_flow_parse_ethertype_action(struct rte_eth_dev *dev,
52 				    const struct rte_flow_action *actions,
53 				    struct rte_flow_error *error,
54 				    struct rte_eth_ethertype_filter *filter);
55 static int i40e_flow_parse_fdir_pattern(struct rte_eth_dev *dev,
56 					const struct rte_flow_attr *attr,
57 					const struct rte_flow_item *pattern,
58 					struct rte_flow_error *error,
59 					struct i40e_fdir_filter_conf *filter);
60 static int i40e_flow_parse_fdir_action(struct rte_eth_dev *dev,
61 				       const struct rte_flow_action *actions,
62 				       struct rte_flow_error *error,
63 				       struct i40e_fdir_filter_conf *filter);
64 static int i40e_flow_parse_tunnel_action(struct rte_eth_dev *dev,
65 				 const struct rte_flow_action *actions,
66 				 struct rte_flow_error *error,
67 				 struct i40e_tunnel_filter_conf *filter);
68 static int i40e_flow_parse_attr(const struct rte_flow_attr *attr,
69 				struct rte_flow_error *error);
70 static int i40e_flow_parse_ethertype_filter(struct rte_eth_dev *dev,
71 				    const struct rte_flow_attr *attr,
72 				    const struct rte_flow_item pattern[],
73 				    const struct rte_flow_action actions[],
74 				    struct rte_flow_error *error,
75 				    union i40e_filter_t *filter);
76 static int i40e_flow_parse_fdir_filter(struct rte_eth_dev *dev,
77 				       const struct rte_flow_attr *attr,
78 				       const struct rte_flow_item pattern[],
79 				       const struct rte_flow_action actions[],
80 				       struct rte_flow_error *error,
81 				       union i40e_filter_t *filter);
82 static int i40e_flow_parse_vxlan_filter(struct rte_eth_dev *dev,
83 					const struct rte_flow_attr *attr,
84 					const struct rte_flow_item pattern[],
85 					const struct rte_flow_action actions[],
86 					struct rte_flow_error *error,
87 					union i40e_filter_t *filter);
88 static int i40e_flow_parse_nvgre_filter(struct rte_eth_dev *dev,
89 					const struct rte_flow_attr *attr,
90 					const struct rte_flow_item pattern[],
91 					const struct rte_flow_action actions[],
92 					struct rte_flow_error *error,
93 					union i40e_filter_t *filter);
94 static int i40e_flow_parse_mpls_filter(struct rte_eth_dev *dev,
95 				       const struct rte_flow_attr *attr,
96 				       const struct rte_flow_item pattern[],
97 				       const struct rte_flow_action actions[],
98 				       struct rte_flow_error *error,
99 				       union i40e_filter_t *filter);
100 static int i40e_flow_parse_gtp_filter(struct rte_eth_dev *dev,
101 				      const struct rte_flow_attr *attr,
102 				      const struct rte_flow_item pattern[],
103 				      const struct rte_flow_action actions[],
104 				      struct rte_flow_error *error,
105 				      union i40e_filter_t *filter);
106 static int i40e_flow_destroy_ethertype_filter(struct i40e_pf *pf,
107 				      struct i40e_ethertype_filter *filter);
108 static int i40e_flow_destroy_tunnel_filter(struct i40e_pf *pf,
109 					   struct i40e_tunnel_filter *filter);
110 static int i40e_flow_flush_fdir_filter(struct i40e_pf *pf);
111 static int i40e_flow_flush_ethertype_filter(struct i40e_pf *pf);
112 static int i40e_flow_flush_tunnel_filter(struct i40e_pf *pf);
113 static int
114 i40e_flow_flush_rss_filter(struct rte_eth_dev *dev);
115 static int
116 i40e_flow_parse_qinq_filter(struct rte_eth_dev *dev,
117 			      const struct rte_flow_attr *attr,
118 			      const struct rte_flow_item pattern[],
119 			      const struct rte_flow_action actions[],
120 			      struct rte_flow_error *error,
121 			      union i40e_filter_t *filter);
122 static int
123 i40e_flow_parse_qinq_pattern(struct rte_eth_dev *dev,
124 			      const struct rte_flow_item *pattern,
125 			      struct rte_flow_error *error,
126 			      struct i40e_tunnel_filter_conf *filter);
127 
128 const struct rte_flow_ops i40e_flow_ops = {
129 	.validate = i40e_flow_validate,
130 	.create = i40e_flow_create,
131 	.destroy = i40e_flow_destroy,
132 	.flush = i40e_flow_flush,
133 };
134 
135 static union i40e_filter_t cons_filter;
136 static enum rte_filter_type cons_filter_type = RTE_ETH_FILTER_NONE;
137 
138 /* Pattern matched ethertype filter */
139 static enum rte_flow_item_type pattern_ethertype[] = {
140 	RTE_FLOW_ITEM_TYPE_ETH,
141 	RTE_FLOW_ITEM_TYPE_END,
142 };
143 
144 /* Pattern matched flow director filter */
145 static enum rte_flow_item_type pattern_fdir_ipv4[] = {
146 	RTE_FLOW_ITEM_TYPE_ETH,
147 	RTE_FLOW_ITEM_TYPE_IPV4,
148 	RTE_FLOW_ITEM_TYPE_END,
149 };
150 
151 static enum rte_flow_item_type pattern_fdir_ipv4_udp[] = {
152 	RTE_FLOW_ITEM_TYPE_ETH,
153 	RTE_FLOW_ITEM_TYPE_IPV4,
154 	RTE_FLOW_ITEM_TYPE_UDP,
155 	RTE_FLOW_ITEM_TYPE_END,
156 };
157 
158 static enum rte_flow_item_type pattern_fdir_ipv4_tcp[] = {
159 	RTE_FLOW_ITEM_TYPE_ETH,
160 	RTE_FLOW_ITEM_TYPE_IPV4,
161 	RTE_FLOW_ITEM_TYPE_TCP,
162 	RTE_FLOW_ITEM_TYPE_END,
163 };
164 
165 static enum rte_flow_item_type pattern_fdir_ipv4_sctp[] = {
166 	RTE_FLOW_ITEM_TYPE_ETH,
167 	RTE_FLOW_ITEM_TYPE_IPV4,
168 	RTE_FLOW_ITEM_TYPE_SCTP,
169 	RTE_FLOW_ITEM_TYPE_END,
170 };
171 
172 static enum rte_flow_item_type pattern_fdir_ipv4_gtpc[] = {
173 	RTE_FLOW_ITEM_TYPE_ETH,
174 	RTE_FLOW_ITEM_TYPE_IPV4,
175 	RTE_FLOW_ITEM_TYPE_UDP,
176 	RTE_FLOW_ITEM_TYPE_GTPC,
177 	RTE_FLOW_ITEM_TYPE_END,
178 };
179 
180 static enum rte_flow_item_type pattern_fdir_ipv4_gtpu[] = {
181 	RTE_FLOW_ITEM_TYPE_ETH,
182 	RTE_FLOW_ITEM_TYPE_IPV4,
183 	RTE_FLOW_ITEM_TYPE_UDP,
184 	RTE_FLOW_ITEM_TYPE_GTPU,
185 	RTE_FLOW_ITEM_TYPE_END,
186 };
187 
188 static enum rte_flow_item_type pattern_fdir_ipv4_gtpu_ipv4[] = {
189 	RTE_FLOW_ITEM_TYPE_ETH,
190 	RTE_FLOW_ITEM_TYPE_IPV4,
191 	RTE_FLOW_ITEM_TYPE_UDP,
192 	RTE_FLOW_ITEM_TYPE_GTPU,
193 	RTE_FLOW_ITEM_TYPE_IPV4,
194 	RTE_FLOW_ITEM_TYPE_END,
195 };
196 
197 static enum rte_flow_item_type pattern_fdir_ipv4_gtpu_ipv6[] = {
198 	RTE_FLOW_ITEM_TYPE_ETH,
199 	RTE_FLOW_ITEM_TYPE_IPV4,
200 	RTE_FLOW_ITEM_TYPE_UDP,
201 	RTE_FLOW_ITEM_TYPE_GTPU,
202 	RTE_FLOW_ITEM_TYPE_IPV6,
203 	RTE_FLOW_ITEM_TYPE_END,
204 };
205 
206 static enum rte_flow_item_type pattern_fdir_ipv6[] = {
207 	RTE_FLOW_ITEM_TYPE_ETH,
208 	RTE_FLOW_ITEM_TYPE_IPV6,
209 	RTE_FLOW_ITEM_TYPE_END,
210 };
211 
212 static enum rte_flow_item_type pattern_fdir_ipv6_udp[] = {
213 	RTE_FLOW_ITEM_TYPE_ETH,
214 	RTE_FLOW_ITEM_TYPE_IPV6,
215 	RTE_FLOW_ITEM_TYPE_UDP,
216 	RTE_FLOW_ITEM_TYPE_END,
217 };
218 
219 static enum rte_flow_item_type pattern_fdir_ipv6_tcp[] = {
220 	RTE_FLOW_ITEM_TYPE_ETH,
221 	RTE_FLOW_ITEM_TYPE_IPV6,
222 	RTE_FLOW_ITEM_TYPE_TCP,
223 	RTE_FLOW_ITEM_TYPE_END,
224 };
225 
226 static enum rte_flow_item_type pattern_fdir_ipv6_sctp[] = {
227 	RTE_FLOW_ITEM_TYPE_ETH,
228 	RTE_FLOW_ITEM_TYPE_IPV6,
229 	RTE_FLOW_ITEM_TYPE_SCTP,
230 	RTE_FLOW_ITEM_TYPE_END,
231 };
232 
233 static enum rte_flow_item_type pattern_fdir_ipv6_gtpc[] = {
234 	RTE_FLOW_ITEM_TYPE_ETH,
235 	RTE_FLOW_ITEM_TYPE_IPV6,
236 	RTE_FLOW_ITEM_TYPE_UDP,
237 	RTE_FLOW_ITEM_TYPE_GTPC,
238 	RTE_FLOW_ITEM_TYPE_END,
239 };
240 
241 static enum rte_flow_item_type pattern_fdir_ipv6_gtpu[] = {
242 	RTE_FLOW_ITEM_TYPE_ETH,
243 	RTE_FLOW_ITEM_TYPE_IPV6,
244 	RTE_FLOW_ITEM_TYPE_UDP,
245 	RTE_FLOW_ITEM_TYPE_GTPU,
246 	RTE_FLOW_ITEM_TYPE_END,
247 };
248 
249 static enum rte_flow_item_type pattern_fdir_ipv6_gtpu_ipv4[] = {
250 	RTE_FLOW_ITEM_TYPE_ETH,
251 	RTE_FLOW_ITEM_TYPE_IPV6,
252 	RTE_FLOW_ITEM_TYPE_UDP,
253 	RTE_FLOW_ITEM_TYPE_GTPU,
254 	RTE_FLOW_ITEM_TYPE_IPV4,
255 	RTE_FLOW_ITEM_TYPE_END,
256 };
257 
258 static enum rte_flow_item_type pattern_fdir_ipv6_gtpu_ipv6[] = {
259 	RTE_FLOW_ITEM_TYPE_ETH,
260 	RTE_FLOW_ITEM_TYPE_IPV6,
261 	RTE_FLOW_ITEM_TYPE_UDP,
262 	RTE_FLOW_ITEM_TYPE_GTPU,
263 	RTE_FLOW_ITEM_TYPE_IPV6,
264 	RTE_FLOW_ITEM_TYPE_END,
265 };
266 
267 static enum rte_flow_item_type pattern_fdir_ethertype_raw_1[] = {
268 	RTE_FLOW_ITEM_TYPE_ETH,
269 	RTE_FLOW_ITEM_TYPE_RAW,
270 	RTE_FLOW_ITEM_TYPE_END,
271 };
272 
273 static enum rte_flow_item_type pattern_fdir_ethertype_raw_2[] = {
274 	RTE_FLOW_ITEM_TYPE_ETH,
275 	RTE_FLOW_ITEM_TYPE_RAW,
276 	RTE_FLOW_ITEM_TYPE_RAW,
277 	RTE_FLOW_ITEM_TYPE_END,
278 };
279 
280 static enum rte_flow_item_type pattern_fdir_ethertype_raw_3[] = {
281 	RTE_FLOW_ITEM_TYPE_ETH,
282 	RTE_FLOW_ITEM_TYPE_RAW,
283 	RTE_FLOW_ITEM_TYPE_RAW,
284 	RTE_FLOW_ITEM_TYPE_RAW,
285 	RTE_FLOW_ITEM_TYPE_END,
286 };
287 
288 static enum rte_flow_item_type pattern_fdir_ipv4_raw_1[] = {
289 	RTE_FLOW_ITEM_TYPE_ETH,
290 	RTE_FLOW_ITEM_TYPE_IPV4,
291 	RTE_FLOW_ITEM_TYPE_RAW,
292 	RTE_FLOW_ITEM_TYPE_END,
293 };
294 
295 static enum rte_flow_item_type pattern_fdir_ipv4_raw_2[] = {
296 	RTE_FLOW_ITEM_TYPE_ETH,
297 	RTE_FLOW_ITEM_TYPE_IPV4,
298 	RTE_FLOW_ITEM_TYPE_RAW,
299 	RTE_FLOW_ITEM_TYPE_RAW,
300 	RTE_FLOW_ITEM_TYPE_END,
301 };
302 
303 static enum rte_flow_item_type pattern_fdir_ipv4_raw_3[] = {
304 	RTE_FLOW_ITEM_TYPE_ETH,
305 	RTE_FLOW_ITEM_TYPE_IPV4,
306 	RTE_FLOW_ITEM_TYPE_RAW,
307 	RTE_FLOW_ITEM_TYPE_RAW,
308 	RTE_FLOW_ITEM_TYPE_RAW,
309 	RTE_FLOW_ITEM_TYPE_END,
310 };
311 
312 static enum rte_flow_item_type pattern_fdir_ipv4_udp_raw_1[] = {
313 	RTE_FLOW_ITEM_TYPE_ETH,
314 	RTE_FLOW_ITEM_TYPE_IPV4,
315 	RTE_FLOW_ITEM_TYPE_UDP,
316 	RTE_FLOW_ITEM_TYPE_RAW,
317 	RTE_FLOW_ITEM_TYPE_END,
318 };
319 
320 static enum rte_flow_item_type pattern_fdir_ipv4_udp_raw_2[] = {
321 	RTE_FLOW_ITEM_TYPE_ETH,
322 	RTE_FLOW_ITEM_TYPE_IPV4,
323 	RTE_FLOW_ITEM_TYPE_UDP,
324 	RTE_FLOW_ITEM_TYPE_RAW,
325 	RTE_FLOW_ITEM_TYPE_RAW,
326 	RTE_FLOW_ITEM_TYPE_END,
327 };
328 
329 static enum rte_flow_item_type pattern_fdir_ipv4_udp_raw_3[] = {
330 	RTE_FLOW_ITEM_TYPE_ETH,
331 	RTE_FLOW_ITEM_TYPE_IPV4,
332 	RTE_FLOW_ITEM_TYPE_UDP,
333 	RTE_FLOW_ITEM_TYPE_RAW,
334 	RTE_FLOW_ITEM_TYPE_RAW,
335 	RTE_FLOW_ITEM_TYPE_RAW,
336 	RTE_FLOW_ITEM_TYPE_END,
337 };
338 
339 static enum rte_flow_item_type pattern_fdir_ipv4_tcp_raw_1[] = {
340 	RTE_FLOW_ITEM_TYPE_ETH,
341 	RTE_FLOW_ITEM_TYPE_IPV4,
342 	RTE_FLOW_ITEM_TYPE_TCP,
343 	RTE_FLOW_ITEM_TYPE_RAW,
344 	RTE_FLOW_ITEM_TYPE_END,
345 };
346 
347 static enum rte_flow_item_type pattern_fdir_ipv4_tcp_raw_2[] = {
348 	RTE_FLOW_ITEM_TYPE_ETH,
349 	RTE_FLOW_ITEM_TYPE_IPV4,
350 	RTE_FLOW_ITEM_TYPE_TCP,
351 	RTE_FLOW_ITEM_TYPE_RAW,
352 	RTE_FLOW_ITEM_TYPE_RAW,
353 	RTE_FLOW_ITEM_TYPE_END,
354 };
355 
356 static enum rte_flow_item_type pattern_fdir_ipv4_tcp_raw_3[] = {
357 	RTE_FLOW_ITEM_TYPE_ETH,
358 	RTE_FLOW_ITEM_TYPE_IPV4,
359 	RTE_FLOW_ITEM_TYPE_TCP,
360 	RTE_FLOW_ITEM_TYPE_RAW,
361 	RTE_FLOW_ITEM_TYPE_RAW,
362 	RTE_FLOW_ITEM_TYPE_RAW,
363 	RTE_FLOW_ITEM_TYPE_END,
364 };
365 
366 static enum rte_flow_item_type pattern_fdir_ipv4_sctp_raw_1[] = {
367 	RTE_FLOW_ITEM_TYPE_ETH,
368 	RTE_FLOW_ITEM_TYPE_IPV4,
369 	RTE_FLOW_ITEM_TYPE_SCTP,
370 	RTE_FLOW_ITEM_TYPE_RAW,
371 	RTE_FLOW_ITEM_TYPE_END,
372 };
373 
374 static enum rte_flow_item_type pattern_fdir_ipv4_sctp_raw_2[] = {
375 	RTE_FLOW_ITEM_TYPE_ETH,
376 	RTE_FLOW_ITEM_TYPE_IPV4,
377 	RTE_FLOW_ITEM_TYPE_SCTP,
378 	RTE_FLOW_ITEM_TYPE_RAW,
379 	RTE_FLOW_ITEM_TYPE_RAW,
380 	RTE_FLOW_ITEM_TYPE_END,
381 };
382 
383 static enum rte_flow_item_type pattern_fdir_ipv4_sctp_raw_3[] = {
384 	RTE_FLOW_ITEM_TYPE_ETH,
385 	RTE_FLOW_ITEM_TYPE_IPV4,
386 	RTE_FLOW_ITEM_TYPE_SCTP,
387 	RTE_FLOW_ITEM_TYPE_RAW,
388 	RTE_FLOW_ITEM_TYPE_RAW,
389 	RTE_FLOW_ITEM_TYPE_RAW,
390 	RTE_FLOW_ITEM_TYPE_END,
391 };
392 
393 static enum rte_flow_item_type pattern_fdir_ipv6_raw_1[] = {
394 	RTE_FLOW_ITEM_TYPE_ETH,
395 	RTE_FLOW_ITEM_TYPE_IPV6,
396 	RTE_FLOW_ITEM_TYPE_RAW,
397 	RTE_FLOW_ITEM_TYPE_END,
398 };
399 
400 static enum rte_flow_item_type pattern_fdir_ipv6_raw_2[] = {
401 	RTE_FLOW_ITEM_TYPE_ETH,
402 	RTE_FLOW_ITEM_TYPE_IPV6,
403 	RTE_FLOW_ITEM_TYPE_RAW,
404 	RTE_FLOW_ITEM_TYPE_RAW,
405 	RTE_FLOW_ITEM_TYPE_END,
406 };
407 
408 static enum rte_flow_item_type pattern_fdir_ipv6_raw_3[] = {
409 	RTE_FLOW_ITEM_TYPE_ETH,
410 	RTE_FLOW_ITEM_TYPE_IPV6,
411 	RTE_FLOW_ITEM_TYPE_RAW,
412 	RTE_FLOW_ITEM_TYPE_RAW,
413 	RTE_FLOW_ITEM_TYPE_RAW,
414 	RTE_FLOW_ITEM_TYPE_END,
415 };
416 
417 static enum rte_flow_item_type pattern_fdir_ipv6_udp_raw_1[] = {
418 	RTE_FLOW_ITEM_TYPE_ETH,
419 	RTE_FLOW_ITEM_TYPE_IPV6,
420 	RTE_FLOW_ITEM_TYPE_UDP,
421 	RTE_FLOW_ITEM_TYPE_RAW,
422 	RTE_FLOW_ITEM_TYPE_END,
423 };
424 
425 static enum rte_flow_item_type pattern_fdir_ipv6_udp_raw_2[] = {
426 	RTE_FLOW_ITEM_TYPE_ETH,
427 	RTE_FLOW_ITEM_TYPE_IPV6,
428 	RTE_FLOW_ITEM_TYPE_UDP,
429 	RTE_FLOW_ITEM_TYPE_RAW,
430 	RTE_FLOW_ITEM_TYPE_RAW,
431 	RTE_FLOW_ITEM_TYPE_END,
432 };
433 
434 static enum rte_flow_item_type pattern_fdir_ipv6_udp_raw_3[] = {
435 	RTE_FLOW_ITEM_TYPE_ETH,
436 	RTE_FLOW_ITEM_TYPE_IPV6,
437 	RTE_FLOW_ITEM_TYPE_UDP,
438 	RTE_FLOW_ITEM_TYPE_RAW,
439 	RTE_FLOW_ITEM_TYPE_RAW,
440 	RTE_FLOW_ITEM_TYPE_RAW,
441 	RTE_FLOW_ITEM_TYPE_END,
442 };
443 
444 static enum rte_flow_item_type pattern_fdir_ipv6_tcp_raw_1[] = {
445 	RTE_FLOW_ITEM_TYPE_ETH,
446 	RTE_FLOW_ITEM_TYPE_IPV6,
447 	RTE_FLOW_ITEM_TYPE_TCP,
448 	RTE_FLOW_ITEM_TYPE_RAW,
449 	RTE_FLOW_ITEM_TYPE_END,
450 };
451 
452 static enum rte_flow_item_type pattern_fdir_ipv6_tcp_raw_2[] = {
453 	RTE_FLOW_ITEM_TYPE_ETH,
454 	RTE_FLOW_ITEM_TYPE_IPV6,
455 	RTE_FLOW_ITEM_TYPE_TCP,
456 	RTE_FLOW_ITEM_TYPE_RAW,
457 	RTE_FLOW_ITEM_TYPE_RAW,
458 	RTE_FLOW_ITEM_TYPE_END,
459 };
460 
461 static enum rte_flow_item_type pattern_fdir_ipv6_tcp_raw_3[] = {
462 	RTE_FLOW_ITEM_TYPE_ETH,
463 	RTE_FLOW_ITEM_TYPE_IPV6,
464 	RTE_FLOW_ITEM_TYPE_TCP,
465 	RTE_FLOW_ITEM_TYPE_RAW,
466 	RTE_FLOW_ITEM_TYPE_RAW,
467 	RTE_FLOW_ITEM_TYPE_RAW,
468 	RTE_FLOW_ITEM_TYPE_END,
469 };
470 
471 static enum rte_flow_item_type pattern_fdir_ipv6_sctp_raw_1[] = {
472 	RTE_FLOW_ITEM_TYPE_ETH,
473 	RTE_FLOW_ITEM_TYPE_IPV6,
474 	RTE_FLOW_ITEM_TYPE_SCTP,
475 	RTE_FLOW_ITEM_TYPE_RAW,
476 	RTE_FLOW_ITEM_TYPE_END,
477 };
478 
479 static enum rte_flow_item_type pattern_fdir_ipv6_sctp_raw_2[] = {
480 	RTE_FLOW_ITEM_TYPE_ETH,
481 	RTE_FLOW_ITEM_TYPE_IPV6,
482 	RTE_FLOW_ITEM_TYPE_SCTP,
483 	RTE_FLOW_ITEM_TYPE_RAW,
484 	RTE_FLOW_ITEM_TYPE_RAW,
485 	RTE_FLOW_ITEM_TYPE_END,
486 };
487 
488 static enum rte_flow_item_type pattern_fdir_ipv6_sctp_raw_3[] = {
489 	RTE_FLOW_ITEM_TYPE_ETH,
490 	RTE_FLOW_ITEM_TYPE_IPV6,
491 	RTE_FLOW_ITEM_TYPE_SCTP,
492 	RTE_FLOW_ITEM_TYPE_RAW,
493 	RTE_FLOW_ITEM_TYPE_RAW,
494 	RTE_FLOW_ITEM_TYPE_RAW,
495 	RTE_FLOW_ITEM_TYPE_END,
496 };
497 
498 static enum rte_flow_item_type pattern_fdir_ethertype_vlan[] = {
499 	RTE_FLOW_ITEM_TYPE_ETH,
500 	RTE_FLOW_ITEM_TYPE_VLAN,
501 	RTE_FLOW_ITEM_TYPE_END,
502 };
503 
504 static enum rte_flow_item_type pattern_fdir_vlan_ipv4[] = {
505 	RTE_FLOW_ITEM_TYPE_ETH,
506 	RTE_FLOW_ITEM_TYPE_VLAN,
507 	RTE_FLOW_ITEM_TYPE_IPV4,
508 	RTE_FLOW_ITEM_TYPE_END,
509 };
510 
511 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_udp[] = {
512 	RTE_FLOW_ITEM_TYPE_ETH,
513 	RTE_FLOW_ITEM_TYPE_VLAN,
514 	RTE_FLOW_ITEM_TYPE_IPV4,
515 	RTE_FLOW_ITEM_TYPE_UDP,
516 	RTE_FLOW_ITEM_TYPE_END,
517 };
518 
519 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_tcp[] = {
520 	RTE_FLOW_ITEM_TYPE_ETH,
521 	RTE_FLOW_ITEM_TYPE_VLAN,
522 	RTE_FLOW_ITEM_TYPE_IPV4,
523 	RTE_FLOW_ITEM_TYPE_TCP,
524 	RTE_FLOW_ITEM_TYPE_END,
525 };
526 
527 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_sctp[] = {
528 	RTE_FLOW_ITEM_TYPE_ETH,
529 	RTE_FLOW_ITEM_TYPE_VLAN,
530 	RTE_FLOW_ITEM_TYPE_IPV4,
531 	RTE_FLOW_ITEM_TYPE_SCTP,
532 	RTE_FLOW_ITEM_TYPE_END,
533 };
534 
535 static enum rte_flow_item_type pattern_fdir_vlan_ipv6[] = {
536 	RTE_FLOW_ITEM_TYPE_ETH,
537 	RTE_FLOW_ITEM_TYPE_VLAN,
538 	RTE_FLOW_ITEM_TYPE_IPV6,
539 	RTE_FLOW_ITEM_TYPE_END,
540 };
541 
542 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_udp[] = {
543 	RTE_FLOW_ITEM_TYPE_ETH,
544 	RTE_FLOW_ITEM_TYPE_VLAN,
545 	RTE_FLOW_ITEM_TYPE_IPV6,
546 	RTE_FLOW_ITEM_TYPE_UDP,
547 	RTE_FLOW_ITEM_TYPE_END,
548 };
549 
550 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_tcp[] = {
551 	RTE_FLOW_ITEM_TYPE_ETH,
552 	RTE_FLOW_ITEM_TYPE_VLAN,
553 	RTE_FLOW_ITEM_TYPE_IPV6,
554 	RTE_FLOW_ITEM_TYPE_TCP,
555 	RTE_FLOW_ITEM_TYPE_END,
556 };
557 
558 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_sctp[] = {
559 	RTE_FLOW_ITEM_TYPE_ETH,
560 	RTE_FLOW_ITEM_TYPE_VLAN,
561 	RTE_FLOW_ITEM_TYPE_IPV6,
562 	RTE_FLOW_ITEM_TYPE_SCTP,
563 	RTE_FLOW_ITEM_TYPE_END,
564 };
565 
566 static enum rte_flow_item_type pattern_fdir_ethertype_vlan_raw_1[] = {
567 	RTE_FLOW_ITEM_TYPE_ETH,
568 	RTE_FLOW_ITEM_TYPE_VLAN,
569 	RTE_FLOW_ITEM_TYPE_RAW,
570 	RTE_FLOW_ITEM_TYPE_END,
571 };
572 
573 static enum rte_flow_item_type pattern_fdir_ethertype_vlan_raw_2[] = {
574 	RTE_FLOW_ITEM_TYPE_ETH,
575 	RTE_FLOW_ITEM_TYPE_VLAN,
576 	RTE_FLOW_ITEM_TYPE_RAW,
577 	RTE_FLOW_ITEM_TYPE_RAW,
578 	RTE_FLOW_ITEM_TYPE_END,
579 };
580 
581 static enum rte_flow_item_type pattern_fdir_ethertype_vlan_raw_3[] = {
582 	RTE_FLOW_ITEM_TYPE_ETH,
583 	RTE_FLOW_ITEM_TYPE_VLAN,
584 	RTE_FLOW_ITEM_TYPE_RAW,
585 	RTE_FLOW_ITEM_TYPE_RAW,
586 	RTE_FLOW_ITEM_TYPE_RAW,
587 	RTE_FLOW_ITEM_TYPE_END,
588 };
589 
590 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_raw_1[] = {
591 	RTE_FLOW_ITEM_TYPE_ETH,
592 	RTE_FLOW_ITEM_TYPE_VLAN,
593 	RTE_FLOW_ITEM_TYPE_IPV4,
594 	RTE_FLOW_ITEM_TYPE_RAW,
595 	RTE_FLOW_ITEM_TYPE_END,
596 };
597 
598 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_raw_2[] = {
599 	RTE_FLOW_ITEM_TYPE_ETH,
600 	RTE_FLOW_ITEM_TYPE_VLAN,
601 	RTE_FLOW_ITEM_TYPE_IPV4,
602 	RTE_FLOW_ITEM_TYPE_RAW,
603 	RTE_FLOW_ITEM_TYPE_RAW,
604 	RTE_FLOW_ITEM_TYPE_END,
605 };
606 
607 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_raw_3[] = {
608 	RTE_FLOW_ITEM_TYPE_ETH,
609 	RTE_FLOW_ITEM_TYPE_VLAN,
610 	RTE_FLOW_ITEM_TYPE_IPV4,
611 	RTE_FLOW_ITEM_TYPE_RAW,
612 	RTE_FLOW_ITEM_TYPE_RAW,
613 	RTE_FLOW_ITEM_TYPE_RAW,
614 	RTE_FLOW_ITEM_TYPE_END,
615 };
616 
617 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_udp_raw_1[] = {
618 	RTE_FLOW_ITEM_TYPE_ETH,
619 	RTE_FLOW_ITEM_TYPE_VLAN,
620 	RTE_FLOW_ITEM_TYPE_IPV4,
621 	RTE_FLOW_ITEM_TYPE_UDP,
622 	RTE_FLOW_ITEM_TYPE_RAW,
623 	RTE_FLOW_ITEM_TYPE_END,
624 };
625 
626 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_udp_raw_2[] = {
627 	RTE_FLOW_ITEM_TYPE_ETH,
628 	RTE_FLOW_ITEM_TYPE_VLAN,
629 	RTE_FLOW_ITEM_TYPE_IPV4,
630 	RTE_FLOW_ITEM_TYPE_UDP,
631 	RTE_FLOW_ITEM_TYPE_RAW,
632 	RTE_FLOW_ITEM_TYPE_RAW,
633 	RTE_FLOW_ITEM_TYPE_END,
634 };
635 
636 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_udp_raw_3[] = {
637 	RTE_FLOW_ITEM_TYPE_ETH,
638 	RTE_FLOW_ITEM_TYPE_VLAN,
639 	RTE_FLOW_ITEM_TYPE_IPV4,
640 	RTE_FLOW_ITEM_TYPE_UDP,
641 	RTE_FLOW_ITEM_TYPE_RAW,
642 	RTE_FLOW_ITEM_TYPE_RAW,
643 	RTE_FLOW_ITEM_TYPE_RAW,
644 	RTE_FLOW_ITEM_TYPE_END,
645 };
646 
647 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_tcp_raw_1[] = {
648 	RTE_FLOW_ITEM_TYPE_ETH,
649 	RTE_FLOW_ITEM_TYPE_VLAN,
650 	RTE_FLOW_ITEM_TYPE_IPV4,
651 	RTE_FLOW_ITEM_TYPE_TCP,
652 	RTE_FLOW_ITEM_TYPE_RAW,
653 	RTE_FLOW_ITEM_TYPE_END,
654 };
655 
656 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_tcp_raw_2[] = {
657 	RTE_FLOW_ITEM_TYPE_ETH,
658 	RTE_FLOW_ITEM_TYPE_VLAN,
659 	RTE_FLOW_ITEM_TYPE_IPV4,
660 	RTE_FLOW_ITEM_TYPE_TCP,
661 	RTE_FLOW_ITEM_TYPE_RAW,
662 	RTE_FLOW_ITEM_TYPE_RAW,
663 	RTE_FLOW_ITEM_TYPE_END,
664 };
665 
666 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_tcp_raw_3[] = {
667 	RTE_FLOW_ITEM_TYPE_ETH,
668 	RTE_FLOW_ITEM_TYPE_VLAN,
669 	RTE_FLOW_ITEM_TYPE_IPV4,
670 	RTE_FLOW_ITEM_TYPE_TCP,
671 	RTE_FLOW_ITEM_TYPE_RAW,
672 	RTE_FLOW_ITEM_TYPE_RAW,
673 	RTE_FLOW_ITEM_TYPE_RAW,
674 	RTE_FLOW_ITEM_TYPE_END,
675 };
676 
677 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_sctp_raw_1[] = {
678 	RTE_FLOW_ITEM_TYPE_ETH,
679 	RTE_FLOW_ITEM_TYPE_VLAN,
680 	RTE_FLOW_ITEM_TYPE_IPV4,
681 	RTE_FLOW_ITEM_TYPE_SCTP,
682 	RTE_FLOW_ITEM_TYPE_RAW,
683 	RTE_FLOW_ITEM_TYPE_END,
684 };
685 
686 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_sctp_raw_2[] = {
687 	RTE_FLOW_ITEM_TYPE_ETH,
688 	RTE_FLOW_ITEM_TYPE_VLAN,
689 	RTE_FLOW_ITEM_TYPE_IPV4,
690 	RTE_FLOW_ITEM_TYPE_SCTP,
691 	RTE_FLOW_ITEM_TYPE_RAW,
692 	RTE_FLOW_ITEM_TYPE_RAW,
693 	RTE_FLOW_ITEM_TYPE_END,
694 };
695 
696 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_sctp_raw_3[] = {
697 	RTE_FLOW_ITEM_TYPE_ETH,
698 	RTE_FLOW_ITEM_TYPE_VLAN,
699 	RTE_FLOW_ITEM_TYPE_IPV4,
700 	RTE_FLOW_ITEM_TYPE_SCTP,
701 	RTE_FLOW_ITEM_TYPE_RAW,
702 	RTE_FLOW_ITEM_TYPE_RAW,
703 	RTE_FLOW_ITEM_TYPE_RAW,
704 	RTE_FLOW_ITEM_TYPE_END,
705 };
706 
707 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_raw_1[] = {
708 	RTE_FLOW_ITEM_TYPE_ETH,
709 	RTE_FLOW_ITEM_TYPE_VLAN,
710 	RTE_FLOW_ITEM_TYPE_IPV6,
711 	RTE_FLOW_ITEM_TYPE_RAW,
712 	RTE_FLOW_ITEM_TYPE_END,
713 };
714 
715 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_raw_2[] = {
716 	RTE_FLOW_ITEM_TYPE_ETH,
717 	RTE_FLOW_ITEM_TYPE_VLAN,
718 	RTE_FLOW_ITEM_TYPE_IPV6,
719 	RTE_FLOW_ITEM_TYPE_RAW,
720 	RTE_FLOW_ITEM_TYPE_RAW,
721 	RTE_FLOW_ITEM_TYPE_END,
722 };
723 
724 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_raw_3[] = {
725 	RTE_FLOW_ITEM_TYPE_ETH,
726 	RTE_FLOW_ITEM_TYPE_VLAN,
727 	RTE_FLOW_ITEM_TYPE_IPV6,
728 	RTE_FLOW_ITEM_TYPE_RAW,
729 	RTE_FLOW_ITEM_TYPE_RAW,
730 	RTE_FLOW_ITEM_TYPE_RAW,
731 	RTE_FLOW_ITEM_TYPE_END,
732 };
733 
734 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_udp_raw_1[] = {
735 	RTE_FLOW_ITEM_TYPE_ETH,
736 	RTE_FLOW_ITEM_TYPE_VLAN,
737 	RTE_FLOW_ITEM_TYPE_IPV6,
738 	RTE_FLOW_ITEM_TYPE_UDP,
739 	RTE_FLOW_ITEM_TYPE_RAW,
740 	RTE_FLOW_ITEM_TYPE_END,
741 };
742 
743 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_udp_raw_2[] = {
744 	RTE_FLOW_ITEM_TYPE_ETH,
745 	RTE_FLOW_ITEM_TYPE_VLAN,
746 	RTE_FLOW_ITEM_TYPE_IPV6,
747 	RTE_FLOW_ITEM_TYPE_UDP,
748 	RTE_FLOW_ITEM_TYPE_RAW,
749 	RTE_FLOW_ITEM_TYPE_RAW,
750 	RTE_FLOW_ITEM_TYPE_END,
751 };
752 
753 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_udp_raw_3[] = {
754 	RTE_FLOW_ITEM_TYPE_ETH,
755 	RTE_FLOW_ITEM_TYPE_VLAN,
756 	RTE_FLOW_ITEM_TYPE_IPV6,
757 	RTE_FLOW_ITEM_TYPE_UDP,
758 	RTE_FLOW_ITEM_TYPE_RAW,
759 	RTE_FLOW_ITEM_TYPE_RAW,
760 	RTE_FLOW_ITEM_TYPE_RAW,
761 	RTE_FLOW_ITEM_TYPE_END,
762 };
763 
764 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_tcp_raw_1[] = {
765 	RTE_FLOW_ITEM_TYPE_ETH,
766 	RTE_FLOW_ITEM_TYPE_VLAN,
767 	RTE_FLOW_ITEM_TYPE_IPV6,
768 	RTE_FLOW_ITEM_TYPE_TCP,
769 	RTE_FLOW_ITEM_TYPE_RAW,
770 	RTE_FLOW_ITEM_TYPE_END,
771 };
772 
773 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_tcp_raw_2[] = {
774 	RTE_FLOW_ITEM_TYPE_ETH,
775 	RTE_FLOW_ITEM_TYPE_VLAN,
776 	RTE_FLOW_ITEM_TYPE_IPV6,
777 	RTE_FLOW_ITEM_TYPE_TCP,
778 	RTE_FLOW_ITEM_TYPE_RAW,
779 	RTE_FLOW_ITEM_TYPE_RAW,
780 	RTE_FLOW_ITEM_TYPE_END,
781 };
782 
783 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_tcp_raw_3[] = {
784 	RTE_FLOW_ITEM_TYPE_ETH,
785 	RTE_FLOW_ITEM_TYPE_VLAN,
786 	RTE_FLOW_ITEM_TYPE_IPV6,
787 	RTE_FLOW_ITEM_TYPE_TCP,
788 	RTE_FLOW_ITEM_TYPE_RAW,
789 	RTE_FLOW_ITEM_TYPE_RAW,
790 	RTE_FLOW_ITEM_TYPE_RAW,
791 	RTE_FLOW_ITEM_TYPE_END,
792 };
793 
794 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_sctp_raw_1[] = {
795 	RTE_FLOW_ITEM_TYPE_ETH,
796 	RTE_FLOW_ITEM_TYPE_VLAN,
797 	RTE_FLOW_ITEM_TYPE_IPV6,
798 	RTE_FLOW_ITEM_TYPE_SCTP,
799 	RTE_FLOW_ITEM_TYPE_RAW,
800 	RTE_FLOW_ITEM_TYPE_END,
801 };
802 
803 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_sctp_raw_2[] = {
804 	RTE_FLOW_ITEM_TYPE_ETH,
805 	RTE_FLOW_ITEM_TYPE_VLAN,
806 	RTE_FLOW_ITEM_TYPE_IPV6,
807 	RTE_FLOW_ITEM_TYPE_SCTP,
808 	RTE_FLOW_ITEM_TYPE_RAW,
809 	RTE_FLOW_ITEM_TYPE_RAW,
810 	RTE_FLOW_ITEM_TYPE_END,
811 };
812 
813 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_sctp_raw_3[] = {
814 	RTE_FLOW_ITEM_TYPE_ETH,
815 	RTE_FLOW_ITEM_TYPE_VLAN,
816 	RTE_FLOW_ITEM_TYPE_IPV6,
817 	RTE_FLOW_ITEM_TYPE_SCTP,
818 	RTE_FLOW_ITEM_TYPE_RAW,
819 	RTE_FLOW_ITEM_TYPE_RAW,
820 	RTE_FLOW_ITEM_TYPE_RAW,
821 	RTE_FLOW_ITEM_TYPE_END,
822 };
823 
824 static enum rte_flow_item_type pattern_fdir_ipv4_vf[] = {
825 	RTE_FLOW_ITEM_TYPE_ETH,
826 	RTE_FLOW_ITEM_TYPE_IPV4,
827 	RTE_FLOW_ITEM_TYPE_VF,
828 	RTE_FLOW_ITEM_TYPE_END,
829 };
830 
831 static enum rte_flow_item_type pattern_fdir_ipv4_udp_vf[] = {
832 	RTE_FLOW_ITEM_TYPE_ETH,
833 	RTE_FLOW_ITEM_TYPE_IPV4,
834 	RTE_FLOW_ITEM_TYPE_UDP,
835 	RTE_FLOW_ITEM_TYPE_VF,
836 	RTE_FLOW_ITEM_TYPE_END,
837 };
838 
839 static enum rte_flow_item_type pattern_fdir_ipv4_tcp_vf[] = {
840 	RTE_FLOW_ITEM_TYPE_ETH,
841 	RTE_FLOW_ITEM_TYPE_IPV4,
842 	RTE_FLOW_ITEM_TYPE_TCP,
843 	RTE_FLOW_ITEM_TYPE_VF,
844 	RTE_FLOW_ITEM_TYPE_END,
845 };
846 
847 static enum rte_flow_item_type pattern_fdir_ipv4_sctp_vf[] = {
848 	RTE_FLOW_ITEM_TYPE_ETH,
849 	RTE_FLOW_ITEM_TYPE_IPV4,
850 	RTE_FLOW_ITEM_TYPE_SCTP,
851 	RTE_FLOW_ITEM_TYPE_VF,
852 	RTE_FLOW_ITEM_TYPE_END,
853 };
854 
855 static enum rte_flow_item_type pattern_fdir_ipv6_vf[] = {
856 	RTE_FLOW_ITEM_TYPE_ETH,
857 	RTE_FLOW_ITEM_TYPE_IPV6,
858 	RTE_FLOW_ITEM_TYPE_VF,
859 	RTE_FLOW_ITEM_TYPE_END,
860 };
861 
862 static enum rte_flow_item_type pattern_fdir_ipv6_udp_vf[] = {
863 	RTE_FLOW_ITEM_TYPE_ETH,
864 	RTE_FLOW_ITEM_TYPE_IPV6,
865 	RTE_FLOW_ITEM_TYPE_UDP,
866 	RTE_FLOW_ITEM_TYPE_VF,
867 	RTE_FLOW_ITEM_TYPE_END,
868 };
869 
870 static enum rte_flow_item_type pattern_fdir_ipv6_tcp_vf[] = {
871 	RTE_FLOW_ITEM_TYPE_ETH,
872 	RTE_FLOW_ITEM_TYPE_IPV6,
873 	RTE_FLOW_ITEM_TYPE_TCP,
874 	RTE_FLOW_ITEM_TYPE_VF,
875 	RTE_FLOW_ITEM_TYPE_END,
876 };
877 
878 static enum rte_flow_item_type pattern_fdir_ipv6_sctp_vf[] = {
879 	RTE_FLOW_ITEM_TYPE_ETH,
880 	RTE_FLOW_ITEM_TYPE_IPV6,
881 	RTE_FLOW_ITEM_TYPE_SCTP,
882 	RTE_FLOW_ITEM_TYPE_VF,
883 	RTE_FLOW_ITEM_TYPE_END,
884 };
885 
886 static enum rte_flow_item_type pattern_fdir_ethertype_raw_1_vf[] = {
887 	RTE_FLOW_ITEM_TYPE_ETH,
888 	RTE_FLOW_ITEM_TYPE_RAW,
889 	RTE_FLOW_ITEM_TYPE_VF,
890 	RTE_FLOW_ITEM_TYPE_END,
891 };
892 
893 static enum rte_flow_item_type pattern_fdir_ethertype_raw_2_vf[] = {
894 	RTE_FLOW_ITEM_TYPE_ETH,
895 	RTE_FLOW_ITEM_TYPE_RAW,
896 	RTE_FLOW_ITEM_TYPE_RAW,
897 	RTE_FLOW_ITEM_TYPE_VF,
898 	RTE_FLOW_ITEM_TYPE_END,
899 };
900 
901 static enum rte_flow_item_type pattern_fdir_ethertype_raw_3_vf[] = {
902 	RTE_FLOW_ITEM_TYPE_ETH,
903 	RTE_FLOW_ITEM_TYPE_RAW,
904 	RTE_FLOW_ITEM_TYPE_RAW,
905 	RTE_FLOW_ITEM_TYPE_RAW,
906 	RTE_FLOW_ITEM_TYPE_VF,
907 	RTE_FLOW_ITEM_TYPE_END,
908 };
909 
910 static enum rte_flow_item_type pattern_fdir_ipv4_raw_1_vf[] = {
911 	RTE_FLOW_ITEM_TYPE_ETH,
912 	RTE_FLOW_ITEM_TYPE_IPV4,
913 	RTE_FLOW_ITEM_TYPE_RAW,
914 	RTE_FLOW_ITEM_TYPE_VF,
915 	RTE_FLOW_ITEM_TYPE_END,
916 };
917 
918 static enum rte_flow_item_type pattern_fdir_ipv4_raw_2_vf[] = {
919 	RTE_FLOW_ITEM_TYPE_ETH,
920 	RTE_FLOW_ITEM_TYPE_IPV4,
921 	RTE_FLOW_ITEM_TYPE_RAW,
922 	RTE_FLOW_ITEM_TYPE_RAW,
923 	RTE_FLOW_ITEM_TYPE_VF,
924 	RTE_FLOW_ITEM_TYPE_END,
925 };
926 
927 static enum rte_flow_item_type pattern_fdir_ipv4_raw_3_vf[] = {
928 	RTE_FLOW_ITEM_TYPE_ETH,
929 	RTE_FLOW_ITEM_TYPE_IPV4,
930 	RTE_FLOW_ITEM_TYPE_RAW,
931 	RTE_FLOW_ITEM_TYPE_RAW,
932 	RTE_FLOW_ITEM_TYPE_RAW,
933 	RTE_FLOW_ITEM_TYPE_VF,
934 	RTE_FLOW_ITEM_TYPE_END,
935 };
936 
937 static enum rte_flow_item_type pattern_fdir_ipv4_udp_raw_1_vf[] = {
938 	RTE_FLOW_ITEM_TYPE_ETH,
939 	RTE_FLOW_ITEM_TYPE_IPV4,
940 	RTE_FLOW_ITEM_TYPE_UDP,
941 	RTE_FLOW_ITEM_TYPE_RAW,
942 	RTE_FLOW_ITEM_TYPE_VF,
943 	RTE_FLOW_ITEM_TYPE_END,
944 };
945 
946 static enum rte_flow_item_type pattern_fdir_ipv4_udp_raw_2_vf[] = {
947 	RTE_FLOW_ITEM_TYPE_ETH,
948 	RTE_FLOW_ITEM_TYPE_IPV4,
949 	RTE_FLOW_ITEM_TYPE_UDP,
950 	RTE_FLOW_ITEM_TYPE_RAW,
951 	RTE_FLOW_ITEM_TYPE_RAW,
952 	RTE_FLOW_ITEM_TYPE_VF,
953 	RTE_FLOW_ITEM_TYPE_END,
954 };
955 
956 static enum rte_flow_item_type pattern_fdir_ipv4_udp_raw_3_vf[] = {
957 	RTE_FLOW_ITEM_TYPE_ETH,
958 	RTE_FLOW_ITEM_TYPE_IPV4,
959 	RTE_FLOW_ITEM_TYPE_UDP,
960 	RTE_FLOW_ITEM_TYPE_RAW,
961 	RTE_FLOW_ITEM_TYPE_RAW,
962 	RTE_FLOW_ITEM_TYPE_RAW,
963 	RTE_FLOW_ITEM_TYPE_VF,
964 	RTE_FLOW_ITEM_TYPE_END,
965 };
966 
967 static enum rte_flow_item_type pattern_fdir_ipv4_tcp_raw_1_vf[] = {
968 	RTE_FLOW_ITEM_TYPE_ETH,
969 	RTE_FLOW_ITEM_TYPE_IPV4,
970 	RTE_FLOW_ITEM_TYPE_TCP,
971 	RTE_FLOW_ITEM_TYPE_RAW,
972 	RTE_FLOW_ITEM_TYPE_VF,
973 	RTE_FLOW_ITEM_TYPE_END,
974 };
975 
976 static enum rte_flow_item_type pattern_fdir_ipv4_tcp_raw_2_vf[] = {
977 	RTE_FLOW_ITEM_TYPE_ETH,
978 	RTE_FLOW_ITEM_TYPE_IPV4,
979 	RTE_FLOW_ITEM_TYPE_TCP,
980 	RTE_FLOW_ITEM_TYPE_RAW,
981 	RTE_FLOW_ITEM_TYPE_RAW,
982 	RTE_FLOW_ITEM_TYPE_VF,
983 	RTE_FLOW_ITEM_TYPE_END,
984 };
985 
986 static enum rte_flow_item_type pattern_fdir_ipv4_tcp_raw_3_vf[] = {
987 	RTE_FLOW_ITEM_TYPE_ETH,
988 	RTE_FLOW_ITEM_TYPE_IPV4,
989 	RTE_FLOW_ITEM_TYPE_TCP,
990 	RTE_FLOW_ITEM_TYPE_RAW,
991 	RTE_FLOW_ITEM_TYPE_RAW,
992 	RTE_FLOW_ITEM_TYPE_RAW,
993 	RTE_FLOW_ITEM_TYPE_VF,
994 	RTE_FLOW_ITEM_TYPE_END,
995 };
996 
997 static enum rte_flow_item_type pattern_fdir_ipv4_sctp_raw_1_vf[] = {
998 	RTE_FLOW_ITEM_TYPE_ETH,
999 	RTE_FLOW_ITEM_TYPE_IPV4,
1000 	RTE_FLOW_ITEM_TYPE_SCTP,
1001 	RTE_FLOW_ITEM_TYPE_RAW,
1002 	RTE_FLOW_ITEM_TYPE_VF,
1003 	RTE_FLOW_ITEM_TYPE_END,
1004 };
1005 
1006 static enum rte_flow_item_type pattern_fdir_ipv4_sctp_raw_2_vf[] = {
1007 	RTE_FLOW_ITEM_TYPE_ETH,
1008 	RTE_FLOW_ITEM_TYPE_IPV4,
1009 	RTE_FLOW_ITEM_TYPE_SCTP,
1010 	RTE_FLOW_ITEM_TYPE_RAW,
1011 	RTE_FLOW_ITEM_TYPE_RAW,
1012 	RTE_FLOW_ITEM_TYPE_VF,
1013 	RTE_FLOW_ITEM_TYPE_END,
1014 };
1015 
1016 static enum rte_flow_item_type pattern_fdir_ipv4_sctp_raw_3_vf[] = {
1017 	RTE_FLOW_ITEM_TYPE_ETH,
1018 	RTE_FLOW_ITEM_TYPE_IPV4,
1019 	RTE_FLOW_ITEM_TYPE_SCTP,
1020 	RTE_FLOW_ITEM_TYPE_RAW,
1021 	RTE_FLOW_ITEM_TYPE_RAW,
1022 	RTE_FLOW_ITEM_TYPE_RAW,
1023 	RTE_FLOW_ITEM_TYPE_VF,
1024 	RTE_FLOW_ITEM_TYPE_END,
1025 };
1026 
1027 static enum rte_flow_item_type pattern_fdir_ipv6_raw_1_vf[] = {
1028 	RTE_FLOW_ITEM_TYPE_ETH,
1029 	RTE_FLOW_ITEM_TYPE_IPV6,
1030 	RTE_FLOW_ITEM_TYPE_RAW,
1031 	RTE_FLOW_ITEM_TYPE_VF,
1032 	RTE_FLOW_ITEM_TYPE_END,
1033 };
1034 
1035 static enum rte_flow_item_type pattern_fdir_ipv6_raw_2_vf[] = {
1036 	RTE_FLOW_ITEM_TYPE_ETH,
1037 	RTE_FLOW_ITEM_TYPE_IPV6,
1038 	RTE_FLOW_ITEM_TYPE_RAW,
1039 	RTE_FLOW_ITEM_TYPE_RAW,
1040 	RTE_FLOW_ITEM_TYPE_VF,
1041 	RTE_FLOW_ITEM_TYPE_END,
1042 };
1043 
1044 static enum rte_flow_item_type pattern_fdir_ipv6_raw_3_vf[] = {
1045 	RTE_FLOW_ITEM_TYPE_ETH,
1046 	RTE_FLOW_ITEM_TYPE_IPV6,
1047 	RTE_FLOW_ITEM_TYPE_RAW,
1048 	RTE_FLOW_ITEM_TYPE_RAW,
1049 	RTE_FLOW_ITEM_TYPE_RAW,
1050 	RTE_FLOW_ITEM_TYPE_VF,
1051 	RTE_FLOW_ITEM_TYPE_END,
1052 };
1053 
1054 static enum rte_flow_item_type pattern_fdir_ipv6_udp_raw_1_vf[] = {
1055 	RTE_FLOW_ITEM_TYPE_ETH,
1056 	RTE_FLOW_ITEM_TYPE_IPV6,
1057 	RTE_FLOW_ITEM_TYPE_UDP,
1058 	RTE_FLOW_ITEM_TYPE_RAW,
1059 	RTE_FLOW_ITEM_TYPE_VF,
1060 	RTE_FLOW_ITEM_TYPE_END,
1061 };
1062 
1063 static enum rte_flow_item_type pattern_fdir_ipv6_udp_raw_2_vf[] = {
1064 	RTE_FLOW_ITEM_TYPE_ETH,
1065 	RTE_FLOW_ITEM_TYPE_IPV6,
1066 	RTE_FLOW_ITEM_TYPE_UDP,
1067 	RTE_FLOW_ITEM_TYPE_RAW,
1068 	RTE_FLOW_ITEM_TYPE_RAW,
1069 	RTE_FLOW_ITEM_TYPE_VF,
1070 	RTE_FLOW_ITEM_TYPE_END,
1071 };
1072 
1073 static enum rte_flow_item_type pattern_fdir_ipv6_udp_raw_3_vf[] = {
1074 	RTE_FLOW_ITEM_TYPE_ETH,
1075 	RTE_FLOW_ITEM_TYPE_IPV6,
1076 	RTE_FLOW_ITEM_TYPE_UDP,
1077 	RTE_FLOW_ITEM_TYPE_RAW,
1078 	RTE_FLOW_ITEM_TYPE_RAW,
1079 	RTE_FLOW_ITEM_TYPE_RAW,
1080 	RTE_FLOW_ITEM_TYPE_VF,
1081 	RTE_FLOW_ITEM_TYPE_END,
1082 };
1083 
1084 static enum rte_flow_item_type pattern_fdir_ipv6_tcp_raw_1_vf[] = {
1085 	RTE_FLOW_ITEM_TYPE_ETH,
1086 	RTE_FLOW_ITEM_TYPE_IPV6,
1087 	RTE_FLOW_ITEM_TYPE_TCP,
1088 	RTE_FLOW_ITEM_TYPE_RAW,
1089 	RTE_FLOW_ITEM_TYPE_VF,
1090 	RTE_FLOW_ITEM_TYPE_END,
1091 };
1092 
1093 static enum rte_flow_item_type pattern_fdir_ipv6_tcp_raw_2_vf[] = {
1094 	RTE_FLOW_ITEM_TYPE_ETH,
1095 	RTE_FLOW_ITEM_TYPE_IPV6,
1096 	RTE_FLOW_ITEM_TYPE_TCP,
1097 	RTE_FLOW_ITEM_TYPE_RAW,
1098 	RTE_FLOW_ITEM_TYPE_RAW,
1099 	RTE_FLOW_ITEM_TYPE_VF,
1100 	RTE_FLOW_ITEM_TYPE_END,
1101 };
1102 
1103 static enum rte_flow_item_type pattern_fdir_ipv6_tcp_raw_3_vf[] = {
1104 	RTE_FLOW_ITEM_TYPE_ETH,
1105 	RTE_FLOW_ITEM_TYPE_IPV6,
1106 	RTE_FLOW_ITEM_TYPE_TCP,
1107 	RTE_FLOW_ITEM_TYPE_RAW,
1108 	RTE_FLOW_ITEM_TYPE_RAW,
1109 	RTE_FLOW_ITEM_TYPE_RAW,
1110 	RTE_FLOW_ITEM_TYPE_VF,
1111 	RTE_FLOW_ITEM_TYPE_END,
1112 };
1113 
1114 static enum rte_flow_item_type pattern_fdir_ipv6_sctp_raw_1_vf[] = {
1115 	RTE_FLOW_ITEM_TYPE_ETH,
1116 	RTE_FLOW_ITEM_TYPE_IPV6,
1117 	RTE_FLOW_ITEM_TYPE_SCTP,
1118 	RTE_FLOW_ITEM_TYPE_RAW,
1119 	RTE_FLOW_ITEM_TYPE_VF,
1120 	RTE_FLOW_ITEM_TYPE_END,
1121 };
1122 
1123 static enum rte_flow_item_type pattern_fdir_ipv6_sctp_raw_2_vf[] = {
1124 	RTE_FLOW_ITEM_TYPE_ETH,
1125 	RTE_FLOW_ITEM_TYPE_IPV6,
1126 	RTE_FLOW_ITEM_TYPE_SCTP,
1127 	RTE_FLOW_ITEM_TYPE_RAW,
1128 	RTE_FLOW_ITEM_TYPE_RAW,
1129 	RTE_FLOW_ITEM_TYPE_VF,
1130 	RTE_FLOW_ITEM_TYPE_END,
1131 };
1132 
1133 static enum rte_flow_item_type pattern_fdir_ipv6_sctp_raw_3_vf[] = {
1134 	RTE_FLOW_ITEM_TYPE_ETH,
1135 	RTE_FLOW_ITEM_TYPE_IPV6,
1136 	RTE_FLOW_ITEM_TYPE_SCTP,
1137 	RTE_FLOW_ITEM_TYPE_RAW,
1138 	RTE_FLOW_ITEM_TYPE_RAW,
1139 	RTE_FLOW_ITEM_TYPE_RAW,
1140 	RTE_FLOW_ITEM_TYPE_VF,
1141 	RTE_FLOW_ITEM_TYPE_END,
1142 };
1143 
1144 static enum rte_flow_item_type pattern_fdir_ethertype_vlan_vf[] = {
1145 	RTE_FLOW_ITEM_TYPE_ETH,
1146 	RTE_FLOW_ITEM_TYPE_VLAN,
1147 	RTE_FLOW_ITEM_TYPE_VF,
1148 	RTE_FLOW_ITEM_TYPE_END,
1149 };
1150 
1151 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_vf[] = {
1152 	RTE_FLOW_ITEM_TYPE_ETH,
1153 	RTE_FLOW_ITEM_TYPE_VLAN,
1154 	RTE_FLOW_ITEM_TYPE_IPV4,
1155 	RTE_FLOW_ITEM_TYPE_VF,
1156 	RTE_FLOW_ITEM_TYPE_END,
1157 };
1158 
1159 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_udp_vf[] = {
1160 	RTE_FLOW_ITEM_TYPE_ETH,
1161 	RTE_FLOW_ITEM_TYPE_VLAN,
1162 	RTE_FLOW_ITEM_TYPE_IPV4,
1163 	RTE_FLOW_ITEM_TYPE_UDP,
1164 	RTE_FLOW_ITEM_TYPE_VF,
1165 	RTE_FLOW_ITEM_TYPE_END,
1166 };
1167 
1168 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_tcp_vf[] = {
1169 	RTE_FLOW_ITEM_TYPE_ETH,
1170 	RTE_FLOW_ITEM_TYPE_VLAN,
1171 	RTE_FLOW_ITEM_TYPE_IPV4,
1172 	RTE_FLOW_ITEM_TYPE_TCP,
1173 	RTE_FLOW_ITEM_TYPE_VF,
1174 	RTE_FLOW_ITEM_TYPE_END,
1175 };
1176 
1177 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_sctp_vf[] = {
1178 	RTE_FLOW_ITEM_TYPE_ETH,
1179 	RTE_FLOW_ITEM_TYPE_VLAN,
1180 	RTE_FLOW_ITEM_TYPE_IPV4,
1181 	RTE_FLOW_ITEM_TYPE_SCTP,
1182 	RTE_FLOW_ITEM_TYPE_VF,
1183 	RTE_FLOW_ITEM_TYPE_END,
1184 };
1185 
1186 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_vf[] = {
1187 	RTE_FLOW_ITEM_TYPE_ETH,
1188 	RTE_FLOW_ITEM_TYPE_VLAN,
1189 	RTE_FLOW_ITEM_TYPE_IPV6,
1190 	RTE_FLOW_ITEM_TYPE_VF,
1191 	RTE_FLOW_ITEM_TYPE_END,
1192 };
1193 
1194 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_udp_vf[] = {
1195 	RTE_FLOW_ITEM_TYPE_ETH,
1196 	RTE_FLOW_ITEM_TYPE_VLAN,
1197 	RTE_FLOW_ITEM_TYPE_IPV6,
1198 	RTE_FLOW_ITEM_TYPE_UDP,
1199 	RTE_FLOW_ITEM_TYPE_VF,
1200 	RTE_FLOW_ITEM_TYPE_END,
1201 };
1202 
1203 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_tcp_vf[] = {
1204 	RTE_FLOW_ITEM_TYPE_ETH,
1205 	RTE_FLOW_ITEM_TYPE_VLAN,
1206 	RTE_FLOW_ITEM_TYPE_IPV6,
1207 	RTE_FLOW_ITEM_TYPE_TCP,
1208 	RTE_FLOW_ITEM_TYPE_VF,
1209 	RTE_FLOW_ITEM_TYPE_END,
1210 };
1211 
1212 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_sctp_vf[] = {
1213 	RTE_FLOW_ITEM_TYPE_ETH,
1214 	RTE_FLOW_ITEM_TYPE_VLAN,
1215 	RTE_FLOW_ITEM_TYPE_IPV6,
1216 	RTE_FLOW_ITEM_TYPE_SCTP,
1217 	RTE_FLOW_ITEM_TYPE_VF,
1218 	RTE_FLOW_ITEM_TYPE_END,
1219 };
1220 
1221 static enum rte_flow_item_type pattern_fdir_ethertype_vlan_raw_1_vf[] = {
1222 	RTE_FLOW_ITEM_TYPE_ETH,
1223 	RTE_FLOW_ITEM_TYPE_VLAN,
1224 	RTE_FLOW_ITEM_TYPE_RAW,
1225 	RTE_FLOW_ITEM_TYPE_VF,
1226 	RTE_FLOW_ITEM_TYPE_END,
1227 };
1228 
1229 static enum rte_flow_item_type pattern_fdir_ethertype_vlan_raw_2_vf[] = {
1230 	RTE_FLOW_ITEM_TYPE_ETH,
1231 	RTE_FLOW_ITEM_TYPE_VLAN,
1232 	RTE_FLOW_ITEM_TYPE_RAW,
1233 	RTE_FLOW_ITEM_TYPE_RAW,
1234 	RTE_FLOW_ITEM_TYPE_VF,
1235 	RTE_FLOW_ITEM_TYPE_END,
1236 };
1237 
1238 static enum rte_flow_item_type pattern_fdir_ethertype_vlan_raw_3_vf[] = {
1239 	RTE_FLOW_ITEM_TYPE_ETH,
1240 	RTE_FLOW_ITEM_TYPE_VLAN,
1241 	RTE_FLOW_ITEM_TYPE_RAW,
1242 	RTE_FLOW_ITEM_TYPE_RAW,
1243 	RTE_FLOW_ITEM_TYPE_RAW,
1244 	RTE_FLOW_ITEM_TYPE_VF,
1245 	RTE_FLOW_ITEM_TYPE_END,
1246 };
1247 
1248 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_raw_1_vf[] = {
1249 	RTE_FLOW_ITEM_TYPE_ETH,
1250 	RTE_FLOW_ITEM_TYPE_VLAN,
1251 	RTE_FLOW_ITEM_TYPE_IPV4,
1252 	RTE_FLOW_ITEM_TYPE_RAW,
1253 	RTE_FLOW_ITEM_TYPE_VF,
1254 	RTE_FLOW_ITEM_TYPE_END,
1255 };
1256 
1257 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_raw_2_vf[] = {
1258 	RTE_FLOW_ITEM_TYPE_ETH,
1259 	RTE_FLOW_ITEM_TYPE_VLAN,
1260 	RTE_FLOW_ITEM_TYPE_IPV4,
1261 	RTE_FLOW_ITEM_TYPE_RAW,
1262 	RTE_FLOW_ITEM_TYPE_RAW,
1263 	RTE_FLOW_ITEM_TYPE_VF,
1264 	RTE_FLOW_ITEM_TYPE_END,
1265 };
1266 
1267 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_raw_3_vf[] = {
1268 	RTE_FLOW_ITEM_TYPE_ETH,
1269 	RTE_FLOW_ITEM_TYPE_VLAN,
1270 	RTE_FLOW_ITEM_TYPE_IPV4,
1271 	RTE_FLOW_ITEM_TYPE_RAW,
1272 	RTE_FLOW_ITEM_TYPE_RAW,
1273 	RTE_FLOW_ITEM_TYPE_RAW,
1274 	RTE_FLOW_ITEM_TYPE_VF,
1275 	RTE_FLOW_ITEM_TYPE_END,
1276 };
1277 
1278 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_udp_raw_1_vf[] = {
1279 	RTE_FLOW_ITEM_TYPE_ETH,
1280 	RTE_FLOW_ITEM_TYPE_VLAN,
1281 	RTE_FLOW_ITEM_TYPE_IPV4,
1282 	RTE_FLOW_ITEM_TYPE_UDP,
1283 	RTE_FLOW_ITEM_TYPE_RAW,
1284 	RTE_FLOW_ITEM_TYPE_VF,
1285 	RTE_FLOW_ITEM_TYPE_END,
1286 };
1287 
1288 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_udp_raw_2_vf[] = {
1289 	RTE_FLOW_ITEM_TYPE_ETH,
1290 	RTE_FLOW_ITEM_TYPE_VLAN,
1291 	RTE_FLOW_ITEM_TYPE_IPV4,
1292 	RTE_FLOW_ITEM_TYPE_UDP,
1293 	RTE_FLOW_ITEM_TYPE_RAW,
1294 	RTE_FLOW_ITEM_TYPE_RAW,
1295 	RTE_FLOW_ITEM_TYPE_VF,
1296 	RTE_FLOW_ITEM_TYPE_END,
1297 };
1298 
1299 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_udp_raw_3_vf[] = {
1300 	RTE_FLOW_ITEM_TYPE_ETH,
1301 	RTE_FLOW_ITEM_TYPE_VLAN,
1302 	RTE_FLOW_ITEM_TYPE_IPV4,
1303 	RTE_FLOW_ITEM_TYPE_UDP,
1304 	RTE_FLOW_ITEM_TYPE_RAW,
1305 	RTE_FLOW_ITEM_TYPE_RAW,
1306 	RTE_FLOW_ITEM_TYPE_RAW,
1307 	RTE_FLOW_ITEM_TYPE_VF,
1308 	RTE_FLOW_ITEM_TYPE_END,
1309 };
1310 
1311 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_tcp_raw_1_vf[] = {
1312 	RTE_FLOW_ITEM_TYPE_ETH,
1313 	RTE_FLOW_ITEM_TYPE_VLAN,
1314 	RTE_FLOW_ITEM_TYPE_IPV4,
1315 	RTE_FLOW_ITEM_TYPE_TCP,
1316 	RTE_FLOW_ITEM_TYPE_RAW,
1317 	RTE_FLOW_ITEM_TYPE_VF,
1318 	RTE_FLOW_ITEM_TYPE_END,
1319 };
1320 
1321 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_tcp_raw_2_vf[] = {
1322 	RTE_FLOW_ITEM_TYPE_ETH,
1323 	RTE_FLOW_ITEM_TYPE_VLAN,
1324 	RTE_FLOW_ITEM_TYPE_IPV4,
1325 	RTE_FLOW_ITEM_TYPE_TCP,
1326 	RTE_FLOW_ITEM_TYPE_RAW,
1327 	RTE_FLOW_ITEM_TYPE_RAW,
1328 	RTE_FLOW_ITEM_TYPE_VF,
1329 	RTE_FLOW_ITEM_TYPE_END,
1330 };
1331 
1332 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_tcp_raw_3_vf[] = {
1333 	RTE_FLOW_ITEM_TYPE_ETH,
1334 	RTE_FLOW_ITEM_TYPE_VLAN,
1335 	RTE_FLOW_ITEM_TYPE_IPV4,
1336 	RTE_FLOW_ITEM_TYPE_TCP,
1337 	RTE_FLOW_ITEM_TYPE_RAW,
1338 	RTE_FLOW_ITEM_TYPE_RAW,
1339 	RTE_FLOW_ITEM_TYPE_RAW,
1340 	RTE_FLOW_ITEM_TYPE_VF,
1341 	RTE_FLOW_ITEM_TYPE_END,
1342 };
1343 
1344 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_sctp_raw_1_vf[] = {
1345 	RTE_FLOW_ITEM_TYPE_ETH,
1346 	RTE_FLOW_ITEM_TYPE_VLAN,
1347 	RTE_FLOW_ITEM_TYPE_IPV4,
1348 	RTE_FLOW_ITEM_TYPE_SCTP,
1349 	RTE_FLOW_ITEM_TYPE_RAW,
1350 	RTE_FLOW_ITEM_TYPE_VF,
1351 	RTE_FLOW_ITEM_TYPE_END,
1352 };
1353 
1354 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_sctp_raw_2_vf[] = {
1355 	RTE_FLOW_ITEM_TYPE_ETH,
1356 	RTE_FLOW_ITEM_TYPE_VLAN,
1357 	RTE_FLOW_ITEM_TYPE_IPV4,
1358 	RTE_FLOW_ITEM_TYPE_SCTP,
1359 	RTE_FLOW_ITEM_TYPE_RAW,
1360 	RTE_FLOW_ITEM_TYPE_RAW,
1361 	RTE_FLOW_ITEM_TYPE_VF,
1362 	RTE_FLOW_ITEM_TYPE_END,
1363 };
1364 
1365 static enum rte_flow_item_type pattern_fdir_vlan_ipv4_sctp_raw_3_vf[] = {
1366 	RTE_FLOW_ITEM_TYPE_ETH,
1367 	RTE_FLOW_ITEM_TYPE_VLAN,
1368 	RTE_FLOW_ITEM_TYPE_IPV4,
1369 	RTE_FLOW_ITEM_TYPE_SCTP,
1370 	RTE_FLOW_ITEM_TYPE_RAW,
1371 	RTE_FLOW_ITEM_TYPE_RAW,
1372 	RTE_FLOW_ITEM_TYPE_RAW,
1373 	RTE_FLOW_ITEM_TYPE_VF,
1374 	RTE_FLOW_ITEM_TYPE_END,
1375 };
1376 
1377 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_raw_1_vf[] = {
1378 	RTE_FLOW_ITEM_TYPE_ETH,
1379 	RTE_FLOW_ITEM_TYPE_VLAN,
1380 	RTE_FLOW_ITEM_TYPE_IPV6,
1381 	RTE_FLOW_ITEM_TYPE_RAW,
1382 	RTE_FLOW_ITEM_TYPE_VF,
1383 	RTE_FLOW_ITEM_TYPE_END,
1384 };
1385 
1386 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_raw_2_vf[] = {
1387 	RTE_FLOW_ITEM_TYPE_ETH,
1388 	RTE_FLOW_ITEM_TYPE_VLAN,
1389 	RTE_FLOW_ITEM_TYPE_IPV6,
1390 	RTE_FLOW_ITEM_TYPE_RAW,
1391 	RTE_FLOW_ITEM_TYPE_RAW,
1392 	RTE_FLOW_ITEM_TYPE_VF,
1393 	RTE_FLOW_ITEM_TYPE_END,
1394 };
1395 
1396 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_raw_3_vf[] = {
1397 	RTE_FLOW_ITEM_TYPE_ETH,
1398 	RTE_FLOW_ITEM_TYPE_VLAN,
1399 	RTE_FLOW_ITEM_TYPE_IPV6,
1400 	RTE_FLOW_ITEM_TYPE_RAW,
1401 	RTE_FLOW_ITEM_TYPE_RAW,
1402 	RTE_FLOW_ITEM_TYPE_RAW,
1403 	RTE_FLOW_ITEM_TYPE_VF,
1404 	RTE_FLOW_ITEM_TYPE_END,
1405 };
1406 
1407 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_udp_raw_1_vf[] = {
1408 	RTE_FLOW_ITEM_TYPE_ETH,
1409 	RTE_FLOW_ITEM_TYPE_VLAN,
1410 	RTE_FLOW_ITEM_TYPE_IPV6,
1411 	RTE_FLOW_ITEM_TYPE_UDP,
1412 	RTE_FLOW_ITEM_TYPE_RAW,
1413 	RTE_FLOW_ITEM_TYPE_VF,
1414 	RTE_FLOW_ITEM_TYPE_END,
1415 };
1416 
1417 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_udp_raw_2_vf[] = {
1418 	RTE_FLOW_ITEM_TYPE_ETH,
1419 	RTE_FLOW_ITEM_TYPE_VLAN,
1420 	RTE_FLOW_ITEM_TYPE_IPV6,
1421 	RTE_FLOW_ITEM_TYPE_UDP,
1422 	RTE_FLOW_ITEM_TYPE_RAW,
1423 	RTE_FLOW_ITEM_TYPE_RAW,
1424 	RTE_FLOW_ITEM_TYPE_VF,
1425 	RTE_FLOW_ITEM_TYPE_END,
1426 };
1427 
1428 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_udp_raw_3_vf[] = {
1429 	RTE_FLOW_ITEM_TYPE_ETH,
1430 	RTE_FLOW_ITEM_TYPE_VLAN,
1431 	RTE_FLOW_ITEM_TYPE_IPV6,
1432 	RTE_FLOW_ITEM_TYPE_UDP,
1433 	RTE_FLOW_ITEM_TYPE_RAW,
1434 	RTE_FLOW_ITEM_TYPE_RAW,
1435 	RTE_FLOW_ITEM_TYPE_RAW,
1436 	RTE_FLOW_ITEM_TYPE_VF,
1437 	RTE_FLOW_ITEM_TYPE_END,
1438 };
1439 
1440 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_tcp_raw_1_vf[] = {
1441 	RTE_FLOW_ITEM_TYPE_ETH,
1442 	RTE_FLOW_ITEM_TYPE_VLAN,
1443 	RTE_FLOW_ITEM_TYPE_IPV6,
1444 	RTE_FLOW_ITEM_TYPE_TCP,
1445 	RTE_FLOW_ITEM_TYPE_RAW,
1446 	RTE_FLOW_ITEM_TYPE_VF,
1447 	RTE_FLOW_ITEM_TYPE_END,
1448 };
1449 
1450 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_tcp_raw_2_vf[] = {
1451 	RTE_FLOW_ITEM_TYPE_ETH,
1452 	RTE_FLOW_ITEM_TYPE_VLAN,
1453 	RTE_FLOW_ITEM_TYPE_IPV6,
1454 	RTE_FLOW_ITEM_TYPE_TCP,
1455 	RTE_FLOW_ITEM_TYPE_RAW,
1456 	RTE_FLOW_ITEM_TYPE_RAW,
1457 	RTE_FLOW_ITEM_TYPE_VF,
1458 	RTE_FLOW_ITEM_TYPE_END,
1459 };
1460 
1461 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_tcp_raw_3_vf[] = {
1462 	RTE_FLOW_ITEM_TYPE_ETH,
1463 	RTE_FLOW_ITEM_TYPE_VLAN,
1464 	RTE_FLOW_ITEM_TYPE_IPV6,
1465 	RTE_FLOW_ITEM_TYPE_TCP,
1466 	RTE_FLOW_ITEM_TYPE_RAW,
1467 	RTE_FLOW_ITEM_TYPE_RAW,
1468 	RTE_FLOW_ITEM_TYPE_RAW,
1469 	RTE_FLOW_ITEM_TYPE_VF,
1470 	RTE_FLOW_ITEM_TYPE_END,
1471 };
1472 
1473 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_sctp_raw_1_vf[] = {
1474 	RTE_FLOW_ITEM_TYPE_ETH,
1475 	RTE_FLOW_ITEM_TYPE_VLAN,
1476 	RTE_FLOW_ITEM_TYPE_IPV6,
1477 	RTE_FLOW_ITEM_TYPE_SCTP,
1478 	RTE_FLOW_ITEM_TYPE_RAW,
1479 	RTE_FLOW_ITEM_TYPE_VF,
1480 	RTE_FLOW_ITEM_TYPE_END,
1481 };
1482 
1483 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_sctp_raw_2_vf[] = {
1484 	RTE_FLOW_ITEM_TYPE_ETH,
1485 	RTE_FLOW_ITEM_TYPE_VLAN,
1486 	RTE_FLOW_ITEM_TYPE_IPV6,
1487 	RTE_FLOW_ITEM_TYPE_SCTP,
1488 	RTE_FLOW_ITEM_TYPE_RAW,
1489 	RTE_FLOW_ITEM_TYPE_RAW,
1490 	RTE_FLOW_ITEM_TYPE_VF,
1491 	RTE_FLOW_ITEM_TYPE_END,
1492 };
1493 
1494 static enum rte_flow_item_type pattern_fdir_vlan_ipv6_sctp_raw_3_vf[] = {
1495 	RTE_FLOW_ITEM_TYPE_ETH,
1496 	RTE_FLOW_ITEM_TYPE_VLAN,
1497 	RTE_FLOW_ITEM_TYPE_IPV6,
1498 	RTE_FLOW_ITEM_TYPE_SCTP,
1499 	RTE_FLOW_ITEM_TYPE_RAW,
1500 	RTE_FLOW_ITEM_TYPE_RAW,
1501 	RTE_FLOW_ITEM_TYPE_RAW,
1502 	RTE_FLOW_ITEM_TYPE_VF,
1503 	RTE_FLOW_ITEM_TYPE_END,
1504 };
1505 
1506 /* Pattern matched tunnel filter */
1507 static enum rte_flow_item_type pattern_vxlan_1[] = {
1508 	RTE_FLOW_ITEM_TYPE_ETH,
1509 	RTE_FLOW_ITEM_TYPE_IPV4,
1510 	RTE_FLOW_ITEM_TYPE_UDP,
1511 	RTE_FLOW_ITEM_TYPE_VXLAN,
1512 	RTE_FLOW_ITEM_TYPE_ETH,
1513 	RTE_FLOW_ITEM_TYPE_END,
1514 };
1515 
1516 static enum rte_flow_item_type pattern_vxlan_2[] = {
1517 	RTE_FLOW_ITEM_TYPE_ETH,
1518 	RTE_FLOW_ITEM_TYPE_IPV6,
1519 	RTE_FLOW_ITEM_TYPE_UDP,
1520 	RTE_FLOW_ITEM_TYPE_VXLAN,
1521 	RTE_FLOW_ITEM_TYPE_ETH,
1522 	RTE_FLOW_ITEM_TYPE_END,
1523 };
1524 
1525 static enum rte_flow_item_type pattern_vxlan_3[] = {
1526 	RTE_FLOW_ITEM_TYPE_ETH,
1527 	RTE_FLOW_ITEM_TYPE_IPV4,
1528 	RTE_FLOW_ITEM_TYPE_UDP,
1529 	RTE_FLOW_ITEM_TYPE_VXLAN,
1530 	RTE_FLOW_ITEM_TYPE_ETH,
1531 	RTE_FLOW_ITEM_TYPE_VLAN,
1532 	RTE_FLOW_ITEM_TYPE_END,
1533 };
1534 
1535 static enum rte_flow_item_type pattern_vxlan_4[] = {
1536 	RTE_FLOW_ITEM_TYPE_ETH,
1537 	RTE_FLOW_ITEM_TYPE_IPV6,
1538 	RTE_FLOW_ITEM_TYPE_UDP,
1539 	RTE_FLOW_ITEM_TYPE_VXLAN,
1540 	RTE_FLOW_ITEM_TYPE_ETH,
1541 	RTE_FLOW_ITEM_TYPE_VLAN,
1542 	RTE_FLOW_ITEM_TYPE_END,
1543 };
1544 
1545 static enum rte_flow_item_type pattern_nvgre_1[] = {
1546 	RTE_FLOW_ITEM_TYPE_ETH,
1547 	RTE_FLOW_ITEM_TYPE_IPV4,
1548 	RTE_FLOW_ITEM_TYPE_NVGRE,
1549 	RTE_FLOW_ITEM_TYPE_ETH,
1550 	RTE_FLOW_ITEM_TYPE_END,
1551 };
1552 
1553 static enum rte_flow_item_type pattern_nvgre_2[] = {
1554 	RTE_FLOW_ITEM_TYPE_ETH,
1555 	RTE_FLOW_ITEM_TYPE_IPV6,
1556 	RTE_FLOW_ITEM_TYPE_NVGRE,
1557 	RTE_FLOW_ITEM_TYPE_ETH,
1558 	RTE_FLOW_ITEM_TYPE_END,
1559 };
1560 
1561 static enum rte_flow_item_type pattern_nvgre_3[] = {
1562 	RTE_FLOW_ITEM_TYPE_ETH,
1563 	RTE_FLOW_ITEM_TYPE_IPV4,
1564 	RTE_FLOW_ITEM_TYPE_NVGRE,
1565 	RTE_FLOW_ITEM_TYPE_ETH,
1566 	RTE_FLOW_ITEM_TYPE_VLAN,
1567 	RTE_FLOW_ITEM_TYPE_END,
1568 };
1569 
1570 static enum rte_flow_item_type pattern_nvgre_4[] = {
1571 	RTE_FLOW_ITEM_TYPE_ETH,
1572 	RTE_FLOW_ITEM_TYPE_IPV6,
1573 	RTE_FLOW_ITEM_TYPE_NVGRE,
1574 	RTE_FLOW_ITEM_TYPE_ETH,
1575 	RTE_FLOW_ITEM_TYPE_VLAN,
1576 	RTE_FLOW_ITEM_TYPE_END,
1577 };
1578 
1579 static enum rte_flow_item_type pattern_mpls_1[] = {
1580 	RTE_FLOW_ITEM_TYPE_ETH,
1581 	RTE_FLOW_ITEM_TYPE_IPV4,
1582 	RTE_FLOW_ITEM_TYPE_UDP,
1583 	RTE_FLOW_ITEM_TYPE_MPLS,
1584 	RTE_FLOW_ITEM_TYPE_END,
1585 };
1586 
1587 static enum rte_flow_item_type pattern_mpls_2[] = {
1588 	RTE_FLOW_ITEM_TYPE_ETH,
1589 	RTE_FLOW_ITEM_TYPE_IPV6,
1590 	RTE_FLOW_ITEM_TYPE_UDP,
1591 	RTE_FLOW_ITEM_TYPE_MPLS,
1592 	RTE_FLOW_ITEM_TYPE_END,
1593 };
1594 
1595 static enum rte_flow_item_type pattern_mpls_3[] = {
1596 	RTE_FLOW_ITEM_TYPE_ETH,
1597 	RTE_FLOW_ITEM_TYPE_IPV4,
1598 	RTE_FLOW_ITEM_TYPE_GRE,
1599 	RTE_FLOW_ITEM_TYPE_MPLS,
1600 	RTE_FLOW_ITEM_TYPE_END,
1601 };
1602 
1603 static enum rte_flow_item_type pattern_mpls_4[] = {
1604 	RTE_FLOW_ITEM_TYPE_ETH,
1605 	RTE_FLOW_ITEM_TYPE_IPV6,
1606 	RTE_FLOW_ITEM_TYPE_GRE,
1607 	RTE_FLOW_ITEM_TYPE_MPLS,
1608 	RTE_FLOW_ITEM_TYPE_END,
1609 };
1610 
1611 static enum rte_flow_item_type pattern_qinq_1[] = {
1612 	RTE_FLOW_ITEM_TYPE_ETH,
1613 	RTE_FLOW_ITEM_TYPE_VLAN,
1614 	RTE_FLOW_ITEM_TYPE_VLAN,
1615 	RTE_FLOW_ITEM_TYPE_END,
1616 };
1617 
1618 static struct i40e_valid_pattern i40e_supported_patterns[] = {
1619 	/* Ethertype */
1620 	{ pattern_ethertype, i40e_flow_parse_ethertype_filter },
1621 	/* FDIR - support default flow type without flexible payload*/
1622 	{ pattern_ethertype, i40e_flow_parse_fdir_filter },
1623 	{ pattern_fdir_ipv4, i40e_flow_parse_fdir_filter },
1624 	{ pattern_fdir_ipv4_udp, i40e_flow_parse_fdir_filter },
1625 	{ pattern_fdir_ipv4_tcp, i40e_flow_parse_fdir_filter },
1626 	{ pattern_fdir_ipv4_sctp, i40e_flow_parse_fdir_filter },
1627 	{ pattern_fdir_ipv4_gtpc, i40e_flow_parse_fdir_filter },
1628 	{ pattern_fdir_ipv4_gtpu, i40e_flow_parse_fdir_filter },
1629 	{ pattern_fdir_ipv4_gtpu_ipv4, i40e_flow_parse_fdir_filter },
1630 	{ pattern_fdir_ipv4_gtpu_ipv6, i40e_flow_parse_fdir_filter },
1631 	{ pattern_fdir_ipv6, i40e_flow_parse_fdir_filter },
1632 	{ pattern_fdir_ipv6_udp, i40e_flow_parse_fdir_filter },
1633 	{ pattern_fdir_ipv6_tcp, i40e_flow_parse_fdir_filter },
1634 	{ pattern_fdir_ipv6_sctp, i40e_flow_parse_fdir_filter },
1635 	{ pattern_fdir_ipv6_gtpc, i40e_flow_parse_fdir_filter },
1636 	{ pattern_fdir_ipv6_gtpu, i40e_flow_parse_fdir_filter },
1637 	{ pattern_fdir_ipv6_gtpu_ipv4, i40e_flow_parse_fdir_filter },
1638 	{ pattern_fdir_ipv6_gtpu_ipv6, i40e_flow_parse_fdir_filter },
1639 	/* FDIR - support default flow type with flexible payload */
1640 	{ pattern_fdir_ethertype_raw_1, i40e_flow_parse_fdir_filter },
1641 	{ pattern_fdir_ethertype_raw_2, i40e_flow_parse_fdir_filter },
1642 	{ pattern_fdir_ethertype_raw_3, i40e_flow_parse_fdir_filter },
1643 	{ pattern_fdir_ipv4_raw_1, i40e_flow_parse_fdir_filter },
1644 	{ pattern_fdir_ipv4_raw_2, i40e_flow_parse_fdir_filter },
1645 	{ pattern_fdir_ipv4_raw_3, i40e_flow_parse_fdir_filter },
1646 	{ pattern_fdir_ipv4_udp_raw_1, i40e_flow_parse_fdir_filter },
1647 	{ pattern_fdir_ipv4_udp_raw_2, i40e_flow_parse_fdir_filter },
1648 	{ pattern_fdir_ipv4_udp_raw_3, i40e_flow_parse_fdir_filter },
1649 	{ pattern_fdir_ipv4_tcp_raw_1, i40e_flow_parse_fdir_filter },
1650 	{ pattern_fdir_ipv4_tcp_raw_2, i40e_flow_parse_fdir_filter },
1651 	{ pattern_fdir_ipv4_tcp_raw_3, i40e_flow_parse_fdir_filter },
1652 	{ pattern_fdir_ipv4_sctp_raw_1, i40e_flow_parse_fdir_filter },
1653 	{ pattern_fdir_ipv4_sctp_raw_2, i40e_flow_parse_fdir_filter },
1654 	{ pattern_fdir_ipv4_sctp_raw_3, i40e_flow_parse_fdir_filter },
1655 	{ pattern_fdir_ipv6_raw_1, i40e_flow_parse_fdir_filter },
1656 	{ pattern_fdir_ipv6_raw_2, i40e_flow_parse_fdir_filter },
1657 	{ pattern_fdir_ipv6_raw_3, i40e_flow_parse_fdir_filter },
1658 	{ pattern_fdir_ipv6_udp_raw_1, i40e_flow_parse_fdir_filter },
1659 	{ pattern_fdir_ipv6_udp_raw_2, i40e_flow_parse_fdir_filter },
1660 	{ pattern_fdir_ipv6_udp_raw_3, i40e_flow_parse_fdir_filter },
1661 	{ pattern_fdir_ipv6_tcp_raw_1, i40e_flow_parse_fdir_filter },
1662 	{ pattern_fdir_ipv6_tcp_raw_2, i40e_flow_parse_fdir_filter },
1663 	{ pattern_fdir_ipv6_tcp_raw_3, i40e_flow_parse_fdir_filter },
1664 	{ pattern_fdir_ipv6_sctp_raw_1, i40e_flow_parse_fdir_filter },
1665 	{ pattern_fdir_ipv6_sctp_raw_2, i40e_flow_parse_fdir_filter },
1666 	{ pattern_fdir_ipv6_sctp_raw_3, i40e_flow_parse_fdir_filter },
1667 	/* FDIR - support single vlan input set */
1668 	{ pattern_fdir_ethertype_vlan, i40e_flow_parse_fdir_filter },
1669 	{ pattern_fdir_vlan_ipv4, i40e_flow_parse_fdir_filter },
1670 	{ pattern_fdir_vlan_ipv4_udp, i40e_flow_parse_fdir_filter },
1671 	{ pattern_fdir_vlan_ipv4_tcp, i40e_flow_parse_fdir_filter },
1672 	{ pattern_fdir_vlan_ipv4_sctp, i40e_flow_parse_fdir_filter },
1673 	{ pattern_fdir_vlan_ipv6, i40e_flow_parse_fdir_filter },
1674 	{ pattern_fdir_vlan_ipv6_udp, i40e_flow_parse_fdir_filter },
1675 	{ pattern_fdir_vlan_ipv6_tcp, i40e_flow_parse_fdir_filter },
1676 	{ pattern_fdir_vlan_ipv6_sctp, i40e_flow_parse_fdir_filter },
1677 	{ pattern_fdir_ethertype_vlan_raw_1, i40e_flow_parse_fdir_filter },
1678 	{ pattern_fdir_ethertype_vlan_raw_2, i40e_flow_parse_fdir_filter },
1679 	{ pattern_fdir_ethertype_vlan_raw_3, i40e_flow_parse_fdir_filter },
1680 	{ pattern_fdir_vlan_ipv4_raw_1, i40e_flow_parse_fdir_filter },
1681 	{ pattern_fdir_vlan_ipv4_raw_2, i40e_flow_parse_fdir_filter },
1682 	{ pattern_fdir_vlan_ipv4_raw_3, i40e_flow_parse_fdir_filter },
1683 	{ pattern_fdir_vlan_ipv4_udp_raw_1, i40e_flow_parse_fdir_filter },
1684 	{ pattern_fdir_vlan_ipv4_udp_raw_2, i40e_flow_parse_fdir_filter },
1685 	{ pattern_fdir_vlan_ipv4_udp_raw_3, i40e_flow_parse_fdir_filter },
1686 	{ pattern_fdir_vlan_ipv4_tcp_raw_1, i40e_flow_parse_fdir_filter },
1687 	{ pattern_fdir_vlan_ipv4_tcp_raw_2, i40e_flow_parse_fdir_filter },
1688 	{ pattern_fdir_vlan_ipv4_tcp_raw_3, i40e_flow_parse_fdir_filter },
1689 	{ pattern_fdir_vlan_ipv4_sctp_raw_1, i40e_flow_parse_fdir_filter },
1690 	{ pattern_fdir_vlan_ipv4_sctp_raw_2, i40e_flow_parse_fdir_filter },
1691 	{ pattern_fdir_vlan_ipv4_sctp_raw_3, i40e_flow_parse_fdir_filter },
1692 	{ pattern_fdir_vlan_ipv6_raw_1, i40e_flow_parse_fdir_filter },
1693 	{ pattern_fdir_vlan_ipv6_raw_2, i40e_flow_parse_fdir_filter },
1694 	{ pattern_fdir_vlan_ipv6_raw_3, i40e_flow_parse_fdir_filter },
1695 	{ pattern_fdir_vlan_ipv6_udp_raw_1, i40e_flow_parse_fdir_filter },
1696 	{ pattern_fdir_vlan_ipv6_udp_raw_2, i40e_flow_parse_fdir_filter },
1697 	{ pattern_fdir_vlan_ipv6_udp_raw_3, i40e_flow_parse_fdir_filter },
1698 	{ pattern_fdir_vlan_ipv6_tcp_raw_1, i40e_flow_parse_fdir_filter },
1699 	{ pattern_fdir_vlan_ipv6_tcp_raw_2, i40e_flow_parse_fdir_filter },
1700 	{ pattern_fdir_vlan_ipv6_tcp_raw_3, i40e_flow_parse_fdir_filter },
1701 	{ pattern_fdir_vlan_ipv6_sctp_raw_1, i40e_flow_parse_fdir_filter },
1702 	{ pattern_fdir_vlan_ipv6_sctp_raw_2, i40e_flow_parse_fdir_filter },
1703 	{ pattern_fdir_vlan_ipv6_sctp_raw_3, i40e_flow_parse_fdir_filter },
1704 	/* FDIR - support VF item */
1705 	{ pattern_fdir_ipv4_vf, i40e_flow_parse_fdir_filter },
1706 	{ pattern_fdir_ipv4_udp_vf, i40e_flow_parse_fdir_filter },
1707 	{ pattern_fdir_ipv4_tcp_vf, i40e_flow_parse_fdir_filter },
1708 	{ pattern_fdir_ipv4_sctp_vf, i40e_flow_parse_fdir_filter },
1709 	{ pattern_fdir_ipv6_vf, i40e_flow_parse_fdir_filter },
1710 	{ pattern_fdir_ipv6_udp_vf, i40e_flow_parse_fdir_filter },
1711 	{ pattern_fdir_ipv6_tcp_vf, i40e_flow_parse_fdir_filter },
1712 	{ pattern_fdir_ipv6_sctp_vf, i40e_flow_parse_fdir_filter },
1713 	{ pattern_fdir_ethertype_raw_1_vf, i40e_flow_parse_fdir_filter },
1714 	{ pattern_fdir_ethertype_raw_2_vf, i40e_flow_parse_fdir_filter },
1715 	{ pattern_fdir_ethertype_raw_3_vf, i40e_flow_parse_fdir_filter },
1716 	{ pattern_fdir_ipv4_raw_1_vf, i40e_flow_parse_fdir_filter },
1717 	{ pattern_fdir_ipv4_raw_2_vf, i40e_flow_parse_fdir_filter },
1718 	{ pattern_fdir_ipv4_raw_3_vf, i40e_flow_parse_fdir_filter },
1719 	{ pattern_fdir_ipv4_udp_raw_1_vf, i40e_flow_parse_fdir_filter },
1720 	{ pattern_fdir_ipv4_udp_raw_2_vf, i40e_flow_parse_fdir_filter },
1721 	{ pattern_fdir_ipv4_udp_raw_3_vf, i40e_flow_parse_fdir_filter },
1722 	{ pattern_fdir_ipv4_tcp_raw_1_vf, i40e_flow_parse_fdir_filter },
1723 	{ pattern_fdir_ipv4_tcp_raw_2_vf, i40e_flow_parse_fdir_filter },
1724 	{ pattern_fdir_ipv4_tcp_raw_3_vf, i40e_flow_parse_fdir_filter },
1725 	{ pattern_fdir_ipv4_sctp_raw_1_vf, i40e_flow_parse_fdir_filter },
1726 	{ pattern_fdir_ipv4_sctp_raw_2_vf, i40e_flow_parse_fdir_filter },
1727 	{ pattern_fdir_ipv4_sctp_raw_3_vf, i40e_flow_parse_fdir_filter },
1728 	{ pattern_fdir_ipv6_raw_1_vf, i40e_flow_parse_fdir_filter },
1729 	{ pattern_fdir_ipv6_raw_2_vf, i40e_flow_parse_fdir_filter },
1730 	{ pattern_fdir_ipv6_raw_3_vf, i40e_flow_parse_fdir_filter },
1731 	{ pattern_fdir_ipv6_udp_raw_1_vf, i40e_flow_parse_fdir_filter },
1732 	{ pattern_fdir_ipv6_udp_raw_2_vf, i40e_flow_parse_fdir_filter },
1733 	{ pattern_fdir_ipv6_udp_raw_3_vf, i40e_flow_parse_fdir_filter },
1734 	{ pattern_fdir_ipv6_tcp_raw_1_vf, i40e_flow_parse_fdir_filter },
1735 	{ pattern_fdir_ipv6_tcp_raw_2_vf, i40e_flow_parse_fdir_filter },
1736 	{ pattern_fdir_ipv6_tcp_raw_3_vf, i40e_flow_parse_fdir_filter },
1737 	{ pattern_fdir_ipv6_sctp_raw_1_vf, i40e_flow_parse_fdir_filter },
1738 	{ pattern_fdir_ipv6_sctp_raw_2_vf, i40e_flow_parse_fdir_filter },
1739 	{ pattern_fdir_ipv6_sctp_raw_3_vf, i40e_flow_parse_fdir_filter },
1740 	{ pattern_fdir_ethertype_vlan_vf, i40e_flow_parse_fdir_filter },
1741 	{ pattern_fdir_vlan_ipv4_vf, i40e_flow_parse_fdir_filter },
1742 	{ pattern_fdir_vlan_ipv4_udp_vf, i40e_flow_parse_fdir_filter },
1743 	{ pattern_fdir_vlan_ipv4_tcp_vf, i40e_flow_parse_fdir_filter },
1744 	{ pattern_fdir_vlan_ipv4_sctp_vf, i40e_flow_parse_fdir_filter },
1745 	{ pattern_fdir_vlan_ipv6_vf, i40e_flow_parse_fdir_filter },
1746 	{ pattern_fdir_vlan_ipv6_udp_vf, i40e_flow_parse_fdir_filter },
1747 	{ pattern_fdir_vlan_ipv6_tcp_vf, i40e_flow_parse_fdir_filter },
1748 	{ pattern_fdir_vlan_ipv6_sctp_vf, i40e_flow_parse_fdir_filter },
1749 	{ pattern_fdir_ethertype_vlan_raw_1_vf, i40e_flow_parse_fdir_filter },
1750 	{ pattern_fdir_ethertype_vlan_raw_2_vf, i40e_flow_parse_fdir_filter },
1751 	{ pattern_fdir_ethertype_vlan_raw_3_vf, i40e_flow_parse_fdir_filter },
1752 	{ pattern_fdir_vlan_ipv4_raw_1_vf, i40e_flow_parse_fdir_filter },
1753 	{ pattern_fdir_vlan_ipv4_raw_2_vf, i40e_flow_parse_fdir_filter },
1754 	{ pattern_fdir_vlan_ipv4_raw_3_vf, i40e_flow_parse_fdir_filter },
1755 	{ pattern_fdir_vlan_ipv4_udp_raw_1_vf, i40e_flow_parse_fdir_filter },
1756 	{ pattern_fdir_vlan_ipv4_udp_raw_2_vf, i40e_flow_parse_fdir_filter },
1757 	{ pattern_fdir_vlan_ipv4_udp_raw_3_vf, i40e_flow_parse_fdir_filter },
1758 	{ pattern_fdir_vlan_ipv4_tcp_raw_1_vf, i40e_flow_parse_fdir_filter },
1759 	{ pattern_fdir_vlan_ipv4_tcp_raw_2_vf, i40e_flow_parse_fdir_filter },
1760 	{ pattern_fdir_vlan_ipv4_tcp_raw_3_vf, i40e_flow_parse_fdir_filter },
1761 	{ pattern_fdir_vlan_ipv4_sctp_raw_1_vf, i40e_flow_parse_fdir_filter },
1762 	{ pattern_fdir_vlan_ipv4_sctp_raw_2_vf, i40e_flow_parse_fdir_filter },
1763 	{ pattern_fdir_vlan_ipv4_sctp_raw_3_vf, i40e_flow_parse_fdir_filter },
1764 	{ pattern_fdir_vlan_ipv6_raw_1_vf, i40e_flow_parse_fdir_filter },
1765 	{ pattern_fdir_vlan_ipv6_raw_2_vf, i40e_flow_parse_fdir_filter },
1766 	{ pattern_fdir_vlan_ipv6_raw_3_vf, i40e_flow_parse_fdir_filter },
1767 	{ pattern_fdir_vlan_ipv6_udp_raw_1_vf, i40e_flow_parse_fdir_filter },
1768 	{ pattern_fdir_vlan_ipv6_udp_raw_2_vf, i40e_flow_parse_fdir_filter },
1769 	{ pattern_fdir_vlan_ipv6_udp_raw_3_vf, i40e_flow_parse_fdir_filter },
1770 	{ pattern_fdir_vlan_ipv6_tcp_raw_1_vf, i40e_flow_parse_fdir_filter },
1771 	{ pattern_fdir_vlan_ipv6_tcp_raw_2_vf, i40e_flow_parse_fdir_filter },
1772 	{ pattern_fdir_vlan_ipv6_tcp_raw_3_vf, i40e_flow_parse_fdir_filter },
1773 	{ pattern_fdir_vlan_ipv6_sctp_raw_1_vf, i40e_flow_parse_fdir_filter },
1774 	{ pattern_fdir_vlan_ipv6_sctp_raw_2_vf, i40e_flow_parse_fdir_filter },
1775 	{ pattern_fdir_vlan_ipv6_sctp_raw_3_vf, i40e_flow_parse_fdir_filter },
1776 	/* VXLAN */
1777 	{ pattern_vxlan_1, i40e_flow_parse_vxlan_filter },
1778 	{ pattern_vxlan_2, i40e_flow_parse_vxlan_filter },
1779 	{ pattern_vxlan_3, i40e_flow_parse_vxlan_filter },
1780 	{ pattern_vxlan_4, i40e_flow_parse_vxlan_filter },
1781 	/* NVGRE */
1782 	{ pattern_nvgre_1, i40e_flow_parse_nvgre_filter },
1783 	{ pattern_nvgre_2, i40e_flow_parse_nvgre_filter },
1784 	{ pattern_nvgre_3, i40e_flow_parse_nvgre_filter },
1785 	{ pattern_nvgre_4, i40e_flow_parse_nvgre_filter },
1786 	/* MPLSoUDP & MPLSoGRE */
1787 	{ pattern_mpls_1, i40e_flow_parse_mpls_filter },
1788 	{ pattern_mpls_2, i40e_flow_parse_mpls_filter },
1789 	{ pattern_mpls_3, i40e_flow_parse_mpls_filter },
1790 	{ pattern_mpls_4, i40e_flow_parse_mpls_filter },
1791 	/* GTP-C & GTP-U */
1792 	{ pattern_fdir_ipv4_gtpc, i40e_flow_parse_gtp_filter },
1793 	{ pattern_fdir_ipv4_gtpu, i40e_flow_parse_gtp_filter },
1794 	{ pattern_fdir_ipv6_gtpc, i40e_flow_parse_gtp_filter },
1795 	{ pattern_fdir_ipv6_gtpu, i40e_flow_parse_gtp_filter },
1796 	/* QINQ */
1797 	{ pattern_qinq_1, i40e_flow_parse_qinq_filter },
1798 };
1799 
1800 #define NEXT_ITEM_OF_ACTION(act, actions, index)                        \
1801 	do {                                                            \
1802 		act = actions + index;                                  \
1803 		while (act->type == RTE_FLOW_ACTION_TYPE_VOID) {        \
1804 			index++;                                        \
1805 			act = actions + index;                          \
1806 		}                                                       \
1807 	} while (0)
1808 
1809 /* Find the first VOID or non-VOID item pointer */
1810 static const struct rte_flow_item *
1811 i40e_find_first_item(const struct rte_flow_item *item, bool is_void)
1812 {
1813 	bool is_find;
1814 
1815 	while (item->type != RTE_FLOW_ITEM_TYPE_END) {
1816 		if (is_void)
1817 			is_find = item->type == RTE_FLOW_ITEM_TYPE_VOID;
1818 		else
1819 			is_find = item->type != RTE_FLOW_ITEM_TYPE_VOID;
1820 		if (is_find)
1821 			break;
1822 		item++;
1823 	}
1824 	return item;
1825 }
1826 
1827 /* Skip all VOID items of the pattern */
1828 static void
1829 i40e_pattern_skip_void_item(struct rte_flow_item *items,
1830 			    const struct rte_flow_item *pattern)
1831 {
1832 	uint32_t cpy_count = 0;
1833 	const struct rte_flow_item *pb = pattern, *pe = pattern;
1834 
1835 	for (;;) {
1836 		/* Find a non-void item first */
1837 		pb = i40e_find_first_item(pb, false);
1838 		if (pb->type == RTE_FLOW_ITEM_TYPE_END) {
1839 			pe = pb;
1840 			break;
1841 		}
1842 
1843 		/* Find a void item */
1844 		pe = i40e_find_first_item(pb + 1, true);
1845 
1846 		cpy_count = pe - pb;
1847 		rte_memcpy(items, pb, sizeof(struct rte_flow_item) * cpy_count);
1848 
1849 		items += cpy_count;
1850 
1851 		if (pe->type == RTE_FLOW_ITEM_TYPE_END) {
1852 			pb = pe;
1853 			break;
1854 		}
1855 
1856 		pb = pe + 1;
1857 	}
1858 	/* Copy the END item. */
1859 	rte_memcpy(items, pe, sizeof(struct rte_flow_item));
1860 }
1861 
1862 /* Check if the pattern matches a supported item type array */
1863 static bool
1864 i40e_match_pattern(enum rte_flow_item_type *item_array,
1865 		   struct rte_flow_item *pattern)
1866 {
1867 	struct rte_flow_item *item = pattern;
1868 
1869 	while ((*item_array == item->type) &&
1870 	       (*item_array != RTE_FLOW_ITEM_TYPE_END)) {
1871 		item_array++;
1872 		item++;
1873 	}
1874 
1875 	return (*item_array == RTE_FLOW_ITEM_TYPE_END &&
1876 		item->type == RTE_FLOW_ITEM_TYPE_END);
1877 }
1878 
1879 /* Find if there's parse filter function matched */
1880 static parse_filter_t
1881 i40e_find_parse_filter_func(struct rte_flow_item *pattern, uint32_t *idx)
1882 {
1883 	parse_filter_t parse_filter = NULL;
1884 	uint8_t i = *idx;
1885 
1886 	for (; i < RTE_DIM(i40e_supported_patterns); i++) {
1887 		if (i40e_match_pattern(i40e_supported_patterns[i].items,
1888 					pattern)) {
1889 			parse_filter = i40e_supported_patterns[i].parse_filter;
1890 			break;
1891 		}
1892 	}
1893 
1894 	*idx = ++i;
1895 
1896 	return parse_filter;
1897 }
1898 
1899 /* Parse attributes */
1900 static int
1901 i40e_flow_parse_attr(const struct rte_flow_attr *attr,
1902 		     struct rte_flow_error *error)
1903 {
1904 	/* Must be input direction */
1905 	if (!attr->ingress) {
1906 		rte_flow_error_set(error, EINVAL,
1907 				   RTE_FLOW_ERROR_TYPE_ATTR_INGRESS,
1908 				   attr, "Only support ingress.");
1909 		return -rte_errno;
1910 	}
1911 
1912 	/* Not supported */
1913 	if (attr->egress) {
1914 		rte_flow_error_set(error, EINVAL,
1915 				   RTE_FLOW_ERROR_TYPE_ATTR_EGRESS,
1916 				   attr, "Not support egress.");
1917 		return -rte_errno;
1918 	}
1919 
1920 	/* Not supported */
1921 	if (attr->priority) {
1922 		rte_flow_error_set(error, EINVAL,
1923 				   RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,
1924 				   attr, "Not support priority.");
1925 		return -rte_errno;
1926 	}
1927 
1928 	/* Not supported */
1929 	if (attr->group) {
1930 		rte_flow_error_set(error, EINVAL,
1931 				   RTE_FLOW_ERROR_TYPE_ATTR_GROUP,
1932 				   attr, "Not support group.");
1933 		return -rte_errno;
1934 	}
1935 
1936 	return 0;
1937 }
1938 
1939 static uint16_t
1940 i40e_get_outer_vlan(struct rte_eth_dev *dev)
1941 {
1942 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1943 	int qinq = dev->data->dev_conf.rxmode.offloads &
1944 		DEV_RX_OFFLOAD_VLAN_EXTEND;
1945 	uint64_t reg_r = 0;
1946 	uint16_t reg_id;
1947 	uint16_t tpid;
1948 
1949 	if (qinq)
1950 		reg_id = 2;
1951 	else
1952 		reg_id = 3;
1953 
1954 	i40e_aq_debug_read_register(hw, I40E_GL_SWT_L2TAGCTRL(reg_id),
1955 				    &reg_r, NULL);
1956 
1957 	tpid = (reg_r >> I40E_GL_SWT_L2TAGCTRL_ETHERTYPE_SHIFT) & 0xFFFF;
1958 
1959 	return tpid;
1960 }
1961 
1962 /* 1. Last in item should be NULL as range is not supported.
1963  * 2. Supported filter types: MAC_ETHTYPE and ETHTYPE.
1964  * 3. SRC mac_addr mask should be 00:00:00:00:00:00.
1965  * 4. DST mac_addr mask should be 00:00:00:00:00:00 or
1966  *    FF:FF:FF:FF:FF:FF
1967  * 5. Ether_type mask should be 0xFFFF.
1968  */
1969 static int
1970 i40e_flow_parse_ethertype_pattern(struct rte_eth_dev *dev,
1971 				  const struct rte_flow_item *pattern,
1972 				  struct rte_flow_error *error,
1973 				  struct rte_eth_ethertype_filter *filter)
1974 {
1975 	const struct rte_flow_item *item = pattern;
1976 	const struct rte_flow_item_eth *eth_spec;
1977 	const struct rte_flow_item_eth *eth_mask;
1978 	enum rte_flow_item_type item_type;
1979 	uint16_t outer_tpid;
1980 
1981 	outer_tpid = i40e_get_outer_vlan(dev);
1982 
1983 	for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
1984 		if (item->last) {
1985 			rte_flow_error_set(error, EINVAL,
1986 					   RTE_FLOW_ERROR_TYPE_ITEM,
1987 					   item,
1988 					   "Not support range");
1989 			return -rte_errno;
1990 		}
1991 		item_type = item->type;
1992 		switch (item_type) {
1993 		case RTE_FLOW_ITEM_TYPE_ETH:
1994 			eth_spec = item->spec;
1995 			eth_mask = item->mask;
1996 			/* Get the MAC info. */
1997 			if (!eth_spec || !eth_mask) {
1998 				rte_flow_error_set(error, EINVAL,
1999 						   RTE_FLOW_ERROR_TYPE_ITEM,
2000 						   item,
2001 						   "NULL ETH spec/mask");
2002 				return -rte_errno;
2003 			}
2004 
2005 			/* Mask bits of source MAC address must be full of 0.
2006 			 * Mask bits of destination MAC address must be full
2007 			 * of 1 or full of 0.
2008 			 */
2009 			if (!rte_is_zero_ether_addr(&eth_mask->src) ||
2010 			    (!rte_is_zero_ether_addr(&eth_mask->dst) &&
2011 			     !rte_is_broadcast_ether_addr(&eth_mask->dst))) {
2012 				rte_flow_error_set(error, EINVAL,
2013 						   RTE_FLOW_ERROR_TYPE_ITEM,
2014 						   item,
2015 						   "Invalid MAC_addr mask");
2016 				return -rte_errno;
2017 			}
2018 
2019 			if ((eth_mask->type & UINT16_MAX) != UINT16_MAX) {
2020 				rte_flow_error_set(error, EINVAL,
2021 						   RTE_FLOW_ERROR_TYPE_ITEM,
2022 						   item,
2023 						   "Invalid ethertype mask");
2024 				return -rte_errno;
2025 			}
2026 
2027 			/* If mask bits of destination MAC address
2028 			 * are full of 1, set RTE_ETHTYPE_FLAGS_MAC.
2029 			 */
2030 			if (rte_is_broadcast_ether_addr(&eth_mask->dst)) {
2031 				filter->mac_addr = eth_spec->dst;
2032 				filter->flags |= RTE_ETHTYPE_FLAGS_MAC;
2033 			} else {
2034 				filter->flags &= ~RTE_ETHTYPE_FLAGS_MAC;
2035 			}
2036 			filter->ether_type = rte_be_to_cpu_16(eth_spec->type);
2037 
2038 			if (filter->ether_type == RTE_ETHER_TYPE_IPV4 ||
2039 			    filter->ether_type == RTE_ETHER_TYPE_IPV6 ||
2040 			    filter->ether_type == RTE_ETHER_TYPE_LLDP ||
2041 			    filter->ether_type == outer_tpid) {
2042 				rte_flow_error_set(error, EINVAL,
2043 						   RTE_FLOW_ERROR_TYPE_ITEM,
2044 						   item,
2045 						   "Unsupported ether_type in"
2046 						   " control packet filter.");
2047 				return -rte_errno;
2048 			}
2049 			break;
2050 		default:
2051 			break;
2052 		}
2053 	}
2054 
2055 	return 0;
2056 }
2057 
2058 /* Ethertype action only supports QUEUE or DROP. */
2059 static int
2060 i40e_flow_parse_ethertype_action(struct rte_eth_dev *dev,
2061 				 const struct rte_flow_action *actions,
2062 				 struct rte_flow_error *error,
2063 				 struct rte_eth_ethertype_filter *filter)
2064 {
2065 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
2066 	const struct rte_flow_action *act;
2067 	const struct rte_flow_action_queue *act_q;
2068 	uint32_t index = 0;
2069 
2070 	/* Check if the first non-void action is QUEUE or DROP. */
2071 	NEXT_ITEM_OF_ACTION(act, actions, index);
2072 	if (act->type != RTE_FLOW_ACTION_TYPE_QUEUE &&
2073 	    act->type != RTE_FLOW_ACTION_TYPE_DROP) {
2074 		rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION,
2075 				   act, "Not supported action.");
2076 		return -rte_errno;
2077 	}
2078 
2079 	if (act->type == RTE_FLOW_ACTION_TYPE_QUEUE) {
2080 		act_q = act->conf;
2081 		filter->queue = act_q->index;
2082 		if (filter->queue >= pf->dev_data->nb_rx_queues) {
2083 			rte_flow_error_set(error, EINVAL,
2084 					   RTE_FLOW_ERROR_TYPE_ACTION,
2085 					   act, "Invalid queue ID for"
2086 					   " ethertype_filter.");
2087 			return -rte_errno;
2088 		}
2089 	} else {
2090 		filter->flags |= RTE_ETHTYPE_FLAGS_DROP;
2091 	}
2092 
2093 	/* Check if the next non-void item is END */
2094 	index++;
2095 	NEXT_ITEM_OF_ACTION(act, actions, index);
2096 	if (act->type != RTE_FLOW_ACTION_TYPE_END) {
2097 		rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION,
2098 				   act, "Not supported action.");
2099 		return -rte_errno;
2100 	}
2101 
2102 	return 0;
2103 }
2104 
2105 static int
2106 i40e_flow_parse_ethertype_filter(struct rte_eth_dev *dev,
2107 				 const struct rte_flow_attr *attr,
2108 				 const struct rte_flow_item pattern[],
2109 				 const struct rte_flow_action actions[],
2110 				 struct rte_flow_error *error,
2111 				 union i40e_filter_t *filter)
2112 {
2113 	struct rte_eth_ethertype_filter *ethertype_filter =
2114 		&filter->ethertype_filter;
2115 	int ret;
2116 
2117 	ret = i40e_flow_parse_ethertype_pattern(dev, pattern, error,
2118 						ethertype_filter);
2119 	if (ret)
2120 		return ret;
2121 
2122 	ret = i40e_flow_parse_ethertype_action(dev, actions, error,
2123 					       ethertype_filter);
2124 	if (ret)
2125 		return ret;
2126 
2127 	ret = i40e_flow_parse_attr(attr, error);
2128 	if (ret)
2129 		return ret;
2130 
2131 	cons_filter_type = RTE_ETH_FILTER_ETHERTYPE;
2132 
2133 	return ret;
2134 }
2135 
2136 static int
2137 i40e_flow_check_raw_item(const struct rte_flow_item *item,
2138 			 const struct rte_flow_item_raw *raw_spec,
2139 			 struct rte_flow_error *error)
2140 {
2141 	if (!raw_spec->relative) {
2142 		rte_flow_error_set(error, EINVAL,
2143 				   RTE_FLOW_ERROR_TYPE_ITEM,
2144 				   item,
2145 				   "Relative should be 1.");
2146 		return -rte_errno;
2147 	}
2148 
2149 	if (raw_spec->offset % sizeof(uint16_t)) {
2150 		rte_flow_error_set(error, EINVAL,
2151 				   RTE_FLOW_ERROR_TYPE_ITEM,
2152 				   item,
2153 				   "Offset should be even.");
2154 		return -rte_errno;
2155 	}
2156 
2157 	if (raw_spec->search || raw_spec->limit) {
2158 		rte_flow_error_set(error, EINVAL,
2159 				   RTE_FLOW_ERROR_TYPE_ITEM,
2160 				   item,
2161 				   "search or limit is not supported.");
2162 		return -rte_errno;
2163 	}
2164 
2165 	if (raw_spec->offset < 0) {
2166 		rte_flow_error_set(error, EINVAL,
2167 				   RTE_FLOW_ERROR_TYPE_ITEM,
2168 				   item,
2169 				   "Offset should be non-negative.");
2170 		return -rte_errno;
2171 	}
2172 	return 0;
2173 }
2174 
2175 static int
2176 i40e_flow_store_flex_pit(struct i40e_pf *pf,
2177 			 struct i40e_fdir_flex_pit *flex_pit,
2178 			 enum i40e_flxpld_layer_idx layer_idx,
2179 			 uint8_t raw_id)
2180 {
2181 	uint8_t field_idx;
2182 
2183 	field_idx = layer_idx * I40E_MAX_FLXPLD_FIED + raw_id;
2184 	/* Check if the configuration is conflicted */
2185 	if (pf->fdir.flex_pit_flag[layer_idx] &&
2186 	    (pf->fdir.flex_set[field_idx].src_offset != flex_pit->src_offset ||
2187 	     pf->fdir.flex_set[field_idx].size != flex_pit->size ||
2188 	     pf->fdir.flex_set[field_idx].dst_offset != flex_pit->dst_offset))
2189 		return -1;
2190 
2191 	/* Check if the configuration exists. */
2192 	if (pf->fdir.flex_pit_flag[layer_idx] &&
2193 	    (pf->fdir.flex_set[field_idx].src_offset == flex_pit->src_offset &&
2194 	     pf->fdir.flex_set[field_idx].size == flex_pit->size &&
2195 	     pf->fdir.flex_set[field_idx].dst_offset == flex_pit->dst_offset))
2196 		return 1;
2197 
2198 	pf->fdir.flex_set[field_idx].src_offset =
2199 		flex_pit->src_offset;
2200 	pf->fdir.flex_set[field_idx].size =
2201 		flex_pit->size;
2202 	pf->fdir.flex_set[field_idx].dst_offset =
2203 		flex_pit->dst_offset;
2204 
2205 	return 0;
2206 }
2207 
2208 static int
2209 i40e_flow_store_flex_mask(struct i40e_pf *pf,
2210 			  enum i40e_filter_pctype pctype,
2211 			  uint8_t *mask)
2212 {
2213 	struct i40e_fdir_flex_mask flex_mask;
2214 	uint16_t mask_tmp;
2215 	uint8_t i, nb_bitmask = 0;
2216 
2217 	memset(&flex_mask, 0, sizeof(struct i40e_fdir_flex_mask));
2218 	for (i = 0; i < I40E_FDIR_MAX_FLEX_LEN; i += sizeof(uint16_t)) {
2219 		mask_tmp = I40E_WORD(mask[i], mask[i + 1]);
2220 		if (mask_tmp) {
2221 			flex_mask.word_mask |=
2222 				I40E_FLEX_WORD_MASK(i / sizeof(uint16_t));
2223 			if (mask_tmp != UINT16_MAX) {
2224 				flex_mask.bitmask[nb_bitmask].mask = ~mask_tmp;
2225 				flex_mask.bitmask[nb_bitmask].offset =
2226 					i / sizeof(uint16_t);
2227 				nb_bitmask++;
2228 				if (nb_bitmask > I40E_FDIR_BITMASK_NUM_WORD)
2229 					return -1;
2230 			}
2231 		}
2232 	}
2233 	flex_mask.nb_bitmask = nb_bitmask;
2234 
2235 	if (pf->fdir.flex_mask_flag[pctype] &&
2236 	    (memcmp(&flex_mask, &pf->fdir.flex_mask[pctype],
2237 		    sizeof(struct i40e_fdir_flex_mask))))
2238 		return -2;
2239 	else if (pf->fdir.flex_mask_flag[pctype] &&
2240 		 !(memcmp(&flex_mask, &pf->fdir.flex_mask[pctype],
2241 			  sizeof(struct i40e_fdir_flex_mask))))
2242 		return 1;
2243 
2244 	memcpy(&pf->fdir.flex_mask[pctype], &flex_mask,
2245 	       sizeof(struct i40e_fdir_flex_mask));
2246 	return 0;
2247 }
2248 
2249 static void
2250 i40e_flow_set_fdir_flex_pit(struct i40e_pf *pf,
2251 			    enum i40e_flxpld_layer_idx layer_idx,
2252 			    uint8_t raw_id)
2253 {
2254 	struct i40e_hw *hw = I40E_PF_TO_HW(pf);
2255 	uint32_t flx_pit, flx_ort;
2256 	uint8_t field_idx;
2257 	uint16_t min_next_off = 0;  /* in words */
2258 	uint8_t i;
2259 
2260 	if (raw_id) {
2261 		flx_ort = (1 << I40E_GLQF_ORT_FLX_PAYLOAD_SHIFT) |
2262 			  (raw_id << I40E_GLQF_ORT_FIELD_CNT_SHIFT) |
2263 			  (layer_idx * I40E_MAX_FLXPLD_FIED);
2264 		I40E_WRITE_GLB_REG(hw, I40E_GLQF_ORT(33 + layer_idx), flx_ort);
2265 	}
2266 
2267 	/* Set flex pit */
2268 	for (i = 0; i < raw_id; i++) {
2269 		field_idx = layer_idx * I40E_MAX_FLXPLD_FIED + i;
2270 		flx_pit = MK_FLX_PIT(pf->fdir.flex_set[field_idx].src_offset,
2271 				     pf->fdir.flex_set[field_idx].size,
2272 				     pf->fdir.flex_set[field_idx].dst_offset);
2273 
2274 		I40E_WRITE_REG(hw, I40E_PRTQF_FLX_PIT(field_idx), flx_pit);
2275 		min_next_off = pf->fdir.flex_set[field_idx].src_offset +
2276 			pf->fdir.flex_set[field_idx].size;
2277 	}
2278 
2279 	for (; i < I40E_MAX_FLXPLD_FIED; i++) {
2280 		/* set the non-used register obeying register's constrain */
2281 		field_idx = layer_idx * I40E_MAX_FLXPLD_FIED + i;
2282 		flx_pit = MK_FLX_PIT(min_next_off, NONUSE_FLX_PIT_FSIZE,
2283 				     NONUSE_FLX_PIT_DEST_OFF);
2284 		I40E_WRITE_REG(hw, I40E_PRTQF_FLX_PIT(field_idx), flx_pit);
2285 		min_next_off++;
2286 	}
2287 
2288 	pf->fdir.flex_pit_flag[layer_idx] = 1;
2289 }
2290 
2291 static void
2292 i40e_flow_set_fdir_flex_msk(struct i40e_pf *pf,
2293 			    enum i40e_filter_pctype pctype)
2294 {
2295 	struct i40e_hw *hw = I40E_PF_TO_HW(pf);
2296 	struct i40e_fdir_flex_mask *flex_mask;
2297 	uint32_t flxinset, fd_mask;
2298 	uint8_t i;
2299 
2300 	/* Set flex mask */
2301 	flex_mask = &pf->fdir.flex_mask[pctype];
2302 	flxinset = (flex_mask->word_mask <<
2303 		    I40E_PRTQF_FD_FLXINSET_INSET_SHIFT) &
2304 		I40E_PRTQF_FD_FLXINSET_INSET_MASK;
2305 	i40e_write_rx_ctl(hw, I40E_PRTQF_FD_FLXINSET(pctype), flxinset);
2306 
2307 	for (i = 0; i < flex_mask->nb_bitmask; i++) {
2308 		fd_mask = (flex_mask->bitmask[i].mask <<
2309 			   I40E_PRTQF_FD_MSK_MASK_SHIFT) &
2310 			I40E_PRTQF_FD_MSK_MASK_MASK;
2311 		fd_mask |= ((flex_mask->bitmask[i].offset +
2312 			     I40E_FLX_OFFSET_IN_FIELD_VECTOR) <<
2313 			    I40E_PRTQF_FD_MSK_OFFSET_SHIFT) &
2314 			I40E_PRTQF_FD_MSK_OFFSET_MASK;
2315 		i40e_write_rx_ctl(hw, I40E_PRTQF_FD_MSK(pctype, i), fd_mask);
2316 	}
2317 
2318 	pf->fdir.flex_mask_flag[pctype] = 1;
2319 }
2320 
2321 static int
2322 i40e_flow_set_fdir_inset(struct i40e_pf *pf,
2323 			 enum i40e_filter_pctype pctype,
2324 			 uint64_t input_set)
2325 {
2326 	struct i40e_hw *hw = I40E_PF_TO_HW(pf);
2327 	uint64_t inset_reg = 0;
2328 	uint32_t mask_reg[I40E_INSET_MASK_NUM_REG] = {0};
2329 	int i, num;
2330 
2331 	/* Check if the input set is valid */
2332 	if (i40e_validate_input_set(pctype, RTE_ETH_FILTER_FDIR,
2333 				    input_set) != 0) {
2334 		PMD_DRV_LOG(ERR, "Invalid input set");
2335 		return -EINVAL;
2336 	}
2337 
2338 	/* Check if the configuration is conflicted */
2339 	if (pf->fdir.inset_flag[pctype] &&
2340 	    memcmp(&pf->fdir.input_set[pctype], &input_set, sizeof(uint64_t)))
2341 		return -1;
2342 
2343 	if (pf->fdir.inset_flag[pctype] &&
2344 	    !memcmp(&pf->fdir.input_set[pctype], &input_set, sizeof(uint64_t)))
2345 		return 0;
2346 
2347 	num = i40e_generate_inset_mask_reg(input_set, mask_reg,
2348 					   I40E_INSET_MASK_NUM_REG);
2349 	if (num < 0)
2350 		return -EINVAL;
2351 
2352 	inset_reg |= i40e_translate_input_set_reg(hw->mac.type, input_set);
2353 
2354 	i40e_check_write_reg(hw, I40E_PRTQF_FD_INSET(pctype, 0),
2355 			     (uint32_t)(inset_reg & UINT32_MAX));
2356 	i40e_check_write_reg(hw, I40E_PRTQF_FD_INSET(pctype, 1),
2357 			     (uint32_t)((inset_reg >>
2358 					 I40E_32_BIT_WIDTH) & UINT32_MAX));
2359 
2360 	for (i = 0; i < num; i++)
2361 		i40e_check_write_reg(hw, I40E_GLQF_FD_MSK(i, pctype),
2362 				     mask_reg[i]);
2363 
2364 	/*clear unused mask registers of the pctype */
2365 	for (i = num; i < I40E_INSET_MASK_NUM_REG; i++)
2366 		i40e_check_write_reg(hw, I40E_GLQF_FD_MSK(i, pctype), 0);
2367 	I40E_WRITE_FLUSH(hw);
2368 
2369 	pf->fdir.input_set[pctype] = input_set;
2370 	pf->fdir.inset_flag[pctype] = 1;
2371 	return 0;
2372 }
2373 
2374 static uint8_t
2375 i40e_flow_fdir_get_pctype_value(struct i40e_pf *pf,
2376 				enum rte_flow_item_type item_type,
2377 				struct i40e_fdir_filter_conf *filter)
2378 {
2379 	struct i40e_customized_pctype *cus_pctype = NULL;
2380 
2381 	switch (item_type) {
2382 	case RTE_FLOW_ITEM_TYPE_GTPC:
2383 		cus_pctype = i40e_find_customized_pctype(pf,
2384 							 I40E_CUSTOMIZED_GTPC);
2385 		break;
2386 	case RTE_FLOW_ITEM_TYPE_GTPU:
2387 		if (!filter->input.flow_ext.inner_ip)
2388 			cus_pctype = i40e_find_customized_pctype(pf,
2389 							 I40E_CUSTOMIZED_GTPU);
2390 		else if (filter->input.flow_ext.iip_type ==
2391 			 I40E_FDIR_IPTYPE_IPV4)
2392 			cus_pctype = i40e_find_customized_pctype(pf,
2393 						 I40E_CUSTOMIZED_GTPU_IPV4);
2394 		else if (filter->input.flow_ext.iip_type ==
2395 			 I40E_FDIR_IPTYPE_IPV6)
2396 			cus_pctype = i40e_find_customized_pctype(pf,
2397 						 I40E_CUSTOMIZED_GTPU_IPV6);
2398 		break;
2399 	default:
2400 		PMD_DRV_LOG(ERR, "Unsupported item type");
2401 		break;
2402 	}
2403 
2404 	if (cus_pctype && cus_pctype->valid)
2405 		return cus_pctype->pctype;
2406 
2407 	return I40E_FILTER_PCTYPE_INVALID;
2408 }
2409 
2410 /* 1. Last in item should be NULL as range is not supported.
2411  * 2. Supported patterns: refer to array i40e_supported_patterns.
2412  * 3. Default supported flow type and input set: refer to array
2413  *    valid_fdir_inset_table in i40e_ethdev.c.
2414  * 4. Mask of fields which need to be matched should be
2415  *    filled with 1.
2416  * 5. Mask of fields which needn't to be matched should be
2417  *    filled with 0.
2418  * 6. GTP profile supports GTPv1 only.
2419  * 7. GTP-C response message ('source_port' = 2123) is not supported.
2420  */
2421 static int
2422 i40e_flow_parse_fdir_pattern(struct rte_eth_dev *dev,
2423 			     const struct rte_flow_attr *attr,
2424 			     const struct rte_flow_item *pattern,
2425 			     struct rte_flow_error *error,
2426 			     struct i40e_fdir_filter_conf *filter)
2427 {
2428 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
2429 	const struct rte_flow_item *item = pattern;
2430 	const struct rte_flow_item_eth *eth_spec, *eth_mask;
2431 	const struct rte_flow_item_vlan *vlan_spec, *vlan_mask;
2432 	const struct rte_flow_item_ipv4 *ipv4_spec, *ipv4_mask;
2433 	const struct rte_flow_item_ipv6 *ipv6_spec, *ipv6_mask;
2434 	const struct rte_flow_item_tcp *tcp_spec, *tcp_mask;
2435 	const struct rte_flow_item_udp *udp_spec, *udp_mask;
2436 	const struct rte_flow_item_sctp *sctp_spec, *sctp_mask;
2437 	const struct rte_flow_item_gtp *gtp_spec, *gtp_mask;
2438 	const struct rte_flow_item_raw *raw_spec, *raw_mask;
2439 	const struct rte_flow_item_vf *vf_spec;
2440 
2441 	uint8_t pctype = 0;
2442 	uint64_t input_set = I40E_INSET_NONE;
2443 	uint16_t frag_off;
2444 	enum rte_flow_item_type item_type;
2445 	enum rte_flow_item_type next_type;
2446 	enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
2447 	enum rte_flow_item_type cus_proto = RTE_FLOW_ITEM_TYPE_END;
2448 	uint32_t i, j;
2449 	uint8_t  ipv6_addr_mask[16] = {
2450 		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2451 		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
2452 	enum i40e_flxpld_layer_idx layer_idx = I40E_FLXPLD_L2_IDX;
2453 	uint8_t raw_id = 0;
2454 	int32_t off_arr[I40E_MAX_FLXPLD_FIED];
2455 	uint16_t len_arr[I40E_MAX_FLXPLD_FIED];
2456 	struct i40e_fdir_flex_pit flex_pit;
2457 	uint8_t next_dst_off = 0;
2458 	uint8_t flex_mask[I40E_FDIR_MAX_FLEX_LEN];
2459 	uint16_t flex_size;
2460 	bool cfg_flex_pit = true;
2461 	bool cfg_flex_msk = true;
2462 	uint16_t outer_tpid;
2463 	uint16_t ether_type;
2464 	uint32_t vtc_flow_cpu;
2465 	bool outer_ip = true;
2466 	int ret;
2467 
2468 	memset(off_arr, 0, sizeof(off_arr));
2469 	memset(len_arr, 0, sizeof(len_arr));
2470 	memset(flex_mask, 0, I40E_FDIR_MAX_FLEX_LEN);
2471 	outer_tpid = i40e_get_outer_vlan(dev);
2472 	filter->input.flow_ext.customized_pctype = false;
2473 	for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
2474 		if (item->last) {
2475 			rte_flow_error_set(error, EINVAL,
2476 					   RTE_FLOW_ERROR_TYPE_ITEM,
2477 					   item,
2478 					   "Not support range");
2479 			return -rte_errno;
2480 		}
2481 		item_type = item->type;
2482 		switch (item_type) {
2483 		case RTE_FLOW_ITEM_TYPE_ETH:
2484 			eth_spec = item->spec;
2485 			eth_mask = item->mask;
2486 			next_type = (item + 1)->type;
2487 
2488 			if (next_type == RTE_FLOW_ITEM_TYPE_END &&
2489 						(!eth_spec || !eth_mask)) {
2490 				rte_flow_error_set(error, EINVAL,
2491 						   RTE_FLOW_ERROR_TYPE_ITEM,
2492 						   item,
2493 						   "NULL eth spec/mask.");
2494 				return -rte_errno;
2495 			}
2496 
2497 			if (eth_spec && eth_mask) {
2498 				if (!rte_is_zero_ether_addr(&eth_mask->src) ||
2499 				    !rte_is_zero_ether_addr(&eth_mask->dst)) {
2500 					rte_flow_error_set(error, EINVAL,
2501 						      RTE_FLOW_ERROR_TYPE_ITEM,
2502 						      item,
2503 						      "Invalid MAC_addr mask.");
2504 					return -rte_errno;
2505 				}
2506 			}
2507 			if (eth_spec && eth_mask && eth_mask->type) {
2508 				if (eth_mask->type != RTE_BE16(0xffff)) {
2509 					rte_flow_error_set(error, EINVAL,
2510 						      RTE_FLOW_ERROR_TYPE_ITEM,
2511 						      item,
2512 						      "Invalid type mask.");
2513 					return -rte_errno;
2514 				}
2515 
2516 				ether_type = rte_be_to_cpu_16(eth_spec->type);
2517 
2518 				if (next_type == RTE_FLOW_ITEM_TYPE_VLAN ||
2519 				    ether_type == RTE_ETHER_TYPE_IPV4 ||
2520 				    ether_type == RTE_ETHER_TYPE_IPV6 ||
2521 				    ether_type == RTE_ETHER_TYPE_ARP ||
2522 				    ether_type == outer_tpid) {
2523 					rte_flow_error_set(error, EINVAL,
2524 						     RTE_FLOW_ERROR_TYPE_ITEM,
2525 						     item,
2526 						     "Unsupported ether_type.");
2527 					return -rte_errno;
2528 				}
2529 				input_set |= I40E_INSET_LAST_ETHER_TYPE;
2530 				filter->input.flow.l2_flow.ether_type =
2531 					eth_spec->type;
2532 			}
2533 
2534 			pctype = I40E_FILTER_PCTYPE_L2_PAYLOAD;
2535 			layer_idx = I40E_FLXPLD_L2_IDX;
2536 
2537 			break;
2538 		case RTE_FLOW_ITEM_TYPE_VLAN:
2539 			vlan_spec = item->spec;
2540 			vlan_mask = item->mask;
2541 
2542 			RTE_ASSERT(!(input_set & I40E_INSET_LAST_ETHER_TYPE));
2543 			if (vlan_spec && vlan_mask) {
2544 				if (vlan_mask->tci ==
2545 				    rte_cpu_to_be_16(I40E_TCI_MASK)) {
2546 					input_set |= I40E_INSET_VLAN_INNER;
2547 					filter->input.flow_ext.vlan_tci =
2548 						vlan_spec->tci;
2549 				}
2550 			}
2551 			if (vlan_spec && vlan_mask && vlan_mask->inner_type) {
2552 				if (vlan_mask->inner_type != RTE_BE16(0xffff)) {
2553 					rte_flow_error_set(error, EINVAL,
2554 						      RTE_FLOW_ERROR_TYPE_ITEM,
2555 						      item,
2556 						      "Invalid inner_type"
2557 						      " mask.");
2558 					return -rte_errno;
2559 				}
2560 
2561 				ether_type =
2562 					rte_be_to_cpu_16(vlan_spec->inner_type);
2563 
2564 				if (ether_type == RTE_ETHER_TYPE_IPV4 ||
2565 				    ether_type == RTE_ETHER_TYPE_IPV6 ||
2566 				    ether_type == RTE_ETHER_TYPE_ARP ||
2567 				    ether_type == outer_tpid) {
2568 					rte_flow_error_set(error, EINVAL,
2569 						     RTE_FLOW_ERROR_TYPE_ITEM,
2570 						     item,
2571 						     "Unsupported inner_type.");
2572 					return -rte_errno;
2573 				}
2574 				input_set |= I40E_INSET_LAST_ETHER_TYPE;
2575 				filter->input.flow.l2_flow.ether_type =
2576 					vlan_spec->inner_type;
2577 			}
2578 
2579 			pctype = I40E_FILTER_PCTYPE_L2_PAYLOAD;
2580 			layer_idx = I40E_FLXPLD_L2_IDX;
2581 
2582 			break;
2583 		case RTE_FLOW_ITEM_TYPE_IPV4:
2584 			l3 = RTE_FLOW_ITEM_TYPE_IPV4;
2585 			ipv4_spec = item->spec;
2586 			ipv4_mask = item->mask;
2587 			pctype = I40E_FILTER_PCTYPE_NONF_IPV4_OTHER;
2588 			layer_idx = I40E_FLXPLD_L3_IDX;
2589 
2590 			if (ipv4_spec && ipv4_mask && outer_ip) {
2591 				/* Check IPv4 mask and update input set */
2592 				if (ipv4_mask->hdr.version_ihl ||
2593 				    ipv4_mask->hdr.total_length ||
2594 				    ipv4_mask->hdr.packet_id ||
2595 				    ipv4_mask->hdr.fragment_offset ||
2596 				    ipv4_mask->hdr.hdr_checksum) {
2597 					rte_flow_error_set(error, EINVAL,
2598 						   RTE_FLOW_ERROR_TYPE_ITEM,
2599 						   item,
2600 						   "Invalid IPv4 mask.");
2601 					return -rte_errno;
2602 				}
2603 
2604 				if (ipv4_mask->hdr.src_addr == UINT32_MAX)
2605 					input_set |= I40E_INSET_IPV4_SRC;
2606 				if (ipv4_mask->hdr.dst_addr == UINT32_MAX)
2607 					input_set |= I40E_INSET_IPV4_DST;
2608 				if (ipv4_mask->hdr.type_of_service == UINT8_MAX)
2609 					input_set |= I40E_INSET_IPV4_TOS;
2610 				if (ipv4_mask->hdr.time_to_live == UINT8_MAX)
2611 					input_set |= I40E_INSET_IPV4_TTL;
2612 				if (ipv4_mask->hdr.next_proto_id == UINT8_MAX)
2613 					input_set |= I40E_INSET_IPV4_PROTO;
2614 
2615 				/* Check if it is fragment. */
2616 				frag_off = ipv4_spec->hdr.fragment_offset;
2617 				frag_off = rte_be_to_cpu_16(frag_off);
2618 				if (frag_off & RTE_IPV4_HDR_OFFSET_MASK ||
2619 				    frag_off & RTE_IPV4_HDR_MF_FLAG)
2620 					pctype = I40E_FILTER_PCTYPE_FRAG_IPV4;
2621 
2622 				/* Get the filter info */
2623 				filter->input.flow.ip4_flow.proto =
2624 					ipv4_spec->hdr.next_proto_id;
2625 				filter->input.flow.ip4_flow.tos =
2626 					ipv4_spec->hdr.type_of_service;
2627 				filter->input.flow.ip4_flow.ttl =
2628 					ipv4_spec->hdr.time_to_live;
2629 				filter->input.flow.ip4_flow.src_ip =
2630 					ipv4_spec->hdr.src_addr;
2631 				filter->input.flow.ip4_flow.dst_ip =
2632 					ipv4_spec->hdr.dst_addr;
2633 			} else if (!ipv4_spec && !ipv4_mask && !outer_ip) {
2634 				filter->input.flow_ext.inner_ip = true;
2635 				filter->input.flow_ext.iip_type =
2636 					I40E_FDIR_IPTYPE_IPV4;
2637 			} else if ((ipv4_spec || ipv4_mask) && !outer_ip) {
2638 				rte_flow_error_set(error, EINVAL,
2639 						   RTE_FLOW_ERROR_TYPE_ITEM,
2640 						   item,
2641 						   "Invalid inner IPv4 mask.");
2642 				return -rte_errno;
2643 			}
2644 
2645 			if (outer_ip)
2646 				outer_ip = false;
2647 
2648 			break;
2649 		case RTE_FLOW_ITEM_TYPE_IPV6:
2650 			l3 = RTE_FLOW_ITEM_TYPE_IPV6;
2651 			ipv6_spec = item->spec;
2652 			ipv6_mask = item->mask;
2653 			pctype = I40E_FILTER_PCTYPE_NONF_IPV6_OTHER;
2654 			layer_idx = I40E_FLXPLD_L3_IDX;
2655 
2656 			if (ipv6_spec && ipv6_mask && outer_ip) {
2657 				/* Check IPv6 mask and update input set */
2658 				if (ipv6_mask->hdr.payload_len) {
2659 					rte_flow_error_set(error, EINVAL,
2660 						   RTE_FLOW_ERROR_TYPE_ITEM,
2661 						   item,
2662 						   "Invalid IPv6 mask");
2663 					return -rte_errno;
2664 				}
2665 
2666 				if (!memcmp(ipv6_mask->hdr.src_addr,
2667 					    ipv6_addr_mask,
2668 					    RTE_DIM(ipv6_mask->hdr.src_addr)))
2669 					input_set |= I40E_INSET_IPV6_SRC;
2670 				if (!memcmp(ipv6_mask->hdr.dst_addr,
2671 					    ipv6_addr_mask,
2672 					    RTE_DIM(ipv6_mask->hdr.dst_addr)))
2673 					input_set |= I40E_INSET_IPV6_DST;
2674 
2675 				if ((ipv6_mask->hdr.vtc_flow &
2676 				     rte_cpu_to_be_32(I40E_IPV6_TC_MASK))
2677 				    == rte_cpu_to_be_32(I40E_IPV6_TC_MASK))
2678 					input_set |= I40E_INSET_IPV6_TC;
2679 				if (ipv6_mask->hdr.proto == UINT8_MAX)
2680 					input_set |= I40E_INSET_IPV6_NEXT_HDR;
2681 				if (ipv6_mask->hdr.hop_limits == UINT8_MAX)
2682 					input_set |= I40E_INSET_IPV6_HOP_LIMIT;
2683 
2684 				/* Get filter info */
2685 				vtc_flow_cpu =
2686 				      rte_be_to_cpu_32(ipv6_spec->hdr.vtc_flow);
2687 				filter->input.flow.ipv6_flow.tc =
2688 					(uint8_t)(vtc_flow_cpu >>
2689 						  I40E_FDIR_IPv6_TC_OFFSET);
2690 				filter->input.flow.ipv6_flow.proto =
2691 					ipv6_spec->hdr.proto;
2692 				filter->input.flow.ipv6_flow.hop_limits =
2693 					ipv6_spec->hdr.hop_limits;
2694 
2695 				rte_memcpy(filter->input.flow.ipv6_flow.src_ip,
2696 					   ipv6_spec->hdr.src_addr, 16);
2697 				rte_memcpy(filter->input.flow.ipv6_flow.dst_ip,
2698 					   ipv6_spec->hdr.dst_addr, 16);
2699 
2700 				/* Check if it is fragment. */
2701 				if (ipv6_spec->hdr.proto ==
2702 				    I40E_IPV6_FRAG_HEADER)
2703 					pctype = I40E_FILTER_PCTYPE_FRAG_IPV6;
2704 			} else if (!ipv6_spec && !ipv6_mask && !outer_ip) {
2705 				filter->input.flow_ext.inner_ip = true;
2706 				filter->input.flow_ext.iip_type =
2707 					I40E_FDIR_IPTYPE_IPV6;
2708 			} else if ((ipv6_spec || ipv6_mask) && !outer_ip) {
2709 				rte_flow_error_set(error, EINVAL,
2710 						   RTE_FLOW_ERROR_TYPE_ITEM,
2711 						   item,
2712 						   "Invalid inner IPv6 mask");
2713 				return -rte_errno;
2714 			}
2715 
2716 			if (outer_ip)
2717 				outer_ip = false;
2718 			break;
2719 		case RTE_FLOW_ITEM_TYPE_TCP:
2720 			tcp_spec = item->spec;
2721 			tcp_mask = item->mask;
2722 
2723 			if (l3 == RTE_FLOW_ITEM_TYPE_IPV4)
2724 				pctype =
2725 					I40E_FILTER_PCTYPE_NONF_IPV4_TCP;
2726 			else if (l3 == RTE_FLOW_ITEM_TYPE_IPV6)
2727 				pctype =
2728 					I40E_FILTER_PCTYPE_NONF_IPV6_TCP;
2729 			if (tcp_spec && tcp_mask) {
2730 				/* Check TCP mask and update input set */
2731 				if (tcp_mask->hdr.sent_seq ||
2732 				    tcp_mask->hdr.recv_ack ||
2733 				    tcp_mask->hdr.data_off ||
2734 				    tcp_mask->hdr.tcp_flags ||
2735 				    tcp_mask->hdr.rx_win ||
2736 				    tcp_mask->hdr.cksum ||
2737 				    tcp_mask->hdr.tcp_urp) {
2738 					rte_flow_error_set(error, EINVAL,
2739 						   RTE_FLOW_ERROR_TYPE_ITEM,
2740 						   item,
2741 						   "Invalid TCP mask");
2742 					return -rte_errno;
2743 				}
2744 
2745 				if (tcp_mask->hdr.src_port == UINT16_MAX)
2746 					input_set |= I40E_INSET_SRC_PORT;
2747 				if (tcp_mask->hdr.dst_port == UINT16_MAX)
2748 					input_set |= I40E_INSET_DST_PORT;
2749 
2750 				/* Get filter info */
2751 				if (l3 == RTE_FLOW_ITEM_TYPE_IPV4) {
2752 					filter->input.flow.tcp4_flow.src_port =
2753 						tcp_spec->hdr.src_port;
2754 					filter->input.flow.tcp4_flow.dst_port =
2755 						tcp_spec->hdr.dst_port;
2756 				} else if (l3 == RTE_FLOW_ITEM_TYPE_IPV6) {
2757 					filter->input.flow.tcp6_flow.src_port =
2758 						tcp_spec->hdr.src_port;
2759 					filter->input.flow.tcp6_flow.dst_port =
2760 						tcp_spec->hdr.dst_port;
2761 				}
2762 			}
2763 
2764 			layer_idx = I40E_FLXPLD_L4_IDX;
2765 
2766 			break;
2767 		case RTE_FLOW_ITEM_TYPE_UDP:
2768 			udp_spec = item->spec;
2769 			udp_mask = item->mask;
2770 
2771 			if (l3 == RTE_FLOW_ITEM_TYPE_IPV4)
2772 				pctype =
2773 					I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
2774 			else if (l3 == RTE_FLOW_ITEM_TYPE_IPV6)
2775 				pctype =
2776 					I40E_FILTER_PCTYPE_NONF_IPV6_UDP;
2777 
2778 			if (udp_spec && udp_mask) {
2779 				/* Check UDP mask and update input set*/
2780 				if (udp_mask->hdr.dgram_len ||
2781 				    udp_mask->hdr.dgram_cksum) {
2782 					rte_flow_error_set(error, EINVAL,
2783 						   RTE_FLOW_ERROR_TYPE_ITEM,
2784 						   item,
2785 						   "Invalid UDP mask");
2786 					return -rte_errno;
2787 				}
2788 
2789 				if (udp_mask->hdr.src_port == UINT16_MAX)
2790 					input_set |= I40E_INSET_SRC_PORT;
2791 				if (udp_mask->hdr.dst_port == UINT16_MAX)
2792 					input_set |= I40E_INSET_DST_PORT;
2793 
2794 				/* Get filter info */
2795 				if (l3 == RTE_FLOW_ITEM_TYPE_IPV4) {
2796 					filter->input.flow.udp4_flow.src_port =
2797 						udp_spec->hdr.src_port;
2798 					filter->input.flow.udp4_flow.dst_port =
2799 						udp_spec->hdr.dst_port;
2800 				} else if (l3 == RTE_FLOW_ITEM_TYPE_IPV6) {
2801 					filter->input.flow.udp6_flow.src_port =
2802 						udp_spec->hdr.src_port;
2803 					filter->input.flow.udp6_flow.dst_port =
2804 						udp_spec->hdr.dst_port;
2805 				}
2806 			}
2807 
2808 			layer_idx = I40E_FLXPLD_L4_IDX;
2809 
2810 			break;
2811 		case RTE_FLOW_ITEM_TYPE_GTPC:
2812 		case RTE_FLOW_ITEM_TYPE_GTPU:
2813 			if (!pf->gtp_support) {
2814 				rte_flow_error_set(error, EINVAL,
2815 						   RTE_FLOW_ERROR_TYPE_ITEM,
2816 						   item,
2817 						   "Unsupported protocol");
2818 				return -rte_errno;
2819 			}
2820 
2821 			gtp_spec = item->spec;
2822 			gtp_mask = item->mask;
2823 
2824 			if (gtp_spec && gtp_mask) {
2825 				if (gtp_mask->v_pt_rsv_flags ||
2826 				    gtp_mask->msg_type ||
2827 				    gtp_mask->msg_len ||
2828 				    gtp_mask->teid != UINT32_MAX) {
2829 					rte_flow_error_set(error, EINVAL,
2830 						   RTE_FLOW_ERROR_TYPE_ITEM,
2831 						   item,
2832 						   "Invalid GTP mask");
2833 					return -rte_errno;
2834 				}
2835 
2836 				filter->input.flow.gtp_flow.teid =
2837 					gtp_spec->teid;
2838 				filter->input.flow_ext.customized_pctype = true;
2839 				cus_proto = item_type;
2840 			}
2841 			break;
2842 		case RTE_FLOW_ITEM_TYPE_SCTP:
2843 			sctp_spec = item->spec;
2844 			sctp_mask = item->mask;
2845 
2846 			if (l3 == RTE_FLOW_ITEM_TYPE_IPV4)
2847 				pctype =
2848 					I40E_FILTER_PCTYPE_NONF_IPV4_SCTP;
2849 			else if (l3 == RTE_FLOW_ITEM_TYPE_IPV6)
2850 				pctype =
2851 					I40E_FILTER_PCTYPE_NONF_IPV6_SCTP;
2852 
2853 			if (sctp_spec && sctp_mask) {
2854 				/* Check SCTP mask and update input set */
2855 				if (sctp_mask->hdr.cksum) {
2856 					rte_flow_error_set(error, EINVAL,
2857 						   RTE_FLOW_ERROR_TYPE_ITEM,
2858 						   item,
2859 						   "Invalid UDP mask");
2860 					return -rte_errno;
2861 				}
2862 
2863 				if (sctp_mask->hdr.src_port == UINT16_MAX)
2864 					input_set |= I40E_INSET_SRC_PORT;
2865 				if (sctp_mask->hdr.dst_port == UINT16_MAX)
2866 					input_set |= I40E_INSET_DST_PORT;
2867 				if (sctp_mask->hdr.tag == UINT32_MAX)
2868 					input_set |= I40E_INSET_SCTP_VT;
2869 
2870 				/* Get filter info */
2871 				if (l3 == RTE_FLOW_ITEM_TYPE_IPV4) {
2872 					filter->input.flow.sctp4_flow.src_port =
2873 						sctp_spec->hdr.src_port;
2874 					filter->input.flow.sctp4_flow.dst_port =
2875 						sctp_spec->hdr.dst_port;
2876 					filter->input.flow.sctp4_flow.verify_tag
2877 						= sctp_spec->hdr.tag;
2878 				} else if (l3 == RTE_FLOW_ITEM_TYPE_IPV6) {
2879 					filter->input.flow.sctp6_flow.src_port =
2880 						sctp_spec->hdr.src_port;
2881 					filter->input.flow.sctp6_flow.dst_port =
2882 						sctp_spec->hdr.dst_port;
2883 					filter->input.flow.sctp6_flow.verify_tag
2884 						= sctp_spec->hdr.tag;
2885 				}
2886 			}
2887 
2888 			layer_idx = I40E_FLXPLD_L4_IDX;
2889 
2890 			break;
2891 		case RTE_FLOW_ITEM_TYPE_RAW:
2892 			raw_spec = item->spec;
2893 			raw_mask = item->mask;
2894 
2895 			if (!raw_spec || !raw_mask) {
2896 				rte_flow_error_set(error, EINVAL,
2897 						   RTE_FLOW_ERROR_TYPE_ITEM,
2898 						   item,
2899 						   "NULL RAW spec/mask");
2900 				return -rte_errno;
2901 			}
2902 
2903 			if (pf->support_multi_driver) {
2904 				rte_flow_error_set(error, ENOTSUP,
2905 						   RTE_FLOW_ERROR_TYPE_ITEM,
2906 						   item,
2907 						   "Unsupported flexible payload.");
2908 				return -rte_errno;
2909 			}
2910 
2911 			ret = i40e_flow_check_raw_item(item, raw_spec, error);
2912 			if (ret < 0)
2913 				return ret;
2914 
2915 			off_arr[raw_id] = raw_spec->offset;
2916 			len_arr[raw_id] = raw_spec->length;
2917 
2918 			flex_size = 0;
2919 			memset(&flex_pit, 0, sizeof(struct i40e_fdir_flex_pit));
2920 			flex_pit.size =
2921 				raw_spec->length / sizeof(uint16_t);
2922 			flex_pit.dst_offset =
2923 				next_dst_off / sizeof(uint16_t);
2924 
2925 			for (i = 0; i <= raw_id; i++) {
2926 				if (i == raw_id)
2927 					flex_pit.src_offset +=
2928 						raw_spec->offset /
2929 						sizeof(uint16_t);
2930 				else
2931 					flex_pit.src_offset +=
2932 						(off_arr[i] + len_arr[i]) /
2933 						sizeof(uint16_t);
2934 				flex_size += len_arr[i];
2935 			}
2936 			if (((flex_pit.src_offset + flex_pit.size) >=
2937 			     I40E_MAX_FLX_SOURCE_OFF / sizeof(uint16_t)) ||
2938 				flex_size > I40E_FDIR_MAX_FLEXLEN) {
2939 				rte_flow_error_set(error, EINVAL,
2940 					   RTE_FLOW_ERROR_TYPE_ITEM,
2941 					   item,
2942 					   "Exceeds maxmial payload limit.");
2943 				return -rte_errno;
2944 			}
2945 
2946 			/* Store flex pit to SW */
2947 			ret = i40e_flow_store_flex_pit(pf, &flex_pit,
2948 						       layer_idx, raw_id);
2949 			if (ret < 0) {
2950 				rte_flow_error_set(error, EINVAL,
2951 				   RTE_FLOW_ERROR_TYPE_ITEM,
2952 				   item,
2953 				   "Conflict with the first flexible rule.");
2954 				return -rte_errno;
2955 			} else if (ret > 0)
2956 				cfg_flex_pit = false;
2957 
2958 			for (i = 0; i < raw_spec->length; i++) {
2959 				j = i + next_dst_off;
2960 				filter->input.flow_ext.flexbytes[j] =
2961 					raw_spec->pattern[i];
2962 				flex_mask[j] = raw_mask->pattern[i];
2963 			}
2964 
2965 			next_dst_off += raw_spec->length;
2966 			raw_id++;
2967 			break;
2968 		case RTE_FLOW_ITEM_TYPE_VF:
2969 			vf_spec = item->spec;
2970 			if (!attr->transfer) {
2971 				rte_flow_error_set(error, ENOTSUP,
2972 						   RTE_FLOW_ERROR_TYPE_ITEM,
2973 						   item,
2974 						   "Matching VF traffic"
2975 						   " without affecting it"
2976 						   " (transfer attribute)"
2977 						   " is unsupported");
2978 				return -rte_errno;
2979 			}
2980 			filter->input.flow_ext.is_vf = 1;
2981 			filter->input.flow_ext.dst_id = vf_spec->id;
2982 			if (filter->input.flow_ext.is_vf &&
2983 			    filter->input.flow_ext.dst_id >= pf->vf_num) {
2984 				rte_flow_error_set(error, EINVAL,
2985 						   RTE_FLOW_ERROR_TYPE_ITEM,
2986 						   item,
2987 						   "Invalid VF ID for FDIR.");
2988 				return -rte_errno;
2989 			}
2990 			break;
2991 		default:
2992 			break;
2993 		}
2994 	}
2995 
2996 	/* Get customized pctype value */
2997 	if (filter->input.flow_ext.customized_pctype) {
2998 		pctype = i40e_flow_fdir_get_pctype_value(pf, cus_proto, filter);
2999 		if (pctype == I40E_FILTER_PCTYPE_INVALID) {
3000 			rte_flow_error_set(error, EINVAL,
3001 					   RTE_FLOW_ERROR_TYPE_ITEM,
3002 					   item,
3003 					   "Unsupported pctype");
3004 			return -rte_errno;
3005 		}
3006 	}
3007 
3008 	/* If customized pctype is not used, set fdir configuration.*/
3009 	if (!filter->input.flow_ext.customized_pctype) {
3010 		ret = i40e_flow_set_fdir_inset(pf, pctype, input_set);
3011 		if (ret == -1) {
3012 			rte_flow_error_set(error, EINVAL,
3013 					   RTE_FLOW_ERROR_TYPE_ITEM, item,
3014 					   "Conflict with the first rule's input set.");
3015 			return -rte_errno;
3016 		} else if (ret == -EINVAL) {
3017 			rte_flow_error_set(error, EINVAL,
3018 					   RTE_FLOW_ERROR_TYPE_ITEM, item,
3019 					   "Invalid pattern mask.");
3020 			return -rte_errno;
3021 		}
3022 
3023 		/* Store flex mask to SW */
3024 		ret = i40e_flow_store_flex_mask(pf, pctype, flex_mask);
3025 		if (ret == -1) {
3026 			rte_flow_error_set(error, EINVAL,
3027 					   RTE_FLOW_ERROR_TYPE_ITEM,
3028 					   item,
3029 					   "Exceed maximal number of bitmasks");
3030 			return -rte_errno;
3031 		} else if (ret == -2) {
3032 			rte_flow_error_set(error, EINVAL,
3033 					   RTE_FLOW_ERROR_TYPE_ITEM,
3034 					   item,
3035 					   "Conflict with the first flexible rule");
3036 			return -rte_errno;
3037 		} else if (ret > 0)
3038 			cfg_flex_msk = false;
3039 
3040 		if (cfg_flex_pit)
3041 			i40e_flow_set_fdir_flex_pit(pf, layer_idx, raw_id);
3042 
3043 		if (cfg_flex_msk)
3044 			i40e_flow_set_fdir_flex_msk(pf, pctype);
3045 	}
3046 
3047 	filter->input.pctype = pctype;
3048 
3049 	return 0;
3050 }
3051 
3052 /* Parse to get the action info of a FDIR filter.
3053  * FDIR action supports QUEUE or (QUEUE + MARK).
3054  */
3055 static int
3056 i40e_flow_parse_fdir_action(struct rte_eth_dev *dev,
3057 			    const struct rte_flow_action *actions,
3058 			    struct rte_flow_error *error,
3059 			    struct i40e_fdir_filter_conf *filter)
3060 {
3061 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
3062 	const struct rte_flow_action *act;
3063 	const struct rte_flow_action_queue *act_q;
3064 	const struct rte_flow_action_mark *mark_spec = NULL;
3065 	uint32_t index = 0;
3066 
3067 	/* Check if the first non-void action is QUEUE or DROP or PASSTHRU. */
3068 	NEXT_ITEM_OF_ACTION(act, actions, index);
3069 	switch (act->type) {
3070 	case RTE_FLOW_ACTION_TYPE_QUEUE:
3071 		act_q = act->conf;
3072 		filter->action.rx_queue = act_q->index;
3073 		if ((!filter->input.flow_ext.is_vf &&
3074 		     filter->action.rx_queue >= pf->dev_data->nb_rx_queues) ||
3075 		    (filter->input.flow_ext.is_vf &&
3076 		     filter->action.rx_queue >= pf->vf_nb_qps)) {
3077 			rte_flow_error_set(error, EINVAL,
3078 					   RTE_FLOW_ERROR_TYPE_ACTION, act,
3079 					   "Invalid queue ID for FDIR.");
3080 			return -rte_errno;
3081 		}
3082 		filter->action.behavior = I40E_FDIR_ACCEPT;
3083 		break;
3084 	case RTE_FLOW_ACTION_TYPE_DROP:
3085 		filter->action.behavior = I40E_FDIR_REJECT;
3086 		break;
3087 	case RTE_FLOW_ACTION_TYPE_PASSTHRU:
3088 		filter->action.behavior = I40E_FDIR_PASSTHRU;
3089 		break;
3090 	case RTE_FLOW_ACTION_TYPE_MARK:
3091 		filter->action.behavior = I40E_FDIR_PASSTHRU;
3092 		mark_spec = act->conf;
3093 		filter->action.report_status = I40E_FDIR_REPORT_ID;
3094 		filter->soft_id = mark_spec->id;
3095 	break;
3096 	default:
3097 		rte_flow_error_set(error, EINVAL,
3098 				   RTE_FLOW_ERROR_TYPE_ACTION, act,
3099 				   "Invalid action.");
3100 		return -rte_errno;
3101 	}
3102 
3103 	/* Check if the next non-void item is MARK or FLAG or END. */
3104 	index++;
3105 	NEXT_ITEM_OF_ACTION(act, actions, index);
3106 	switch (act->type) {
3107 	case RTE_FLOW_ACTION_TYPE_MARK:
3108 		if (mark_spec) {
3109 			/* Double MARK actions requested */
3110 			rte_flow_error_set(error, EINVAL,
3111 			   RTE_FLOW_ERROR_TYPE_ACTION, act,
3112 			   "Invalid action.");
3113 			return -rte_errno;
3114 		}
3115 		mark_spec = act->conf;
3116 		filter->action.report_status = I40E_FDIR_REPORT_ID;
3117 		filter->soft_id = mark_spec->id;
3118 		break;
3119 	case RTE_FLOW_ACTION_TYPE_FLAG:
3120 		if (mark_spec) {
3121 			/* MARK + FLAG not supported */
3122 			rte_flow_error_set(error, EINVAL,
3123 					   RTE_FLOW_ERROR_TYPE_ACTION, act,
3124 					   "Invalid action.");
3125 			return -rte_errno;
3126 		}
3127 		filter->action.report_status = I40E_FDIR_NO_REPORT_STATUS;
3128 		break;
3129 	case RTE_FLOW_ACTION_TYPE_RSS:
3130 		if (filter->action.behavior != I40E_FDIR_PASSTHRU) {
3131 			/* RSS filter won't be next if FDIR did not pass thru */
3132 			rte_flow_error_set(error, EINVAL,
3133 					   RTE_FLOW_ERROR_TYPE_ACTION, act,
3134 					   "Invalid action.");
3135 			return -rte_errno;
3136 		}
3137 		break;
3138 	case RTE_FLOW_ACTION_TYPE_END:
3139 		return 0;
3140 	default:
3141 		rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION,
3142 				   act, "Invalid action.");
3143 		return -rte_errno;
3144 	}
3145 
3146 	/* Check if the next non-void item is END */
3147 	index++;
3148 	NEXT_ITEM_OF_ACTION(act, actions, index);
3149 	if (act->type != RTE_FLOW_ACTION_TYPE_END) {
3150 		rte_flow_error_set(error, EINVAL,
3151 				   RTE_FLOW_ERROR_TYPE_ACTION,
3152 				   act, "Invalid action.");
3153 		return -rte_errno;
3154 	}
3155 
3156 	return 0;
3157 }
3158 
3159 static int
3160 i40e_flow_parse_fdir_filter(struct rte_eth_dev *dev,
3161 			    const struct rte_flow_attr *attr,
3162 			    const struct rte_flow_item pattern[],
3163 			    const struct rte_flow_action actions[],
3164 			    struct rte_flow_error *error,
3165 			    union i40e_filter_t *filter)
3166 {
3167 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
3168 	struct i40e_fdir_filter_conf *fdir_filter =
3169 		&filter->fdir_filter;
3170 	int ret;
3171 
3172 	ret = i40e_flow_parse_fdir_pattern(dev, attr, pattern, error,
3173 					   fdir_filter);
3174 	if (ret)
3175 		return ret;
3176 
3177 	ret = i40e_flow_parse_fdir_action(dev, actions, error, fdir_filter);
3178 	if (ret)
3179 		return ret;
3180 
3181 	ret = i40e_flow_parse_attr(attr, error);
3182 	if (ret)
3183 		return ret;
3184 
3185 	cons_filter_type = RTE_ETH_FILTER_FDIR;
3186 
3187 	if (dev->data->dev_conf.fdir_conf.mode != RTE_FDIR_MODE_PERFECT ||
3188 		pf->fdir.fdir_vsi == NULL) {
3189 		/* Enable fdir when fdir flow is added at first time. */
3190 		ret = i40e_fdir_setup(pf);
3191 		if (ret != I40E_SUCCESS) {
3192 			rte_flow_error_set(error, ENOTSUP,
3193 					   RTE_FLOW_ERROR_TYPE_HANDLE,
3194 					   NULL, "Failed to setup fdir.");
3195 			return -rte_errno;
3196 		}
3197 		ret = i40e_fdir_configure(dev);
3198 		if (ret < 0) {
3199 			rte_flow_error_set(error, ENOTSUP,
3200 					   RTE_FLOW_ERROR_TYPE_HANDLE,
3201 					   NULL, "Failed to configure fdir.");
3202 			goto err;
3203 		}
3204 
3205 		dev->data->dev_conf.fdir_conf.mode = RTE_FDIR_MODE_PERFECT;
3206 	}
3207 
3208 	return 0;
3209 err:
3210 	i40e_fdir_teardown(pf);
3211 	return -rte_errno;
3212 }
3213 
3214 /* Parse to get the action info of a tunnel filter
3215  * Tunnel action only supports PF, VF and QUEUE.
3216  */
3217 static int
3218 i40e_flow_parse_tunnel_action(struct rte_eth_dev *dev,
3219 			      const struct rte_flow_action *actions,
3220 			      struct rte_flow_error *error,
3221 			      struct i40e_tunnel_filter_conf *filter)
3222 {
3223 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
3224 	const struct rte_flow_action *act;
3225 	const struct rte_flow_action_queue *act_q;
3226 	const struct rte_flow_action_vf *act_vf;
3227 	uint32_t index = 0;
3228 
3229 	/* Check if the first non-void action is PF or VF. */
3230 	NEXT_ITEM_OF_ACTION(act, actions, index);
3231 	if (act->type != RTE_FLOW_ACTION_TYPE_PF &&
3232 	    act->type != RTE_FLOW_ACTION_TYPE_VF) {
3233 		rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION,
3234 				   act, "Not supported action.");
3235 		return -rte_errno;
3236 	}
3237 
3238 	if (act->type == RTE_FLOW_ACTION_TYPE_VF) {
3239 		act_vf = act->conf;
3240 		filter->vf_id = act_vf->id;
3241 		filter->is_to_vf = 1;
3242 		if (filter->vf_id >= pf->vf_num) {
3243 			rte_flow_error_set(error, EINVAL,
3244 				   RTE_FLOW_ERROR_TYPE_ACTION,
3245 				   act, "Invalid VF ID for tunnel filter");
3246 			return -rte_errno;
3247 		}
3248 	}
3249 
3250 	/* Check if the next non-void item is QUEUE */
3251 	index++;
3252 	NEXT_ITEM_OF_ACTION(act, actions, index);
3253 	if (act->type == RTE_FLOW_ACTION_TYPE_QUEUE) {
3254 		act_q = act->conf;
3255 		filter->queue_id = act_q->index;
3256 		if ((!filter->is_to_vf) &&
3257 		    (filter->queue_id >= pf->dev_data->nb_rx_queues)) {
3258 			rte_flow_error_set(error, EINVAL,
3259 				   RTE_FLOW_ERROR_TYPE_ACTION,
3260 				   act, "Invalid queue ID for tunnel filter");
3261 			return -rte_errno;
3262 		} else if (filter->is_to_vf &&
3263 			   (filter->queue_id >= pf->vf_nb_qps)) {
3264 			rte_flow_error_set(error, EINVAL,
3265 				   RTE_FLOW_ERROR_TYPE_ACTION,
3266 				   act, "Invalid queue ID for tunnel filter");
3267 			return -rte_errno;
3268 		}
3269 	}
3270 
3271 	/* Check if the next non-void item is END */
3272 	index++;
3273 	NEXT_ITEM_OF_ACTION(act, actions, index);
3274 	if (act->type != RTE_FLOW_ACTION_TYPE_END) {
3275 		rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION,
3276 				   act, "Not supported action.");
3277 		return -rte_errno;
3278 	}
3279 
3280 	return 0;
3281 }
3282 
3283 static uint16_t i40e_supported_tunnel_filter_types[] = {
3284 	ETH_TUNNEL_FILTER_IMAC | ETH_TUNNEL_FILTER_TENID |
3285 	ETH_TUNNEL_FILTER_IVLAN,
3286 	ETH_TUNNEL_FILTER_IMAC | ETH_TUNNEL_FILTER_IVLAN,
3287 	ETH_TUNNEL_FILTER_IMAC | ETH_TUNNEL_FILTER_TENID,
3288 	ETH_TUNNEL_FILTER_OMAC | ETH_TUNNEL_FILTER_TENID |
3289 	ETH_TUNNEL_FILTER_IMAC,
3290 	ETH_TUNNEL_FILTER_IMAC,
3291 };
3292 
3293 static int
3294 i40e_check_tunnel_filter_type(uint8_t filter_type)
3295 {
3296 	uint8_t i;
3297 
3298 	for (i = 0; i < RTE_DIM(i40e_supported_tunnel_filter_types); i++) {
3299 		if (filter_type == i40e_supported_tunnel_filter_types[i])
3300 			return 0;
3301 	}
3302 
3303 	return -1;
3304 }
3305 
3306 /* 1. Last in item should be NULL as range is not supported.
3307  * 2. Supported filter types: IMAC_IVLAN_TENID, IMAC_IVLAN,
3308  *    IMAC_TENID, OMAC_TENID_IMAC and IMAC.
3309  * 3. Mask of fields which need to be matched should be
3310  *    filled with 1.
3311  * 4. Mask of fields which needn't to be matched should be
3312  *    filled with 0.
3313  */
3314 static int
3315 i40e_flow_parse_vxlan_pattern(__rte_unused struct rte_eth_dev *dev,
3316 			      const struct rte_flow_item *pattern,
3317 			      struct rte_flow_error *error,
3318 			      struct i40e_tunnel_filter_conf *filter)
3319 {
3320 	const struct rte_flow_item *item = pattern;
3321 	const struct rte_flow_item_eth *eth_spec;
3322 	const struct rte_flow_item_eth *eth_mask;
3323 	const struct rte_flow_item_vxlan *vxlan_spec;
3324 	const struct rte_flow_item_vxlan *vxlan_mask;
3325 	const struct rte_flow_item_vlan *vlan_spec;
3326 	const struct rte_flow_item_vlan *vlan_mask;
3327 	uint8_t filter_type = 0;
3328 	bool is_vni_masked = 0;
3329 	uint8_t vni_mask[] = {0xFF, 0xFF, 0xFF};
3330 	enum rte_flow_item_type item_type;
3331 	bool vxlan_flag = 0;
3332 	uint32_t tenant_id_be = 0;
3333 	int ret;
3334 
3335 	for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
3336 		if (item->last) {
3337 			rte_flow_error_set(error, EINVAL,
3338 					   RTE_FLOW_ERROR_TYPE_ITEM,
3339 					   item,
3340 					   "Not support range");
3341 			return -rte_errno;
3342 		}
3343 		item_type = item->type;
3344 		switch (item_type) {
3345 		case RTE_FLOW_ITEM_TYPE_ETH:
3346 			eth_spec = item->spec;
3347 			eth_mask = item->mask;
3348 
3349 			/* Check if ETH item is used for place holder.
3350 			 * If yes, both spec and mask should be NULL.
3351 			 * If no, both spec and mask shouldn't be NULL.
3352 			 */
3353 			if ((!eth_spec && eth_mask) ||
3354 			    (eth_spec && !eth_mask)) {
3355 				rte_flow_error_set(error, EINVAL,
3356 						   RTE_FLOW_ERROR_TYPE_ITEM,
3357 						   item,
3358 						   "Invalid ether spec/mask");
3359 				return -rte_errno;
3360 			}
3361 
3362 			if (eth_spec && eth_mask) {
3363 				/* DST address of inner MAC shouldn't be masked.
3364 				 * SRC address of Inner MAC should be masked.
3365 				 */
3366 				if (!rte_is_broadcast_ether_addr(&eth_mask->dst) ||
3367 				    !rte_is_zero_ether_addr(&eth_mask->src) ||
3368 				    eth_mask->type) {
3369 					rte_flow_error_set(error, EINVAL,
3370 						   RTE_FLOW_ERROR_TYPE_ITEM,
3371 						   item,
3372 						   "Invalid ether spec/mask");
3373 					return -rte_errno;
3374 				}
3375 
3376 				if (!vxlan_flag) {
3377 					rte_memcpy(&filter->outer_mac,
3378 						   &eth_spec->dst,
3379 						   RTE_ETHER_ADDR_LEN);
3380 					filter_type |= ETH_TUNNEL_FILTER_OMAC;
3381 				} else {
3382 					rte_memcpy(&filter->inner_mac,
3383 						   &eth_spec->dst,
3384 						   RTE_ETHER_ADDR_LEN);
3385 					filter_type |= ETH_TUNNEL_FILTER_IMAC;
3386 				}
3387 			}
3388 			break;
3389 		case RTE_FLOW_ITEM_TYPE_VLAN:
3390 			vlan_spec = item->spec;
3391 			vlan_mask = item->mask;
3392 			if (!(vlan_spec && vlan_mask) ||
3393 			    vlan_mask->inner_type) {
3394 				rte_flow_error_set(error, EINVAL,
3395 						   RTE_FLOW_ERROR_TYPE_ITEM,
3396 						   item,
3397 						   "Invalid vlan item");
3398 				return -rte_errno;
3399 			}
3400 
3401 			if (vlan_spec && vlan_mask) {
3402 				if (vlan_mask->tci ==
3403 				    rte_cpu_to_be_16(I40E_TCI_MASK))
3404 					filter->inner_vlan =
3405 					      rte_be_to_cpu_16(vlan_spec->tci) &
3406 					      I40E_TCI_MASK;
3407 				filter_type |= ETH_TUNNEL_FILTER_IVLAN;
3408 			}
3409 			break;
3410 		case RTE_FLOW_ITEM_TYPE_IPV4:
3411 			filter->ip_type = I40E_TUNNEL_IPTYPE_IPV4;
3412 			/* IPv4 is used to describe protocol,
3413 			 * spec and mask should be NULL.
3414 			 */
3415 			if (item->spec || item->mask) {
3416 				rte_flow_error_set(error, EINVAL,
3417 						   RTE_FLOW_ERROR_TYPE_ITEM,
3418 						   item,
3419 						   "Invalid IPv4 item");
3420 				return -rte_errno;
3421 			}
3422 			break;
3423 		case RTE_FLOW_ITEM_TYPE_IPV6:
3424 			filter->ip_type = I40E_TUNNEL_IPTYPE_IPV6;
3425 			/* IPv6 is used to describe protocol,
3426 			 * spec and mask should be NULL.
3427 			 */
3428 			if (item->spec || item->mask) {
3429 				rte_flow_error_set(error, EINVAL,
3430 						   RTE_FLOW_ERROR_TYPE_ITEM,
3431 						   item,
3432 						   "Invalid IPv6 item");
3433 				return -rte_errno;
3434 			}
3435 			break;
3436 		case RTE_FLOW_ITEM_TYPE_UDP:
3437 			/* UDP is used to describe protocol,
3438 			 * spec and mask should be NULL.
3439 			 */
3440 			if (item->spec || item->mask) {
3441 				rte_flow_error_set(error, EINVAL,
3442 					   RTE_FLOW_ERROR_TYPE_ITEM,
3443 					   item,
3444 					   "Invalid UDP item");
3445 				return -rte_errno;
3446 			}
3447 			break;
3448 		case RTE_FLOW_ITEM_TYPE_VXLAN:
3449 			vxlan_spec = item->spec;
3450 			vxlan_mask = item->mask;
3451 			/* Check if VXLAN item is used to describe protocol.
3452 			 * If yes, both spec and mask should be NULL.
3453 			 * If no, both spec and mask shouldn't be NULL.
3454 			 */
3455 			if ((!vxlan_spec && vxlan_mask) ||
3456 			    (vxlan_spec && !vxlan_mask)) {
3457 				rte_flow_error_set(error, EINVAL,
3458 					   RTE_FLOW_ERROR_TYPE_ITEM,
3459 					   item,
3460 					   "Invalid VXLAN item");
3461 				return -rte_errno;
3462 			}
3463 
3464 			/* Check if VNI is masked. */
3465 			if (vxlan_spec && vxlan_mask) {
3466 				is_vni_masked =
3467 					!!memcmp(vxlan_mask->vni, vni_mask,
3468 						 RTE_DIM(vni_mask));
3469 				if (is_vni_masked) {
3470 					rte_flow_error_set(error, EINVAL,
3471 						   RTE_FLOW_ERROR_TYPE_ITEM,
3472 						   item,
3473 						   "Invalid VNI mask");
3474 					return -rte_errno;
3475 				}
3476 
3477 				rte_memcpy(((uint8_t *)&tenant_id_be + 1),
3478 					   vxlan_spec->vni, 3);
3479 				filter->tenant_id =
3480 					rte_be_to_cpu_32(tenant_id_be);
3481 				filter_type |= ETH_TUNNEL_FILTER_TENID;
3482 			}
3483 
3484 			vxlan_flag = 1;
3485 			break;
3486 		default:
3487 			break;
3488 		}
3489 	}
3490 
3491 	ret = i40e_check_tunnel_filter_type(filter_type);
3492 	if (ret < 0) {
3493 		rte_flow_error_set(error, EINVAL,
3494 				   RTE_FLOW_ERROR_TYPE_ITEM,
3495 				   NULL,
3496 				   "Invalid filter type");
3497 		return -rte_errno;
3498 	}
3499 	filter->filter_type = filter_type;
3500 
3501 	filter->tunnel_type = I40E_TUNNEL_TYPE_VXLAN;
3502 
3503 	return 0;
3504 }
3505 
3506 static int
3507 i40e_flow_parse_vxlan_filter(struct rte_eth_dev *dev,
3508 			     const struct rte_flow_attr *attr,
3509 			     const struct rte_flow_item pattern[],
3510 			     const struct rte_flow_action actions[],
3511 			     struct rte_flow_error *error,
3512 			     union i40e_filter_t *filter)
3513 {
3514 	struct i40e_tunnel_filter_conf *tunnel_filter =
3515 		&filter->consistent_tunnel_filter;
3516 	int ret;
3517 
3518 	ret = i40e_flow_parse_vxlan_pattern(dev, pattern,
3519 					    error, tunnel_filter);
3520 	if (ret)
3521 		return ret;
3522 
3523 	ret = i40e_flow_parse_tunnel_action(dev, actions, error, tunnel_filter);
3524 	if (ret)
3525 		return ret;
3526 
3527 	ret = i40e_flow_parse_attr(attr, error);
3528 	if (ret)
3529 		return ret;
3530 
3531 	cons_filter_type = RTE_ETH_FILTER_TUNNEL;
3532 
3533 	return ret;
3534 }
3535 
3536 /* 1. Last in item should be NULL as range is not supported.
3537  * 2. Supported filter types: IMAC_IVLAN_TENID, IMAC_IVLAN,
3538  *    IMAC_TENID, OMAC_TENID_IMAC and IMAC.
3539  * 3. Mask of fields which need to be matched should be
3540  *    filled with 1.
3541  * 4. Mask of fields which needn't to be matched should be
3542  *    filled with 0.
3543  */
3544 static int
3545 i40e_flow_parse_nvgre_pattern(__rte_unused struct rte_eth_dev *dev,
3546 			      const struct rte_flow_item *pattern,
3547 			      struct rte_flow_error *error,
3548 			      struct i40e_tunnel_filter_conf *filter)
3549 {
3550 	const struct rte_flow_item *item = pattern;
3551 	const struct rte_flow_item_eth *eth_spec;
3552 	const struct rte_flow_item_eth *eth_mask;
3553 	const struct rte_flow_item_nvgre *nvgre_spec;
3554 	const struct rte_flow_item_nvgre *nvgre_mask;
3555 	const struct rte_flow_item_vlan *vlan_spec;
3556 	const struct rte_flow_item_vlan *vlan_mask;
3557 	enum rte_flow_item_type item_type;
3558 	uint8_t filter_type = 0;
3559 	bool is_tni_masked = 0;
3560 	uint8_t tni_mask[] = {0xFF, 0xFF, 0xFF};
3561 	bool nvgre_flag = 0;
3562 	uint32_t tenant_id_be = 0;
3563 	int ret;
3564 
3565 	for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
3566 		if (item->last) {
3567 			rte_flow_error_set(error, EINVAL,
3568 					   RTE_FLOW_ERROR_TYPE_ITEM,
3569 					   item,
3570 					   "Not support range");
3571 			return -rte_errno;
3572 		}
3573 		item_type = item->type;
3574 		switch (item_type) {
3575 		case RTE_FLOW_ITEM_TYPE_ETH:
3576 			eth_spec = item->spec;
3577 			eth_mask = item->mask;
3578 
3579 			/* Check if ETH item is used for place holder.
3580 			 * If yes, both spec and mask should be NULL.
3581 			 * If no, both spec and mask shouldn't be NULL.
3582 			 */
3583 			if ((!eth_spec && eth_mask) ||
3584 			    (eth_spec && !eth_mask)) {
3585 				rte_flow_error_set(error, EINVAL,
3586 						   RTE_FLOW_ERROR_TYPE_ITEM,
3587 						   item,
3588 						   "Invalid ether spec/mask");
3589 				return -rte_errno;
3590 			}
3591 
3592 			if (eth_spec && eth_mask) {
3593 				/* DST address of inner MAC shouldn't be masked.
3594 				 * SRC address of Inner MAC should be masked.
3595 				 */
3596 				if (!rte_is_broadcast_ether_addr(&eth_mask->dst) ||
3597 				    !rte_is_zero_ether_addr(&eth_mask->src) ||
3598 				    eth_mask->type) {
3599 					rte_flow_error_set(error, EINVAL,
3600 						   RTE_FLOW_ERROR_TYPE_ITEM,
3601 						   item,
3602 						   "Invalid ether spec/mask");
3603 					return -rte_errno;
3604 				}
3605 
3606 				if (!nvgre_flag) {
3607 					rte_memcpy(&filter->outer_mac,
3608 						   &eth_spec->dst,
3609 						   RTE_ETHER_ADDR_LEN);
3610 					filter_type |= ETH_TUNNEL_FILTER_OMAC;
3611 				} else {
3612 					rte_memcpy(&filter->inner_mac,
3613 						   &eth_spec->dst,
3614 						   RTE_ETHER_ADDR_LEN);
3615 					filter_type |= ETH_TUNNEL_FILTER_IMAC;
3616 				}
3617 			}
3618 
3619 			break;
3620 		case RTE_FLOW_ITEM_TYPE_VLAN:
3621 			vlan_spec = item->spec;
3622 			vlan_mask = item->mask;
3623 			if (!(vlan_spec && vlan_mask) ||
3624 			    vlan_mask->inner_type) {
3625 				rte_flow_error_set(error, EINVAL,
3626 						   RTE_FLOW_ERROR_TYPE_ITEM,
3627 						   item,
3628 						   "Invalid vlan item");
3629 				return -rte_errno;
3630 			}
3631 
3632 			if (vlan_spec && vlan_mask) {
3633 				if (vlan_mask->tci ==
3634 				    rte_cpu_to_be_16(I40E_TCI_MASK))
3635 					filter->inner_vlan =
3636 					      rte_be_to_cpu_16(vlan_spec->tci) &
3637 					      I40E_TCI_MASK;
3638 				filter_type |= ETH_TUNNEL_FILTER_IVLAN;
3639 			}
3640 			break;
3641 		case RTE_FLOW_ITEM_TYPE_IPV4:
3642 			filter->ip_type = I40E_TUNNEL_IPTYPE_IPV4;
3643 			/* IPv4 is used to describe protocol,
3644 			 * spec and mask should be NULL.
3645 			 */
3646 			if (item->spec || item->mask) {
3647 				rte_flow_error_set(error, EINVAL,
3648 						   RTE_FLOW_ERROR_TYPE_ITEM,
3649 						   item,
3650 						   "Invalid IPv4 item");
3651 				return -rte_errno;
3652 			}
3653 			break;
3654 		case RTE_FLOW_ITEM_TYPE_IPV6:
3655 			filter->ip_type = I40E_TUNNEL_IPTYPE_IPV6;
3656 			/* IPv6 is used to describe protocol,
3657 			 * spec and mask should be NULL.
3658 			 */
3659 			if (item->spec || item->mask) {
3660 				rte_flow_error_set(error, EINVAL,
3661 						   RTE_FLOW_ERROR_TYPE_ITEM,
3662 						   item,
3663 						   "Invalid IPv6 item");
3664 				return -rte_errno;
3665 			}
3666 			break;
3667 		case RTE_FLOW_ITEM_TYPE_NVGRE:
3668 			nvgre_spec = item->spec;
3669 			nvgre_mask = item->mask;
3670 			/* Check if NVGRE item is used to describe protocol.
3671 			 * If yes, both spec and mask should be NULL.
3672 			 * If no, both spec and mask shouldn't be NULL.
3673 			 */
3674 			if ((!nvgre_spec && nvgre_mask) ||
3675 			    (nvgre_spec && !nvgre_mask)) {
3676 				rte_flow_error_set(error, EINVAL,
3677 					   RTE_FLOW_ERROR_TYPE_ITEM,
3678 					   item,
3679 					   "Invalid NVGRE item");
3680 				return -rte_errno;
3681 			}
3682 
3683 			if (nvgre_spec && nvgre_mask) {
3684 				is_tni_masked =
3685 					!!memcmp(nvgre_mask->tni, tni_mask,
3686 						 RTE_DIM(tni_mask));
3687 				if (is_tni_masked) {
3688 					rte_flow_error_set(error, EINVAL,
3689 						       RTE_FLOW_ERROR_TYPE_ITEM,
3690 						       item,
3691 						       "Invalid TNI mask");
3692 					return -rte_errno;
3693 				}
3694 				if (nvgre_mask->protocol &&
3695 					nvgre_mask->protocol != 0xFFFF) {
3696 					rte_flow_error_set(error, EINVAL,
3697 						RTE_FLOW_ERROR_TYPE_ITEM,
3698 						item,
3699 						"Invalid NVGRE item");
3700 					return -rte_errno;
3701 				}
3702 				if (nvgre_mask->c_k_s_rsvd0_ver &&
3703 					nvgre_mask->c_k_s_rsvd0_ver !=
3704 					rte_cpu_to_be_16(0xFFFF)) {
3705 					rte_flow_error_set(error, EINVAL,
3706 						   RTE_FLOW_ERROR_TYPE_ITEM,
3707 						   item,
3708 						   "Invalid NVGRE item");
3709 					return -rte_errno;
3710 				}
3711 				if (nvgre_spec->c_k_s_rsvd0_ver !=
3712 					rte_cpu_to_be_16(0x2000) &&
3713 					nvgre_mask->c_k_s_rsvd0_ver) {
3714 					rte_flow_error_set(error, EINVAL,
3715 						   RTE_FLOW_ERROR_TYPE_ITEM,
3716 						   item,
3717 						   "Invalid NVGRE item");
3718 					return -rte_errno;
3719 				}
3720 				if (nvgre_mask->protocol &&
3721 					nvgre_spec->protocol !=
3722 					rte_cpu_to_be_16(0x6558)) {
3723 					rte_flow_error_set(error, EINVAL,
3724 						   RTE_FLOW_ERROR_TYPE_ITEM,
3725 						   item,
3726 						   "Invalid NVGRE item");
3727 					return -rte_errno;
3728 				}
3729 				rte_memcpy(((uint8_t *)&tenant_id_be + 1),
3730 					   nvgre_spec->tni, 3);
3731 				filter->tenant_id =
3732 					rte_be_to_cpu_32(tenant_id_be);
3733 				filter_type |= ETH_TUNNEL_FILTER_TENID;
3734 			}
3735 
3736 			nvgre_flag = 1;
3737 			break;
3738 		default:
3739 			break;
3740 		}
3741 	}
3742 
3743 	ret = i40e_check_tunnel_filter_type(filter_type);
3744 	if (ret < 0) {
3745 		rte_flow_error_set(error, EINVAL,
3746 				   RTE_FLOW_ERROR_TYPE_ITEM,
3747 				   NULL,
3748 				   "Invalid filter type");
3749 		return -rte_errno;
3750 	}
3751 	filter->filter_type = filter_type;
3752 
3753 	filter->tunnel_type = I40E_TUNNEL_TYPE_NVGRE;
3754 
3755 	return 0;
3756 }
3757 
3758 static int
3759 i40e_flow_parse_nvgre_filter(struct rte_eth_dev *dev,
3760 			     const struct rte_flow_attr *attr,
3761 			     const struct rte_flow_item pattern[],
3762 			     const struct rte_flow_action actions[],
3763 			     struct rte_flow_error *error,
3764 			     union i40e_filter_t *filter)
3765 {
3766 	struct i40e_tunnel_filter_conf *tunnel_filter =
3767 		&filter->consistent_tunnel_filter;
3768 	int ret;
3769 
3770 	ret = i40e_flow_parse_nvgre_pattern(dev, pattern,
3771 					    error, tunnel_filter);
3772 	if (ret)
3773 		return ret;
3774 
3775 	ret = i40e_flow_parse_tunnel_action(dev, actions, error, tunnel_filter);
3776 	if (ret)
3777 		return ret;
3778 
3779 	ret = i40e_flow_parse_attr(attr, error);
3780 	if (ret)
3781 		return ret;
3782 
3783 	cons_filter_type = RTE_ETH_FILTER_TUNNEL;
3784 
3785 	return ret;
3786 }
3787 
3788 /* 1. Last in item should be NULL as range is not supported.
3789  * 2. Supported filter types: MPLS label.
3790  * 3. Mask of fields which need to be matched should be
3791  *    filled with 1.
3792  * 4. Mask of fields which needn't to be matched should be
3793  *    filled with 0.
3794  */
3795 static int
3796 i40e_flow_parse_mpls_pattern(__rte_unused struct rte_eth_dev *dev,
3797 			     const struct rte_flow_item *pattern,
3798 			     struct rte_flow_error *error,
3799 			     struct i40e_tunnel_filter_conf *filter)
3800 {
3801 	const struct rte_flow_item *item = pattern;
3802 	const struct rte_flow_item_mpls *mpls_spec;
3803 	const struct rte_flow_item_mpls *mpls_mask;
3804 	enum rte_flow_item_type item_type;
3805 	bool is_mplsoudp = 0; /* 1 - MPLSoUDP, 0 - MPLSoGRE */
3806 	const uint8_t label_mask[3] = {0xFF, 0xFF, 0xF0};
3807 	uint32_t label_be = 0;
3808 
3809 	for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
3810 		if (item->last) {
3811 			rte_flow_error_set(error, EINVAL,
3812 					   RTE_FLOW_ERROR_TYPE_ITEM,
3813 					   item,
3814 					   "Not support range");
3815 			return -rte_errno;
3816 		}
3817 		item_type = item->type;
3818 		switch (item_type) {
3819 		case RTE_FLOW_ITEM_TYPE_ETH:
3820 			if (item->spec || item->mask) {
3821 				rte_flow_error_set(error, EINVAL,
3822 						   RTE_FLOW_ERROR_TYPE_ITEM,
3823 						   item,
3824 						   "Invalid ETH item");
3825 				return -rte_errno;
3826 			}
3827 			break;
3828 		case RTE_FLOW_ITEM_TYPE_IPV4:
3829 			filter->ip_type = I40E_TUNNEL_IPTYPE_IPV4;
3830 			/* IPv4 is used to describe protocol,
3831 			 * spec and mask should be NULL.
3832 			 */
3833 			if (item->spec || item->mask) {
3834 				rte_flow_error_set(error, EINVAL,
3835 						   RTE_FLOW_ERROR_TYPE_ITEM,
3836 						   item,
3837 						   "Invalid IPv4 item");
3838 				return -rte_errno;
3839 			}
3840 			break;
3841 		case RTE_FLOW_ITEM_TYPE_IPV6:
3842 			filter->ip_type = I40E_TUNNEL_IPTYPE_IPV6;
3843 			/* IPv6 is used to describe protocol,
3844 			 * spec and mask should be NULL.
3845 			 */
3846 			if (item->spec || item->mask) {
3847 				rte_flow_error_set(error, EINVAL,
3848 						   RTE_FLOW_ERROR_TYPE_ITEM,
3849 						   item,
3850 						   "Invalid IPv6 item");
3851 				return -rte_errno;
3852 			}
3853 			break;
3854 		case RTE_FLOW_ITEM_TYPE_UDP:
3855 			/* UDP is used to describe protocol,
3856 			 * spec and mask should be NULL.
3857 			 */
3858 			if (item->spec || item->mask) {
3859 				rte_flow_error_set(error, EINVAL,
3860 						   RTE_FLOW_ERROR_TYPE_ITEM,
3861 						   item,
3862 						   "Invalid UDP item");
3863 				return -rte_errno;
3864 			}
3865 			is_mplsoudp = 1;
3866 			break;
3867 		case RTE_FLOW_ITEM_TYPE_GRE:
3868 			/* GRE is used to describe protocol,
3869 			 * spec and mask should be NULL.
3870 			 */
3871 			if (item->spec || item->mask) {
3872 				rte_flow_error_set(error, EINVAL,
3873 						   RTE_FLOW_ERROR_TYPE_ITEM,
3874 						   item,
3875 						   "Invalid GRE item");
3876 				return -rte_errno;
3877 			}
3878 			break;
3879 		case RTE_FLOW_ITEM_TYPE_MPLS:
3880 			mpls_spec = item->spec;
3881 			mpls_mask = item->mask;
3882 
3883 			if (!mpls_spec || !mpls_mask) {
3884 				rte_flow_error_set(error, EINVAL,
3885 						   RTE_FLOW_ERROR_TYPE_ITEM,
3886 						   item,
3887 						   "Invalid MPLS item");
3888 				return -rte_errno;
3889 			}
3890 
3891 			if (memcmp(mpls_mask->label_tc_s, label_mask, 3)) {
3892 				rte_flow_error_set(error, EINVAL,
3893 						   RTE_FLOW_ERROR_TYPE_ITEM,
3894 						   item,
3895 						   "Invalid MPLS label mask");
3896 				return -rte_errno;
3897 			}
3898 			rte_memcpy(((uint8_t *)&label_be + 1),
3899 				   mpls_spec->label_tc_s, 3);
3900 			filter->tenant_id = rte_be_to_cpu_32(label_be) >> 4;
3901 			break;
3902 		default:
3903 			break;
3904 		}
3905 	}
3906 
3907 	if (is_mplsoudp)
3908 		filter->tunnel_type = I40E_TUNNEL_TYPE_MPLSoUDP;
3909 	else
3910 		filter->tunnel_type = I40E_TUNNEL_TYPE_MPLSoGRE;
3911 
3912 	return 0;
3913 }
3914 
3915 static int
3916 i40e_flow_parse_mpls_filter(struct rte_eth_dev *dev,
3917 			    const struct rte_flow_attr *attr,
3918 			    const struct rte_flow_item pattern[],
3919 			    const struct rte_flow_action actions[],
3920 			    struct rte_flow_error *error,
3921 			    union i40e_filter_t *filter)
3922 {
3923 	struct i40e_tunnel_filter_conf *tunnel_filter =
3924 		&filter->consistent_tunnel_filter;
3925 	int ret;
3926 
3927 	ret = i40e_flow_parse_mpls_pattern(dev, pattern,
3928 					   error, tunnel_filter);
3929 	if (ret)
3930 		return ret;
3931 
3932 	ret = i40e_flow_parse_tunnel_action(dev, actions, error, tunnel_filter);
3933 	if (ret)
3934 		return ret;
3935 
3936 	ret = i40e_flow_parse_attr(attr, error);
3937 	if (ret)
3938 		return ret;
3939 
3940 	cons_filter_type = RTE_ETH_FILTER_TUNNEL;
3941 
3942 	return ret;
3943 }
3944 
3945 /* 1. Last in item should be NULL as range is not supported.
3946  * 2. Supported filter types: GTP TEID.
3947  * 3. Mask of fields which need to be matched should be
3948  *    filled with 1.
3949  * 4. Mask of fields which needn't to be matched should be
3950  *    filled with 0.
3951  * 5. GTP profile supports GTPv1 only.
3952  * 6. GTP-C response message ('source_port' = 2123) is not supported.
3953  */
3954 static int
3955 i40e_flow_parse_gtp_pattern(struct rte_eth_dev *dev,
3956 			    const struct rte_flow_item *pattern,
3957 			    struct rte_flow_error *error,
3958 			    struct i40e_tunnel_filter_conf *filter)
3959 {
3960 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
3961 	const struct rte_flow_item *item = pattern;
3962 	const struct rte_flow_item_gtp *gtp_spec;
3963 	const struct rte_flow_item_gtp *gtp_mask;
3964 	enum rte_flow_item_type item_type;
3965 
3966 	if (!pf->gtp_support) {
3967 		rte_flow_error_set(error, EINVAL,
3968 				   RTE_FLOW_ERROR_TYPE_ITEM,
3969 				   item,
3970 				   "GTP is not supported by default.");
3971 		return -rte_errno;
3972 	}
3973 
3974 	for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
3975 		if (item->last) {
3976 			rte_flow_error_set(error, EINVAL,
3977 					   RTE_FLOW_ERROR_TYPE_ITEM,
3978 					   item,
3979 					   "Not support range");
3980 			return -rte_errno;
3981 		}
3982 		item_type = item->type;
3983 		switch (item_type) {
3984 		case RTE_FLOW_ITEM_TYPE_ETH:
3985 			if (item->spec || item->mask) {
3986 				rte_flow_error_set(error, EINVAL,
3987 						   RTE_FLOW_ERROR_TYPE_ITEM,
3988 						   item,
3989 						   "Invalid ETH item");
3990 				return -rte_errno;
3991 			}
3992 			break;
3993 		case RTE_FLOW_ITEM_TYPE_IPV4:
3994 			filter->ip_type = I40E_TUNNEL_IPTYPE_IPV4;
3995 			/* IPv4 is used to describe protocol,
3996 			 * spec and mask should be NULL.
3997 			 */
3998 			if (item->spec || item->mask) {
3999 				rte_flow_error_set(error, EINVAL,
4000 						   RTE_FLOW_ERROR_TYPE_ITEM,
4001 						   item,
4002 						   "Invalid IPv4 item");
4003 				return -rte_errno;
4004 			}
4005 			break;
4006 		case RTE_FLOW_ITEM_TYPE_UDP:
4007 			if (item->spec || item->mask) {
4008 				rte_flow_error_set(error, EINVAL,
4009 						   RTE_FLOW_ERROR_TYPE_ITEM,
4010 						   item,
4011 						   "Invalid UDP item");
4012 				return -rte_errno;
4013 			}
4014 			break;
4015 		case RTE_FLOW_ITEM_TYPE_GTPC:
4016 		case RTE_FLOW_ITEM_TYPE_GTPU:
4017 			gtp_spec = item->spec;
4018 			gtp_mask = item->mask;
4019 
4020 			if (!gtp_spec || !gtp_mask) {
4021 				rte_flow_error_set(error, EINVAL,
4022 						   RTE_FLOW_ERROR_TYPE_ITEM,
4023 						   item,
4024 						   "Invalid GTP item");
4025 				return -rte_errno;
4026 			}
4027 
4028 			if (gtp_mask->v_pt_rsv_flags ||
4029 			    gtp_mask->msg_type ||
4030 			    gtp_mask->msg_len ||
4031 			    gtp_mask->teid != UINT32_MAX) {
4032 				rte_flow_error_set(error, EINVAL,
4033 						   RTE_FLOW_ERROR_TYPE_ITEM,
4034 						   item,
4035 						   "Invalid GTP mask");
4036 				return -rte_errno;
4037 			}
4038 
4039 			if (item_type == RTE_FLOW_ITEM_TYPE_GTPC)
4040 				filter->tunnel_type = I40E_TUNNEL_TYPE_GTPC;
4041 			else if (item_type == RTE_FLOW_ITEM_TYPE_GTPU)
4042 				filter->tunnel_type = I40E_TUNNEL_TYPE_GTPU;
4043 
4044 			filter->tenant_id = rte_be_to_cpu_32(gtp_spec->teid);
4045 
4046 			break;
4047 		default:
4048 			break;
4049 		}
4050 	}
4051 
4052 	return 0;
4053 }
4054 
4055 static int
4056 i40e_flow_parse_gtp_filter(struct rte_eth_dev *dev,
4057 			   const struct rte_flow_attr *attr,
4058 			   const struct rte_flow_item pattern[],
4059 			   const struct rte_flow_action actions[],
4060 			   struct rte_flow_error *error,
4061 			   union i40e_filter_t *filter)
4062 {
4063 	struct i40e_tunnel_filter_conf *tunnel_filter =
4064 		&filter->consistent_tunnel_filter;
4065 	int ret;
4066 
4067 	ret = i40e_flow_parse_gtp_pattern(dev, pattern,
4068 					  error, tunnel_filter);
4069 	if (ret)
4070 		return ret;
4071 
4072 	ret = i40e_flow_parse_tunnel_action(dev, actions, error, tunnel_filter);
4073 	if (ret)
4074 		return ret;
4075 
4076 	ret = i40e_flow_parse_attr(attr, error);
4077 	if (ret)
4078 		return ret;
4079 
4080 	cons_filter_type = RTE_ETH_FILTER_TUNNEL;
4081 
4082 	return ret;
4083 }
4084 
4085 /* 1. Last in item should be NULL as range is not supported.
4086  * 2. Supported filter types: QINQ.
4087  * 3. Mask of fields which need to be matched should be
4088  *    filled with 1.
4089  * 4. Mask of fields which needn't to be matched should be
4090  *    filled with 0.
4091  */
4092 static int
4093 i40e_flow_parse_qinq_pattern(__rte_unused struct rte_eth_dev *dev,
4094 			      const struct rte_flow_item *pattern,
4095 			      struct rte_flow_error *error,
4096 			      struct i40e_tunnel_filter_conf *filter)
4097 {
4098 	const struct rte_flow_item *item = pattern;
4099 	const struct rte_flow_item_vlan *vlan_spec = NULL;
4100 	const struct rte_flow_item_vlan *vlan_mask = NULL;
4101 	const struct rte_flow_item_vlan *i_vlan_spec = NULL;
4102 	const struct rte_flow_item_vlan *i_vlan_mask = NULL;
4103 	const struct rte_flow_item_vlan *o_vlan_spec = NULL;
4104 	const struct rte_flow_item_vlan *o_vlan_mask = NULL;
4105 
4106 	enum rte_flow_item_type item_type;
4107 	bool vlan_flag = 0;
4108 
4109 	for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
4110 		if (item->last) {
4111 			rte_flow_error_set(error, EINVAL,
4112 					   RTE_FLOW_ERROR_TYPE_ITEM,
4113 					   item,
4114 					   "Not support range");
4115 			return -rte_errno;
4116 		}
4117 		item_type = item->type;
4118 		switch (item_type) {
4119 		case RTE_FLOW_ITEM_TYPE_ETH:
4120 			if (item->spec || item->mask) {
4121 				rte_flow_error_set(error, EINVAL,
4122 						   RTE_FLOW_ERROR_TYPE_ITEM,
4123 						   item,
4124 						   "Invalid ETH item");
4125 				return -rte_errno;
4126 			}
4127 			break;
4128 		case RTE_FLOW_ITEM_TYPE_VLAN:
4129 			vlan_spec = item->spec;
4130 			vlan_mask = item->mask;
4131 
4132 			if (!(vlan_spec && vlan_mask) ||
4133 			    vlan_mask->inner_type) {
4134 				rte_flow_error_set(error, EINVAL,
4135 					   RTE_FLOW_ERROR_TYPE_ITEM,
4136 					   item,
4137 					   "Invalid vlan item");
4138 				return -rte_errno;
4139 			}
4140 
4141 			if (!vlan_flag) {
4142 				o_vlan_spec = vlan_spec;
4143 				o_vlan_mask = vlan_mask;
4144 				vlan_flag = 1;
4145 			} else {
4146 				i_vlan_spec = vlan_spec;
4147 				i_vlan_mask = vlan_mask;
4148 				vlan_flag = 0;
4149 			}
4150 			break;
4151 
4152 		default:
4153 			break;
4154 		}
4155 	}
4156 
4157 	/* Get filter specification */
4158 	if ((o_vlan_mask != NULL) && (o_vlan_mask->tci ==
4159 			rte_cpu_to_be_16(I40E_TCI_MASK)) &&
4160 			(i_vlan_mask != NULL) &&
4161 			(i_vlan_mask->tci == rte_cpu_to_be_16(I40E_TCI_MASK))) {
4162 		filter->outer_vlan = rte_be_to_cpu_16(o_vlan_spec->tci)
4163 			& I40E_TCI_MASK;
4164 		filter->inner_vlan = rte_be_to_cpu_16(i_vlan_spec->tci)
4165 			& I40E_TCI_MASK;
4166 	} else {
4167 			rte_flow_error_set(error, EINVAL,
4168 					   RTE_FLOW_ERROR_TYPE_ITEM,
4169 					   NULL,
4170 					   "Invalid filter type");
4171 			return -rte_errno;
4172 	}
4173 
4174 	filter->tunnel_type = I40E_TUNNEL_TYPE_QINQ;
4175 	return 0;
4176 }
4177 
4178 static int
4179 i40e_flow_parse_qinq_filter(struct rte_eth_dev *dev,
4180 			      const struct rte_flow_attr *attr,
4181 			      const struct rte_flow_item pattern[],
4182 			      const struct rte_flow_action actions[],
4183 			      struct rte_flow_error *error,
4184 			      union i40e_filter_t *filter)
4185 {
4186 	struct i40e_tunnel_filter_conf *tunnel_filter =
4187 		&filter->consistent_tunnel_filter;
4188 	int ret;
4189 
4190 	ret = i40e_flow_parse_qinq_pattern(dev, pattern,
4191 					     error, tunnel_filter);
4192 	if (ret)
4193 		return ret;
4194 
4195 	ret = i40e_flow_parse_tunnel_action(dev, actions, error, tunnel_filter);
4196 	if (ret)
4197 		return ret;
4198 
4199 	ret = i40e_flow_parse_attr(attr, error);
4200 	if (ret)
4201 		return ret;
4202 
4203 	cons_filter_type = RTE_ETH_FILTER_TUNNEL;
4204 
4205 	return ret;
4206 }
4207 
4208 /**
4209  * This function is used to do configuration i40e existing RSS with rte_flow.
4210  * It also enable queue region configuration using flow API for i40e.
4211  * pattern can be used indicate what parameters will be include in flow,
4212  * like user_priority or flowtype for queue region or HASH function for RSS.
4213  * Action is used to transmit parameter like queue index and HASH
4214  * function for RSS, or flowtype for queue region configuration.
4215  * For example:
4216  * pattern:
4217  * Case 1: only ETH, indicate  flowtype for queue region will be parsed.
4218  * Case 2: only VLAN, indicate user_priority for queue region will be parsed.
4219  * Case 3: none, indicate RSS related will be parsed in action.
4220  * Any pattern other the ETH or VLAN will be treated as invalid except END.
4221  * So, pattern choice is depened on the purpose of configuration of
4222  * that flow.
4223  * action:
4224  * action RSS will be uaed to transmit valid parameter with
4225  * struct rte_flow_action_rss for all the 3 case.
4226  */
4227 static int
4228 i40e_flow_parse_rss_pattern(__rte_unused struct rte_eth_dev *dev,
4229 			     const struct rte_flow_item *pattern,
4230 			     struct rte_flow_error *error,
4231 			     uint8_t *action_flag,
4232 			     struct i40e_queue_regions *info)
4233 {
4234 	const struct rte_flow_item_vlan *vlan_spec, *vlan_mask;
4235 	const struct rte_flow_item *item = pattern;
4236 	enum rte_flow_item_type item_type;
4237 
4238 	if (item->type == RTE_FLOW_ITEM_TYPE_END)
4239 		return 0;
4240 
4241 	for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
4242 		if (item->last) {
4243 			rte_flow_error_set(error, EINVAL,
4244 					   RTE_FLOW_ERROR_TYPE_ITEM,
4245 					   item,
4246 					   "Not support range");
4247 			return -rte_errno;
4248 		}
4249 		item_type = item->type;
4250 		switch (item_type) {
4251 		case RTE_FLOW_ITEM_TYPE_ETH:
4252 			*action_flag = 1;
4253 			break;
4254 		case RTE_FLOW_ITEM_TYPE_VLAN:
4255 			vlan_spec = item->spec;
4256 			vlan_mask = item->mask;
4257 			if (vlan_spec && vlan_mask) {
4258 				if (vlan_mask->tci ==
4259 					rte_cpu_to_be_16(I40E_TCI_MASK)) {
4260 					info->region[0].user_priority[0] =
4261 						(rte_be_to_cpu_16(
4262 						vlan_spec->tci) >> 13) & 0x7;
4263 					info->region[0].user_priority_num = 1;
4264 					info->queue_region_number = 1;
4265 					*action_flag = 0;
4266 				}
4267 			}
4268 			break;
4269 		default:
4270 			rte_flow_error_set(error, EINVAL,
4271 					RTE_FLOW_ERROR_TYPE_ITEM,
4272 					item,
4273 					"Not support range");
4274 			return -rte_errno;
4275 		}
4276 	}
4277 
4278 	return 0;
4279 }
4280 
4281 /**
4282  * This function is used to parse rss queue index, total queue number and
4283  * hash functions, If the purpose of this configuration is for queue region
4284  * configuration, it will set queue_region_conf flag to TRUE, else to FALSE.
4285  * In queue region configuration, it also need to parse hardware flowtype
4286  * and user_priority from configuration, it will also cheeck the validity
4287  * of these parameters. For example, The queue region sizes should
4288  * be any of the following values: 1, 2, 4, 8, 16, 32, 64, the
4289  * hw_flowtype or PCTYPE max index should be 63, the user priority
4290  * max index should be 7, and so on. And also, queue index should be
4291  * continuous sequence and queue region index should be part of rss
4292  * queue index for this port.
4293  */
4294 static int
4295 i40e_flow_parse_rss_action(struct rte_eth_dev *dev,
4296 			    const struct rte_flow_action *actions,
4297 			    struct rte_flow_error *error,
4298 			    uint8_t action_flag,
4299 			    struct i40e_queue_regions *conf_info,
4300 			    union i40e_filter_t *filter)
4301 {
4302 	const struct rte_flow_action *act;
4303 	const struct rte_flow_action_rss *rss;
4304 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
4305 	struct i40e_queue_regions *info = &pf->queue_region;
4306 	struct i40e_rte_flow_rss_conf *rss_config =
4307 			&filter->rss_conf;
4308 	struct i40e_rte_flow_rss_conf *rss_info = &pf->rss_info;
4309 	uint16_t i, j, n, tmp;
4310 	uint32_t index = 0;
4311 	uint64_t hf_bit = 1;
4312 
4313 	NEXT_ITEM_OF_ACTION(act, actions, index);
4314 	rss = act->conf;
4315 
4316 	/**
4317 	 * rss only supports forwarding,
4318 	 * check if the first not void action is RSS.
4319 	 */
4320 	if (act->type != RTE_FLOW_ACTION_TYPE_RSS) {
4321 		memset(rss_config, 0, sizeof(struct i40e_rte_flow_rss_conf));
4322 		rte_flow_error_set(error, EINVAL,
4323 			RTE_FLOW_ERROR_TYPE_ACTION,
4324 			act, "Not supported action.");
4325 		return -rte_errno;
4326 	}
4327 
4328 	if (action_flag) {
4329 		for (n = 0; n < 64; n++) {
4330 			if (rss->types & (hf_bit << n)) {
4331 				conf_info->region[0].hw_flowtype[0] = n;
4332 				conf_info->region[0].flowtype_num = 1;
4333 				conf_info->queue_region_number = 1;
4334 				break;
4335 			}
4336 		}
4337 	}
4338 
4339 	/**
4340 	 * Do some queue region related parameters check
4341 	 * in order to keep queue index for queue region to be
4342 	 * continuous sequence and also to be part of RSS
4343 	 * queue index for this port.
4344 	 */
4345 	if (conf_info->queue_region_number) {
4346 		for (i = 0; i < rss->queue_num; i++) {
4347 			for (j = 0; j < rss_info->conf.queue_num; j++) {
4348 				if (rss->queue[i] == rss_info->conf.queue[j])
4349 					break;
4350 			}
4351 			if (j == rss_info->conf.queue_num) {
4352 				rte_flow_error_set(error, EINVAL,
4353 					RTE_FLOW_ERROR_TYPE_ACTION,
4354 					act,
4355 					"no valid queues");
4356 				return -rte_errno;
4357 			}
4358 		}
4359 
4360 		for (i = 0; i < rss->queue_num - 1; i++) {
4361 			if (rss->queue[i + 1] != rss->queue[i] + 1) {
4362 				rte_flow_error_set(error, EINVAL,
4363 					RTE_FLOW_ERROR_TYPE_ACTION,
4364 					act,
4365 					"no valid queues");
4366 				return -rte_errno;
4367 			}
4368 		}
4369 	}
4370 
4371 	/* Parse queue region related parameters from configuration */
4372 	for (n = 0; n < conf_info->queue_region_number; n++) {
4373 		if (conf_info->region[n].user_priority_num ||
4374 				conf_info->region[n].flowtype_num) {
4375 			if (!((rte_is_power_of_2(rss->queue_num)) &&
4376 					rss->queue_num <= 64)) {
4377 				rte_flow_error_set(error, EINVAL,
4378 					RTE_FLOW_ERROR_TYPE_ACTION,
4379 					act,
4380 					"The region sizes should be any of the following values: 1, 2, 4, 8, 16, 32, 64 as long as the "
4381 					"total number of queues do not exceed the VSI allocation");
4382 				return -rte_errno;
4383 			}
4384 
4385 			if (conf_info->region[n].user_priority[n] >=
4386 					I40E_MAX_USER_PRIORITY) {
4387 				rte_flow_error_set(error, EINVAL,
4388 					RTE_FLOW_ERROR_TYPE_ACTION,
4389 					act,
4390 					"the user priority max index is 7");
4391 				return -rte_errno;
4392 			}
4393 
4394 			if (conf_info->region[n].hw_flowtype[n] >=
4395 					I40E_FILTER_PCTYPE_MAX) {
4396 				rte_flow_error_set(error, EINVAL,
4397 					RTE_FLOW_ERROR_TYPE_ACTION,
4398 					act,
4399 					"the hw_flowtype or PCTYPE max index is 63");
4400 				return -rte_errno;
4401 			}
4402 
4403 			for (i = 0; i < info->queue_region_number; i++) {
4404 				if (info->region[i].queue_num ==
4405 				    rss->queue_num &&
4406 					info->region[i].queue_start_index ==
4407 						rss->queue[0])
4408 					break;
4409 			}
4410 
4411 			if (i == info->queue_region_number) {
4412 				if (i > I40E_REGION_MAX_INDEX) {
4413 					rte_flow_error_set(error, EINVAL,
4414 						RTE_FLOW_ERROR_TYPE_ACTION,
4415 						act,
4416 						"the queue region max index is 7");
4417 					return -rte_errno;
4418 				}
4419 
4420 				info->region[i].queue_num =
4421 					rss->queue_num;
4422 				info->region[i].queue_start_index =
4423 					rss->queue[0];
4424 				info->region[i].region_id =
4425 					info->queue_region_number;
4426 
4427 				j = info->region[i].user_priority_num;
4428 				tmp = conf_info->region[n].user_priority[0];
4429 				if (conf_info->region[n].user_priority_num) {
4430 					info->region[i].user_priority[j] = tmp;
4431 					info->region[i].user_priority_num++;
4432 				}
4433 
4434 				j = info->region[i].flowtype_num;
4435 				tmp = conf_info->region[n].hw_flowtype[0];
4436 				if (conf_info->region[n].flowtype_num) {
4437 					info->region[i].hw_flowtype[j] = tmp;
4438 					info->region[i].flowtype_num++;
4439 				}
4440 				info->queue_region_number++;
4441 			} else {
4442 				j = info->region[i].user_priority_num;
4443 				tmp = conf_info->region[n].user_priority[0];
4444 				if (conf_info->region[n].user_priority_num) {
4445 					info->region[i].user_priority[j] = tmp;
4446 					info->region[i].user_priority_num++;
4447 				}
4448 
4449 				j = info->region[i].flowtype_num;
4450 				tmp = conf_info->region[n].hw_flowtype[0];
4451 				if (conf_info->region[n].flowtype_num) {
4452 					info->region[i].hw_flowtype[j] = tmp;
4453 					info->region[i].flowtype_num++;
4454 				}
4455 			}
4456 		}
4457 
4458 		rss_config->queue_region_conf = TRUE;
4459 	}
4460 
4461 	/**
4462 	 * Return function if this flow is used for queue region configuration
4463 	 */
4464 	if (rss_config->queue_region_conf)
4465 		return 0;
4466 
4467 	if (!rss || !rss->queue_num) {
4468 		rte_flow_error_set(error, EINVAL,
4469 				RTE_FLOW_ERROR_TYPE_ACTION,
4470 				act,
4471 				"no valid queues");
4472 		return -rte_errno;
4473 	}
4474 
4475 	for (n = 0; n < rss->queue_num; n++) {
4476 		if (rss->queue[n] >= dev->data->nb_rx_queues) {
4477 			rte_flow_error_set(error, EINVAL,
4478 				   RTE_FLOW_ERROR_TYPE_ACTION,
4479 				   act,
4480 				   "queue id > max number of queues");
4481 			return -rte_errno;
4482 		}
4483 	}
4484 
4485 	if (rss_info->conf.queue_num) {
4486 		rte_flow_error_set(error, EINVAL,
4487 				RTE_FLOW_ERROR_TYPE_ACTION,
4488 				act,
4489 				"rss only allow one valid rule");
4490 		return -rte_errno;
4491 	}
4492 
4493 	/* Parse RSS related parameters from configuration */
4494 	if (rss->func != RTE_ETH_HASH_FUNCTION_DEFAULT)
4495 		return rte_flow_error_set
4496 			(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, act,
4497 			 "non-default RSS hash functions are not supported");
4498 	if (rss->level)
4499 		return rte_flow_error_set
4500 			(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, act,
4501 			 "a nonzero RSS encapsulation level is not supported");
4502 	if (rss->key_len && rss->key_len > RTE_DIM(rss_config->key))
4503 		return rte_flow_error_set
4504 			(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, act,
4505 			 "RSS hash key too large");
4506 	if (rss->queue_num > RTE_DIM(rss_config->queue))
4507 		return rte_flow_error_set
4508 			(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, act,
4509 			 "too many queues for RSS context");
4510 	if (i40e_rss_conf_init(rss_config, rss))
4511 		return rte_flow_error_set
4512 			(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, act,
4513 			 "RSS context initialization failure");
4514 
4515 	index++;
4516 
4517 	/* check if the next not void action is END */
4518 	NEXT_ITEM_OF_ACTION(act, actions, index);
4519 	if (act->type != RTE_FLOW_ACTION_TYPE_END) {
4520 		memset(rss_config, 0, sizeof(struct i40e_rte_flow_rss_conf));
4521 		rte_flow_error_set(error, EINVAL,
4522 			RTE_FLOW_ERROR_TYPE_ACTION,
4523 			act, "Not supported action.");
4524 		return -rte_errno;
4525 	}
4526 	rss_config->queue_region_conf = FALSE;
4527 
4528 	return 0;
4529 }
4530 
4531 static int
4532 i40e_parse_rss_filter(struct rte_eth_dev *dev,
4533 			const struct rte_flow_attr *attr,
4534 			const struct rte_flow_item pattern[],
4535 			const struct rte_flow_action actions[],
4536 			union i40e_filter_t *filter,
4537 			struct rte_flow_error *error)
4538 {
4539 	int ret;
4540 	struct i40e_queue_regions info;
4541 	uint8_t action_flag = 0;
4542 
4543 	memset(&info, 0, sizeof(struct i40e_queue_regions));
4544 
4545 	ret = i40e_flow_parse_rss_pattern(dev, pattern,
4546 					error, &action_flag, &info);
4547 	if (ret)
4548 		return ret;
4549 
4550 	ret = i40e_flow_parse_rss_action(dev, actions, error,
4551 					action_flag, &info, filter);
4552 	if (ret)
4553 		return ret;
4554 
4555 	ret = i40e_flow_parse_attr(attr, error);
4556 	if (ret)
4557 		return ret;
4558 
4559 	cons_filter_type = RTE_ETH_FILTER_HASH;
4560 
4561 	return 0;
4562 }
4563 
4564 static int
4565 i40e_config_rss_filter_set(struct rte_eth_dev *dev,
4566 		struct i40e_rte_flow_rss_conf *conf)
4567 {
4568 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
4569 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
4570 	int ret;
4571 
4572 	if (conf->queue_region_conf) {
4573 		ret = i40e_flush_queue_region_all_conf(dev, hw, pf, 1);
4574 		conf->queue_region_conf = 0;
4575 	} else {
4576 		ret = i40e_config_rss_filter(pf, conf, 1);
4577 	}
4578 	return ret;
4579 }
4580 
4581 static int
4582 i40e_config_rss_filter_del(struct rte_eth_dev *dev,
4583 		struct i40e_rte_flow_rss_conf *conf)
4584 {
4585 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
4586 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
4587 
4588 	i40e_flush_queue_region_all_conf(dev, hw, pf, 0);
4589 
4590 	i40e_config_rss_filter(pf, conf, 0);
4591 	return 0;
4592 }
4593 
4594 static int
4595 i40e_flow_validate(struct rte_eth_dev *dev,
4596 		   const struct rte_flow_attr *attr,
4597 		   const struct rte_flow_item pattern[],
4598 		   const struct rte_flow_action actions[],
4599 		   struct rte_flow_error *error)
4600 {
4601 	struct rte_flow_item *items; /* internal pattern w/o VOID items */
4602 	parse_filter_t parse_filter;
4603 	uint32_t item_num = 0; /* non-void item number of pattern*/
4604 	uint32_t i = 0;
4605 	bool flag = false;
4606 	int ret = I40E_NOT_SUPPORTED;
4607 
4608 	if (!pattern) {
4609 		rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
4610 				   NULL, "NULL pattern.");
4611 		return -rte_errno;
4612 	}
4613 
4614 	if (!actions) {
4615 		rte_flow_error_set(error, EINVAL,
4616 				   RTE_FLOW_ERROR_TYPE_ACTION_NUM,
4617 				   NULL, "NULL action.");
4618 		return -rte_errno;
4619 	}
4620 
4621 	if (!attr) {
4622 		rte_flow_error_set(error, EINVAL,
4623 				   RTE_FLOW_ERROR_TYPE_ATTR,
4624 				   NULL, "NULL attribute.");
4625 		return -rte_errno;
4626 	}
4627 
4628 	memset(&cons_filter, 0, sizeof(cons_filter));
4629 
4630 	/* Get the non-void item of action */
4631 	while ((actions + i)->type == RTE_FLOW_ACTION_TYPE_VOID)
4632 		i++;
4633 
4634 	if ((actions + i)->type == RTE_FLOW_ACTION_TYPE_RSS) {
4635 		ret = i40e_parse_rss_filter(dev, attr, pattern,
4636 					actions, &cons_filter, error);
4637 		return ret;
4638 	}
4639 
4640 	i = 0;
4641 	/* Get the non-void item number of pattern */
4642 	while ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_END) {
4643 		if ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_VOID)
4644 			item_num++;
4645 		i++;
4646 	}
4647 	item_num++;
4648 
4649 	items = rte_zmalloc("i40e_pattern",
4650 			    item_num * sizeof(struct rte_flow_item), 0);
4651 	if (!items) {
4652 		rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
4653 				   NULL, "No memory for PMD internal items.");
4654 		return -ENOMEM;
4655 	}
4656 
4657 	i40e_pattern_skip_void_item(items, pattern);
4658 
4659 	i = 0;
4660 	do {
4661 		parse_filter = i40e_find_parse_filter_func(items, &i);
4662 		if (!parse_filter && !flag) {
4663 			rte_flow_error_set(error, EINVAL,
4664 					   RTE_FLOW_ERROR_TYPE_ITEM,
4665 					   pattern, "Unsupported pattern");
4666 			rte_free(items);
4667 			return -rte_errno;
4668 		}
4669 		if (parse_filter)
4670 			ret = parse_filter(dev, attr, items, actions,
4671 					   error, &cons_filter);
4672 		flag = true;
4673 	} while ((ret < 0) && (i < RTE_DIM(i40e_supported_patterns)));
4674 
4675 	rte_free(items);
4676 
4677 	return ret;
4678 }
4679 
4680 static struct rte_flow *
4681 i40e_flow_create(struct rte_eth_dev *dev,
4682 		 const struct rte_flow_attr *attr,
4683 		 const struct rte_flow_item pattern[],
4684 		 const struct rte_flow_action actions[],
4685 		 struct rte_flow_error *error)
4686 {
4687 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
4688 	struct rte_flow *flow;
4689 	int ret;
4690 
4691 	flow = rte_zmalloc("i40e_flow", sizeof(struct rte_flow), 0);
4692 	if (!flow) {
4693 		rte_flow_error_set(error, ENOMEM,
4694 				   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
4695 				   "Failed to allocate memory");
4696 		return flow;
4697 	}
4698 
4699 	ret = i40e_flow_validate(dev, attr, pattern, actions, error);
4700 	if (ret < 0)
4701 		return NULL;
4702 
4703 	switch (cons_filter_type) {
4704 	case RTE_ETH_FILTER_ETHERTYPE:
4705 		ret = i40e_ethertype_filter_set(pf,
4706 					&cons_filter.ethertype_filter, 1);
4707 		if (ret)
4708 			goto free_flow;
4709 		flow->rule = TAILQ_LAST(&pf->ethertype.ethertype_list,
4710 					i40e_ethertype_filter_list);
4711 		break;
4712 	case RTE_ETH_FILTER_FDIR:
4713 		ret = i40e_flow_add_del_fdir_filter(dev,
4714 				       &cons_filter.fdir_filter, 1);
4715 		if (ret)
4716 			goto free_flow;
4717 		flow->rule = TAILQ_LAST(&pf->fdir.fdir_list,
4718 					i40e_fdir_filter_list);
4719 		break;
4720 	case RTE_ETH_FILTER_TUNNEL:
4721 		ret = i40e_dev_consistent_tunnel_filter_set(pf,
4722 			    &cons_filter.consistent_tunnel_filter, 1);
4723 		if (ret)
4724 			goto free_flow;
4725 		flow->rule = TAILQ_LAST(&pf->tunnel.tunnel_list,
4726 					i40e_tunnel_filter_list);
4727 		break;
4728 	case RTE_ETH_FILTER_HASH:
4729 		ret = i40e_config_rss_filter_set(dev,
4730 			    &cons_filter.rss_conf);
4731 		if (ret)
4732 			goto free_flow;
4733 		flow->rule = &pf->rss_info;
4734 		break;
4735 	default:
4736 		goto free_flow;
4737 	}
4738 
4739 	flow->filter_type = cons_filter_type;
4740 	TAILQ_INSERT_TAIL(&pf->flow_list, flow, node);
4741 	return flow;
4742 
4743 free_flow:
4744 	rte_flow_error_set(error, -ret,
4745 			   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
4746 			   "Failed to create flow.");
4747 	rte_free(flow);
4748 	return NULL;
4749 }
4750 
4751 static int
4752 i40e_flow_destroy(struct rte_eth_dev *dev,
4753 		  struct rte_flow *flow,
4754 		  struct rte_flow_error *error)
4755 {
4756 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
4757 	enum rte_filter_type filter_type = flow->filter_type;
4758 	int ret = 0;
4759 
4760 	switch (filter_type) {
4761 	case RTE_ETH_FILTER_ETHERTYPE:
4762 		ret = i40e_flow_destroy_ethertype_filter(pf,
4763 			 (struct i40e_ethertype_filter *)flow->rule);
4764 		break;
4765 	case RTE_ETH_FILTER_TUNNEL:
4766 		ret = i40e_flow_destroy_tunnel_filter(pf,
4767 			      (struct i40e_tunnel_filter *)flow->rule);
4768 		break;
4769 	case RTE_ETH_FILTER_FDIR:
4770 		ret = i40e_flow_add_del_fdir_filter(dev,
4771 		       &((struct i40e_fdir_filter *)flow->rule)->fdir, 0);
4772 
4773 		/* If the last flow is destroyed, disable fdir. */
4774 		if (!ret && TAILQ_EMPTY(&pf->fdir.fdir_list)) {
4775 			i40e_fdir_teardown(pf);
4776 			dev->data->dev_conf.fdir_conf.mode =
4777 				   RTE_FDIR_MODE_NONE;
4778 		}
4779 		break;
4780 	case RTE_ETH_FILTER_HASH:
4781 		ret = i40e_config_rss_filter_del(dev,
4782 			   (struct i40e_rte_flow_rss_conf *)flow->rule);
4783 		break;
4784 	default:
4785 		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
4786 			    filter_type);
4787 		ret = -EINVAL;
4788 		break;
4789 	}
4790 
4791 	if (!ret) {
4792 		TAILQ_REMOVE(&pf->flow_list, flow, node);
4793 		rte_free(flow);
4794 	} else
4795 		rte_flow_error_set(error, -ret,
4796 				   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
4797 				   "Failed to destroy flow.");
4798 
4799 	return ret;
4800 }
4801 
4802 static int
4803 i40e_flow_destroy_ethertype_filter(struct i40e_pf *pf,
4804 				   struct i40e_ethertype_filter *filter)
4805 {
4806 	struct i40e_hw *hw = I40E_PF_TO_HW(pf);
4807 	struct i40e_ethertype_rule *ethertype_rule = &pf->ethertype;
4808 	struct i40e_ethertype_filter *node;
4809 	struct i40e_control_filter_stats stats;
4810 	uint16_t flags = 0;
4811 	int ret = 0;
4812 
4813 	if (!(filter->flags & RTE_ETHTYPE_FLAGS_MAC))
4814 		flags |= I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC;
4815 	if (filter->flags & RTE_ETHTYPE_FLAGS_DROP)
4816 		flags |= I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP;
4817 	flags |= I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TO_QUEUE;
4818 
4819 	memset(&stats, 0, sizeof(stats));
4820 	ret = i40e_aq_add_rem_control_packet_filter(hw,
4821 				    filter->input.mac_addr.addr_bytes,
4822 				    filter->input.ether_type,
4823 				    flags, pf->main_vsi->seid,
4824 				    filter->queue, 0, &stats, NULL);
4825 	if (ret < 0)
4826 		return ret;
4827 
4828 	node = i40e_sw_ethertype_filter_lookup(ethertype_rule, &filter->input);
4829 	if (!node)
4830 		return -EINVAL;
4831 
4832 	ret = i40e_sw_ethertype_filter_del(pf, &node->input);
4833 
4834 	return ret;
4835 }
4836 
4837 static int
4838 i40e_flow_destroy_tunnel_filter(struct i40e_pf *pf,
4839 				struct i40e_tunnel_filter *filter)
4840 {
4841 	struct i40e_hw *hw = I40E_PF_TO_HW(pf);
4842 	struct i40e_vsi *vsi;
4843 	struct i40e_pf_vf *vf;
4844 	struct i40e_aqc_cloud_filters_element_bb cld_filter;
4845 	struct i40e_tunnel_rule *tunnel_rule = &pf->tunnel;
4846 	struct i40e_tunnel_filter *node;
4847 	bool big_buffer = 0;
4848 	int ret = 0;
4849 
4850 	memset(&cld_filter, 0, sizeof(cld_filter));
4851 	rte_ether_addr_copy((struct rte_ether_addr *)&filter->input.outer_mac,
4852 			(struct rte_ether_addr *)&cld_filter.element.outer_mac);
4853 	rte_ether_addr_copy((struct rte_ether_addr *)&filter->input.inner_mac,
4854 			(struct rte_ether_addr *)&cld_filter.element.inner_mac);
4855 	cld_filter.element.inner_vlan = filter->input.inner_vlan;
4856 	cld_filter.element.flags = filter->input.flags;
4857 	cld_filter.element.tenant_id = filter->input.tenant_id;
4858 	cld_filter.element.queue_number = filter->queue;
4859 	rte_memcpy(cld_filter.general_fields,
4860 		   filter->input.general_fields,
4861 		   sizeof(cld_filter.general_fields));
4862 
4863 	if (!filter->is_to_vf)
4864 		vsi = pf->main_vsi;
4865 	else {
4866 		vf = &pf->vfs[filter->vf_id];
4867 		vsi = vf->vsi;
4868 	}
4869 
4870 	if (((filter->input.flags & I40E_AQC_ADD_CLOUD_FILTER_0X11) ==
4871 	    I40E_AQC_ADD_CLOUD_FILTER_0X11) ||
4872 	    ((filter->input.flags & I40E_AQC_ADD_CLOUD_FILTER_0X12) ==
4873 	    I40E_AQC_ADD_CLOUD_FILTER_0X12) ||
4874 	    ((filter->input.flags & I40E_AQC_ADD_CLOUD_FILTER_0X10) ==
4875 	    I40E_AQC_ADD_CLOUD_FILTER_0X10))
4876 		big_buffer = 1;
4877 
4878 	if (big_buffer)
4879 		ret = i40e_aq_rem_cloud_filters_bb(hw, vsi->seid,
4880 						&cld_filter, 1);
4881 	else
4882 		ret = i40e_aq_rem_cloud_filters(hw, vsi->seid,
4883 						&cld_filter.element, 1);
4884 	if (ret < 0)
4885 		return -ENOTSUP;
4886 
4887 	node = i40e_sw_tunnel_filter_lookup(tunnel_rule, &filter->input);
4888 	if (!node)
4889 		return -EINVAL;
4890 
4891 	ret = i40e_sw_tunnel_filter_del(pf, &node->input);
4892 
4893 	return ret;
4894 }
4895 
4896 static int
4897 i40e_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error)
4898 {
4899 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
4900 	int ret;
4901 
4902 	ret = i40e_flow_flush_fdir_filter(pf);
4903 	if (ret) {
4904 		rte_flow_error_set(error, -ret,
4905 				   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
4906 				   "Failed to flush FDIR flows.");
4907 		return -rte_errno;
4908 	}
4909 
4910 	ret = i40e_flow_flush_ethertype_filter(pf);
4911 	if (ret) {
4912 		rte_flow_error_set(error, -ret,
4913 				   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
4914 				   "Failed to ethertype flush flows.");
4915 		return -rte_errno;
4916 	}
4917 
4918 	ret = i40e_flow_flush_tunnel_filter(pf);
4919 	if (ret) {
4920 		rte_flow_error_set(error, -ret,
4921 				   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
4922 				   "Failed to flush tunnel flows.");
4923 		return -rte_errno;
4924 	}
4925 
4926 	ret = i40e_flow_flush_rss_filter(dev);
4927 	if (ret) {
4928 		rte_flow_error_set(error, -ret,
4929 				   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
4930 				   "Failed to flush rss flows.");
4931 		return -rte_errno;
4932 	}
4933 
4934 	return ret;
4935 }
4936 
4937 static int
4938 i40e_flow_flush_fdir_filter(struct i40e_pf *pf)
4939 {
4940 	struct rte_eth_dev *dev = pf->adapter->eth_dev;
4941 	struct i40e_fdir_info *fdir_info = &pf->fdir;
4942 	struct i40e_fdir_filter *fdir_filter;
4943 	enum i40e_filter_pctype pctype;
4944 	struct rte_flow *flow;
4945 	void *temp;
4946 	int ret;
4947 
4948 	ret = i40e_fdir_flush(dev);
4949 	if (!ret) {
4950 		/* Delete FDIR filters in FDIR list. */
4951 		while ((fdir_filter = TAILQ_FIRST(&fdir_info->fdir_list))) {
4952 			ret = i40e_sw_fdir_filter_del(pf,
4953 						      &fdir_filter->fdir.input);
4954 			if (ret < 0)
4955 				return ret;
4956 		}
4957 
4958 		/* Delete FDIR flows in flow list. */
4959 		TAILQ_FOREACH_SAFE(flow, &pf->flow_list, node, temp) {
4960 			if (flow->filter_type == RTE_ETH_FILTER_FDIR) {
4961 				TAILQ_REMOVE(&pf->flow_list, flow, node);
4962 				rte_free(flow);
4963 			}
4964 		}
4965 
4966 		for (pctype = I40E_FILTER_PCTYPE_NONF_IPV4_UDP;
4967 		     pctype <= I40E_FILTER_PCTYPE_L2_PAYLOAD; pctype++)
4968 			pf->fdir.inset_flag[pctype] = 0;
4969 	}
4970 
4971 	i40e_fdir_teardown(pf);
4972 
4973 	return ret;
4974 }
4975 
4976 /* Flush all ethertype filters */
4977 static int
4978 i40e_flow_flush_ethertype_filter(struct i40e_pf *pf)
4979 {
4980 	struct i40e_ethertype_filter_list
4981 		*ethertype_list = &pf->ethertype.ethertype_list;
4982 	struct i40e_ethertype_filter *filter;
4983 	struct rte_flow *flow;
4984 	void *temp;
4985 	int ret = 0;
4986 
4987 	while ((filter = TAILQ_FIRST(ethertype_list))) {
4988 		ret = i40e_flow_destroy_ethertype_filter(pf, filter);
4989 		if (ret)
4990 			return ret;
4991 	}
4992 
4993 	/* Delete ethertype flows in flow list. */
4994 	TAILQ_FOREACH_SAFE(flow, &pf->flow_list, node, temp) {
4995 		if (flow->filter_type == RTE_ETH_FILTER_ETHERTYPE) {
4996 			TAILQ_REMOVE(&pf->flow_list, flow, node);
4997 			rte_free(flow);
4998 		}
4999 	}
5000 
5001 	return ret;
5002 }
5003 
5004 /* Flush all tunnel filters */
5005 static int
5006 i40e_flow_flush_tunnel_filter(struct i40e_pf *pf)
5007 {
5008 	struct i40e_tunnel_filter_list
5009 		*tunnel_list = &pf->tunnel.tunnel_list;
5010 	struct i40e_tunnel_filter *filter;
5011 	struct rte_flow *flow;
5012 	void *temp;
5013 	int ret = 0;
5014 
5015 	while ((filter = TAILQ_FIRST(tunnel_list))) {
5016 		ret = i40e_flow_destroy_tunnel_filter(pf, filter);
5017 		if (ret)
5018 			return ret;
5019 	}
5020 
5021 	/* Delete tunnel flows in flow list. */
5022 	TAILQ_FOREACH_SAFE(flow, &pf->flow_list, node, temp) {
5023 		if (flow->filter_type == RTE_ETH_FILTER_TUNNEL) {
5024 			TAILQ_REMOVE(&pf->flow_list, flow, node);
5025 			rte_free(flow);
5026 		}
5027 	}
5028 
5029 	return ret;
5030 }
5031 
5032 /* remove the rss filter */
5033 static int
5034 i40e_flow_flush_rss_filter(struct rte_eth_dev *dev)
5035 {
5036 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
5037 	struct i40e_rte_flow_rss_conf *rss_info = &pf->rss_info;
5038 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
5039 	int32_t ret = -EINVAL;
5040 
5041 	ret = i40e_flush_queue_region_all_conf(dev, hw, pf, 0);
5042 
5043 	if (rss_info->conf.queue_num)
5044 		ret = i40e_config_rss_filter(pf, rss_info, FALSE);
5045 	return ret;
5046 }
5047