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