xref: /dpdk/drivers/net/ice/ice_generic_flow.h (revision 85cf6dc3)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019 Intel Corporation
3  */
4 
5 #ifndef _ICE_GENERIC_FLOW_H_
6 #define _ICE_GENERIC_FLOW_H_
7 
8 #include <rte_flow_driver.h>
9 
10 struct ice_flow_pattern {
11 	enum rte_flow_item_type *items;
12 	uint64_t sw_fields;
13 };
14 
15 #define ICE_INSET_NONE            0x00000000000000000ULL
16 
17 /* bit0 ~ bit 7 */
18 #define ICE_INSET_SMAC            0x0000000000000001ULL
19 #define ICE_INSET_DMAC            0x0000000000000002ULL
20 #define ICE_INSET_ETHERTYPE       0x0000000000000020ULL
21 
22 /* bit 8 ~ bit 15 */
23 #define ICE_INSET_IPV4_SRC        0x0000000000000100ULL
24 #define ICE_INSET_IPV4_DST        0x0000000000000200ULL
25 #define ICE_INSET_IPV6_SRC        0x0000000000000400ULL
26 #define ICE_INSET_IPV6_DST        0x0000000000000800ULL
27 #define ICE_INSET_SRC_PORT        0x0000000000001000ULL
28 #define ICE_INSET_DST_PORT        0x0000000000002000ULL
29 #define ICE_INSET_ARP             0x0000000000004000ULL
30 
31 /* bit 16 ~ bit 31 */
32 #define ICE_INSET_IPV4_TOS        0x0000000000010000ULL
33 #define ICE_INSET_IPV4_PROTO      0x0000000000020000ULL
34 #define ICE_INSET_IPV4_TTL        0x0000000000040000ULL
35 #define ICE_INSET_IPV6_TOS        0x0000000000100000ULL
36 #define ICE_INSET_IPV6_PROTO      0x0000000000200000ULL
37 #define ICE_INSET_IPV6_HOP_LIMIT  0x0000000000400000ULL
38 #define ICE_INSET_ICMP            0x0000000001000000ULL
39 #define ICE_INSET_ICMP6           0x0000000002000000ULL
40 
41 /* bit 32 ~ bit 47, tunnel fields */
42 #define ICE_INSET_TUN_SMAC           0x0000000100000000ULL
43 #define ICE_INSET_TUN_DMAC           0x0000000200000000ULL
44 #define ICE_INSET_TUN_IPV4_SRC       0x0000000400000000ULL
45 #define ICE_INSET_TUN_IPV4_DST       0x0000000800000000ULL
46 #define ICE_INSET_TUN_IPV4_TTL       0x0000001000000000ULL
47 #define ICE_INSET_TUN_IPV4_PROTO     0x0000002000000000ULL
48 #define ICE_INSET_TUN_IPV6_SRC       0x0000004000000000ULL
49 #define ICE_INSET_TUN_IPV6_DST       0x0000008000000000ULL
50 #define ICE_INSET_TUN_IPV6_TTL       0x0000010000000000ULL
51 #define ICE_INSET_TUN_IPV6_PROTO     0x0000020000000000ULL
52 #define ICE_INSET_TUN_SRC_PORT       0x0000040000000000ULL
53 #define ICE_INSET_TUN_DST_PORT       0x0000080000000000ULL
54 #define ICE_INSET_TUN_ID             0x0000100000000000ULL
55 
56 /* bit 48 ~ bit 55 */
57 #define ICE_INSET_LAST_ETHER_TYPE 0x0001000000000000ULL
58 
59 #define ICE_FLAG_VLAN_INNER  0x00000001ULL
60 #define ICE_FLAG_VLAN_OUTER  0x00000002ULL
61 
62 #define INSET_ETHER ( \
63 	ICE_INSET_DMAC | ICE_INSET_SMAC | ICE_INSET_ETHERTYPE)
64 #define INSET_MAC_IPV4 ( \
65 	ICE_INSET_DMAC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_SRC | \
66 	ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_TOS)
67 #define INSET_MAC_IPV4_L4 ( \
68 	ICE_INSET_DMAC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_SRC | \
69 	ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_TOS | ICE_INSET_DST_PORT | \
70 	ICE_INSET_SRC_PORT)
71 #define INSET_MAC_IPV4_ICMP ( \
72 	ICE_INSET_DMAC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_SRC | \
73 	ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_TOS | ICE_INSET_ICMP)
74 #define INSET_MAC_IPV6 ( \
75 	ICE_INSET_DMAC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_SRC | \
76 	ICE_INSET_IPV6_TOS | ICE_INSET_IPV6_HOP_LIMIT)
77 #define INSET_MAC_IPV6_L4 ( \
78 	ICE_INSET_DMAC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_SRC | \
79 	ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_TOS | \
80 	ICE_INSET_DST_PORT | ICE_INSET_SRC_PORT)
81 #define INSET_MAC_IPV6_ICMP ( \
82 	ICE_INSET_DMAC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_SRC | \
83 	ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_TOS | ICE_INSET_ICMP6)
84 #define INSET_TUNNEL_IPV4_TYPE1 ( \
85 	ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \
86 	ICE_INSET_TUN_IPV4_TTL | ICE_INSET_TUN_IPV4_PROTO)
87 #define INSET_TUNNEL_IPV4_TYPE2 ( \
88 	ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \
89 	ICE_INSET_TUN_IPV4_TTL | ICE_INSET_TUN_IPV4_PROTO | \
90 	ICE_INSET_TUN_SRC_PORT | ICE_INSET_TUN_DST_PORT)
91 #define INSET_TUNNEL_IPV4_TYPE3 ( \
92 	ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \
93 	ICE_INSET_TUN_IPV4_TTL | ICE_INSET_ICMP)
94 #define INSET_TUNNEL_IPV6_TYPE1 ( \
95 	ICE_INSET_TUN_IPV6_SRC | ICE_INSET_TUN_IPV6_DST | \
96 	ICE_INSET_TUN_IPV6_TTL | ICE_INSET_TUN_IPV6_PROTO)
97 #define INSET_TUNNEL_IPV6_TYPE2 ( \
98 	ICE_INSET_TUN_IPV6_SRC | ICE_INSET_TUN_IPV6_DST | \
99 	ICE_INSET_TUN_IPV6_TTL | ICE_INSET_TUN_IPV6_PROTO | \
100 	ICE_INSET_TUN_SRC_PORT | ICE_INSET_TUN_DST_PORT)
101 #define INSET_TUNNEL_IPV6_TYPE3 ( \
102 	ICE_INSET_TUN_IPV6_SRC | ICE_INSET_TUN_IPV6_DST | \
103 	ICE_INSET_TUN_IPV6_TTL | ICE_INSET_ICMP6)
104 
105 /* L2 */
106 static enum rte_flow_item_type pattern_ethertype[] = {
107 	RTE_FLOW_ITEM_TYPE_ETH,
108 	RTE_FLOW_ITEM_TYPE_END,
109 };
110 
111 /* non-tunnel IPv4 */
112 static enum rte_flow_item_type pattern_ipv4[] = {
113 	RTE_FLOW_ITEM_TYPE_ETH,
114 	RTE_FLOW_ITEM_TYPE_IPV4,
115 	RTE_FLOW_ITEM_TYPE_END,
116 };
117 
118 static enum rte_flow_item_type pattern_ipv4_udp[] = {
119 	RTE_FLOW_ITEM_TYPE_ETH,
120 	RTE_FLOW_ITEM_TYPE_IPV4,
121 	RTE_FLOW_ITEM_TYPE_UDP,
122 	RTE_FLOW_ITEM_TYPE_END,
123 };
124 
125 static enum rte_flow_item_type pattern_ipv4_tcp[] = {
126 	RTE_FLOW_ITEM_TYPE_ETH,
127 	RTE_FLOW_ITEM_TYPE_IPV4,
128 	RTE_FLOW_ITEM_TYPE_TCP,
129 	RTE_FLOW_ITEM_TYPE_END,
130 };
131 
132 static enum rte_flow_item_type pattern_ipv4_sctp[] = {
133 	RTE_FLOW_ITEM_TYPE_ETH,
134 	RTE_FLOW_ITEM_TYPE_IPV4,
135 	RTE_FLOW_ITEM_TYPE_SCTP,
136 	RTE_FLOW_ITEM_TYPE_END,
137 };
138 
139 static enum rte_flow_item_type pattern_ipv4_icmp[] = {
140 	RTE_FLOW_ITEM_TYPE_ETH,
141 	RTE_FLOW_ITEM_TYPE_IPV4,
142 	RTE_FLOW_ITEM_TYPE_ICMP,
143 	RTE_FLOW_ITEM_TYPE_END,
144 };
145 
146 /* non-tunnel IPv6 */
147 static enum rte_flow_item_type pattern_ipv6[] = {
148 	RTE_FLOW_ITEM_TYPE_ETH,
149 	RTE_FLOW_ITEM_TYPE_IPV6,
150 	RTE_FLOW_ITEM_TYPE_END,
151 };
152 
153 static enum rte_flow_item_type pattern_ipv6_udp[] = {
154 	RTE_FLOW_ITEM_TYPE_ETH,
155 	RTE_FLOW_ITEM_TYPE_IPV6,
156 	RTE_FLOW_ITEM_TYPE_UDP,
157 	RTE_FLOW_ITEM_TYPE_END,
158 };
159 
160 static enum rte_flow_item_type pattern_ipv6_tcp[] = {
161 	RTE_FLOW_ITEM_TYPE_ETH,
162 	RTE_FLOW_ITEM_TYPE_IPV6,
163 	RTE_FLOW_ITEM_TYPE_TCP,
164 	RTE_FLOW_ITEM_TYPE_END,
165 };
166 
167 static enum rte_flow_item_type pattern_ipv6_sctp[] = {
168 	RTE_FLOW_ITEM_TYPE_ETH,
169 	RTE_FLOW_ITEM_TYPE_IPV6,
170 	RTE_FLOW_ITEM_TYPE_SCTP,
171 	RTE_FLOW_ITEM_TYPE_END,
172 };
173 
174 static enum rte_flow_item_type pattern_ipv6_icmp6[] = {
175 	RTE_FLOW_ITEM_TYPE_ETH,
176 	RTE_FLOW_ITEM_TYPE_IPV6,
177 	RTE_FLOW_ITEM_TYPE_ICMP6,
178 	RTE_FLOW_ITEM_TYPE_END,
179 };
180 
181 /* IPv4 VXLAN IPv4 */
182 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv4[] = {
183 	RTE_FLOW_ITEM_TYPE_ETH,
184 	RTE_FLOW_ITEM_TYPE_IPV4,
185 	RTE_FLOW_ITEM_TYPE_UDP,
186 	RTE_FLOW_ITEM_TYPE_VXLAN,
187 	RTE_FLOW_ITEM_TYPE_IPV4,
188 	RTE_FLOW_ITEM_TYPE_END,
189 };
190 
191 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv4_udp[] = {
192 	RTE_FLOW_ITEM_TYPE_ETH,
193 	RTE_FLOW_ITEM_TYPE_IPV4,
194 	RTE_FLOW_ITEM_TYPE_UDP,
195 	RTE_FLOW_ITEM_TYPE_VXLAN,
196 	RTE_FLOW_ITEM_TYPE_IPV4,
197 	RTE_FLOW_ITEM_TYPE_UDP,
198 	RTE_FLOW_ITEM_TYPE_END,
199 };
200 
201 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv4_tcp[] = {
202 	RTE_FLOW_ITEM_TYPE_ETH,
203 	RTE_FLOW_ITEM_TYPE_IPV4,
204 	RTE_FLOW_ITEM_TYPE_UDP,
205 	RTE_FLOW_ITEM_TYPE_VXLAN,
206 	RTE_FLOW_ITEM_TYPE_IPV4,
207 	RTE_FLOW_ITEM_TYPE_TCP,
208 	RTE_FLOW_ITEM_TYPE_END,
209 };
210 
211 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv4_sctp[] = {
212 	RTE_FLOW_ITEM_TYPE_ETH,
213 	RTE_FLOW_ITEM_TYPE_IPV4,
214 	RTE_FLOW_ITEM_TYPE_UDP,
215 	RTE_FLOW_ITEM_TYPE_VXLAN,
216 	RTE_FLOW_ITEM_TYPE_IPV4,
217 	RTE_FLOW_ITEM_TYPE_SCTP,
218 	RTE_FLOW_ITEM_TYPE_END,
219 };
220 
221 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv4_icmp[] = {
222 	RTE_FLOW_ITEM_TYPE_ETH,
223 	RTE_FLOW_ITEM_TYPE_IPV4,
224 	RTE_FLOW_ITEM_TYPE_UDP,
225 	RTE_FLOW_ITEM_TYPE_VXLAN,
226 	RTE_FLOW_ITEM_TYPE_IPV4,
227 	RTE_FLOW_ITEM_TYPE_ICMP,
228 	RTE_FLOW_ITEM_TYPE_END,
229 };
230 
231 /* IPv4 VXLAN MAC IPv4 */
232 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv4[] = {
233 	RTE_FLOW_ITEM_TYPE_ETH,
234 	RTE_FLOW_ITEM_TYPE_IPV4,
235 	RTE_FLOW_ITEM_TYPE_UDP,
236 	RTE_FLOW_ITEM_TYPE_VXLAN,
237 	RTE_FLOW_ITEM_TYPE_ETH,
238 	RTE_FLOW_ITEM_TYPE_IPV4,
239 	RTE_FLOW_ITEM_TYPE_END,
240 };
241 
242 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv4_udp[] = {
243 	RTE_FLOW_ITEM_TYPE_ETH,
244 	RTE_FLOW_ITEM_TYPE_IPV4,
245 	RTE_FLOW_ITEM_TYPE_UDP,
246 	RTE_FLOW_ITEM_TYPE_VXLAN,
247 	RTE_FLOW_ITEM_TYPE_ETH,
248 	RTE_FLOW_ITEM_TYPE_IPV4,
249 	RTE_FLOW_ITEM_TYPE_UDP,
250 	RTE_FLOW_ITEM_TYPE_END,
251 };
252 
253 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv4_tcp[] = {
254 	RTE_FLOW_ITEM_TYPE_ETH,
255 	RTE_FLOW_ITEM_TYPE_IPV4,
256 	RTE_FLOW_ITEM_TYPE_UDP,
257 	RTE_FLOW_ITEM_TYPE_VXLAN,
258 	RTE_FLOW_ITEM_TYPE_ETH,
259 	RTE_FLOW_ITEM_TYPE_IPV4,
260 	RTE_FLOW_ITEM_TYPE_TCP,
261 	RTE_FLOW_ITEM_TYPE_END,
262 };
263 
264 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv4_sctp[] = {
265 	RTE_FLOW_ITEM_TYPE_ETH,
266 	RTE_FLOW_ITEM_TYPE_IPV4,
267 	RTE_FLOW_ITEM_TYPE_UDP,
268 	RTE_FLOW_ITEM_TYPE_VXLAN,
269 	RTE_FLOW_ITEM_TYPE_ETH,
270 	RTE_FLOW_ITEM_TYPE_IPV4,
271 	RTE_FLOW_ITEM_TYPE_SCTP,
272 	RTE_FLOW_ITEM_TYPE_END,
273 };
274 
275 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv4_icmp[] = {
276 	RTE_FLOW_ITEM_TYPE_ETH,
277 	RTE_FLOW_ITEM_TYPE_IPV4,
278 	RTE_FLOW_ITEM_TYPE_UDP,
279 	RTE_FLOW_ITEM_TYPE_VXLAN,
280 	RTE_FLOW_ITEM_TYPE_ETH,
281 	RTE_FLOW_ITEM_TYPE_IPV4,
282 	RTE_FLOW_ITEM_TYPE_ICMP,
283 	RTE_FLOW_ITEM_TYPE_END,
284 };
285 
286 /* IPv4 VXLAN IPv6 */
287 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv6[] = {
288 	RTE_FLOW_ITEM_TYPE_ETH,
289 	RTE_FLOW_ITEM_TYPE_IPV4,
290 	RTE_FLOW_ITEM_TYPE_UDP,
291 	RTE_FLOW_ITEM_TYPE_VXLAN,
292 	RTE_FLOW_ITEM_TYPE_IPV6,
293 	RTE_FLOW_ITEM_TYPE_END,
294 };
295 
296 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv6_udp[] = {
297 	RTE_FLOW_ITEM_TYPE_ETH,
298 	RTE_FLOW_ITEM_TYPE_IPV4,
299 	RTE_FLOW_ITEM_TYPE_UDP,
300 	RTE_FLOW_ITEM_TYPE_VXLAN,
301 	RTE_FLOW_ITEM_TYPE_IPV6,
302 	RTE_FLOW_ITEM_TYPE_UDP,
303 	RTE_FLOW_ITEM_TYPE_END,
304 };
305 
306 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv6_tcp[] = {
307 	RTE_FLOW_ITEM_TYPE_ETH,
308 	RTE_FLOW_ITEM_TYPE_IPV4,
309 	RTE_FLOW_ITEM_TYPE_UDP,
310 	RTE_FLOW_ITEM_TYPE_VXLAN,
311 	RTE_FLOW_ITEM_TYPE_IPV6,
312 	RTE_FLOW_ITEM_TYPE_TCP,
313 	RTE_FLOW_ITEM_TYPE_END,
314 };
315 
316 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv6_sctp[] = {
317 	RTE_FLOW_ITEM_TYPE_ETH,
318 	RTE_FLOW_ITEM_TYPE_IPV4,
319 	RTE_FLOW_ITEM_TYPE_UDP,
320 	RTE_FLOW_ITEM_TYPE_VXLAN,
321 	RTE_FLOW_ITEM_TYPE_IPV6,
322 	RTE_FLOW_ITEM_TYPE_SCTP,
323 	RTE_FLOW_ITEM_TYPE_END,
324 };
325 
326 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv6_icmp[] = {
327 	RTE_FLOW_ITEM_TYPE_ETH,
328 	RTE_FLOW_ITEM_TYPE_IPV4,
329 	RTE_FLOW_ITEM_TYPE_UDP,
330 	RTE_FLOW_ITEM_TYPE_VXLAN,
331 	RTE_FLOW_ITEM_TYPE_IPV6,
332 	RTE_FLOW_ITEM_TYPE_ICMP,
333 	RTE_FLOW_ITEM_TYPE_END,
334 };
335 
336 /* IPv4 VXLAN MAC IPv6 */
337 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv6[] = {
338 	RTE_FLOW_ITEM_TYPE_ETH,
339 	RTE_FLOW_ITEM_TYPE_IPV4,
340 	RTE_FLOW_ITEM_TYPE_UDP,
341 	RTE_FLOW_ITEM_TYPE_VXLAN,
342 	RTE_FLOW_ITEM_TYPE_ETH,
343 	RTE_FLOW_ITEM_TYPE_IPV6,
344 	RTE_FLOW_ITEM_TYPE_END,
345 };
346 
347 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv6_udp[] = {
348 	RTE_FLOW_ITEM_TYPE_ETH,
349 	RTE_FLOW_ITEM_TYPE_IPV4,
350 	RTE_FLOW_ITEM_TYPE_UDP,
351 	RTE_FLOW_ITEM_TYPE_VXLAN,
352 	RTE_FLOW_ITEM_TYPE_ETH,
353 	RTE_FLOW_ITEM_TYPE_IPV6,
354 	RTE_FLOW_ITEM_TYPE_UDP,
355 	RTE_FLOW_ITEM_TYPE_END,
356 };
357 
358 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv6_tcp[] = {
359 	RTE_FLOW_ITEM_TYPE_ETH,
360 	RTE_FLOW_ITEM_TYPE_IPV4,
361 	RTE_FLOW_ITEM_TYPE_UDP,
362 	RTE_FLOW_ITEM_TYPE_VXLAN,
363 	RTE_FLOW_ITEM_TYPE_ETH,
364 	RTE_FLOW_ITEM_TYPE_IPV6,
365 	RTE_FLOW_ITEM_TYPE_TCP,
366 	RTE_FLOW_ITEM_TYPE_END,
367 };
368 
369 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv6_sctp[] = {
370 	RTE_FLOW_ITEM_TYPE_ETH,
371 	RTE_FLOW_ITEM_TYPE_IPV4,
372 	RTE_FLOW_ITEM_TYPE_UDP,
373 	RTE_FLOW_ITEM_TYPE_VXLAN,
374 	RTE_FLOW_ITEM_TYPE_ETH,
375 	RTE_FLOW_ITEM_TYPE_IPV6,
376 	RTE_FLOW_ITEM_TYPE_SCTP,
377 	RTE_FLOW_ITEM_TYPE_END,
378 };
379 
380 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv6_icmp[] = {
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_IPV6,
387 	RTE_FLOW_ITEM_TYPE_ICMP,
388 	RTE_FLOW_ITEM_TYPE_END,
389 };
390 
391 /* IPv4 NVGRE IPv4 */
392 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv4[] = {
393 	RTE_FLOW_ITEM_TYPE_ETH,
394 	RTE_FLOW_ITEM_TYPE_IPV4,
395 	RTE_FLOW_ITEM_TYPE_NVGRE,
396 	RTE_FLOW_ITEM_TYPE_IPV4,
397 	RTE_FLOW_ITEM_TYPE_END,
398 };
399 
400 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv4_udp[] = {
401 	RTE_FLOW_ITEM_TYPE_ETH,
402 	RTE_FLOW_ITEM_TYPE_IPV4,
403 	RTE_FLOW_ITEM_TYPE_NVGRE,
404 	RTE_FLOW_ITEM_TYPE_IPV4,
405 	RTE_FLOW_ITEM_TYPE_UDP,
406 	RTE_FLOW_ITEM_TYPE_END,
407 };
408 
409 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv4_tcp[] = {
410 	RTE_FLOW_ITEM_TYPE_ETH,
411 	RTE_FLOW_ITEM_TYPE_IPV4,
412 	RTE_FLOW_ITEM_TYPE_NVGRE,
413 	RTE_FLOW_ITEM_TYPE_IPV4,
414 	RTE_FLOW_ITEM_TYPE_TCP,
415 	RTE_FLOW_ITEM_TYPE_END,
416 };
417 
418 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv4_sctp[] = {
419 	RTE_FLOW_ITEM_TYPE_ETH,
420 	RTE_FLOW_ITEM_TYPE_IPV4,
421 	RTE_FLOW_ITEM_TYPE_NVGRE,
422 	RTE_FLOW_ITEM_TYPE_IPV4,
423 	RTE_FLOW_ITEM_TYPE_SCTP,
424 	RTE_FLOW_ITEM_TYPE_END,
425 };
426 
427 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv4_icmp[] = {
428 	RTE_FLOW_ITEM_TYPE_ETH,
429 	RTE_FLOW_ITEM_TYPE_IPV4,
430 	RTE_FLOW_ITEM_TYPE_NVGRE,
431 	RTE_FLOW_ITEM_TYPE_IPV4,
432 	RTE_FLOW_ITEM_TYPE_ICMP,
433 	RTE_FLOW_ITEM_TYPE_END,
434 };
435 
436 /* IPv4 NVGRE MAC IPv4 */
437 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv4[] = {
438 	RTE_FLOW_ITEM_TYPE_ETH,
439 	RTE_FLOW_ITEM_TYPE_IPV4,
440 	RTE_FLOW_ITEM_TYPE_NVGRE,
441 	RTE_FLOW_ITEM_TYPE_ETH,
442 	RTE_FLOW_ITEM_TYPE_IPV4,
443 	RTE_FLOW_ITEM_TYPE_END,
444 };
445 
446 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv4_udp[] = {
447 	RTE_FLOW_ITEM_TYPE_ETH,
448 	RTE_FLOW_ITEM_TYPE_IPV4,
449 	RTE_FLOW_ITEM_TYPE_NVGRE,
450 	RTE_FLOW_ITEM_TYPE_ETH,
451 	RTE_FLOW_ITEM_TYPE_IPV4,
452 	RTE_FLOW_ITEM_TYPE_UDP,
453 	RTE_FLOW_ITEM_TYPE_END,
454 };
455 
456 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv4_tcp[] = {
457 	RTE_FLOW_ITEM_TYPE_ETH,
458 	RTE_FLOW_ITEM_TYPE_IPV4,
459 	RTE_FLOW_ITEM_TYPE_NVGRE,
460 	RTE_FLOW_ITEM_TYPE_ETH,
461 	RTE_FLOW_ITEM_TYPE_IPV4,
462 	RTE_FLOW_ITEM_TYPE_TCP,
463 	RTE_FLOW_ITEM_TYPE_END,
464 };
465 
466 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv4_sctp[] = {
467 	RTE_FLOW_ITEM_TYPE_ETH,
468 	RTE_FLOW_ITEM_TYPE_IPV4,
469 	RTE_FLOW_ITEM_TYPE_NVGRE,
470 	RTE_FLOW_ITEM_TYPE_ETH,
471 	RTE_FLOW_ITEM_TYPE_IPV4,
472 	RTE_FLOW_ITEM_TYPE_SCTP,
473 	RTE_FLOW_ITEM_TYPE_END,
474 };
475 
476 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv4_icmp[] = {
477 	RTE_FLOW_ITEM_TYPE_ETH,
478 	RTE_FLOW_ITEM_TYPE_IPV4,
479 	RTE_FLOW_ITEM_TYPE_NVGRE,
480 	RTE_FLOW_ITEM_TYPE_ETH,
481 	RTE_FLOW_ITEM_TYPE_IPV4,
482 	RTE_FLOW_ITEM_TYPE_ICMP,
483 	RTE_FLOW_ITEM_TYPE_END,
484 };
485 
486 /* IPv4 NVGRE IPv6 */
487 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv6[] = {
488 	RTE_FLOW_ITEM_TYPE_ETH,
489 	RTE_FLOW_ITEM_TYPE_IPV4,
490 	RTE_FLOW_ITEM_TYPE_NVGRE,
491 	RTE_FLOW_ITEM_TYPE_IPV6,
492 	RTE_FLOW_ITEM_TYPE_END,
493 };
494 
495 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv6_udp[] = {
496 	RTE_FLOW_ITEM_TYPE_ETH,
497 	RTE_FLOW_ITEM_TYPE_IPV4,
498 	RTE_FLOW_ITEM_TYPE_NVGRE,
499 	RTE_FLOW_ITEM_TYPE_IPV6,
500 	RTE_FLOW_ITEM_TYPE_UDP,
501 	RTE_FLOW_ITEM_TYPE_END,
502 };
503 
504 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv6_tcp[] = {
505 	RTE_FLOW_ITEM_TYPE_ETH,
506 	RTE_FLOW_ITEM_TYPE_IPV4,
507 	RTE_FLOW_ITEM_TYPE_NVGRE,
508 	RTE_FLOW_ITEM_TYPE_IPV6,
509 	RTE_FLOW_ITEM_TYPE_TCP,
510 	RTE_FLOW_ITEM_TYPE_END,
511 };
512 
513 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv6_sctp[] = {
514 	RTE_FLOW_ITEM_TYPE_ETH,
515 	RTE_FLOW_ITEM_TYPE_IPV4,
516 	RTE_FLOW_ITEM_TYPE_NVGRE,
517 	RTE_FLOW_ITEM_TYPE_IPV6,
518 	RTE_FLOW_ITEM_TYPE_SCTP,
519 	RTE_FLOW_ITEM_TYPE_END,
520 };
521 
522 
523 /* IPv4 NVGRE MAC IPv6 */
524 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv6[] = {
525 	RTE_FLOW_ITEM_TYPE_ETH,
526 	RTE_FLOW_ITEM_TYPE_IPV4,
527 	RTE_FLOW_ITEM_TYPE_NVGRE,
528 	RTE_FLOW_ITEM_TYPE_ETH,
529 	RTE_FLOW_ITEM_TYPE_IPV6,
530 	RTE_FLOW_ITEM_TYPE_END,
531 };
532 
533 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv6_udp[] = {
534 	RTE_FLOW_ITEM_TYPE_ETH,
535 	RTE_FLOW_ITEM_TYPE_IPV4,
536 	RTE_FLOW_ITEM_TYPE_NVGRE,
537 	RTE_FLOW_ITEM_TYPE_ETH,
538 	RTE_FLOW_ITEM_TYPE_IPV6,
539 	RTE_FLOW_ITEM_TYPE_UDP,
540 	RTE_FLOW_ITEM_TYPE_END,
541 };
542 
543 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv6_tcp[] = {
544 	RTE_FLOW_ITEM_TYPE_ETH,
545 	RTE_FLOW_ITEM_TYPE_IPV4,
546 	RTE_FLOW_ITEM_TYPE_NVGRE,
547 	RTE_FLOW_ITEM_TYPE_ETH,
548 	RTE_FLOW_ITEM_TYPE_IPV6,
549 	RTE_FLOW_ITEM_TYPE_TCP,
550 	RTE_FLOW_ITEM_TYPE_END,
551 };
552 
553 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv6_sctp[] = {
554 	RTE_FLOW_ITEM_TYPE_ETH,
555 	RTE_FLOW_ITEM_TYPE_IPV4,
556 	RTE_FLOW_ITEM_TYPE_NVGRE,
557 	RTE_FLOW_ITEM_TYPE_ETH,
558 	RTE_FLOW_ITEM_TYPE_IPV6,
559 	RTE_FLOW_ITEM_TYPE_SCTP,
560 	RTE_FLOW_ITEM_TYPE_END,
561 };
562 
563 static struct ice_flow_pattern ice_supported_patterns[] = {
564 	{pattern_ethertype, INSET_ETHER},
565 	{pattern_ipv4, INSET_MAC_IPV4},
566 	{pattern_ipv4_udp, INSET_MAC_IPV4_L4},
567 	{pattern_ipv4_sctp, INSET_MAC_IPV4_L4},
568 	{pattern_ipv4_tcp, INSET_MAC_IPV4_L4},
569 	{pattern_ipv4_icmp, INSET_MAC_IPV4_ICMP},
570 	{pattern_ipv6, INSET_MAC_IPV6},
571 	{pattern_ipv6_udp, INSET_MAC_IPV6_L4},
572 	{pattern_ipv6_sctp, INSET_MAC_IPV6_L4},
573 	{pattern_ipv6_tcp, INSET_MAC_IPV6_L4},
574 	{pattern_ipv6_icmp6, INSET_MAC_IPV6_ICMP},
575 	{pattern_ipv4_vxlan_ipv4, INSET_TUNNEL_IPV4_TYPE1},
576 	{pattern_ipv4_vxlan_ipv4_udp, INSET_TUNNEL_IPV4_TYPE2},
577 	{pattern_ipv4_vxlan_ipv4_tcp, INSET_TUNNEL_IPV4_TYPE2},
578 	{pattern_ipv4_vxlan_ipv4_sctp, INSET_TUNNEL_IPV4_TYPE2},
579 	{pattern_ipv4_vxlan_ipv4_icmp, INSET_TUNNEL_IPV4_TYPE3},
580 	{pattern_ipv4_vxlan_eth_ipv4, INSET_TUNNEL_IPV4_TYPE1},
581 	{pattern_ipv4_vxlan_eth_ipv4_udp, INSET_TUNNEL_IPV4_TYPE2},
582 	{pattern_ipv4_vxlan_eth_ipv4_tcp, INSET_TUNNEL_IPV4_TYPE2},
583 	{pattern_ipv4_vxlan_eth_ipv4_sctp, INSET_TUNNEL_IPV4_TYPE2},
584 	{pattern_ipv4_vxlan_eth_ipv4_icmp, INSET_TUNNEL_IPV4_TYPE3},
585 	{pattern_ipv4_vxlan_ipv6, INSET_TUNNEL_IPV6_TYPE1},
586 	{pattern_ipv4_vxlan_ipv6_udp, INSET_TUNNEL_IPV6_TYPE2},
587 	{pattern_ipv4_vxlan_ipv6_tcp, INSET_TUNNEL_IPV6_TYPE2},
588 	{pattern_ipv4_vxlan_ipv6_sctp, INSET_TUNNEL_IPV6_TYPE2},
589 	{pattern_ipv4_vxlan_ipv6_icmp, INSET_TUNNEL_IPV6_TYPE3},
590 	{pattern_ipv4_vxlan_eth_ipv6, INSET_TUNNEL_IPV6_TYPE1},
591 	{pattern_ipv4_vxlan_eth_ipv6_udp, INSET_TUNNEL_IPV6_TYPE2},
592 	{pattern_ipv4_vxlan_eth_ipv6_tcp, INSET_TUNNEL_IPV6_TYPE2},
593 	{pattern_ipv4_vxlan_eth_ipv6_sctp, INSET_TUNNEL_IPV6_TYPE2},
594 	{pattern_ipv4_vxlan_eth_ipv6_icmp, INSET_TUNNEL_IPV6_TYPE3},
595 	{pattern_ipv4_nvgre_ipv4, INSET_TUNNEL_IPV4_TYPE1},
596 	{pattern_ipv4_nvgre_ipv4_udp, INSET_TUNNEL_IPV4_TYPE2},
597 	{pattern_ipv4_nvgre_ipv4_tcp, INSET_TUNNEL_IPV4_TYPE2},
598 	{pattern_ipv4_nvgre_ipv4_sctp, INSET_TUNNEL_IPV4_TYPE2},
599 	{pattern_ipv4_nvgre_ipv4_icmp, INSET_TUNNEL_IPV4_TYPE3},
600 	{pattern_ipv4_nvgre_eth_ipv4, INSET_TUNNEL_IPV4_TYPE1},
601 	{pattern_ipv4_nvgre_eth_ipv4_udp, INSET_TUNNEL_IPV4_TYPE2},
602 	{pattern_ipv4_nvgre_eth_ipv4_tcp, INSET_TUNNEL_IPV4_TYPE2},
603 	{pattern_ipv4_nvgre_eth_ipv4_sctp, INSET_TUNNEL_IPV4_TYPE2},
604 	{pattern_ipv4_nvgre_eth_ipv4_icmp, INSET_TUNNEL_IPV4_TYPE3},
605 	{pattern_ipv4_nvgre_ipv6, INSET_TUNNEL_IPV6_TYPE1},
606 	{pattern_ipv4_nvgre_ipv6_udp, INSET_TUNNEL_IPV6_TYPE2},
607 	{pattern_ipv4_nvgre_ipv6_tcp, INSET_TUNNEL_IPV6_TYPE2},
608 	{pattern_ipv4_nvgre_ipv6_sctp, INSET_TUNNEL_IPV6_TYPE2},
609 	{pattern_ipv4_nvgre_eth_ipv6, INSET_TUNNEL_IPV6_TYPE1},
610 	{pattern_ipv4_nvgre_eth_ipv6_udp, INSET_TUNNEL_IPV6_TYPE2},
611 	{pattern_ipv4_nvgre_eth_ipv6_tcp, INSET_TUNNEL_IPV6_TYPE2},
612 	{pattern_ipv4_nvgre_eth_ipv6_sctp, INSET_TUNNEL_IPV6_TYPE2},
613 };
614 
615 #endif
616