xref: /dpdk/drivers/net/ice/ice_generic_flow.h (revision 7f12dfdc)
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 	ICE_INSET_TUN_ID)
88 #define INSET_TUNNEL_IPV4_TYPE2 ( \
89 	ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \
90 	ICE_INSET_TUN_IPV4_TTL | ICE_INSET_TUN_IPV4_PROTO | \
91 	ICE_INSET_TUN_SRC_PORT | ICE_INSET_TUN_DST_PORT | \
92 	ICE_INSET_TUN_ID)
93 #define INSET_TUNNEL_IPV4_TYPE3 ( \
94 	ICE_INSET_TUN_IPV4_SRC | ICE_INSET_TUN_IPV4_DST | \
95 	ICE_INSET_TUN_IPV4_TTL | ICE_INSET_ICMP | \
96 	ICE_INSET_TUN_ID)
97 #define INSET_TUNNEL_IPV6_TYPE1 ( \
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_ID)
101 #define INSET_TUNNEL_IPV6_TYPE2 ( \
102 	ICE_INSET_TUN_IPV6_SRC | ICE_INSET_TUN_IPV6_DST | \
103 	ICE_INSET_TUN_IPV6_TTL | ICE_INSET_TUN_IPV6_PROTO | \
104 	ICE_INSET_TUN_SRC_PORT | ICE_INSET_TUN_DST_PORT | \
105 	ICE_INSET_TUN_ID)
106 #define INSET_TUNNEL_IPV6_TYPE3 ( \
107 	ICE_INSET_TUN_IPV6_SRC | ICE_INSET_TUN_IPV6_DST | \
108 	ICE_INSET_TUN_IPV6_TTL | ICE_INSET_ICMP6 | \
109 	ICE_INSET_TUN_ID)
110 
111 /* L2 */
112 static enum rte_flow_item_type pattern_ethertype[] = {
113 	RTE_FLOW_ITEM_TYPE_ETH,
114 	RTE_FLOW_ITEM_TYPE_END,
115 };
116 
117 /* non-tunnel IPv4 */
118 static enum rte_flow_item_type pattern_ipv4[] = {
119 	RTE_FLOW_ITEM_TYPE_ETH,
120 	RTE_FLOW_ITEM_TYPE_IPV4,
121 	RTE_FLOW_ITEM_TYPE_END,
122 };
123 
124 static enum rte_flow_item_type pattern_ipv4_udp[] = {
125 	RTE_FLOW_ITEM_TYPE_ETH,
126 	RTE_FLOW_ITEM_TYPE_IPV4,
127 	RTE_FLOW_ITEM_TYPE_UDP,
128 	RTE_FLOW_ITEM_TYPE_END,
129 };
130 
131 static enum rte_flow_item_type pattern_ipv4_tcp[] = {
132 	RTE_FLOW_ITEM_TYPE_ETH,
133 	RTE_FLOW_ITEM_TYPE_IPV4,
134 	RTE_FLOW_ITEM_TYPE_TCP,
135 	RTE_FLOW_ITEM_TYPE_END,
136 };
137 
138 static enum rte_flow_item_type pattern_ipv4_sctp[] = {
139 	RTE_FLOW_ITEM_TYPE_ETH,
140 	RTE_FLOW_ITEM_TYPE_IPV4,
141 	RTE_FLOW_ITEM_TYPE_SCTP,
142 	RTE_FLOW_ITEM_TYPE_END,
143 };
144 
145 static enum rte_flow_item_type pattern_ipv4_icmp[] = {
146 	RTE_FLOW_ITEM_TYPE_ETH,
147 	RTE_FLOW_ITEM_TYPE_IPV4,
148 	RTE_FLOW_ITEM_TYPE_ICMP,
149 	RTE_FLOW_ITEM_TYPE_END,
150 };
151 
152 /* non-tunnel IPv6 */
153 static enum rte_flow_item_type pattern_ipv6[] = {
154 	RTE_FLOW_ITEM_TYPE_ETH,
155 	RTE_FLOW_ITEM_TYPE_IPV6,
156 	RTE_FLOW_ITEM_TYPE_END,
157 };
158 
159 static enum rte_flow_item_type pattern_ipv6_udp[] = {
160 	RTE_FLOW_ITEM_TYPE_ETH,
161 	RTE_FLOW_ITEM_TYPE_IPV6,
162 	RTE_FLOW_ITEM_TYPE_UDP,
163 	RTE_FLOW_ITEM_TYPE_END,
164 };
165 
166 static enum rte_flow_item_type pattern_ipv6_tcp[] = {
167 	RTE_FLOW_ITEM_TYPE_ETH,
168 	RTE_FLOW_ITEM_TYPE_IPV6,
169 	RTE_FLOW_ITEM_TYPE_TCP,
170 	RTE_FLOW_ITEM_TYPE_END,
171 };
172 
173 static enum rte_flow_item_type pattern_ipv6_sctp[] = {
174 	RTE_FLOW_ITEM_TYPE_ETH,
175 	RTE_FLOW_ITEM_TYPE_IPV6,
176 	RTE_FLOW_ITEM_TYPE_SCTP,
177 	RTE_FLOW_ITEM_TYPE_END,
178 };
179 
180 static enum rte_flow_item_type pattern_ipv6_icmp6[] = {
181 	RTE_FLOW_ITEM_TYPE_ETH,
182 	RTE_FLOW_ITEM_TYPE_IPV6,
183 	RTE_FLOW_ITEM_TYPE_ICMP6,
184 	RTE_FLOW_ITEM_TYPE_END,
185 };
186 
187 /* IPv4 VXLAN IPv4 */
188 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv4[] = {
189 	RTE_FLOW_ITEM_TYPE_ETH,
190 	RTE_FLOW_ITEM_TYPE_IPV4,
191 	RTE_FLOW_ITEM_TYPE_UDP,
192 	RTE_FLOW_ITEM_TYPE_VXLAN,
193 	RTE_FLOW_ITEM_TYPE_IPV4,
194 	RTE_FLOW_ITEM_TYPE_END,
195 };
196 
197 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv4_udp[] = {
198 	RTE_FLOW_ITEM_TYPE_ETH,
199 	RTE_FLOW_ITEM_TYPE_IPV4,
200 	RTE_FLOW_ITEM_TYPE_UDP,
201 	RTE_FLOW_ITEM_TYPE_VXLAN,
202 	RTE_FLOW_ITEM_TYPE_IPV4,
203 	RTE_FLOW_ITEM_TYPE_UDP,
204 	RTE_FLOW_ITEM_TYPE_END,
205 };
206 
207 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv4_tcp[] = {
208 	RTE_FLOW_ITEM_TYPE_ETH,
209 	RTE_FLOW_ITEM_TYPE_IPV4,
210 	RTE_FLOW_ITEM_TYPE_UDP,
211 	RTE_FLOW_ITEM_TYPE_VXLAN,
212 	RTE_FLOW_ITEM_TYPE_IPV4,
213 	RTE_FLOW_ITEM_TYPE_TCP,
214 	RTE_FLOW_ITEM_TYPE_END,
215 };
216 
217 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv4_sctp[] = {
218 	RTE_FLOW_ITEM_TYPE_ETH,
219 	RTE_FLOW_ITEM_TYPE_IPV4,
220 	RTE_FLOW_ITEM_TYPE_UDP,
221 	RTE_FLOW_ITEM_TYPE_VXLAN,
222 	RTE_FLOW_ITEM_TYPE_IPV4,
223 	RTE_FLOW_ITEM_TYPE_SCTP,
224 	RTE_FLOW_ITEM_TYPE_END,
225 };
226 
227 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv4_icmp[] = {
228 	RTE_FLOW_ITEM_TYPE_ETH,
229 	RTE_FLOW_ITEM_TYPE_IPV4,
230 	RTE_FLOW_ITEM_TYPE_UDP,
231 	RTE_FLOW_ITEM_TYPE_VXLAN,
232 	RTE_FLOW_ITEM_TYPE_IPV4,
233 	RTE_FLOW_ITEM_TYPE_ICMP,
234 	RTE_FLOW_ITEM_TYPE_END,
235 };
236 
237 /* IPv4 VXLAN MAC IPv4 */
238 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv4[] = {
239 	RTE_FLOW_ITEM_TYPE_ETH,
240 	RTE_FLOW_ITEM_TYPE_IPV4,
241 	RTE_FLOW_ITEM_TYPE_UDP,
242 	RTE_FLOW_ITEM_TYPE_VXLAN,
243 	RTE_FLOW_ITEM_TYPE_ETH,
244 	RTE_FLOW_ITEM_TYPE_IPV4,
245 	RTE_FLOW_ITEM_TYPE_END,
246 };
247 
248 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv4_udp[] = {
249 	RTE_FLOW_ITEM_TYPE_ETH,
250 	RTE_FLOW_ITEM_TYPE_IPV4,
251 	RTE_FLOW_ITEM_TYPE_UDP,
252 	RTE_FLOW_ITEM_TYPE_VXLAN,
253 	RTE_FLOW_ITEM_TYPE_ETH,
254 	RTE_FLOW_ITEM_TYPE_IPV4,
255 	RTE_FLOW_ITEM_TYPE_UDP,
256 	RTE_FLOW_ITEM_TYPE_END,
257 };
258 
259 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv4_tcp[] = {
260 	RTE_FLOW_ITEM_TYPE_ETH,
261 	RTE_FLOW_ITEM_TYPE_IPV4,
262 	RTE_FLOW_ITEM_TYPE_UDP,
263 	RTE_FLOW_ITEM_TYPE_VXLAN,
264 	RTE_FLOW_ITEM_TYPE_ETH,
265 	RTE_FLOW_ITEM_TYPE_IPV4,
266 	RTE_FLOW_ITEM_TYPE_TCP,
267 	RTE_FLOW_ITEM_TYPE_END,
268 };
269 
270 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv4_sctp[] = {
271 	RTE_FLOW_ITEM_TYPE_ETH,
272 	RTE_FLOW_ITEM_TYPE_IPV4,
273 	RTE_FLOW_ITEM_TYPE_UDP,
274 	RTE_FLOW_ITEM_TYPE_VXLAN,
275 	RTE_FLOW_ITEM_TYPE_ETH,
276 	RTE_FLOW_ITEM_TYPE_IPV4,
277 	RTE_FLOW_ITEM_TYPE_SCTP,
278 	RTE_FLOW_ITEM_TYPE_END,
279 };
280 
281 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv4_icmp[] = {
282 	RTE_FLOW_ITEM_TYPE_ETH,
283 	RTE_FLOW_ITEM_TYPE_IPV4,
284 	RTE_FLOW_ITEM_TYPE_UDP,
285 	RTE_FLOW_ITEM_TYPE_VXLAN,
286 	RTE_FLOW_ITEM_TYPE_ETH,
287 	RTE_FLOW_ITEM_TYPE_IPV4,
288 	RTE_FLOW_ITEM_TYPE_ICMP,
289 	RTE_FLOW_ITEM_TYPE_END,
290 };
291 
292 /* IPv4 VXLAN IPv6 */
293 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv6[] = {
294 	RTE_FLOW_ITEM_TYPE_ETH,
295 	RTE_FLOW_ITEM_TYPE_IPV4,
296 	RTE_FLOW_ITEM_TYPE_UDP,
297 	RTE_FLOW_ITEM_TYPE_VXLAN,
298 	RTE_FLOW_ITEM_TYPE_IPV6,
299 	RTE_FLOW_ITEM_TYPE_END,
300 };
301 
302 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv6_udp[] = {
303 	RTE_FLOW_ITEM_TYPE_ETH,
304 	RTE_FLOW_ITEM_TYPE_IPV4,
305 	RTE_FLOW_ITEM_TYPE_UDP,
306 	RTE_FLOW_ITEM_TYPE_VXLAN,
307 	RTE_FLOW_ITEM_TYPE_IPV6,
308 	RTE_FLOW_ITEM_TYPE_UDP,
309 	RTE_FLOW_ITEM_TYPE_END,
310 };
311 
312 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv6_tcp[] = {
313 	RTE_FLOW_ITEM_TYPE_ETH,
314 	RTE_FLOW_ITEM_TYPE_IPV4,
315 	RTE_FLOW_ITEM_TYPE_UDP,
316 	RTE_FLOW_ITEM_TYPE_VXLAN,
317 	RTE_FLOW_ITEM_TYPE_IPV6,
318 	RTE_FLOW_ITEM_TYPE_TCP,
319 	RTE_FLOW_ITEM_TYPE_END,
320 };
321 
322 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv6_sctp[] = {
323 	RTE_FLOW_ITEM_TYPE_ETH,
324 	RTE_FLOW_ITEM_TYPE_IPV4,
325 	RTE_FLOW_ITEM_TYPE_UDP,
326 	RTE_FLOW_ITEM_TYPE_VXLAN,
327 	RTE_FLOW_ITEM_TYPE_IPV6,
328 	RTE_FLOW_ITEM_TYPE_SCTP,
329 	RTE_FLOW_ITEM_TYPE_END,
330 };
331 
332 static enum rte_flow_item_type pattern_ipv4_vxlan_ipv6_icmp[] = {
333 	RTE_FLOW_ITEM_TYPE_ETH,
334 	RTE_FLOW_ITEM_TYPE_IPV4,
335 	RTE_FLOW_ITEM_TYPE_UDP,
336 	RTE_FLOW_ITEM_TYPE_VXLAN,
337 	RTE_FLOW_ITEM_TYPE_IPV6,
338 	RTE_FLOW_ITEM_TYPE_ICMP,
339 	RTE_FLOW_ITEM_TYPE_END,
340 };
341 
342 /* IPv4 VXLAN MAC IPv6 */
343 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv6[] = {
344 	RTE_FLOW_ITEM_TYPE_ETH,
345 	RTE_FLOW_ITEM_TYPE_IPV4,
346 	RTE_FLOW_ITEM_TYPE_UDP,
347 	RTE_FLOW_ITEM_TYPE_VXLAN,
348 	RTE_FLOW_ITEM_TYPE_ETH,
349 	RTE_FLOW_ITEM_TYPE_IPV6,
350 	RTE_FLOW_ITEM_TYPE_END,
351 };
352 
353 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv6_udp[] = {
354 	RTE_FLOW_ITEM_TYPE_ETH,
355 	RTE_FLOW_ITEM_TYPE_IPV4,
356 	RTE_FLOW_ITEM_TYPE_UDP,
357 	RTE_FLOW_ITEM_TYPE_VXLAN,
358 	RTE_FLOW_ITEM_TYPE_ETH,
359 	RTE_FLOW_ITEM_TYPE_IPV6,
360 	RTE_FLOW_ITEM_TYPE_UDP,
361 	RTE_FLOW_ITEM_TYPE_END,
362 };
363 
364 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv6_tcp[] = {
365 	RTE_FLOW_ITEM_TYPE_ETH,
366 	RTE_FLOW_ITEM_TYPE_IPV4,
367 	RTE_FLOW_ITEM_TYPE_UDP,
368 	RTE_FLOW_ITEM_TYPE_VXLAN,
369 	RTE_FLOW_ITEM_TYPE_ETH,
370 	RTE_FLOW_ITEM_TYPE_IPV6,
371 	RTE_FLOW_ITEM_TYPE_TCP,
372 	RTE_FLOW_ITEM_TYPE_END,
373 };
374 
375 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv6_sctp[] = {
376 	RTE_FLOW_ITEM_TYPE_ETH,
377 	RTE_FLOW_ITEM_TYPE_IPV4,
378 	RTE_FLOW_ITEM_TYPE_UDP,
379 	RTE_FLOW_ITEM_TYPE_VXLAN,
380 	RTE_FLOW_ITEM_TYPE_ETH,
381 	RTE_FLOW_ITEM_TYPE_IPV6,
382 	RTE_FLOW_ITEM_TYPE_SCTP,
383 	RTE_FLOW_ITEM_TYPE_END,
384 };
385 
386 static enum rte_flow_item_type pattern_ipv4_vxlan_eth_ipv6_icmp[] = {
387 	RTE_FLOW_ITEM_TYPE_ETH,
388 	RTE_FLOW_ITEM_TYPE_IPV4,
389 	RTE_FLOW_ITEM_TYPE_UDP,
390 	RTE_FLOW_ITEM_TYPE_VXLAN,
391 	RTE_FLOW_ITEM_TYPE_ETH,
392 	RTE_FLOW_ITEM_TYPE_IPV6,
393 	RTE_FLOW_ITEM_TYPE_ICMP,
394 	RTE_FLOW_ITEM_TYPE_END,
395 };
396 
397 /* IPv4 NVGRE IPv4 */
398 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv4[] = {
399 	RTE_FLOW_ITEM_TYPE_ETH,
400 	RTE_FLOW_ITEM_TYPE_IPV4,
401 	RTE_FLOW_ITEM_TYPE_NVGRE,
402 	RTE_FLOW_ITEM_TYPE_IPV4,
403 	RTE_FLOW_ITEM_TYPE_END,
404 };
405 
406 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv4_udp[] = {
407 	RTE_FLOW_ITEM_TYPE_ETH,
408 	RTE_FLOW_ITEM_TYPE_IPV4,
409 	RTE_FLOW_ITEM_TYPE_NVGRE,
410 	RTE_FLOW_ITEM_TYPE_IPV4,
411 	RTE_FLOW_ITEM_TYPE_UDP,
412 	RTE_FLOW_ITEM_TYPE_END,
413 };
414 
415 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv4_tcp[] = {
416 	RTE_FLOW_ITEM_TYPE_ETH,
417 	RTE_FLOW_ITEM_TYPE_IPV4,
418 	RTE_FLOW_ITEM_TYPE_NVGRE,
419 	RTE_FLOW_ITEM_TYPE_IPV4,
420 	RTE_FLOW_ITEM_TYPE_TCP,
421 	RTE_FLOW_ITEM_TYPE_END,
422 };
423 
424 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv4_sctp[] = {
425 	RTE_FLOW_ITEM_TYPE_ETH,
426 	RTE_FLOW_ITEM_TYPE_IPV4,
427 	RTE_FLOW_ITEM_TYPE_NVGRE,
428 	RTE_FLOW_ITEM_TYPE_IPV4,
429 	RTE_FLOW_ITEM_TYPE_SCTP,
430 	RTE_FLOW_ITEM_TYPE_END,
431 };
432 
433 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv4_icmp[] = {
434 	RTE_FLOW_ITEM_TYPE_ETH,
435 	RTE_FLOW_ITEM_TYPE_IPV4,
436 	RTE_FLOW_ITEM_TYPE_NVGRE,
437 	RTE_FLOW_ITEM_TYPE_IPV4,
438 	RTE_FLOW_ITEM_TYPE_ICMP,
439 	RTE_FLOW_ITEM_TYPE_END,
440 };
441 
442 /* IPv4 NVGRE MAC IPv4 */
443 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv4[] = {
444 	RTE_FLOW_ITEM_TYPE_ETH,
445 	RTE_FLOW_ITEM_TYPE_IPV4,
446 	RTE_FLOW_ITEM_TYPE_NVGRE,
447 	RTE_FLOW_ITEM_TYPE_ETH,
448 	RTE_FLOW_ITEM_TYPE_IPV4,
449 	RTE_FLOW_ITEM_TYPE_END,
450 };
451 
452 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv4_udp[] = {
453 	RTE_FLOW_ITEM_TYPE_ETH,
454 	RTE_FLOW_ITEM_TYPE_IPV4,
455 	RTE_FLOW_ITEM_TYPE_NVGRE,
456 	RTE_FLOW_ITEM_TYPE_ETH,
457 	RTE_FLOW_ITEM_TYPE_IPV4,
458 	RTE_FLOW_ITEM_TYPE_UDP,
459 	RTE_FLOW_ITEM_TYPE_END,
460 };
461 
462 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv4_tcp[] = {
463 	RTE_FLOW_ITEM_TYPE_ETH,
464 	RTE_FLOW_ITEM_TYPE_IPV4,
465 	RTE_FLOW_ITEM_TYPE_NVGRE,
466 	RTE_FLOW_ITEM_TYPE_ETH,
467 	RTE_FLOW_ITEM_TYPE_IPV4,
468 	RTE_FLOW_ITEM_TYPE_TCP,
469 	RTE_FLOW_ITEM_TYPE_END,
470 };
471 
472 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv4_sctp[] = {
473 	RTE_FLOW_ITEM_TYPE_ETH,
474 	RTE_FLOW_ITEM_TYPE_IPV4,
475 	RTE_FLOW_ITEM_TYPE_NVGRE,
476 	RTE_FLOW_ITEM_TYPE_ETH,
477 	RTE_FLOW_ITEM_TYPE_IPV4,
478 	RTE_FLOW_ITEM_TYPE_SCTP,
479 	RTE_FLOW_ITEM_TYPE_END,
480 };
481 
482 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv4_icmp[] = {
483 	RTE_FLOW_ITEM_TYPE_ETH,
484 	RTE_FLOW_ITEM_TYPE_IPV4,
485 	RTE_FLOW_ITEM_TYPE_NVGRE,
486 	RTE_FLOW_ITEM_TYPE_ETH,
487 	RTE_FLOW_ITEM_TYPE_IPV4,
488 	RTE_FLOW_ITEM_TYPE_ICMP,
489 	RTE_FLOW_ITEM_TYPE_END,
490 };
491 
492 /* IPv4 NVGRE IPv6 */
493 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv6[] = {
494 	RTE_FLOW_ITEM_TYPE_ETH,
495 	RTE_FLOW_ITEM_TYPE_IPV4,
496 	RTE_FLOW_ITEM_TYPE_NVGRE,
497 	RTE_FLOW_ITEM_TYPE_IPV6,
498 	RTE_FLOW_ITEM_TYPE_END,
499 };
500 
501 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv6_udp[] = {
502 	RTE_FLOW_ITEM_TYPE_ETH,
503 	RTE_FLOW_ITEM_TYPE_IPV4,
504 	RTE_FLOW_ITEM_TYPE_NVGRE,
505 	RTE_FLOW_ITEM_TYPE_IPV6,
506 	RTE_FLOW_ITEM_TYPE_UDP,
507 	RTE_FLOW_ITEM_TYPE_END,
508 };
509 
510 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv6_tcp[] = {
511 	RTE_FLOW_ITEM_TYPE_ETH,
512 	RTE_FLOW_ITEM_TYPE_IPV4,
513 	RTE_FLOW_ITEM_TYPE_NVGRE,
514 	RTE_FLOW_ITEM_TYPE_IPV6,
515 	RTE_FLOW_ITEM_TYPE_TCP,
516 	RTE_FLOW_ITEM_TYPE_END,
517 };
518 
519 static enum rte_flow_item_type pattern_ipv4_nvgre_ipv6_sctp[] = {
520 	RTE_FLOW_ITEM_TYPE_ETH,
521 	RTE_FLOW_ITEM_TYPE_IPV4,
522 	RTE_FLOW_ITEM_TYPE_NVGRE,
523 	RTE_FLOW_ITEM_TYPE_IPV6,
524 	RTE_FLOW_ITEM_TYPE_SCTP,
525 	RTE_FLOW_ITEM_TYPE_END,
526 };
527 
528 
529 /* IPv4 NVGRE MAC IPv6 */
530 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv6[] = {
531 	RTE_FLOW_ITEM_TYPE_ETH,
532 	RTE_FLOW_ITEM_TYPE_IPV4,
533 	RTE_FLOW_ITEM_TYPE_NVGRE,
534 	RTE_FLOW_ITEM_TYPE_ETH,
535 	RTE_FLOW_ITEM_TYPE_IPV6,
536 	RTE_FLOW_ITEM_TYPE_END,
537 };
538 
539 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv6_udp[] = {
540 	RTE_FLOW_ITEM_TYPE_ETH,
541 	RTE_FLOW_ITEM_TYPE_IPV4,
542 	RTE_FLOW_ITEM_TYPE_NVGRE,
543 	RTE_FLOW_ITEM_TYPE_ETH,
544 	RTE_FLOW_ITEM_TYPE_IPV6,
545 	RTE_FLOW_ITEM_TYPE_UDP,
546 	RTE_FLOW_ITEM_TYPE_END,
547 };
548 
549 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv6_tcp[] = {
550 	RTE_FLOW_ITEM_TYPE_ETH,
551 	RTE_FLOW_ITEM_TYPE_IPV4,
552 	RTE_FLOW_ITEM_TYPE_NVGRE,
553 	RTE_FLOW_ITEM_TYPE_ETH,
554 	RTE_FLOW_ITEM_TYPE_IPV6,
555 	RTE_FLOW_ITEM_TYPE_TCP,
556 	RTE_FLOW_ITEM_TYPE_END,
557 };
558 
559 static enum rte_flow_item_type pattern_ipv4_nvgre_eth_ipv6_sctp[] = {
560 	RTE_FLOW_ITEM_TYPE_ETH,
561 	RTE_FLOW_ITEM_TYPE_IPV4,
562 	RTE_FLOW_ITEM_TYPE_NVGRE,
563 	RTE_FLOW_ITEM_TYPE_ETH,
564 	RTE_FLOW_ITEM_TYPE_IPV6,
565 	RTE_FLOW_ITEM_TYPE_SCTP,
566 	RTE_FLOW_ITEM_TYPE_END,
567 };
568 
569 static struct ice_flow_pattern ice_supported_patterns[] = {
570 	{pattern_ethertype, INSET_ETHER},
571 	{pattern_ipv4, INSET_MAC_IPV4},
572 	{pattern_ipv4_udp, INSET_MAC_IPV4_L4},
573 	{pattern_ipv4_sctp, INSET_MAC_IPV4_L4},
574 	{pattern_ipv4_tcp, INSET_MAC_IPV4_L4},
575 	{pattern_ipv4_icmp, INSET_MAC_IPV4_ICMP},
576 	{pattern_ipv6, INSET_MAC_IPV6},
577 	{pattern_ipv6_udp, INSET_MAC_IPV6_L4},
578 	{pattern_ipv6_sctp, INSET_MAC_IPV6_L4},
579 	{pattern_ipv6_tcp, INSET_MAC_IPV6_L4},
580 	{pattern_ipv6_icmp6, INSET_MAC_IPV6_ICMP},
581 	{pattern_ipv4_vxlan_ipv4, INSET_TUNNEL_IPV4_TYPE1},
582 	{pattern_ipv4_vxlan_ipv4_udp, INSET_TUNNEL_IPV4_TYPE2},
583 	{pattern_ipv4_vxlan_ipv4_tcp, INSET_TUNNEL_IPV4_TYPE2},
584 	{pattern_ipv4_vxlan_ipv4_sctp, INSET_TUNNEL_IPV4_TYPE2},
585 	{pattern_ipv4_vxlan_ipv4_icmp, INSET_TUNNEL_IPV4_TYPE3},
586 	{pattern_ipv4_vxlan_eth_ipv4, INSET_TUNNEL_IPV4_TYPE1},
587 	{pattern_ipv4_vxlan_eth_ipv4_udp, INSET_TUNNEL_IPV4_TYPE2},
588 	{pattern_ipv4_vxlan_eth_ipv4_tcp, INSET_TUNNEL_IPV4_TYPE2},
589 	{pattern_ipv4_vxlan_eth_ipv4_sctp, INSET_TUNNEL_IPV4_TYPE2},
590 	{pattern_ipv4_vxlan_eth_ipv4_icmp, INSET_TUNNEL_IPV4_TYPE3},
591 	{pattern_ipv4_vxlan_ipv6, INSET_TUNNEL_IPV6_TYPE1},
592 	{pattern_ipv4_vxlan_ipv6_udp, INSET_TUNNEL_IPV6_TYPE2},
593 	{pattern_ipv4_vxlan_ipv6_tcp, INSET_TUNNEL_IPV6_TYPE2},
594 	{pattern_ipv4_vxlan_ipv6_sctp, INSET_TUNNEL_IPV6_TYPE2},
595 	{pattern_ipv4_vxlan_ipv6_icmp, INSET_TUNNEL_IPV6_TYPE3},
596 	{pattern_ipv4_vxlan_eth_ipv6, INSET_TUNNEL_IPV6_TYPE1},
597 	{pattern_ipv4_vxlan_eth_ipv6_udp, INSET_TUNNEL_IPV6_TYPE2},
598 	{pattern_ipv4_vxlan_eth_ipv6_tcp, INSET_TUNNEL_IPV6_TYPE2},
599 	{pattern_ipv4_vxlan_eth_ipv6_sctp, INSET_TUNNEL_IPV6_TYPE2},
600 	{pattern_ipv4_vxlan_eth_ipv6_icmp, INSET_TUNNEL_IPV6_TYPE3},
601 	{pattern_ipv4_nvgre_ipv4, INSET_TUNNEL_IPV4_TYPE1},
602 	{pattern_ipv4_nvgre_ipv4_udp, INSET_TUNNEL_IPV4_TYPE2},
603 	{pattern_ipv4_nvgre_ipv4_tcp, INSET_TUNNEL_IPV4_TYPE2},
604 	{pattern_ipv4_nvgre_ipv4_sctp, INSET_TUNNEL_IPV4_TYPE2},
605 	{pattern_ipv4_nvgre_ipv4_icmp, INSET_TUNNEL_IPV4_TYPE3},
606 	{pattern_ipv4_nvgre_eth_ipv4, INSET_TUNNEL_IPV4_TYPE1},
607 	{pattern_ipv4_nvgre_eth_ipv4_udp, INSET_TUNNEL_IPV4_TYPE2},
608 	{pattern_ipv4_nvgre_eth_ipv4_tcp, INSET_TUNNEL_IPV4_TYPE2},
609 	{pattern_ipv4_nvgre_eth_ipv4_sctp, INSET_TUNNEL_IPV4_TYPE2},
610 	{pattern_ipv4_nvgre_eth_ipv4_icmp, INSET_TUNNEL_IPV4_TYPE3},
611 	{pattern_ipv4_nvgre_ipv6, INSET_TUNNEL_IPV6_TYPE1},
612 	{pattern_ipv4_nvgre_ipv6_udp, INSET_TUNNEL_IPV6_TYPE2},
613 	{pattern_ipv4_nvgre_ipv6_tcp, INSET_TUNNEL_IPV6_TYPE2},
614 	{pattern_ipv4_nvgre_ipv6_sctp, INSET_TUNNEL_IPV6_TYPE2},
615 	{pattern_ipv4_nvgre_eth_ipv6, INSET_TUNNEL_IPV6_TYPE1},
616 	{pattern_ipv4_nvgre_eth_ipv6_udp, INSET_TUNNEL_IPV6_TYPE2},
617 	{pattern_ipv4_nvgre_eth_ipv6_tcp, INSET_TUNNEL_IPV6_TYPE2},
618 	{pattern_ipv4_nvgre_eth_ipv6_sctp, INSET_TUNNEL_IPV6_TYPE2},
619 };
620 
621 #endif
622