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