net/i40e: extend VF reset waiting time
[dpdk.git] / drivers / net / iavf / iavf_generic_flow.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019 Intel Corporation
3  */
4
5 #include <sys/queue.h>
6 #include <stdio.h>
7 #include <errno.h>
8 #include <stdint.h>
9 #include <string.h>
10 #include <unistd.h>
11 #include <stdarg.h>
12
13 #include <rte_ether.h>
14 #include <ethdev_driver.h>
15 #include <rte_malloc.h>
16 #include <rte_tailq.h>
17
18 #include "iavf.h"
19 #include "iavf_generic_flow.h"
20
21 static struct iavf_engine_list engine_list =
22                 TAILQ_HEAD_INITIALIZER(engine_list);
23
24 static int iavf_flow_validate(struct rte_eth_dev *dev,
25                 const struct rte_flow_attr *attr,
26                 const struct rte_flow_item pattern[],
27                 const struct rte_flow_action actions[],
28                 struct rte_flow_error *error);
29 static struct rte_flow *iavf_flow_create(struct rte_eth_dev *dev,
30                 const struct rte_flow_attr *attr,
31                 const struct rte_flow_item pattern[],
32                 const struct rte_flow_action actions[],
33                 struct rte_flow_error *error);
34 static int iavf_flow_destroy(struct rte_eth_dev *dev,
35                 struct rte_flow *flow,
36                 struct rte_flow_error *error);
37 static int iavf_flow_query(struct rte_eth_dev *dev,
38                 struct rte_flow *flow,
39                 const struct rte_flow_action *actions,
40                 void *data,
41                 struct rte_flow_error *error);
42
43 const struct rte_flow_ops iavf_flow_ops = {
44         .validate = iavf_flow_validate,
45         .create = iavf_flow_create,
46         .destroy = iavf_flow_destroy,
47         .flush = iavf_flow_flush,
48         .query = iavf_flow_query,
49 };
50
51 /* empty */
52 enum rte_flow_item_type iavf_pattern_empty[] = {
53         RTE_FLOW_ITEM_TYPE_END,
54 };
55
56 /* L2 */
57 enum rte_flow_item_type iavf_pattern_ethertype[] = {
58         RTE_FLOW_ITEM_TYPE_ETH,
59         RTE_FLOW_ITEM_TYPE_END,
60 };
61
62 enum rte_flow_item_type iavf_pattern_ethertype_vlan[] = {
63         RTE_FLOW_ITEM_TYPE_ETH,
64         RTE_FLOW_ITEM_TYPE_VLAN,
65         RTE_FLOW_ITEM_TYPE_END,
66 };
67
68 enum rte_flow_item_type iavf_pattern_ethertype_qinq[] = {
69         RTE_FLOW_ITEM_TYPE_ETH,
70         RTE_FLOW_ITEM_TYPE_VLAN,
71         RTE_FLOW_ITEM_TYPE_VLAN,
72         RTE_FLOW_ITEM_TYPE_END,
73 };
74
75 /* ARP */
76 enum rte_flow_item_type iavf_pattern_eth_arp[] = {
77         RTE_FLOW_ITEM_TYPE_ETH,
78         RTE_FLOW_ITEM_TYPE_ARP_ETH_IPV4,
79         RTE_FLOW_ITEM_TYPE_END,
80 };
81
82 /* non-tunnel IPv4 */
83 enum rte_flow_item_type iavf_pattern_eth_ipv4[] = {
84         RTE_FLOW_ITEM_TYPE_ETH,
85         RTE_FLOW_ITEM_TYPE_IPV4,
86         RTE_FLOW_ITEM_TYPE_END,
87 };
88
89 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv4[] = {
90         RTE_FLOW_ITEM_TYPE_ETH,
91         RTE_FLOW_ITEM_TYPE_VLAN,
92         RTE_FLOW_ITEM_TYPE_IPV4,
93         RTE_FLOW_ITEM_TYPE_END,
94 };
95
96 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv4[] = {
97         RTE_FLOW_ITEM_TYPE_ETH,
98         RTE_FLOW_ITEM_TYPE_VLAN,
99         RTE_FLOW_ITEM_TYPE_VLAN,
100         RTE_FLOW_ITEM_TYPE_IPV4,
101         RTE_FLOW_ITEM_TYPE_END,
102 };
103
104 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp[] = {
105         RTE_FLOW_ITEM_TYPE_ETH,
106         RTE_FLOW_ITEM_TYPE_IPV4,
107         RTE_FLOW_ITEM_TYPE_UDP,
108         RTE_FLOW_ITEM_TYPE_END,
109 };
110
111 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv4_udp[] = {
112         RTE_FLOW_ITEM_TYPE_ETH,
113         RTE_FLOW_ITEM_TYPE_VLAN,
114         RTE_FLOW_ITEM_TYPE_IPV4,
115         RTE_FLOW_ITEM_TYPE_UDP,
116         RTE_FLOW_ITEM_TYPE_END,
117 };
118
119 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv4_udp[] = {
120         RTE_FLOW_ITEM_TYPE_ETH,
121         RTE_FLOW_ITEM_TYPE_VLAN,
122         RTE_FLOW_ITEM_TYPE_VLAN,
123         RTE_FLOW_ITEM_TYPE_IPV4,
124         RTE_FLOW_ITEM_TYPE_UDP,
125         RTE_FLOW_ITEM_TYPE_END,
126 };
127
128 enum rte_flow_item_type iavf_pattern_eth_ipv4_tcp[] = {
129         RTE_FLOW_ITEM_TYPE_ETH,
130         RTE_FLOW_ITEM_TYPE_IPV4,
131         RTE_FLOW_ITEM_TYPE_TCP,
132         RTE_FLOW_ITEM_TYPE_END,
133 };
134
135 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv4_tcp[] = {
136         RTE_FLOW_ITEM_TYPE_ETH,
137         RTE_FLOW_ITEM_TYPE_VLAN,
138         RTE_FLOW_ITEM_TYPE_IPV4,
139         RTE_FLOW_ITEM_TYPE_TCP,
140         RTE_FLOW_ITEM_TYPE_END,
141 };
142
143 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv4_tcp[] = {
144         RTE_FLOW_ITEM_TYPE_ETH,
145         RTE_FLOW_ITEM_TYPE_VLAN,
146         RTE_FLOW_ITEM_TYPE_VLAN,
147         RTE_FLOW_ITEM_TYPE_IPV4,
148         RTE_FLOW_ITEM_TYPE_TCP,
149         RTE_FLOW_ITEM_TYPE_END,
150 };
151
152 enum rte_flow_item_type iavf_pattern_eth_ipv4_sctp[] = {
153         RTE_FLOW_ITEM_TYPE_ETH,
154         RTE_FLOW_ITEM_TYPE_IPV4,
155         RTE_FLOW_ITEM_TYPE_SCTP,
156         RTE_FLOW_ITEM_TYPE_END,
157 };
158
159 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv4_sctp[] = {
160         RTE_FLOW_ITEM_TYPE_ETH,
161         RTE_FLOW_ITEM_TYPE_VLAN,
162         RTE_FLOW_ITEM_TYPE_IPV4,
163         RTE_FLOW_ITEM_TYPE_SCTP,
164         RTE_FLOW_ITEM_TYPE_END,
165 };
166
167 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv4_sctp[] = {
168         RTE_FLOW_ITEM_TYPE_ETH,
169         RTE_FLOW_ITEM_TYPE_VLAN,
170         RTE_FLOW_ITEM_TYPE_VLAN,
171         RTE_FLOW_ITEM_TYPE_IPV4,
172         RTE_FLOW_ITEM_TYPE_SCTP,
173         RTE_FLOW_ITEM_TYPE_END,
174 };
175
176 enum rte_flow_item_type iavf_pattern_eth_ipv4_icmp[] = {
177         RTE_FLOW_ITEM_TYPE_ETH,
178         RTE_FLOW_ITEM_TYPE_IPV4,
179         RTE_FLOW_ITEM_TYPE_ICMP,
180         RTE_FLOW_ITEM_TYPE_END,
181 };
182
183 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv4_icmp[] = {
184         RTE_FLOW_ITEM_TYPE_ETH,
185         RTE_FLOW_ITEM_TYPE_VLAN,
186         RTE_FLOW_ITEM_TYPE_IPV4,
187         RTE_FLOW_ITEM_TYPE_ICMP,
188         RTE_FLOW_ITEM_TYPE_END,
189 };
190
191 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv4_icmp[] = {
192         RTE_FLOW_ITEM_TYPE_ETH,
193         RTE_FLOW_ITEM_TYPE_VLAN,
194         RTE_FLOW_ITEM_TYPE_VLAN,
195         RTE_FLOW_ITEM_TYPE_IPV4,
196         RTE_FLOW_ITEM_TYPE_ICMP,
197         RTE_FLOW_ITEM_TYPE_END,
198 };
199
200 /* non-tunnel IPv6 */
201 enum rte_flow_item_type iavf_pattern_eth_ipv6[] = {
202         RTE_FLOW_ITEM_TYPE_ETH,
203         RTE_FLOW_ITEM_TYPE_IPV6,
204         RTE_FLOW_ITEM_TYPE_END,
205 };
206
207 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6[] = {
208         RTE_FLOW_ITEM_TYPE_ETH,
209         RTE_FLOW_ITEM_TYPE_VLAN,
210         RTE_FLOW_ITEM_TYPE_IPV6,
211         RTE_FLOW_ITEM_TYPE_END,
212 };
213
214 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6[] = {
215         RTE_FLOW_ITEM_TYPE_ETH,
216         RTE_FLOW_ITEM_TYPE_VLAN,
217         RTE_FLOW_ITEM_TYPE_VLAN,
218         RTE_FLOW_ITEM_TYPE_IPV6,
219         RTE_FLOW_ITEM_TYPE_END,
220 };
221
222 enum rte_flow_item_type iavf_pattern_eth_ipv6_frag_ext[] = {
223         RTE_FLOW_ITEM_TYPE_ETH,
224         RTE_FLOW_ITEM_TYPE_IPV6,
225         RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
226         RTE_FLOW_ITEM_TYPE_END,
227 };
228
229 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_frag_ext[] = {
230         RTE_FLOW_ITEM_TYPE_ETH,
231         RTE_FLOW_ITEM_TYPE_VLAN,
232         RTE_FLOW_ITEM_TYPE_IPV6,
233         RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
234         RTE_FLOW_ITEM_TYPE_END,
235 };
236
237 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_frag_ext[] = {
238         RTE_FLOW_ITEM_TYPE_ETH,
239         RTE_FLOW_ITEM_TYPE_VLAN,
240         RTE_FLOW_ITEM_TYPE_VLAN,
241         RTE_FLOW_ITEM_TYPE_IPV6,
242         RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
243         RTE_FLOW_ITEM_TYPE_END,
244 };
245
246 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp[] = {
247         RTE_FLOW_ITEM_TYPE_ETH,
248         RTE_FLOW_ITEM_TYPE_IPV6,
249         RTE_FLOW_ITEM_TYPE_UDP,
250         RTE_FLOW_ITEM_TYPE_END,
251 };
252
253 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_udp[] = {
254         RTE_FLOW_ITEM_TYPE_ETH,
255         RTE_FLOW_ITEM_TYPE_VLAN,
256         RTE_FLOW_ITEM_TYPE_IPV6,
257         RTE_FLOW_ITEM_TYPE_UDP,
258         RTE_FLOW_ITEM_TYPE_END,
259 };
260
261 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_udp[] = {
262         RTE_FLOW_ITEM_TYPE_ETH,
263         RTE_FLOW_ITEM_TYPE_VLAN,
264         RTE_FLOW_ITEM_TYPE_VLAN,
265         RTE_FLOW_ITEM_TYPE_IPV6,
266         RTE_FLOW_ITEM_TYPE_UDP,
267         RTE_FLOW_ITEM_TYPE_END,
268 };
269
270 enum rte_flow_item_type iavf_pattern_eth_ipv6_tcp[] = {
271         RTE_FLOW_ITEM_TYPE_ETH,
272         RTE_FLOW_ITEM_TYPE_IPV6,
273         RTE_FLOW_ITEM_TYPE_TCP,
274         RTE_FLOW_ITEM_TYPE_END,
275 };
276
277 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_tcp[] = {
278         RTE_FLOW_ITEM_TYPE_ETH,
279         RTE_FLOW_ITEM_TYPE_VLAN,
280         RTE_FLOW_ITEM_TYPE_IPV6,
281         RTE_FLOW_ITEM_TYPE_TCP,
282         RTE_FLOW_ITEM_TYPE_END,
283 };
284
285 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_tcp[] = {
286         RTE_FLOW_ITEM_TYPE_ETH,
287         RTE_FLOW_ITEM_TYPE_VLAN,
288         RTE_FLOW_ITEM_TYPE_VLAN,
289         RTE_FLOW_ITEM_TYPE_IPV6,
290         RTE_FLOW_ITEM_TYPE_TCP,
291         RTE_FLOW_ITEM_TYPE_END,
292 };
293
294 enum rte_flow_item_type iavf_pattern_eth_ipv6_sctp[] = {
295         RTE_FLOW_ITEM_TYPE_ETH,
296         RTE_FLOW_ITEM_TYPE_IPV6,
297         RTE_FLOW_ITEM_TYPE_SCTP,
298         RTE_FLOW_ITEM_TYPE_END,
299 };
300
301 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_sctp[] = {
302         RTE_FLOW_ITEM_TYPE_ETH,
303         RTE_FLOW_ITEM_TYPE_VLAN,
304         RTE_FLOW_ITEM_TYPE_IPV6,
305         RTE_FLOW_ITEM_TYPE_SCTP,
306         RTE_FLOW_ITEM_TYPE_END,
307 };
308
309 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_sctp[] = {
310         RTE_FLOW_ITEM_TYPE_ETH,
311         RTE_FLOW_ITEM_TYPE_VLAN,
312         RTE_FLOW_ITEM_TYPE_VLAN,
313         RTE_FLOW_ITEM_TYPE_IPV6,
314         RTE_FLOW_ITEM_TYPE_SCTP,
315         RTE_FLOW_ITEM_TYPE_END,
316 };
317
318 enum rte_flow_item_type iavf_pattern_eth_ipv6_icmp6[] = {
319         RTE_FLOW_ITEM_TYPE_ETH,
320         RTE_FLOW_ITEM_TYPE_IPV6,
321         RTE_FLOW_ITEM_TYPE_ICMP6,
322         RTE_FLOW_ITEM_TYPE_END,
323 };
324
325 enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_icmp6[] = {
326         RTE_FLOW_ITEM_TYPE_ETH,
327         RTE_FLOW_ITEM_TYPE_VLAN,
328         RTE_FLOW_ITEM_TYPE_IPV6,
329         RTE_FLOW_ITEM_TYPE_ICMP6,
330         RTE_FLOW_ITEM_TYPE_END,
331 };
332
333 enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_icmp6[] = {
334         RTE_FLOW_ITEM_TYPE_ETH,
335         RTE_FLOW_ITEM_TYPE_VLAN,
336         RTE_FLOW_ITEM_TYPE_VLAN,
337         RTE_FLOW_ITEM_TYPE_IPV6,
338         RTE_FLOW_ITEM_TYPE_ICMP6,
339         RTE_FLOW_ITEM_TYPE_END,
340 };
341
342 /* IPv4 GTPC */
343 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpc[] = {
344         RTE_FLOW_ITEM_TYPE_ETH,
345         RTE_FLOW_ITEM_TYPE_IPV4,
346         RTE_FLOW_ITEM_TYPE_UDP,
347         RTE_FLOW_ITEM_TYPE_GTPC,
348         RTE_FLOW_ITEM_TYPE_END,
349 };
350
351 /* IPV4 GTPU (EH) */
352 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu[] = {
353         RTE_FLOW_ITEM_TYPE_ETH,
354         RTE_FLOW_ITEM_TYPE_IPV4,
355         RTE_FLOW_ITEM_TYPE_UDP,
356         RTE_FLOW_ITEM_TYPE_GTPU,
357         RTE_FLOW_ITEM_TYPE_END,
358 };
359
360 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh[] = {
361         RTE_FLOW_ITEM_TYPE_ETH,
362         RTE_FLOW_ITEM_TYPE_IPV4,
363         RTE_FLOW_ITEM_TYPE_UDP,
364         RTE_FLOW_ITEM_TYPE_GTPU,
365         RTE_FLOW_ITEM_TYPE_GTP_PSC,
366         RTE_FLOW_ITEM_TYPE_END,
367 };
368
369 /* IPv6 GTPC */
370 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpc[] = {
371         RTE_FLOW_ITEM_TYPE_ETH,
372         RTE_FLOW_ITEM_TYPE_IPV6,
373         RTE_FLOW_ITEM_TYPE_UDP,
374         RTE_FLOW_ITEM_TYPE_GTPC,
375         RTE_FLOW_ITEM_TYPE_END,
376 };
377
378 /* IPV6 GTPU (EH) */
379 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu[] = {
380         RTE_FLOW_ITEM_TYPE_ETH,
381         RTE_FLOW_ITEM_TYPE_IPV6,
382         RTE_FLOW_ITEM_TYPE_UDP,
383         RTE_FLOW_ITEM_TYPE_GTPU,
384         RTE_FLOW_ITEM_TYPE_END,
385 };
386
387 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh[] = {
388         RTE_FLOW_ITEM_TYPE_ETH,
389         RTE_FLOW_ITEM_TYPE_IPV6,
390         RTE_FLOW_ITEM_TYPE_UDP,
391         RTE_FLOW_ITEM_TYPE_GTPU,
392         RTE_FLOW_ITEM_TYPE_GTP_PSC,
393         RTE_FLOW_ITEM_TYPE_END,
394 };
395
396 /* IPV4 GTPU IPv4 */
397 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv4[] = {
398         RTE_FLOW_ITEM_TYPE_ETH,
399         RTE_FLOW_ITEM_TYPE_IPV4,
400         RTE_FLOW_ITEM_TYPE_UDP,
401         RTE_FLOW_ITEM_TYPE_GTPU,
402         RTE_FLOW_ITEM_TYPE_IPV4,
403         RTE_FLOW_ITEM_TYPE_END,
404 };
405
406 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv4_udp[] = {
407         RTE_FLOW_ITEM_TYPE_ETH,
408         RTE_FLOW_ITEM_TYPE_IPV4,
409         RTE_FLOW_ITEM_TYPE_UDP,
410         RTE_FLOW_ITEM_TYPE_GTPU,
411         RTE_FLOW_ITEM_TYPE_IPV4,
412         RTE_FLOW_ITEM_TYPE_UDP,
413         RTE_FLOW_ITEM_TYPE_END,
414 };
415
416 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv4_tcp[] = {
417         RTE_FLOW_ITEM_TYPE_ETH,
418         RTE_FLOW_ITEM_TYPE_IPV4,
419         RTE_FLOW_ITEM_TYPE_UDP,
420         RTE_FLOW_ITEM_TYPE_GTPU,
421         RTE_FLOW_ITEM_TYPE_IPV4,
422         RTE_FLOW_ITEM_TYPE_TCP,
423         RTE_FLOW_ITEM_TYPE_END,
424 };
425
426 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv4_icmp[] = {
427         RTE_FLOW_ITEM_TYPE_ETH,
428         RTE_FLOW_ITEM_TYPE_IPV4,
429         RTE_FLOW_ITEM_TYPE_UDP,
430         RTE_FLOW_ITEM_TYPE_GTPU,
431         RTE_FLOW_ITEM_TYPE_IPV4,
432         RTE_FLOW_ITEM_TYPE_ICMP,
433         RTE_FLOW_ITEM_TYPE_END,
434 };
435
436 /* IPV4 GTPU IPv6 */
437 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv6[] = {
438         RTE_FLOW_ITEM_TYPE_ETH,
439         RTE_FLOW_ITEM_TYPE_IPV4,
440         RTE_FLOW_ITEM_TYPE_UDP,
441         RTE_FLOW_ITEM_TYPE_GTPU,
442         RTE_FLOW_ITEM_TYPE_IPV6,
443         RTE_FLOW_ITEM_TYPE_END,
444 };
445
446 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv6_udp[] = {
447         RTE_FLOW_ITEM_TYPE_ETH,
448         RTE_FLOW_ITEM_TYPE_IPV4,
449         RTE_FLOW_ITEM_TYPE_UDP,
450         RTE_FLOW_ITEM_TYPE_GTPU,
451         RTE_FLOW_ITEM_TYPE_IPV6,
452         RTE_FLOW_ITEM_TYPE_UDP,
453         RTE_FLOW_ITEM_TYPE_END,
454 };
455
456 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv6_tcp[] = {
457         RTE_FLOW_ITEM_TYPE_ETH,
458         RTE_FLOW_ITEM_TYPE_IPV4,
459         RTE_FLOW_ITEM_TYPE_UDP,
460         RTE_FLOW_ITEM_TYPE_GTPU,
461         RTE_FLOW_ITEM_TYPE_IPV6,
462         RTE_FLOW_ITEM_TYPE_TCP,
463         RTE_FLOW_ITEM_TYPE_END,
464 };
465
466 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_ipv6_icmp[] = {
467         RTE_FLOW_ITEM_TYPE_ETH,
468         RTE_FLOW_ITEM_TYPE_IPV4,
469         RTE_FLOW_ITEM_TYPE_UDP,
470         RTE_FLOW_ITEM_TYPE_GTPU,
471         RTE_FLOW_ITEM_TYPE_IPV6,
472         RTE_FLOW_ITEM_TYPE_ICMP,
473         RTE_FLOW_ITEM_TYPE_END,
474 };
475
476 /* IPV6 GTPU IPv4 */
477 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv4[] = {
478         RTE_FLOW_ITEM_TYPE_ETH,
479         RTE_FLOW_ITEM_TYPE_IPV6,
480         RTE_FLOW_ITEM_TYPE_UDP,
481         RTE_FLOW_ITEM_TYPE_GTPU,
482         RTE_FLOW_ITEM_TYPE_IPV4,
483         RTE_FLOW_ITEM_TYPE_END,
484 };
485
486 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv4_udp[] = {
487         RTE_FLOW_ITEM_TYPE_ETH,
488         RTE_FLOW_ITEM_TYPE_IPV6,
489         RTE_FLOW_ITEM_TYPE_UDP,
490         RTE_FLOW_ITEM_TYPE_GTPU,
491         RTE_FLOW_ITEM_TYPE_IPV4,
492         RTE_FLOW_ITEM_TYPE_UDP,
493         RTE_FLOW_ITEM_TYPE_END,
494 };
495
496 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv4_tcp[] = {
497         RTE_FLOW_ITEM_TYPE_ETH,
498         RTE_FLOW_ITEM_TYPE_IPV6,
499         RTE_FLOW_ITEM_TYPE_UDP,
500         RTE_FLOW_ITEM_TYPE_GTPU,
501         RTE_FLOW_ITEM_TYPE_IPV4,
502         RTE_FLOW_ITEM_TYPE_TCP,
503         RTE_FLOW_ITEM_TYPE_END,
504 };
505
506 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv4_icmp[] = {
507         RTE_FLOW_ITEM_TYPE_ETH,
508         RTE_FLOW_ITEM_TYPE_IPV6,
509         RTE_FLOW_ITEM_TYPE_UDP,
510         RTE_FLOW_ITEM_TYPE_GTPU,
511         RTE_FLOW_ITEM_TYPE_IPV4,
512         RTE_FLOW_ITEM_TYPE_ICMP,
513         RTE_FLOW_ITEM_TYPE_END,
514 };
515
516 /* IPV6 GTPU IPv6 */
517 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv6[] = {
518         RTE_FLOW_ITEM_TYPE_ETH,
519         RTE_FLOW_ITEM_TYPE_IPV6,
520         RTE_FLOW_ITEM_TYPE_UDP,
521         RTE_FLOW_ITEM_TYPE_GTPU,
522         RTE_FLOW_ITEM_TYPE_IPV6,
523         RTE_FLOW_ITEM_TYPE_END,
524 };
525
526 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv6_udp[] = {
527         RTE_FLOW_ITEM_TYPE_ETH,
528         RTE_FLOW_ITEM_TYPE_IPV6,
529         RTE_FLOW_ITEM_TYPE_UDP,
530         RTE_FLOW_ITEM_TYPE_GTPU,
531         RTE_FLOW_ITEM_TYPE_IPV6,
532         RTE_FLOW_ITEM_TYPE_UDP,
533         RTE_FLOW_ITEM_TYPE_END,
534 };
535
536 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv6_tcp[] = {
537         RTE_FLOW_ITEM_TYPE_ETH,
538         RTE_FLOW_ITEM_TYPE_IPV6,
539         RTE_FLOW_ITEM_TYPE_UDP,
540         RTE_FLOW_ITEM_TYPE_GTPU,
541         RTE_FLOW_ITEM_TYPE_IPV6,
542         RTE_FLOW_ITEM_TYPE_TCP,
543         RTE_FLOW_ITEM_TYPE_END,
544 };
545
546 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_ipv6_icmp[] = {
547         RTE_FLOW_ITEM_TYPE_ETH,
548         RTE_FLOW_ITEM_TYPE_IPV6,
549         RTE_FLOW_ITEM_TYPE_UDP,
550         RTE_FLOW_ITEM_TYPE_GTPU,
551         RTE_FLOW_ITEM_TYPE_IPV6,
552         RTE_FLOW_ITEM_TYPE_ICMP,
553         RTE_FLOW_ITEM_TYPE_END,
554 };
555
556 /* IPV4 GTPU EH IPv4 */
557 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv4[] = {
558         RTE_FLOW_ITEM_TYPE_ETH,
559         RTE_FLOW_ITEM_TYPE_IPV4,
560         RTE_FLOW_ITEM_TYPE_UDP,
561         RTE_FLOW_ITEM_TYPE_GTPU,
562         RTE_FLOW_ITEM_TYPE_GTP_PSC,
563         RTE_FLOW_ITEM_TYPE_IPV4,
564         RTE_FLOW_ITEM_TYPE_END,
565 };
566
567 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp[] = {
568         RTE_FLOW_ITEM_TYPE_ETH,
569         RTE_FLOW_ITEM_TYPE_IPV4,
570         RTE_FLOW_ITEM_TYPE_UDP,
571         RTE_FLOW_ITEM_TYPE_GTPU,
572         RTE_FLOW_ITEM_TYPE_GTP_PSC,
573         RTE_FLOW_ITEM_TYPE_IPV4,
574         RTE_FLOW_ITEM_TYPE_UDP,
575         RTE_FLOW_ITEM_TYPE_END,
576 };
577
578 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp[] = {
579         RTE_FLOW_ITEM_TYPE_ETH,
580         RTE_FLOW_ITEM_TYPE_IPV4,
581         RTE_FLOW_ITEM_TYPE_UDP,
582         RTE_FLOW_ITEM_TYPE_GTPU,
583         RTE_FLOW_ITEM_TYPE_GTP_PSC,
584         RTE_FLOW_ITEM_TYPE_IPV4,
585         RTE_FLOW_ITEM_TYPE_TCP,
586         RTE_FLOW_ITEM_TYPE_END,
587 };
588
589 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv4_icmp[] = {
590         RTE_FLOW_ITEM_TYPE_ETH,
591         RTE_FLOW_ITEM_TYPE_IPV4,
592         RTE_FLOW_ITEM_TYPE_UDP,
593         RTE_FLOW_ITEM_TYPE_GTPU,
594         RTE_FLOW_ITEM_TYPE_GTP_PSC,
595         RTE_FLOW_ITEM_TYPE_IPV4,
596         RTE_FLOW_ITEM_TYPE_ICMP,
597         RTE_FLOW_ITEM_TYPE_END,
598 };
599
600 /* IPV4 GTPU EH IPv6 */
601 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv6[] = {
602         RTE_FLOW_ITEM_TYPE_ETH,
603         RTE_FLOW_ITEM_TYPE_IPV4,
604         RTE_FLOW_ITEM_TYPE_UDP,
605         RTE_FLOW_ITEM_TYPE_GTPU,
606         RTE_FLOW_ITEM_TYPE_GTP_PSC,
607         RTE_FLOW_ITEM_TYPE_IPV6,
608         RTE_FLOW_ITEM_TYPE_END,
609 };
610
611 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv6_udp[] = {
612         RTE_FLOW_ITEM_TYPE_ETH,
613         RTE_FLOW_ITEM_TYPE_IPV4,
614         RTE_FLOW_ITEM_TYPE_UDP,
615         RTE_FLOW_ITEM_TYPE_GTPU,
616         RTE_FLOW_ITEM_TYPE_GTP_PSC,
617         RTE_FLOW_ITEM_TYPE_IPV6,
618         RTE_FLOW_ITEM_TYPE_UDP,
619         RTE_FLOW_ITEM_TYPE_END,
620 };
621
622 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv6_tcp[] = {
623         RTE_FLOW_ITEM_TYPE_ETH,
624         RTE_FLOW_ITEM_TYPE_IPV4,
625         RTE_FLOW_ITEM_TYPE_UDP,
626         RTE_FLOW_ITEM_TYPE_GTPU,
627         RTE_FLOW_ITEM_TYPE_GTP_PSC,
628         RTE_FLOW_ITEM_TYPE_IPV6,
629         RTE_FLOW_ITEM_TYPE_TCP,
630         RTE_FLOW_ITEM_TYPE_END,
631 };
632
633 enum rte_flow_item_type iavf_pattern_eth_ipv4_gtpu_eh_ipv6_icmp[] = {
634         RTE_FLOW_ITEM_TYPE_ETH,
635         RTE_FLOW_ITEM_TYPE_IPV4,
636         RTE_FLOW_ITEM_TYPE_UDP,
637         RTE_FLOW_ITEM_TYPE_GTPU,
638         RTE_FLOW_ITEM_TYPE_GTP_PSC,
639         RTE_FLOW_ITEM_TYPE_IPV6,
640         RTE_FLOW_ITEM_TYPE_ICMP,
641         RTE_FLOW_ITEM_TYPE_END,
642 };
643
644 /* IPV6 GTPU EH IPv4 */
645 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv4[] = {
646         RTE_FLOW_ITEM_TYPE_ETH,
647         RTE_FLOW_ITEM_TYPE_IPV6,
648         RTE_FLOW_ITEM_TYPE_UDP,
649         RTE_FLOW_ITEM_TYPE_GTPU,
650         RTE_FLOW_ITEM_TYPE_GTP_PSC,
651         RTE_FLOW_ITEM_TYPE_IPV4,
652         RTE_FLOW_ITEM_TYPE_END,
653 };
654
655 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv4_udp[] = {
656         RTE_FLOW_ITEM_TYPE_ETH,
657         RTE_FLOW_ITEM_TYPE_IPV6,
658         RTE_FLOW_ITEM_TYPE_UDP,
659         RTE_FLOW_ITEM_TYPE_GTPU,
660         RTE_FLOW_ITEM_TYPE_GTP_PSC,
661         RTE_FLOW_ITEM_TYPE_IPV4,
662         RTE_FLOW_ITEM_TYPE_UDP,
663         RTE_FLOW_ITEM_TYPE_END,
664 };
665
666 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv4_tcp[] = {
667         RTE_FLOW_ITEM_TYPE_ETH,
668         RTE_FLOW_ITEM_TYPE_IPV6,
669         RTE_FLOW_ITEM_TYPE_UDP,
670         RTE_FLOW_ITEM_TYPE_GTPU,
671         RTE_FLOW_ITEM_TYPE_GTP_PSC,
672         RTE_FLOW_ITEM_TYPE_IPV4,
673         RTE_FLOW_ITEM_TYPE_TCP,
674         RTE_FLOW_ITEM_TYPE_END,
675 };
676
677 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv4_icmp[] = {
678         RTE_FLOW_ITEM_TYPE_ETH,
679         RTE_FLOW_ITEM_TYPE_IPV6,
680         RTE_FLOW_ITEM_TYPE_UDP,
681         RTE_FLOW_ITEM_TYPE_GTPU,
682         RTE_FLOW_ITEM_TYPE_GTP_PSC,
683         RTE_FLOW_ITEM_TYPE_IPV4,
684         RTE_FLOW_ITEM_TYPE_ICMP,
685         RTE_FLOW_ITEM_TYPE_END,
686 };
687
688 /* IPV6 GTPU EH IPv6 */
689 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv6[] = {
690         RTE_FLOW_ITEM_TYPE_ETH,
691         RTE_FLOW_ITEM_TYPE_IPV6,
692         RTE_FLOW_ITEM_TYPE_UDP,
693         RTE_FLOW_ITEM_TYPE_GTPU,
694         RTE_FLOW_ITEM_TYPE_GTP_PSC,
695         RTE_FLOW_ITEM_TYPE_IPV6,
696         RTE_FLOW_ITEM_TYPE_END,
697 };
698
699 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv6_udp[] = {
700         RTE_FLOW_ITEM_TYPE_ETH,
701         RTE_FLOW_ITEM_TYPE_IPV6,
702         RTE_FLOW_ITEM_TYPE_UDP,
703         RTE_FLOW_ITEM_TYPE_GTPU,
704         RTE_FLOW_ITEM_TYPE_GTP_PSC,
705         RTE_FLOW_ITEM_TYPE_IPV6,
706         RTE_FLOW_ITEM_TYPE_UDP,
707         RTE_FLOW_ITEM_TYPE_END,
708 };
709
710 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv6_tcp[] = {
711         RTE_FLOW_ITEM_TYPE_ETH,
712         RTE_FLOW_ITEM_TYPE_IPV6,
713         RTE_FLOW_ITEM_TYPE_UDP,
714         RTE_FLOW_ITEM_TYPE_GTPU,
715         RTE_FLOW_ITEM_TYPE_GTP_PSC,
716         RTE_FLOW_ITEM_TYPE_IPV6,
717         RTE_FLOW_ITEM_TYPE_TCP,
718         RTE_FLOW_ITEM_TYPE_END,
719 };
720
721 enum rte_flow_item_type iavf_pattern_eth_ipv6_gtpu_eh_ipv6_icmp[] = {
722         RTE_FLOW_ITEM_TYPE_ETH,
723         RTE_FLOW_ITEM_TYPE_IPV6,
724         RTE_FLOW_ITEM_TYPE_UDP,
725         RTE_FLOW_ITEM_TYPE_GTPU,
726         RTE_FLOW_ITEM_TYPE_GTP_PSC,
727         RTE_FLOW_ITEM_TYPE_IPV6,
728         RTE_FLOW_ITEM_TYPE_ICMP,
729         RTE_FLOW_ITEM_TYPE_END,
730 };
731
732 /* ESP */
733 enum rte_flow_item_type iavf_pattern_eth_ipv4_esp[] = {
734         RTE_FLOW_ITEM_TYPE_ETH,
735         RTE_FLOW_ITEM_TYPE_IPV4,
736         RTE_FLOW_ITEM_TYPE_ESP,
737         RTE_FLOW_ITEM_TYPE_END,
738 };
739
740 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_esp[] = {
741         RTE_FLOW_ITEM_TYPE_ETH,
742         RTE_FLOW_ITEM_TYPE_IPV4,
743         RTE_FLOW_ITEM_TYPE_UDP,
744         RTE_FLOW_ITEM_TYPE_ESP,
745         RTE_FLOW_ITEM_TYPE_END,
746 };
747
748 enum rte_flow_item_type iavf_pattern_eth_ipv6_esp[] = {
749         RTE_FLOW_ITEM_TYPE_ETH,
750         RTE_FLOW_ITEM_TYPE_IPV6,
751         RTE_FLOW_ITEM_TYPE_ESP,
752         RTE_FLOW_ITEM_TYPE_END,
753 };
754
755 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_esp[] = {
756         RTE_FLOW_ITEM_TYPE_ETH,
757         RTE_FLOW_ITEM_TYPE_IPV6,
758         RTE_FLOW_ITEM_TYPE_UDP,
759         RTE_FLOW_ITEM_TYPE_ESP,
760         RTE_FLOW_ITEM_TYPE_END,
761 };
762
763 /* AH */
764 enum rte_flow_item_type iavf_pattern_eth_ipv4_ah[] = {
765         RTE_FLOW_ITEM_TYPE_ETH,
766         RTE_FLOW_ITEM_TYPE_IPV4,
767         RTE_FLOW_ITEM_TYPE_AH,
768         RTE_FLOW_ITEM_TYPE_END,
769 };
770
771 enum rte_flow_item_type iavf_pattern_eth_ipv6_ah[] = {
772         RTE_FLOW_ITEM_TYPE_ETH,
773         RTE_FLOW_ITEM_TYPE_IPV6,
774         RTE_FLOW_ITEM_TYPE_AH,
775         RTE_FLOW_ITEM_TYPE_END,
776 };
777
778 /* L2TPV3 */
779 enum rte_flow_item_type iavf_pattern_eth_ipv4_l2tpv3[] = {
780         RTE_FLOW_ITEM_TYPE_ETH,
781         RTE_FLOW_ITEM_TYPE_IPV4,
782         RTE_FLOW_ITEM_TYPE_L2TPV3OIP,
783         RTE_FLOW_ITEM_TYPE_END,
784 };
785
786 enum rte_flow_item_type iavf_pattern_eth_ipv6_l2tpv3[] = {
787         RTE_FLOW_ITEM_TYPE_ETH,
788         RTE_FLOW_ITEM_TYPE_IPV6,
789         RTE_FLOW_ITEM_TYPE_L2TPV3OIP,
790         RTE_FLOW_ITEM_TYPE_END,
791 };
792
793 /* PFCP */
794 enum rte_flow_item_type iavf_pattern_eth_ipv4_pfcp[] = {
795         RTE_FLOW_ITEM_TYPE_ETH,
796         RTE_FLOW_ITEM_TYPE_IPV4,
797         RTE_FLOW_ITEM_TYPE_UDP,
798         RTE_FLOW_ITEM_TYPE_PFCP,
799         RTE_FLOW_ITEM_TYPE_END,
800 };
801
802 enum rte_flow_item_type iavf_pattern_eth_ipv6_pfcp[] = {
803         RTE_FLOW_ITEM_TYPE_ETH,
804         RTE_FLOW_ITEM_TYPE_IPV6,
805         RTE_FLOW_ITEM_TYPE_UDP,
806         RTE_FLOW_ITEM_TYPE_PFCP,
807         RTE_FLOW_ITEM_TYPE_END,
808 };
809
810 /* ECPRI */
811 enum rte_flow_item_type iavf_pattern_eth_ecpri[] = {
812         RTE_FLOW_ITEM_TYPE_ETH,
813         RTE_FLOW_ITEM_TYPE_ECPRI,
814         RTE_FLOW_ITEM_TYPE_END,
815 };
816
817 enum rte_flow_item_type iavf_pattern_eth_ipv4_ecpri[] = {
818         RTE_FLOW_ITEM_TYPE_ETH,
819         RTE_FLOW_ITEM_TYPE_IPV4,
820         RTE_FLOW_ITEM_TYPE_UDP,
821         RTE_FLOW_ITEM_TYPE_ECPRI,
822         RTE_FLOW_ITEM_TYPE_END,
823 };
824
825 typedef struct iavf_flow_engine * (*parse_engine_t)(struct iavf_adapter *ad,
826                 struct rte_flow *flow,
827                 struct iavf_parser_list *parser_list,
828                 const struct rte_flow_item pattern[],
829                 const struct rte_flow_action actions[],
830                 struct rte_flow_error *error);
831
832 void
833 iavf_register_flow_engine(struct iavf_flow_engine *engine)
834 {
835         TAILQ_INSERT_TAIL(&engine_list, engine, node);
836 }
837
838 int
839 iavf_flow_init(struct iavf_adapter *ad)
840 {
841         int ret;
842         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
843         void *temp;
844         struct iavf_flow_engine *engine;
845
846         TAILQ_INIT(&vf->flow_list);
847         TAILQ_INIT(&vf->rss_parser_list);
848         TAILQ_INIT(&vf->dist_parser_list);
849         rte_spinlock_init(&vf->flow_ops_lock);
850
851         TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
852                 if (engine->init == NULL) {
853                         PMD_INIT_LOG(ERR, "Invalid engine type (%d)",
854                                      engine->type);
855                         return -ENOTSUP;
856                 }
857
858                 ret = engine->init(ad);
859                 if (ret && ret != -ENOTSUP) {
860                         PMD_INIT_LOG(ERR, "Failed to initialize engine %d",
861                                      engine->type);
862                         return ret;
863                 }
864         }
865         return 0;
866 }
867
868 void
869 iavf_flow_uninit(struct iavf_adapter *ad)
870 {
871         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
872         struct iavf_flow_engine *engine;
873         struct rte_flow *p_flow;
874         struct iavf_flow_parser_node *p_parser;
875         void *temp;
876
877         TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
878                 if (engine->uninit)
879                         engine->uninit(ad);
880         }
881
882         /* Remove all flows */
883         while ((p_flow = TAILQ_FIRST(&vf->flow_list))) {
884                 TAILQ_REMOVE(&vf->flow_list, p_flow, node);
885                 if (p_flow->engine->free)
886                         p_flow->engine->free(p_flow);
887                 rte_free(p_flow);
888         }
889
890         /* Cleanup parser list */
891         while ((p_parser = TAILQ_FIRST(&vf->rss_parser_list))) {
892                 TAILQ_REMOVE(&vf->rss_parser_list, p_parser, node);
893                 rte_free(p_parser);
894         }
895
896         while ((p_parser = TAILQ_FIRST(&vf->dist_parser_list))) {
897                 TAILQ_REMOVE(&vf->dist_parser_list, p_parser, node);
898                 rte_free(p_parser);
899         }
900 }
901
902 int
903 iavf_register_parser(struct iavf_flow_parser *parser,
904                      struct iavf_adapter *ad)
905 {
906         struct iavf_parser_list *list = NULL;
907         struct iavf_flow_parser_node *parser_node;
908         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
909
910         parser_node = rte_zmalloc("iavf_parser", sizeof(*parser_node), 0);
911         if (parser_node == NULL) {
912                 PMD_DRV_LOG(ERR, "Failed to allocate memory.");
913                 return -ENOMEM;
914         }
915         parser_node->parser = parser;
916
917         if (parser->engine->type == IAVF_FLOW_ENGINE_HASH) {
918                 list = &vf->rss_parser_list;
919                 TAILQ_INSERT_TAIL(list, parser_node, node);
920         } else if (parser->engine->type == IAVF_FLOW_ENGINE_FDIR) {
921                 list = &vf->dist_parser_list;
922                 TAILQ_INSERT_HEAD(list, parser_node, node);
923         } else {
924                 return -EINVAL;
925         }
926
927         return 0;
928 }
929
930 void
931 iavf_unregister_parser(struct iavf_flow_parser *parser,
932                        struct iavf_adapter *ad)
933 {
934         struct iavf_parser_list *list = NULL;
935         struct iavf_flow_parser_node *p_parser;
936         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
937         void *temp;
938
939         if (parser->engine->type == IAVF_FLOW_ENGINE_HASH)
940                 list = &vf->rss_parser_list;
941         else if (parser->engine->type == IAVF_FLOW_ENGINE_FDIR)
942                 list = &vf->dist_parser_list;
943
944         if (list == NULL)
945                 return;
946
947         TAILQ_FOREACH_SAFE(p_parser, list, node, temp) {
948                 if (p_parser->parser->engine->type == parser->engine->type) {
949                         TAILQ_REMOVE(list, p_parser, node);
950                         rte_free(p_parser);
951                 }
952         }
953 }
954
955 static int
956 iavf_flow_valid_attr(const struct rte_flow_attr *attr,
957                      struct rte_flow_error *error)
958 {
959         /* Must be input direction */
960         if (!attr->ingress) {
961                 rte_flow_error_set(error, EINVAL,
962                                 RTE_FLOW_ERROR_TYPE_ATTR_INGRESS,
963                                 attr, "Only support ingress.");
964                 return -rte_errno;
965         }
966
967         /* Not supported */
968         if (attr->egress) {
969                 rte_flow_error_set(error, EINVAL,
970                                 RTE_FLOW_ERROR_TYPE_ATTR_EGRESS,
971                                 attr, "Not support egress.");
972                 return -rte_errno;
973         }
974
975         /* Not supported */
976         if (attr->priority) {
977                 rte_flow_error_set(error, EINVAL,
978                                 RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,
979                                 attr, "Not support priority.");
980                 return -rte_errno;
981         }
982
983         /* Not supported */
984         if (attr->group) {
985                 rte_flow_error_set(error, EINVAL,
986                                 RTE_FLOW_ERROR_TYPE_ATTR_GROUP,
987                                 attr, "Not support group.");
988                 return -rte_errno;
989         }
990
991         return 0;
992 }
993
994 /* Find the first VOID or non-VOID item pointer */
995 static const struct rte_flow_item *
996 iavf_find_first_item(const struct rte_flow_item *item, bool is_void)
997 {
998         bool is_find;
999
1000         while (item->type != RTE_FLOW_ITEM_TYPE_END) {
1001                 if (is_void)
1002                         is_find = item->type == RTE_FLOW_ITEM_TYPE_VOID;
1003                 else
1004                         is_find = item->type != RTE_FLOW_ITEM_TYPE_VOID;
1005                 if (is_find)
1006                         break;
1007                 item++;
1008         }
1009         return item;
1010 }
1011
1012 /* Skip all VOID items of the pattern */
1013 static void
1014 iavf_pattern_skip_void_item(struct rte_flow_item *items,
1015                         const struct rte_flow_item *pattern)
1016 {
1017         uint32_t cpy_count = 0;
1018         const struct rte_flow_item *pb = pattern, *pe = pattern;
1019
1020         for (;;) {
1021                 /* Find a non-void item first */
1022                 pb = iavf_find_first_item(pb, false);
1023                 if (pb->type == RTE_FLOW_ITEM_TYPE_END) {
1024                         pe = pb;
1025                         break;
1026                 }
1027
1028                 /* Find a void item */
1029                 pe = iavf_find_first_item(pb + 1, true);
1030
1031                 cpy_count = pe - pb;
1032                 rte_memcpy(items, pb, sizeof(struct rte_flow_item) * cpy_count);
1033
1034                 items += cpy_count;
1035
1036                 if (pe->type == RTE_FLOW_ITEM_TYPE_END)
1037                         break;
1038
1039                 pb = pe + 1;
1040         }
1041         /* Copy the END item. */
1042         rte_memcpy(items, pe, sizeof(struct rte_flow_item));
1043 }
1044
1045 /* Check if the pattern matches a supported item type array */
1046 static bool
1047 iavf_match_pattern(enum rte_flow_item_type *item_array,
1048                    const struct rte_flow_item *pattern)
1049 {
1050         const struct rte_flow_item *item = pattern;
1051
1052         while ((*item_array == item->type) &&
1053                (*item_array != RTE_FLOW_ITEM_TYPE_END)) {
1054                 item_array++;
1055                 item++;
1056         }
1057
1058         return (*item_array == RTE_FLOW_ITEM_TYPE_END &&
1059                 item->type == RTE_FLOW_ITEM_TYPE_END);
1060 }
1061
1062 struct iavf_pattern_match_item *
1063 iavf_search_pattern_match_item(const struct rte_flow_item pattern[],
1064                 struct iavf_pattern_match_item *array,
1065                 uint32_t array_len,
1066                 struct rte_flow_error *error)
1067 {
1068         uint16_t i = 0;
1069         struct iavf_pattern_match_item *pattern_match_item;
1070         /* need free by each filter */
1071         struct rte_flow_item *items; /* used for pattern without VOID items */
1072         uint32_t item_num = 0; /* non-void item number */
1073
1074         /* Get the non-void item number of pattern */
1075         while ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_END) {
1076                 if ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_VOID)
1077                         item_num++;
1078                 i++;
1079         }
1080         item_num++;
1081
1082         items = rte_zmalloc("iavf_pattern",
1083                             item_num * sizeof(struct rte_flow_item), 0);
1084         if (!items) {
1085                 rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
1086                                    NULL, "No memory for PMD internal items.");
1087                 return NULL;
1088         }
1089         pattern_match_item = rte_zmalloc("iavf_pattern_match_item",
1090                                 sizeof(struct iavf_pattern_match_item), 0);
1091         if (!pattern_match_item) {
1092                 rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_HANDLE,
1093                                    NULL, "Failed to allocate memory.");
1094                 return NULL;
1095         }
1096
1097         iavf_pattern_skip_void_item(items, pattern);
1098
1099         for (i = 0; i < array_len; i++)
1100                 if (iavf_match_pattern(array[i].pattern_list,
1101                                        items)) {
1102                         pattern_match_item->input_set_mask =
1103                                 array[i].input_set_mask;
1104                         pattern_match_item->pattern_list =
1105                                 array[i].pattern_list;
1106                         pattern_match_item->meta = array[i].meta;
1107                         rte_free(items);
1108                         return pattern_match_item;
1109                 }
1110         rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM,
1111                            pattern, "Unsupported pattern");
1112
1113         rte_free(items);
1114         rte_free(pattern_match_item);
1115         return NULL;
1116 }
1117
1118 static struct iavf_flow_engine *
1119 iavf_parse_engine_create(struct iavf_adapter *ad,
1120                 struct rte_flow *flow,
1121                 struct iavf_parser_list *parser_list,
1122                 const struct rte_flow_item pattern[],
1123                 const struct rte_flow_action actions[],
1124                 struct rte_flow_error *error)
1125 {
1126         struct iavf_flow_engine *engine = NULL;
1127         struct iavf_flow_parser_node *parser_node;
1128         void *temp;
1129         void *meta = NULL;
1130
1131         TAILQ_FOREACH_SAFE(parser_node, parser_list, node, temp) {
1132                 if (parser_node->parser->parse_pattern_action(ad,
1133                                 parser_node->parser->array,
1134                                 parser_node->parser->array_len,
1135                                 pattern, actions, &meta, error) < 0)
1136                         continue;
1137
1138                 engine = parser_node->parser->engine;
1139
1140                 RTE_ASSERT(engine->create != NULL);
1141                 if (!(engine->create(ad, flow, meta, error)))
1142                         return engine;
1143         }
1144         return NULL;
1145 }
1146
1147 static struct iavf_flow_engine *
1148 iavf_parse_engine_validate(struct iavf_adapter *ad,
1149                 struct rte_flow *flow,
1150                 struct iavf_parser_list *parser_list,
1151                 const struct rte_flow_item pattern[],
1152                 const struct rte_flow_action actions[],
1153                 struct rte_flow_error *error)
1154 {
1155         struct iavf_flow_engine *engine = NULL;
1156         struct iavf_flow_parser_node *parser_node;
1157         void *temp;
1158         void *meta = NULL;
1159
1160         TAILQ_FOREACH_SAFE(parser_node, parser_list, node, temp) {
1161                 if (parser_node->parser->parse_pattern_action(ad,
1162                                 parser_node->parser->array,
1163                                 parser_node->parser->array_len,
1164                                 pattern, actions, &meta,  error) < 0)
1165                         continue;
1166
1167                 engine = parser_node->parser->engine;
1168                 if (engine->validation == NULL) {
1169                         rte_flow_error_set(error, EINVAL,
1170                                 RTE_FLOW_ERROR_TYPE_HANDLE,
1171                                 NULL, "Validation not support");
1172                         continue;
1173                 }
1174
1175                 if (engine->validation(ad, flow, meta, error)) {
1176                         rte_flow_error_set(error, EINVAL,
1177                                 RTE_FLOW_ERROR_TYPE_HANDLE,
1178                                 NULL, "Validation failed");
1179                         break;
1180                 }
1181         }
1182         return engine;
1183 }
1184
1185
1186 static int
1187 iavf_flow_process_filter(struct rte_eth_dev *dev,
1188                 struct rte_flow *flow,
1189                 const struct rte_flow_attr *attr,
1190                 const struct rte_flow_item pattern[],
1191                 const struct rte_flow_action actions[],
1192                 struct iavf_flow_engine **engine,
1193                 parse_engine_t iavf_parse_engine,
1194                 struct rte_flow_error *error)
1195 {
1196         int ret = IAVF_ERR_CONFIG;
1197         struct iavf_adapter *ad =
1198                 IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
1199         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
1200
1201         if (!pattern) {
1202                 rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
1203                                    NULL, "NULL pattern.");
1204                 return -rte_errno;
1205         }
1206
1207         if (!actions) {
1208                 rte_flow_error_set(error, EINVAL,
1209                                    RTE_FLOW_ERROR_TYPE_ACTION_NUM,
1210                                    NULL, "NULL action.");
1211                 return -rte_errno;
1212         }
1213
1214         if (!attr) {
1215                 rte_flow_error_set(error, EINVAL,
1216                                    RTE_FLOW_ERROR_TYPE_ATTR,
1217                                    NULL, "NULL attribute.");
1218                 return -rte_errno;
1219         }
1220
1221         ret = iavf_flow_valid_attr(attr, error);
1222         if (ret)
1223                 return ret;
1224
1225         *engine = iavf_parse_engine(ad, flow, &vf->rss_parser_list, pattern,
1226                                     actions, error);
1227         if (*engine)
1228                 return 0;
1229
1230         *engine = iavf_parse_engine(ad, flow, &vf->dist_parser_list, pattern,
1231                                     actions, error);
1232
1233         if (!*engine) {
1234                 rte_flow_error_set(error, EINVAL,
1235                                    RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1236                                    "Failed to create parser engine.");
1237                 return -rte_errno;
1238         }
1239
1240         return 0;
1241 }
1242
1243 static int
1244 iavf_flow_validate(struct rte_eth_dev *dev,
1245                 const struct rte_flow_attr *attr,
1246                 const struct rte_flow_item pattern[],
1247                 const struct rte_flow_action actions[],
1248                 struct rte_flow_error *error)
1249 {
1250         struct iavf_flow_engine *engine;
1251
1252         return iavf_flow_process_filter(dev, NULL, attr, pattern, actions,
1253                         &engine, iavf_parse_engine_validate, error);
1254 }
1255
1256 static struct rte_flow *
1257 iavf_flow_create(struct rte_eth_dev *dev,
1258                  const struct rte_flow_attr *attr,
1259                  const struct rte_flow_item pattern[],
1260                  const struct rte_flow_action actions[],
1261                  struct rte_flow_error *error)
1262 {
1263         struct iavf_adapter *ad =
1264                 IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
1265         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
1266         struct iavf_flow_engine *engine = NULL;
1267         struct rte_flow *flow = NULL;
1268         int ret;
1269
1270         flow = rte_zmalloc("iavf_flow", sizeof(struct rte_flow), 0);
1271         if (!flow) {
1272                 rte_flow_error_set(error, ENOMEM,
1273                                    RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1274                                    "Failed to allocate memory");
1275                 return flow;
1276         }
1277
1278         ret = iavf_flow_process_filter(dev, flow, attr, pattern, actions,
1279                         &engine, iavf_parse_engine_create, error);
1280         if (ret < 0) {
1281                 PMD_DRV_LOG(ERR, "Failed to create flow");
1282                 rte_free(flow);
1283                 flow = NULL;
1284                 goto free_flow;
1285         }
1286
1287         flow->engine = engine;
1288         TAILQ_INSERT_TAIL(&vf->flow_list, flow, node);
1289         PMD_DRV_LOG(INFO, "Succeeded to create (%d) flow", engine->type);
1290
1291 free_flow:
1292         rte_spinlock_unlock(&vf->flow_ops_lock);
1293         return flow;
1294 }
1295
1296 static bool
1297 iavf_flow_is_valid(struct rte_flow *flow)
1298 {
1299         struct iavf_flow_engine *engine;
1300         void *temp;
1301
1302         if (flow && flow->engine) {
1303                 TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
1304                         if (engine == flow->engine)
1305                                 return true;
1306                 }
1307         }
1308
1309         return false;
1310 }
1311
1312 static int
1313 iavf_flow_destroy(struct rte_eth_dev *dev,
1314                   struct rte_flow *flow,
1315                   struct rte_flow_error *error)
1316 {
1317         struct iavf_adapter *ad =
1318                 IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
1319         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
1320         int ret = 0;
1321
1322         if (!iavf_flow_is_valid(flow) || !flow->engine->destroy) {
1323                 rte_flow_error_set(error, EINVAL,
1324                                    RTE_FLOW_ERROR_TYPE_HANDLE,
1325                                    NULL, "Invalid flow destroy");
1326                 return -rte_errno;
1327         }
1328
1329         rte_spinlock_lock(&vf->flow_ops_lock);
1330
1331         ret = flow->engine->destroy(ad, flow, error);
1332
1333         if (!ret) {
1334                 TAILQ_REMOVE(&vf->flow_list, flow, node);
1335                 rte_free(flow);
1336         } else {
1337                 PMD_DRV_LOG(ERR, "Failed to destroy flow");
1338         }
1339
1340         rte_spinlock_unlock(&vf->flow_ops_lock);
1341
1342         return ret;
1343 }
1344
1345 int
1346 iavf_flow_flush(struct rte_eth_dev *dev,
1347                 struct rte_flow_error *error)
1348 {
1349         struct iavf_adapter *ad =
1350                 IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
1351         struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
1352         struct rte_flow *p_flow;
1353         void *temp;
1354         int ret = 0;
1355
1356         TAILQ_FOREACH_SAFE(p_flow, &vf->flow_list, node, temp) {
1357                 ret = iavf_flow_destroy(dev, p_flow, error);
1358                 if (ret) {
1359                         PMD_DRV_LOG(ERR, "Failed to flush flows");
1360                         return -EINVAL;
1361                 }
1362         }
1363
1364         return ret;
1365 }
1366
1367 static int
1368 iavf_flow_query(struct rte_eth_dev *dev,
1369                 struct rte_flow *flow,
1370                 const struct rte_flow_action *actions,
1371                 void *data,
1372                 struct rte_flow_error *error)
1373 {
1374         int ret = -EINVAL;
1375         struct iavf_adapter *ad =
1376                 IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
1377         struct rte_flow_query_count *count = data;
1378
1379         if (!iavf_flow_is_valid(flow) || !flow->engine->query_count) {
1380                 rte_flow_error_set(error, EINVAL,
1381                                    RTE_FLOW_ERROR_TYPE_HANDLE,
1382                                    NULL, "Invalid flow query");
1383                 return -rte_errno;
1384         }
1385
1386         for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
1387                 switch (actions->type) {
1388                 case RTE_FLOW_ACTION_TYPE_VOID:
1389                         break;
1390                 case RTE_FLOW_ACTION_TYPE_COUNT:
1391                         ret = flow->engine->query_count(ad, flow, count, error);
1392                         break;
1393                 default:
1394                         return rte_flow_error_set(error, ENOTSUP,
1395                                         RTE_FLOW_ERROR_TYPE_ACTION,
1396                                         actions,
1397                                         "action not supported");
1398                 }
1399         }
1400         return ret;
1401 }
1402