Line data Source code
1 : /*
2 : *------------------------------------------------------------------
3 : * Copyright (c) 2022 Intel and/or its affiliates.
4 : * Licensed under the Apache License, Version 2.0 (the "License");
5 : * you may not use this file except in compliance with the License.
6 : * You may obtain a copy of the License at:
7 : *
8 : * http://www.apache.org/licenses/LICENSE-2.0
9 : *
10 : * Unless required by applicable law or agreed to in writing, software
11 : * distributed under the License is distributed on an "AS IS" BASIS,
12 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 : * See the License for the specific language governing permissions and
14 : * limitations under the License.
15 : *------------------------------------------------------------------
16 : */
17 :
18 : #include <vppinfra/mem.h>
19 : #include "avf_advanced_flow.h"
20 :
21 : #define AVF_PHINT_NONE 0
22 : #define AVF_PHINT_GTPU BIT_ULL (0)
23 : #define AVF_PHINT_GTPU_EH BIT_ULL (1)
24 : #define AVF_PHINT_GTPU_EH_DWN BIT_ULL (2)
25 : #define AVF_PHINT_GTPU_EH_UP BIT_ULL (3)
26 : #define AVF_PHINT_OUTER_IPV4 BIT_ULL (4)
27 : #define AVF_PHINT_OUTER_IPV6 BIT_ULL (5)
28 : #define AVF_PHINT_GRE BIT_ULL (6)
29 : /* the second IP header of GTPoGRE */
30 : #define AVF_PHINT_MID_IPV4 BIT_ULL (7)
31 : #define AVF_PHINT_MID_IPV6 BIT_ULL (8)
32 : /* L2TPv2 */
33 : #define AVF_PHINT_L2TPV2 BIT_ULL (9)
34 : #define AVF_PHINT_L2TPV2_LEN BIT_ULL (10)
35 : /* Raw */
36 : #define AVF_PHINT_RAW BIT_ULL (11)
37 :
38 : #define AVF_PHINT_GTPU_MSK \
39 : (AVF_PHINT_GTPU | AVF_PHINT_GTPU_EH | AVF_PHINT_GTPU_EH_DWN | \
40 : AVF_PHINT_GTPU_EH_UP)
41 :
42 : #define AVF_PHINT_LAYERS_MSK (AVF_PHINT_OUTER_IPV4 | AVF_PHINT_OUTER_IPV6)
43 :
44 : #define AVF_GTPU_EH_DWNLINK 0
45 : #define AVF_GTPU_EH_UPLINK 1
46 :
47 : #define FIELD_SELECTOR(proto_hdr_field) \
48 : (1UL << ((proto_hdr_field) &PROTO_HDR_FIELD_MASK))
49 : #define BUFF_NOUSED 0
50 :
51 : #define REFINE_PROTO_FLD(op, fld) \
52 : VIRTCHNL_##op##_PROTO_HDR_FIELD (hdr, VIRTCHNL_PROTO_HDR_##fld)
53 : #define REPALCE_PROTO_FLD(fld_1, fld_2) \
54 : do \
55 : { \
56 : REFINE_PROTO_FLD (DEL, fld_1); \
57 : REFINE_PROTO_FLD (ADD, fld_2); \
58 : } \
59 : while (0)
60 :
61 : #define proto_hdr_eth \
62 : { \
63 : VIRTCHNL_PROTO_HDR_ETH, \
64 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_ETH_SRC) | \
65 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_ETH_DST), \
66 : { \
67 : BUFF_NOUSED \
68 : } \
69 : }
70 :
71 : #define proto_hdr_svlan \
72 : { \
73 : VIRTCHNL_PROTO_HDR_S_VLAN, FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_S_VLAN_ID), \
74 : { \
75 : BUFF_NOUSED \
76 : } \
77 : }
78 :
79 : #define proto_hdr_cvlan \
80 : { \
81 : VIRTCHNL_PROTO_HDR_C_VLAN, FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_C_VLAN_ID), \
82 : { \
83 : BUFF_NOUSED \
84 : } \
85 : }
86 :
87 : #define proto_hdr_ipv4 \
88 : { \
89 : VIRTCHNL_PROTO_HDR_IPV4, \
90 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
91 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV4_DST), \
92 : { \
93 : BUFF_NOUSED \
94 : } \
95 : }
96 :
97 : #define proto_hdr_ipv4_with_prot \
98 : { \
99 : VIRTCHNL_PROTO_HDR_IPV4, \
100 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
101 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV4_DST) | \
102 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV4_PROT), \
103 : { \
104 : BUFF_NOUSED \
105 : } \
106 : }
107 :
108 : #define proto_hdr_ipv6 \
109 : { \
110 : VIRTCHNL_PROTO_HDR_IPV6, \
111 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
112 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV6_DST), \
113 : { \
114 : BUFF_NOUSED \
115 : } \
116 : }
117 :
118 : #define proto_hdr_ipv6_frag \
119 : { \
120 : VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG, \
121 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG_PKID), \
122 : { \
123 : BUFF_NOUSED \
124 : } \
125 : }
126 :
127 : #define proto_hdr_ipv6_with_prot \
128 : { \
129 : VIRTCHNL_PROTO_HDR_IPV6, \
130 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
131 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV6_DST) | \
132 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_IPV6_PROT), \
133 : { \
134 : BUFF_NOUSED \
135 : } \
136 : }
137 :
138 : #define proto_hdr_udp \
139 : { \
140 : VIRTCHNL_PROTO_HDR_UDP, \
141 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_UDP_SRC_PORT) | \
142 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_UDP_DST_PORT), \
143 : { \
144 : BUFF_NOUSED \
145 : } \
146 : }
147 :
148 : #define proto_hdr_tcp \
149 : { \
150 : VIRTCHNL_PROTO_HDR_TCP, \
151 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_TCP_SRC_PORT) | \
152 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_TCP_DST_PORT), \
153 : { \
154 : BUFF_NOUSED \
155 : } \
156 : }
157 :
158 : #define proto_hdr_sctp \
159 : { \
160 : VIRTCHNL_PROTO_HDR_SCTP, \
161 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_SCTP_SRC_PORT) | \
162 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_SCTP_DST_PORT), \
163 : { \
164 : BUFF_NOUSED \
165 : } \
166 : }
167 :
168 : #define proto_hdr_esp \
169 : { \
170 : VIRTCHNL_PROTO_HDR_ESP, FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_ESP_SPI), \
171 : { \
172 : BUFF_NOUSED \
173 : } \
174 : }
175 :
176 : #define proto_hdr_ah \
177 : { \
178 : VIRTCHNL_PROTO_HDR_AH, FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_AH_SPI), \
179 : { \
180 : BUFF_NOUSED \
181 : } \
182 : }
183 :
184 : #define proto_hdr_l2tpv3 \
185 : { \
186 : VIRTCHNL_PROTO_HDR_L2TPV3, \
187 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_L2TPV3_SESS_ID), \
188 : { \
189 : BUFF_NOUSED \
190 : } \
191 : }
192 :
193 : #define proto_hdr_pfcp \
194 : { \
195 : VIRTCHNL_PROTO_HDR_PFCP, FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_PFCP_SEID), \
196 : { \
197 : BUFF_NOUSED \
198 : } \
199 : }
200 :
201 : #define proto_hdr_gtpc \
202 : { \
203 : VIRTCHNL_PROTO_HDR_GTPC, 0, { BUFF_NOUSED } \
204 : }
205 :
206 : #define proto_hdr_ecpri \
207 : { \
208 : VIRTCHNL_PROTO_HDR_ECPRI, \
209 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_ECPRI_PC_RTC_ID), \
210 : { \
211 : BUFF_NOUSED \
212 : } \
213 : }
214 :
215 : #define proto_hdr_l2tpv2 \
216 : { \
217 : VIRTCHNL_PROTO_HDR_L2TPV2, \
218 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_L2TPV2_SESS_ID) | \
219 : FIELD_SELECTOR (VIRTCHNL_PROTO_HDR_L2TPV2_LEN_SESS_ID), \
220 : { \
221 : BUFF_NOUSED \
222 : } \
223 : }
224 :
225 : #define proto_hdr_ppp \
226 : { \
227 : VIRTCHNL_PROTO_HDR_PPP, 0, { BUFF_NOUSED } \
228 : }
229 :
230 : #define TUNNEL_LEVEL_OUTER 0
231 : #define TUNNEL_LEVEL_INNER 1
232 :
233 : /* proto_hdrs template */
234 : struct virtchnl_proto_hdrs outer_ipv4_tmplt = {
235 : TUNNEL_LEVEL_OUTER,
236 : 4,
237 : { { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv4 } }
238 : };
239 :
240 : struct virtchnl_proto_hdrs outer_ipv4_udp_tmplt = {
241 : TUNNEL_LEVEL_OUTER,
242 : 5,
243 : { { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
244 : proto_hdr_ipv4_with_prot, proto_hdr_udp } }
245 : };
246 :
247 : struct virtchnl_proto_hdrs outer_ipv4_tcp_tmplt = {
248 : TUNNEL_LEVEL_OUTER,
249 : 5,
250 : { { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
251 : proto_hdr_ipv4_with_prot, proto_hdr_tcp } }
252 : };
253 :
254 : struct virtchnl_proto_hdrs outer_ipv4_sctp_tmplt = {
255 : TUNNEL_LEVEL_OUTER,
256 : 5,
257 : { { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv4,
258 : proto_hdr_sctp } }
259 : };
260 :
261 : struct virtchnl_proto_hdrs outer_ipv6_tmplt = {
262 : TUNNEL_LEVEL_OUTER,
263 : 4,
264 : { { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6 } }
265 : };
266 :
267 : struct virtchnl_proto_hdrs outer_ipv6_frag_tmplt = {
268 : TUNNEL_LEVEL_OUTER,
269 : 5,
270 : { { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6,
271 : proto_hdr_ipv6_frag } }
272 : };
273 :
274 : struct virtchnl_proto_hdrs outer_ipv6_udp_tmplt = {
275 : TUNNEL_LEVEL_OUTER,
276 : 5,
277 : { { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
278 : proto_hdr_ipv6_with_prot, proto_hdr_udp } }
279 : };
280 :
281 : struct virtchnl_proto_hdrs outer_ipv6_tcp_tmplt = {
282 : TUNNEL_LEVEL_OUTER,
283 : 5,
284 : { { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
285 : proto_hdr_ipv6_with_prot, proto_hdr_tcp } }
286 : };
287 :
288 : struct virtchnl_proto_hdrs outer_ipv6_sctp_tmplt = {
289 : TUNNEL_LEVEL_OUTER,
290 : 5,
291 : { { proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6,
292 : proto_hdr_sctp } }
293 : };
294 :
295 : struct virtchnl_proto_hdrs inner_ipv4_tmplt = { TUNNEL_LEVEL_INNER,
296 : 1,
297 : { { proto_hdr_ipv4 } } };
298 :
299 : struct virtchnl_proto_hdrs inner_ipv4_udp_tmplt = {
300 : TUNNEL_LEVEL_INNER, 2, { { proto_hdr_ipv4_with_prot, proto_hdr_udp } }
301 : };
302 :
303 : struct virtchnl_proto_hdrs inner_ipv4_tcp_tmplt = {
304 : TUNNEL_LEVEL_INNER, 2, { { proto_hdr_ipv4_with_prot, proto_hdr_tcp } }
305 : };
306 :
307 : struct virtchnl_proto_hdrs second_inner_ipv4_tmplt = {
308 : 2, 1, { { proto_hdr_ipv4 } }
309 : };
310 :
311 : struct virtchnl_proto_hdrs second_inner_ipv4_udp_tmplt = {
312 : 2, 2, { { proto_hdr_ipv4_with_prot, proto_hdr_udp } }
313 : };
314 :
315 : struct virtchnl_proto_hdrs second_inner_ipv4_tcp_tmplt = {
316 : 2, 2, { { proto_hdr_ipv4_with_prot, proto_hdr_tcp } }
317 : };
318 :
319 : struct virtchnl_proto_hdrs second_inner_ipv6_tmplt = {
320 : 2, 1, { { proto_hdr_ipv6 } }
321 : };
322 :
323 : struct virtchnl_proto_hdrs second_inner_ipv6_udp_tmplt = {
324 : 2, 2, { { proto_hdr_ipv6_with_prot, proto_hdr_udp } }
325 : };
326 :
327 : struct virtchnl_proto_hdrs second_inner_ipv6_tcp_tmplt = {
328 : 2, 2, { { proto_hdr_ipv6_with_prot, proto_hdr_tcp } }
329 : };
330 :
331 : struct virtchnl_proto_hdrs inner_ipv4_sctp_tmplt = {
332 : TUNNEL_LEVEL_INNER, 2, { { proto_hdr_ipv4, proto_hdr_sctp } }
333 : };
334 :
335 : struct virtchnl_proto_hdrs inner_ipv6_tmplt = { TUNNEL_LEVEL_INNER,
336 : 1,
337 : { { proto_hdr_ipv6 } } };
338 :
339 : struct virtchnl_proto_hdrs inner_ipv6_udp_tmplt = {
340 : TUNNEL_LEVEL_INNER, 2, { { proto_hdr_ipv6_with_prot, proto_hdr_udp } }
341 : };
342 :
343 : struct virtchnl_proto_hdrs inner_ipv6_tcp_tmplt = {
344 : TUNNEL_LEVEL_INNER, 2, { { proto_hdr_ipv6_with_prot, proto_hdr_tcp } }
345 : };
346 :
347 : struct virtchnl_proto_hdrs inner_ipv6_sctp_tmplt = {
348 : TUNNEL_LEVEL_INNER, 2, { { proto_hdr_ipv6, proto_hdr_sctp } }
349 : };
350 :
351 : struct virtchnl_proto_hdrs ipv4_esp_tmplt = {
352 : TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv4, proto_hdr_esp } }
353 : };
354 :
355 : struct virtchnl_proto_hdrs ipv4_udp_esp_tmplt = {
356 : TUNNEL_LEVEL_OUTER, 3, { { proto_hdr_ipv4, proto_hdr_udp, proto_hdr_esp } }
357 : };
358 :
359 : struct virtchnl_proto_hdrs ipv4_ah_tmplt = {
360 : TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv4, proto_hdr_ah } }
361 : };
362 :
363 : struct virtchnl_proto_hdrs ipv6_esp_tmplt = {
364 : TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv6, proto_hdr_esp } }
365 : };
366 :
367 : struct virtchnl_proto_hdrs ipv6_udp_esp_tmplt = {
368 : TUNNEL_LEVEL_OUTER, 3, { { proto_hdr_ipv6, proto_hdr_udp, proto_hdr_esp } }
369 : };
370 :
371 : struct virtchnl_proto_hdrs ipv6_ah_tmplt = {
372 : TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv6, proto_hdr_ah } }
373 : };
374 :
375 : struct virtchnl_proto_hdrs ipv4_l2tpv3_tmplt = {
376 : TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv4, proto_hdr_l2tpv3 } }
377 : };
378 :
379 : struct virtchnl_proto_hdrs ipv6_l2tpv3_tmplt = {
380 : TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv6, proto_hdr_l2tpv3 } }
381 : };
382 :
383 : struct virtchnl_proto_hdrs ipv4_pfcp_tmplt = {
384 : TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv4, proto_hdr_pfcp } }
385 : };
386 :
387 : struct virtchnl_proto_hdrs ipv6_pfcp_tmplt = {
388 : TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_ipv6, proto_hdr_pfcp } }
389 : };
390 :
391 : struct virtchnl_proto_hdrs ipv4_udp_gtpc_tmplt = {
392 : TUNNEL_LEVEL_OUTER, 3, { { proto_hdr_ipv4, proto_hdr_udp, proto_hdr_gtpc } }
393 : };
394 :
395 : struct virtchnl_proto_hdrs ipv6_udp_gtpc_tmplt = {
396 : TUNNEL_LEVEL_OUTER, 3, { { proto_hdr_ipv6, proto_hdr_udp, proto_hdr_gtpc } }
397 : };
398 :
399 : struct virtchnl_proto_hdrs eth_ecpri_tmplt = {
400 : TUNNEL_LEVEL_OUTER, 2, { { proto_hdr_eth, proto_hdr_ecpri } }
401 : };
402 :
403 : struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
404 : TUNNEL_LEVEL_OUTER, 3, { { proto_hdr_ipv4, proto_hdr_udp, proto_hdr_ecpri } }
405 : };
406 :
407 : struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv4_tmplt = {
408 : TUNNEL_LEVEL_INNER,
409 : 3,
410 : { { proto_hdr_l2tpv2, proto_hdr_ppp, proto_hdr_ipv4 } }
411 : };
412 :
413 : struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tmplt = {
414 : TUNNEL_LEVEL_INNER,
415 : 3,
416 : { { proto_hdr_l2tpv2, proto_hdr_ppp, proto_hdr_ipv6 } }
417 : };
418 :
419 : struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv4_udp_tmplt = {
420 : TUNNEL_LEVEL_INNER,
421 : 4,
422 : { { proto_hdr_l2tpv2, proto_hdr_ppp, proto_hdr_ipv4_with_prot,
423 : proto_hdr_udp } }
424 : };
425 :
426 : struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv4_tcp_tmplt = {
427 : TUNNEL_LEVEL_INNER,
428 : 4,
429 : { { proto_hdr_l2tpv2, proto_hdr_ppp, proto_hdr_ipv4_with_prot,
430 : proto_hdr_tcp } }
431 : };
432 :
433 : struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_udp_tmplt = {
434 : TUNNEL_LEVEL_INNER,
435 : 4,
436 : { { proto_hdr_l2tpv2, proto_hdr_ppp, proto_hdr_ipv6_with_prot,
437 : proto_hdr_udp } }
438 : };
439 :
440 : struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tcp_tmplt = {
441 : TUNNEL_LEVEL_INNER,
442 : 4,
443 : { { proto_hdr_l2tpv2, proto_hdr_ppp, proto_hdr_ipv6_with_prot,
444 : proto_hdr_tcp } }
445 :
446 : };
447 :
448 : struct virtchnl_proto_hdrs ipv4_l2tpv2_tmplt = {
449 : TUNNEL_LEVEL_OUTER,
450 : 4,
451 : { { proto_hdr_eth, proto_hdr_ipv4, proto_hdr_udp, proto_hdr_l2tpv2 } }
452 : };
453 :
454 : struct virtchnl_proto_hdrs ipv6_l2tpv2_tmplt = {
455 : TUNNEL_LEVEL_OUTER,
456 : 4,
457 : { { proto_hdr_eth, proto_hdr_ipv6, proto_hdr_udp, proto_hdr_l2tpv2 } }
458 : };
459 :
460 : struct virtchnl_proto_hdrs ipv4_l2tpv2_ppp_tmplt = {
461 : TUNNEL_LEVEL_OUTER,
462 : 5,
463 : { { proto_hdr_eth, proto_hdr_ipv4, proto_hdr_udp, proto_hdr_l2tpv2,
464 : proto_hdr_ppp } }
465 : };
466 :
467 : struct virtchnl_proto_hdrs ipv6_l2tpv2_ppp_tmplt = {
468 : TUNNEL_LEVEL_OUTER,
469 : 5,
470 : { { proto_hdr_eth, proto_hdr_ipv6, proto_hdr_udp, proto_hdr_l2tpv2,
471 : proto_hdr_ppp } }
472 : };
473 :
474 : /* rss type super set */
475 :
476 : #define AVF_INSET_NONE 0ULL
477 :
478 : /* IPv4 outer */
479 : #define AVF_RSS_TYPE_OUTER_IPV4 \
480 : (AVF_ETH_RSS_ETH | AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_FRAG_IPV4 | \
481 : AVF_ETH_RSS_IPV4_CHKSUM)
482 : #define AVF_RSS_TYPE_OUTER_IPV4_UDP \
483 : (AVF_RSS_TYPE_OUTER_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_UDP | \
484 : AVF_ETH_RSS_L4_CHKSUM)
485 : #define AVF_RSS_TYPE_OUTER_IPV4_TCP \
486 : (AVF_RSS_TYPE_OUTER_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_TCP | \
487 : AVF_ETH_RSS_L4_CHKSUM)
488 : #define AVF_RSS_TYPE_OUTER_IPV4_SCTP \
489 : (AVF_RSS_TYPE_OUTER_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_SCTP | \
490 : AVF_ETH_RSS_L4_CHKSUM)
491 : /* IPv6 outer */
492 : #define AVF_RSS_TYPE_OUTER_IPV6 (AVF_ETH_RSS_ETH | AVF_ETH_RSS_IPV6)
493 : #define AVF_RSS_TYPE_OUTER_IPV6_FRAG \
494 : (AVF_RSS_TYPE_OUTER_IPV6 | AVF_ETH_RSS_FRAG_IPV6)
495 : #define AVF_RSS_TYPE_OUTER_IPV6_UDP \
496 : (AVF_RSS_TYPE_OUTER_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_UDP | \
497 : AVF_ETH_RSS_L4_CHKSUM)
498 : #define AVF_RSS_TYPE_OUTER_IPV6_TCP \
499 : (AVF_RSS_TYPE_OUTER_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_TCP | \
500 : AVF_ETH_RSS_L4_CHKSUM)
501 : #define AVF_RSS_TYPE_OUTER_IPV6_SCTP \
502 : (AVF_RSS_TYPE_OUTER_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_SCTP | \
503 : AVF_ETH_RSS_L4_CHKSUM)
504 : /* VLAN IPV4 */
505 : #define AVF_RSS_TYPE_VLAN_IPV4 \
506 : (AVF_RSS_TYPE_OUTER_IPV4 | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
507 : #define AVF_RSS_TYPE_VLAN_IPV4_UDP \
508 : (AVF_RSS_TYPE_OUTER_IPV4_UDP | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
509 : #define AVF_RSS_TYPE_VLAN_IPV4_TCP \
510 : (AVF_RSS_TYPE_OUTER_IPV4_TCP | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
511 : #define AVF_RSS_TYPE_VLAN_IPV4_SCTP \
512 : (AVF_RSS_TYPE_OUTER_IPV4_SCTP | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
513 : /* VLAN IPv6 */
514 : #define AVF_RSS_TYPE_VLAN_IPV6 \
515 : (AVF_RSS_TYPE_OUTER_IPV6 | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
516 : #define AVF_RSS_TYPE_VLAN_IPV6_FRAG \
517 : (AVF_RSS_TYPE_OUTER_IPV6_FRAG | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
518 : #define AVF_RSS_TYPE_VLAN_IPV6_UDP \
519 : (AVF_RSS_TYPE_OUTER_IPV6_UDP | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
520 : #define AVF_RSS_TYPE_VLAN_IPV6_TCP \
521 : (AVF_RSS_TYPE_OUTER_IPV6_TCP | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
522 : #define AVF_RSS_TYPE_VLAN_IPV6_SCTP \
523 : (AVF_RSS_TYPE_OUTER_IPV6_SCTP | AVF_ETH_RSS_S_VLAN | AVF_ETH_RSS_C_VLAN)
524 : /* IPv4 inner */
525 : #define AVF_RSS_TYPE_INNER_IPV4 AVF_ETH_RSS_IPV4
526 : #define AVF_RSS_TYPE_INNER_IPV4_UDP \
527 : (AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_UDP)
528 : #define AVF_RSS_TYPE_INNER_IPV4_TCP \
529 : (AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_TCP)
530 : #define AVF_RSS_TYPE_INNER_IPV4_SCTP \
531 : (AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_SCTP)
532 : /* IPv6 inner */
533 : #define AVF_RSS_TYPE_INNER_IPV6 AVF_ETH_RSS_IPV6
534 : #define AVF_RSS_TYPE_INNER_IPV6_UDP \
535 : (AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_UDP)
536 : #define AVF_RSS_TYPE_INNER_IPV6_TCP \
537 : (AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_TCP)
538 : #define AVF_RSS_TYPE_INNER_IPV6_SCTP \
539 : (AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_SCTP)
540 : /* GTPU IPv4 */
541 : #define AVF_RSS_TYPE_GTPU_IPV4 (AVF_RSS_TYPE_INNER_IPV4 | AVF_ETH_RSS_GTPU)
542 : #define AVF_RSS_TYPE_GTPU_IPV4_UDP \
543 : (AVF_RSS_TYPE_INNER_IPV4_UDP | AVF_ETH_RSS_GTPU)
544 : #define AVF_RSS_TYPE_GTPU_IPV4_TCP \
545 : (AVF_RSS_TYPE_INNER_IPV4_TCP | AVF_ETH_RSS_GTPU)
546 : /* GTPU IPv6 */
547 : #define AVF_RSS_TYPE_GTPU_IPV6 (AVF_RSS_TYPE_INNER_IPV6 | AVF_ETH_RSS_GTPU)
548 : #define AVF_RSS_TYPE_GTPU_IPV6_UDP \
549 : (AVF_RSS_TYPE_INNER_IPV6_UDP | AVF_ETH_RSS_GTPU)
550 : #define AVF_RSS_TYPE_GTPU_IPV6_TCP \
551 : (AVF_RSS_TYPE_INNER_IPV6_TCP | AVF_ETH_RSS_GTPU)
552 : /* ESP, AH, L2TPV3 and PFCP */
553 : #define AVF_RSS_TYPE_IPV4_ESP (AVF_ETH_RSS_ESP | AVF_ETH_RSS_IPV4)
554 : #define AVF_RSS_TYPE_IPV4_AH (AVF_ETH_RSS_AH | AVF_ETH_RSS_IPV4)
555 : #define AVF_RSS_TYPE_IPV6_ESP (AVF_ETH_RSS_ESP | AVF_ETH_RSS_IPV6)
556 : #define AVF_RSS_TYPE_IPV6_AH (AVF_ETH_RSS_AH | AVF_ETH_RSS_IPV6)
557 : #define AVF_RSS_TYPE_IPV4_L2TPV3 (AVF_ETH_RSS_L2TPV3 | AVF_ETH_RSS_IPV4)
558 : #define AVF_RSS_TYPE_IPV6_L2TPV3 (AVF_ETH_RSS_L2TPV3 | AVF_ETH_RSS_IPV6)
559 : #define AVF_RSS_TYPE_IPV4_PFCP (AVF_ETH_RSS_PFCP | AVF_ETH_RSS_IPV4)
560 : #define AVF_RSS_TYPE_IPV6_PFCP (AVF_ETH_RSS_PFCP | AVF_ETH_RSS_IPV6)
561 :
562 : /* L2TPv2 */
563 : #define AVF_RSS_TYPE_ETH_L2TPV2 (AVF_ETH_RSS_ETH | AVF_ETH_RSS_L2TPV2)
564 :
565 : #define VALID_RSS_IPV4_L4 \
566 : (AVF_ETH_RSS_NONFRAG_IPV4_UDP | AVF_ETH_RSS_NONFRAG_IPV4_TCP | \
567 : AVF_ETH_RSS_NONFRAG_IPV4_SCTP)
568 :
569 : #define VALID_RSS_IPV6_L4 \
570 : (AVF_ETH_RSS_NONFRAG_IPV6_UDP | AVF_ETH_RSS_NONFRAG_IPV6_TCP | \
571 : AVF_ETH_RSS_NONFRAG_IPV6_SCTP)
572 :
573 : #define VALID_RSS_IPV4 \
574 : (AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_FRAG_IPV4 | VALID_RSS_IPV4_L4)
575 : #define VALID_RSS_IPV6 \
576 : (AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_FRAG_IPV6 | VALID_RSS_IPV6_L4)
577 : #define VALID_RSS_L3 (VALID_RSS_IPV4 | VALID_RSS_IPV6)
578 : #define VALID_RSS_L4 (VALID_RSS_IPV4_L4 | VALID_RSS_IPV6_L4)
579 :
580 : #define VALID_RSS_ATTR \
581 : (AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY | \
582 : AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY | \
583 : AVF_ETH_RSS_L2_SRC_ONLY | AVF_ETH_RSS_L2_DST_ONLY | AVF_ETH_RSS_L3_PRE64)
584 :
585 : #define INVALID_RSS_ATTR \
586 : (AVF_ETH_RSS_L3_PRE32 | AVF_ETH_RSS_L3_PRE40 | AVF_ETH_RSS_L3_PRE48 | \
587 : AVF_ETH_RSS_L3_PRE56 | AVF_ETH_RSS_L3_PRE96)
588 :
589 : static u64 invalid_rss_comb[] = {
590 : AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_UDP,
591 : AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_NONFRAG_IPV4_TCP,
592 : AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_UDP,
593 : AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_NONFRAG_IPV6_TCP,
594 : AVF_ETH_RSS_L3_PRE32 | AVF_ETH_RSS_L3_PRE40 | AVF_ETH_RSS_L3_PRE48 |
595 : AVF_ETH_RSS_L3_PRE56 | AVF_ETH_RSS_L3_PRE96
596 : };
597 :
598 : struct rss_attr_type
599 : {
600 : u64 attr;
601 : u64 type;
602 : };
603 :
604 : static struct rss_attr_type rss_attr_to_valid_type[] = {
605 : { AVF_ETH_RSS_L2_SRC_ONLY | AVF_ETH_RSS_L2_DST_ONLY, AVF_ETH_RSS_ETH },
606 : { AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY, VALID_RSS_L3 },
607 : { AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY, VALID_RSS_L4 },
608 : /* current ipv6 prefix only supports prefix 64 bits*/
609 : { AVF_ETH_RSS_L3_PRE64, VALID_RSS_IPV6 },
610 : { INVALID_RSS_ATTR, 0 }
611 : };
612 :
613 : /* raw */
614 : enum avf_flow_item_type avf_pattern_raw[] = {
615 : AVF_FLOW_ITEM_TYPE_RAW,
616 : AVF_FLOW_ITEM_TYPE_END,
617 : };
618 :
619 : /* empty */
620 : enum avf_flow_item_type avf_pattern_empty[] = {
621 : AVF_FLOW_ITEM_TYPE_END,
622 : };
623 :
624 : /* L2 */
625 : enum avf_flow_item_type avf_pattern_ethertype[] = {
626 : AVF_FLOW_ITEM_TYPE_ETH,
627 : AVF_FLOW_ITEM_TYPE_END,
628 : };
629 :
630 : enum avf_flow_item_type avf_pattern_ethertype_vlan[] = {
631 : AVF_FLOW_ITEM_TYPE_ETH,
632 : AVF_FLOW_ITEM_TYPE_VLAN,
633 : AVF_FLOW_ITEM_TYPE_END,
634 : };
635 :
636 : enum avf_flow_item_type avf_pattern_ethertype_qinq[] = {
637 : AVF_FLOW_ITEM_TYPE_ETH,
638 : AVF_FLOW_ITEM_TYPE_VLAN,
639 : AVF_FLOW_ITEM_TYPE_VLAN,
640 : AVF_FLOW_ITEM_TYPE_END,
641 : };
642 :
643 : /* ARP */
644 : enum avf_flow_item_type avf_pattern_eth_arp[] = {
645 : AVF_FLOW_ITEM_TYPE_ETH,
646 : AVF_FLOW_ITEM_TYPE_ARP_ETH_IPV4,
647 : AVF_FLOW_ITEM_TYPE_END,
648 : };
649 :
650 : /* non-tunnel IPv4 */
651 : enum avf_flow_item_type avf_pattern_eth_ipv4[] = {
652 : AVF_FLOW_ITEM_TYPE_ETH,
653 : AVF_FLOW_ITEM_TYPE_IPV4,
654 : AVF_FLOW_ITEM_TYPE_END,
655 : };
656 :
657 : enum avf_flow_item_type avf_pattern_eth_vlan_ipv4[] = {
658 : AVF_FLOW_ITEM_TYPE_ETH,
659 : AVF_FLOW_ITEM_TYPE_VLAN,
660 : AVF_FLOW_ITEM_TYPE_IPV4,
661 : AVF_FLOW_ITEM_TYPE_END,
662 : };
663 :
664 : enum avf_flow_item_type avf_pattern_eth_qinq_ipv4[] = {
665 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
666 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
667 : };
668 :
669 : enum avf_flow_item_type avf_pattern_eth_ipv4_udp[] = {
670 : AVF_FLOW_ITEM_TYPE_ETH,
671 : AVF_FLOW_ITEM_TYPE_IPV4,
672 : AVF_FLOW_ITEM_TYPE_UDP,
673 : AVF_FLOW_ITEM_TYPE_END,
674 : };
675 :
676 : enum avf_flow_item_type avf_pattern_eth_vlan_ipv4_udp[] = {
677 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV4,
678 : AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
679 : };
680 :
681 : enum avf_flow_item_type avf_pattern_eth_qinq_ipv4_udp[] = {
682 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
683 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
684 : };
685 :
686 : enum avf_flow_item_type avf_pattern_eth_ipv4_tcp[] = {
687 : AVF_FLOW_ITEM_TYPE_ETH,
688 : AVF_FLOW_ITEM_TYPE_IPV4,
689 : AVF_FLOW_ITEM_TYPE_TCP,
690 : AVF_FLOW_ITEM_TYPE_END,
691 : };
692 :
693 : enum avf_flow_item_type avf_pattern_eth_vlan_ipv4_tcp[] = {
694 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV4,
695 : AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
696 : };
697 :
698 : enum avf_flow_item_type avf_pattern_eth_qinq_ipv4_tcp[] = {
699 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
700 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
701 : };
702 :
703 : enum avf_flow_item_type avf_pattern_eth_ipv4_sctp[] = {
704 : AVF_FLOW_ITEM_TYPE_ETH,
705 : AVF_FLOW_ITEM_TYPE_IPV4,
706 : AVF_FLOW_ITEM_TYPE_SCTP,
707 : AVF_FLOW_ITEM_TYPE_END,
708 : };
709 :
710 : enum avf_flow_item_type avf_pattern_eth_vlan_ipv4_sctp[] = {
711 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV4,
712 : AVF_FLOW_ITEM_TYPE_SCTP, AVF_FLOW_ITEM_TYPE_END,
713 : };
714 :
715 : enum avf_flow_item_type avf_pattern_eth_qinq_ipv4_sctp[] = {
716 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
717 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_SCTP, AVF_FLOW_ITEM_TYPE_END,
718 : };
719 :
720 : enum avf_flow_item_type avf_pattern_eth_ipv4_icmp[] = {
721 : AVF_FLOW_ITEM_TYPE_ETH,
722 : AVF_FLOW_ITEM_TYPE_IPV4,
723 : AVF_FLOW_ITEM_TYPE_ICMP,
724 : AVF_FLOW_ITEM_TYPE_END,
725 : };
726 :
727 : enum avf_flow_item_type avf_pattern_eth_vlan_ipv4_icmp[] = {
728 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV4,
729 : AVF_FLOW_ITEM_TYPE_ICMP, AVF_FLOW_ITEM_TYPE_END,
730 : };
731 :
732 : enum avf_flow_item_type avf_pattern_eth_qinq_ipv4_icmp[] = {
733 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
734 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_ICMP, AVF_FLOW_ITEM_TYPE_END,
735 : };
736 :
737 : /* non-tunnel IPv6 */
738 : enum avf_flow_item_type avf_pattern_eth_ipv6[] = {
739 : AVF_FLOW_ITEM_TYPE_ETH,
740 : AVF_FLOW_ITEM_TYPE_IPV6,
741 : AVF_FLOW_ITEM_TYPE_END,
742 : };
743 :
744 : enum avf_flow_item_type avf_pattern_eth_vlan_ipv6[] = {
745 : AVF_FLOW_ITEM_TYPE_ETH,
746 : AVF_FLOW_ITEM_TYPE_VLAN,
747 : AVF_FLOW_ITEM_TYPE_IPV6,
748 : AVF_FLOW_ITEM_TYPE_END,
749 : };
750 :
751 : enum avf_flow_item_type avf_pattern_eth_qinq_ipv6[] = {
752 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
753 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
754 : };
755 :
756 : enum avf_flow_item_type avf_pattern_eth_ipv6_frag_ext[] = {
757 : AVF_FLOW_ITEM_TYPE_ETH,
758 : AVF_FLOW_ITEM_TYPE_IPV6,
759 : AVF_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
760 : AVF_FLOW_ITEM_TYPE_END,
761 : };
762 :
763 : enum avf_flow_item_type avf_pattern_eth_vlan_ipv6_frag_ext[] = {
764 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN,
765 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
766 : AVF_FLOW_ITEM_TYPE_END,
767 : };
768 :
769 : enum avf_flow_item_type avf_pattern_eth_qinq_ipv6_frag_ext[] = {
770 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN,
771 : AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV6,
772 : AVF_FLOW_ITEM_TYPE_IPV6_FRAG_EXT, AVF_FLOW_ITEM_TYPE_END,
773 : };
774 :
775 : enum avf_flow_item_type avf_pattern_eth_ipv6_udp[] = {
776 : AVF_FLOW_ITEM_TYPE_ETH,
777 : AVF_FLOW_ITEM_TYPE_IPV6,
778 : AVF_FLOW_ITEM_TYPE_UDP,
779 : AVF_FLOW_ITEM_TYPE_END,
780 : };
781 :
782 : enum avf_flow_item_type avf_pattern_eth_vlan_ipv6_udp[] = {
783 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV6,
784 : AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
785 : };
786 :
787 : enum avf_flow_item_type avf_pattern_eth_qinq_ipv6_udp[] = {
788 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
789 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
790 : };
791 :
792 : enum avf_flow_item_type avf_pattern_eth_ipv6_tcp[] = {
793 : AVF_FLOW_ITEM_TYPE_ETH,
794 : AVF_FLOW_ITEM_TYPE_IPV6,
795 : AVF_FLOW_ITEM_TYPE_TCP,
796 : AVF_FLOW_ITEM_TYPE_END,
797 : };
798 :
799 : enum avf_flow_item_type avf_pattern_eth_vlan_ipv6_tcp[] = {
800 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV6,
801 : AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
802 : };
803 :
804 : enum avf_flow_item_type avf_pattern_eth_qinq_ipv6_tcp[] = {
805 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
806 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
807 : };
808 :
809 : enum avf_flow_item_type avf_pattern_eth_ipv6_sctp[] = {
810 : AVF_FLOW_ITEM_TYPE_ETH,
811 : AVF_FLOW_ITEM_TYPE_IPV6,
812 : AVF_FLOW_ITEM_TYPE_SCTP,
813 : AVF_FLOW_ITEM_TYPE_END,
814 : };
815 :
816 : enum avf_flow_item_type avf_pattern_eth_vlan_ipv6_sctp[] = {
817 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV6,
818 : AVF_FLOW_ITEM_TYPE_SCTP, AVF_FLOW_ITEM_TYPE_END,
819 : };
820 :
821 : enum avf_flow_item_type avf_pattern_eth_qinq_ipv6_sctp[] = {
822 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
823 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_SCTP, AVF_FLOW_ITEM_TYPE_END,
824 : };
825 :
826 : enum avf_flow_item_type avf_pattern_eth_ipv6_icmp6[] = {
827 : AVF_FLOW_ITEM_TYPE_ETH,
828 : AVF_FLOW_ITEM_TYPE_IPV6,
829 : AVF_FLOW_ITEM_TYPE_ICMP6,
830 : AVF_FLOW_ITEM_TYPE_END,
831 : };
832 :
833 : enum avf_flow_item_type avf_pattern_eth_vlan_ipv6_icmp6[] = {
834 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_IPV6,
835 : AVF_FLOW_ITEM_TYPE_ICMP6, AVF_FLOW_ITEM_TYPE_END,
836 : };
837 :
838 : enum avf_flow_item_type avf_pattern_eth_qinq_ipv6_icmp6[] = {
839 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_VLAN, AVF_FLOW_ITEM_TYPE_VLAN,
840 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_ICMP6, AVF_FLOW_ITEM_TYPE_END,
841 : };
842 :
843 : /* IPv4 GTPC */
844 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpc[] = {
845 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
846 : AVF_FLOW_ITEM_TYPE_GTPC, AVF_FLOW_ITEM_TYPE_END,
847 : };
848 :
849 : /* IPV4 GTPU (EH) */
850 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu[] = {
851 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
852 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_END,
853 : };
854 :
855 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh[] = {
856 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
857 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_END,
858 : };
859 :
860 : /* IPv6 GTPC */
861 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpc[] = {
862 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
863 : AVF_FLOW_ITEM_TYPE_GTPC, AVF_FLOW_ITEM_TYPE_END,
864 : };
865 :
866 : /* IPV6 GTPU (EH) */
867 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu[] = {
868 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
869 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_END,
870 : };
871 :
872 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh[] = {
873 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
874 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_END,
875 : };
876 :
877 : /* IPV4 GTPU IPv4 */
878 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv4[] = {
879 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
880 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
881 : };
882 :
883 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv4_udp[] = {
884 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
885 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
886 : AVF_FLOW_ITEM_TYPE_END,
887 : };
888 :
889 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv4_tcp[] = {
890 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
891 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP,
892 : AVF_FLOW_ITEM_TYPE_END,
893 : };
894 :
895 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv4_icmp[] = {
896 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
897 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_ICMP,
898 : AVF_FLOW_ITEM_TYPE_END,
899 : };
900 :
901 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu[] = {
902 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
903 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
904 : AVF_FLOW_ITEM_TYPE_END,
905 : };
906 :
907 : /* IPV4 GRE IPv4 UDP GTPU IPv4*/
908 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4[] = {
909 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
910 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
911 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
912 : };
913 :
914 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4_udp[] = {
915 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
916 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
917 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
918 : };
919 :
920 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4_tcp[] = {
921 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
922 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
923 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
924 : };
925 :
926 : /* IPV4 GRE IPv4 UDP GTPU IPv6*/
927 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6[] = {
928 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
929 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
930 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
931 : };
932 :
933 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6_udp[] = {
934 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
935 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
936 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
937 : };
938 :
939 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6_tcp[] = {
940 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
941 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
942 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
943 : };
944 :
945 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu[] = {
946 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
947 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
948 : AVF_FLOW_ITEM_TYPE_END,
949 : };
950 :
951 : /* IPV4 GRE IPv6 UDP GTPU IPv4*/
952 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4[] = {
953 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
954 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
955 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
956 : };
957 :
958 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4_udp[] = {
959 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
960 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
961 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
962 : };
963 :
964 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4_tcp[] = {
965 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
966 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
967 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
968 : };
969 :
970 : /* IPV4 GRE IPv6 UDP GTPU IPv6*/
971 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6[] = {
972 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
973 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
974 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
975 : };
976 :
977 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6_udp[] = {
978 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
979 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
980 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
981 : };
982 :
983 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6_tcp[] = {
984 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
985 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
986 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
987 : };
988 :
989 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu[] = {
990 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
991 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
992 : AVF_FLOW_ITEM_TYPE_END,
993 : };
994 :
995 : /* IPV6 GRE IPv4 UDP GTPU IPv4*/
996 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4[] = {
997 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
998 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
999 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
1000 : };
1001 :
1002 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4_udp[] = {
1003 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1004 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1005 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1006 : };
1007 :
1008 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4_tcp[] = {
1009 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1010 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1011 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1012 : };
1013 :
1014 : /* IPV4 GRE IPv4 UDP GTPU IPv6*/
1015 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6[] = {
1016 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1017 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1018 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
1019 : };
1020 :
1021 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6_udp[] = {
1022 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1023 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1024 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1025 : };
1026 :
1027 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6_tcp[] = {
1028 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1029 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1030 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1031 : };
1032 :
1033 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu[] = {
1034 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1035 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1036 : AVF_FLOW_ITEM_TYPE_END,
1037 : };
1038 :
1039 : /* IPV6 GRE IPv6 UDP GTPU IPv4*/
1040 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4[] = {
1041 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1042 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1043 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
1044 : };
1045 :
1046 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4_udp[] = {
1047 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1048 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1049 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1050 : };
1051 :
1052 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4_tcp[] = {
1053 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1054 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1055 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1056 : };
1057 :
1058 : /* IPV6 GRE IPv6 UDP GTPU IPv6*/
1059 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6[] = {
1060 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1061 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1062 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
1063 : };
1064 :
1065 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6_udp[] = {
1066 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1067 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1068 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1069 : };
1070 :
1071 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6_tcp[] = {
1072 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1073 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1074 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1075 : };
1076 :
1077 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh[] = {
1078 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1079 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1080 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_END,
1081 : };
1082 :
1083 : /* IPV4 GRE IPv4 UDP GTPU EH IPv4*/
1084 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4[] = {
1085 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1086 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1087 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
1088 : };
1089 :
1090 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4_udp[] = {
1091 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1092 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1093 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1094 : AVF_FLOW_ITEM_TYPE_END,
1095 : };
1096 :
1097 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4_tcp[] = {
1098 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1099 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1100 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP,
1101 : AVF_FLOW_ITEM_TYPE_END,
1102 : };
1103 :
1104 : /* IPV4 GRE IPv4 UDP GTPU IPv6*/
1105 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6[] = {
1106 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1107 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1108 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
1109 : };
1110 :
1111 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6_udp[] = {
1112 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1113 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1114 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1115 : AVF_FLOW_ITEM_TYPE_END,
1116 : };
1117 :
1118 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6_tcp[] = {
1119 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1120 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1121 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP,
1122 : AVF_FLOW_ITEM_TYPE_END,
1123 : };
1124 :
1125 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh[] = {
1126 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1127 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1128 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_END,
1129 : };
1130 :
1131 : /* IPV4 GRE IPv6 UDP GTPU EH IPv4*/
1132 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4[] = {
1133 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1134 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1135 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
1136 : };
1137 :
1138 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4_udp[] = {
1139 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1140 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1141 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1142 : AVF_FLOW_ITEM_TYPE_END,
1143 : };
1144 :
1145 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4_tcp[] = {
1146 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1147 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1148 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP,
1149 : AVF_FLOW_ITEM_TYPE_END,
1150 : };
1151 :
1152 : /* IPV4 GRE IPv6 UDP GTPU EH IPv6*/
1153 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6[] = {
1154 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1155 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1156 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
1157 : };
1158 :
1159 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6_udp[] = {
1160 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1161 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1162 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1163 : AVF_FLOW_ITEM_TYPE_END,
1164 : };
1165 :
1166 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6_tcp[] = {
1167 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1168 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1169 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP,
1170 : AVF_FLOW_ITEM_TYPE_END,
1171 : };
1172 :
1173 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh[] = {
1174 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1175 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1176 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_END,
1177 : };
1178 :
1179 : /* IPV6 GRE IPv4 UDP GTPU EH IPv4*/
1180 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4[] = {
1181 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1182 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1183 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
1184 : };
1185 :
1186 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4_udp[] = {
1187 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1188 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1189 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1190 : AVF_FLOW_ITEM_TYPE_END,
1191 : };
1192 :
1193 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4_tcp[] = {
1194 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1195 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1196 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP,
1197 : AVF_FLOW_ITEM_TYPE_END,
1198 : };
1199 :
1200 : /* IPV4 GRE IPv4 UDP GTPU EH IPv6*/
1201 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6[] = {
1202 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1203 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1204 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
1205 : };
1206 :
1207 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6_udp[] = {
1208 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1209 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1210 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1211 : AVF_FLOW_ITEM_TYPE_END,
1212 : };
1213 :
1214 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6_tcp[] = {
1215 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1216 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1217 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP,
1218 : AVF_FLOW_ITEM_TYPE_END,
1219 : };
1220 :
1221 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh[] = {
1222 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1223 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1224 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_END,
1225 : };
1226 :
1227 : /* IPV6 GRE IPv6 UDP GTPU EH IPv4*/
1228 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4[] = {
1229 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1230 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1231 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
1232 : };
1233 :
1234 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4_udp[] = {
1235 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1236 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1237 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1238 : AVF_FLOW_ITEM_TYPE_END,
1239 : };
1240 :
1241 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4_tcp[] = {
1242 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1243 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1244 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP,
1245 : AVF_FLOW_ITEM_TYPE_END,
1246 : };
1247 :
1248 : /* IPV6 GRE IPv6 UDP GTPU EH IPv6*/
1249 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6[] = {
1250 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1251 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1252 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
1253 : };
1254 :
1255 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6_udp[] = {
1256 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1257 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1258 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1259 : AVF_FLOW_ITEM_TYPE_END,
1260 : };
1261 :
1262 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6_tcp[] = {
1263 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1264 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_GTPU,
1265 : AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP,
1266 : AVF_FLOW_ITEM_TYPE_END,
1267 : };
1268 :
1269 : /* IPV4 GTPU IPv6 */
1270 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv6[] = {
1271 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1272 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
1273 : };
1274 :
1275 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv6_udp[] = {
1276 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1277 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1278 : AVF_FLOW_ITEM_TYPE_END,
1279 : };
1280 :
1281 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv6_tcp[] = {
1282 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1283 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP,
1284 : AVF_FLOW_ITEM_TYPE_END,
1285 : };
1286 :
1287 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_ipv6_icmp[] = {
1288 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1289 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_ICMP,
1290 : AVF_FLOW_ITEM_TYPE_END,
1291 : };
1292 :
1293 : /* IPV6 GTPU IPv4 */
1294 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv4[] = {
1295 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1296 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
1297 : };
1298 :
1299 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv4_udp[] = {
1300 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1301 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1302 : AVF_FLOW_ITEM_TYPE_END,
1303 : };
1304 :
1305 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv4_tcp[] = {
1306 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1307 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP,
1308 : AVF_FLOW_ITEM_TYPE_END,
1309 : };
1310 :
1311 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv4_icmp[] = {
1312 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1313 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_ICMP,
1314 : AVF_FLOW_ITEM_TYPE_END,
1315 : };
1316 :
1317 : /* IPV6 GTPU IPv6 */
1318 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv6[] = {
1319 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1320 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
1321 : };
1322 :
1323 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv6_udp[] = {
1324 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1325 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1326 : AVF_FLOW_ITEM_TYPE_END,
1327 : };
1328 :
1329 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv6_tcp[] = {
1330 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1331 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP,
1332 : AVF_FLOW_ITEM_TYPE_END,
1333 : };
1334 :
1335 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_ipv6_icmp[] = {
1336 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1337 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_ICMP,
1338 : AVF_FLOW_ITEM_TYPE_END,
1339 : };
1340 :
1341 : /* IPV4 GTPU EH IPv4 */
1342 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv4[] = {
1343 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1344 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
1345 : AVF_FLOW_ITEM_TYPE_END,
1346 : };
1347 :
1348 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv4_udp[] = {
1349 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1350 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
1351 : AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1352 : };
1353 :
1354 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp[] = {
1355 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1356 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
1357 : AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1358 : };
1359 :
1360 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv4_icmp[] = {
1361 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1362 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
1363 : AVF_FLOW_ITEM_TYPE_ICMP, AVF_FLOW_ITEM_TYPE_END,
1364 : };
1365 :
1366 : /* IPV4 GTPU EH IPv6 */
1367 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv6[] = {
1368 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1369 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
1370 : AVF_FLOW_ITEM_TYPE_END,
1371 : };
1372 :
1373 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv6_udp[] = {
1374 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1375 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
1376 : AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1377 : };
1378 :
1379 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv6_tcp[] = {
1380 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1381 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
1382 : AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1383 : };
1384 :
1385 : enum avf_flow_item_type avf_pattern_eth_ipv4_gtpu_eh_ipv6_icmp[] = {
1386 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1387 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
1388 : AVF_FLOW_ITEM_TYPE_ICMP, AVF_FLOW_ITEM_TYPE_END,
1389 : };
1390 :
1391 : /* IPV6 GTPU EH IPv4 */
1392 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv4[] = {
1393 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1394 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
1395 : AVF_FLOW_ITEM_TYPE_END,
1396 : };
1397 :
1398 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv4_udp[] = {
1399 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1400 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
1401 : AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1402 : };
1403 :
1404 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv4_tcp[] = {
1405 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1406 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
1407 : AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1408 : };
1409 :
1410 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv4_icmp[] = {
1411 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1412 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV4,
1413 : AVF_FLOW_ITEM_TYPE_ICMP, AVF_FLOW_ITEM_TYPE_END,
1414 : };
1415 :
1416 : /* IPV6 GTPU EH IPv6 */
1417 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv6[] = {
1418 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1419 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
1420 : AVF_FLOW_ITEM_TYPE_END,
1421 : };
1422 :
1423 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv6_udp[] = {
1424 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1425 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
1426 : AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1427 : };
1428 :
1429 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv6_tcp[] = {
1430 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1431 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
1432 : AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1433 : };
1434 :
1435 : enum avf_flow_item_type avf_pattern_eth_ipv6_gtpu_eh_ipv6_icmp[] = {
1436 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1437 : AVF_FLOW_ITEM_TYPE_GTPU, AVF_FLOW_ITEM_TYPE_GTP_PSC, AVF_FLOW_ITEM_TYPE_IPV6,
1438 : AVF_FLOW_ITEM_TYPE_ICMP, AVF_FLOW_ITEM_TYPE_END,
1439 : };
1440 :
1441 : /* ESP */
1442 : enum avf_flow_item_type avf_pattern_eth_ipv4_esp[] = {
1443 : AVF_FLOW_ITEM_TYPE_ETH,
1444 : AVF_FLOW_ITEM_TYPE_IPV4,
1445 : AVF_FLOW_ITEM_TYPE_ESP,
1446 : AVF_FLOW_ITEM_TYPE_END,
1447 : };
1448 :
1449 : enum avf_flow_item_type avf_pattern_eth_ipv4_udp_esp[] = {
1450 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1451 : AVF_FLOW_ITEM_TYPE_ESP, AVF_FLOW_ITEM_TYPE_END,
1452 : };
1453 :
1454 : enum avf_flow_item_type avf_pattern_eth_ipv6_esp[] = {
1455 : AVF_FLOW_ITEM_TYPE_ETH,
1456 : AVF_FLOW_ITEM_TYPE_IPV6,
1457 : AVF_FLOW_ITEM_TYPE_ESP,
1458 : AVF_FLOW_ITEM_TYPE_END,
1459 : };
1460 :
1461 : enum avf_flow_item_type avf_pattern_eth_ipv6_udp_esp[] = {
1462 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1463 : AVF_FLOW_ITEM_TYPE_ESP, AVF_FLOW_ITEM_TYPE_END,
1464 : };
1465 :
1466 : /* AH */
1467 : enum avf_flow_item_type avf_pattern_eth_ipv4_ah[] = {
1468 : AVF_FLOW_ITEM_TYPE_ETH,
1469 : AVF_FLOW_ITEM_TYPE_IPV4,
1470 : AVF_FLOW_ITEM_TYPE_AH,
1471 : AVF_FLOW_ITEM_TYPE_END,
1472 : };
1473 :
1474 : enum avf_flow_item_type avf_pattern_eth_ipv6_ah[] = {
1475 : AVF_FLOW_ITEM_TYPE_ETH,
1476 : AVF_FLOW_ITEM_TYPE_IPV6,
1477 : AVF_FLOW_ITEM_TYPE_AH,
1478 : AVF_FLOW_ITEM_TYPE_END,
1479 : };
1480 :
1481 : /* L2TPV3 */
1482 : enum avf_flow_item_type avf_pattern_eth_ipv4_l2tpv3[] = {
1483 : AVF_FLOW_ITEM_TYPE_ETH,
1484 : AVF_FLOW_ITEM_TYPE_IPV4,
1485 : AVF_FLOW_ITEM_TYPE_L2TPV3OIP,
1486 : AVF_FLOW_ITEM_TYPE_END,
1487 : };
1488 :
1489 : enum avf_flow_item_type avf_pattern_eth_ipv6_l2tpv3[] = {
1490 : AVF_FLOW_ITEM_TYPE_ETH,
1491 : AVF_FLOW_ITEM_TYPE_IPV6,
1492 : AVF_FLOW_ITEM_TYPE_L2TPV3OIP,
1493 : AVF_FLOW_ITEM_TYPE_END,
1494 : };
1495 :
1496 : /* PFCP */
1497 : enum avf_flow_item_type avf_pattern_eth_ipv4_pfcp[] = {
1498 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1499 : AVF_FLOW_ITEM_TYPE_PFCP, AVF_FLOW_ITEM_TYPE_END,
1500 : };
1501 :
1502 : enum avf_flow_item_type avf_pattern_eth_ipv6_pfcp[] = {
1503 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1504 : AVF_FLOW_ITEM_TYPE_PFCP, AVF_FLOW_ITEM_TYPE_END,
1505 : };
1506 :
1507 : /* ECPRI */
1508 : enum avf_flow_item_type avf_pattern_eth_ecpri[] = {
1509 : AVF_FLOW_ITEM_TYPE_ETH,
1510 : AVF_FLOW_ITEM_TYPE_ECPRI,
1511 : AVF_FLOW_ITEM_TYPE_END,
1512 : };
1513 :
1514 : enum avf_flow_item_type avf_pattern_eth_ipv4_ecpri[] = {
1515 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1516 : AVF_FLOW_ITEM_TYPE_ECPRI, AVF_FLOW_ITEM_TYPE_END,
1517 : };
1518 :
1519 : /* GRE */
1520 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4[] = {
1521 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1522 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
1523 : };
1524 :
1525 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6[] = {
1526 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1527 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
1528 : };
1529 :
1530 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4[] = {
1531 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1532 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_END,
1533 : };
1534 :
1535 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6[] = {
1536 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1537 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_END,
1538 : };
1539 :
1540 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_tcp[] = {
1541 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1542 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1543 : };
1544 :
1545 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv4_udp[] = {
1546 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1547 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1548 : };
1549 :
1550 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_tcp[] = {
1551 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1552 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1553 : };
1554 :
1555 : enum avf_flow_item_type avf_pattern_eth_ipv4_gre_ipv6_udp[] = {
1556 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_GRE,
1557 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1558 : };
1559 :
1560 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_tcp[] = {
1561 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1562 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1563 : };
1564 :
1565 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv4_udp[] = {
1566 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1567 : AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1568 : };
1569 :
1570 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_tcp[] = {
1571 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1572 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1573 : };
1574 :
1575 : enum avf_flow_item_type avf_pattern_eth_ipv6_gre_ipv6_udp[] = {
1576 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_GRE,
1577 : AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1578 : };
1579 :
1580 : enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2[] = {
1581 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1582 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_END,
1583 : };
1584 :
1585 : enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp[] = {
1586 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1587 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_END,
1588 : };
1589 :
1590 : enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2[] = {
1591 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1592 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_END,
1593 : };
1594 :
1595 : enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp[] = {
1596 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1597 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_END,
1598 : };
1599 :
1600 : /* PPPoL2TPv2oUDP */
1601 : enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4[] = {
1602 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1603 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV4,
1604 : AVF_FLOW_ITEM_TYPE_END,
1605 : };
1606 :
1607 : enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6[] = {
1608 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1609 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV6,
1610 : AVF_FLOW_ITEM_TYPE_END,
1611 : };
1612 :
1613 : enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp[] = {
1614 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1615 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV4,
1616 : AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1617 : };
1618 :
1619 : enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp[] = {
1620 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1621 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV4,
1622 : AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1623 : };
1624 :
1625 : enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp[] = {
1626 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1627 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV6,
1628 : AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1629 : };
1630 :
1631 : enum avf_flow_item_type avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp[] = {
1632 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV4, AVF_FLOW_ITEM_TYPE_UDP,
1633 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV6,
1634 : AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1635 : };
1636 :
1637 : enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4[] = {
1638 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1639 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV4,
1640 : AVF_FLOW_ITEM_TYPE_END,
1641 : };
1642 :
1643 : enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6[] = {
1644 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1645 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV6,
1646 : AVF_FLOW_ITEM_TYPE_END,
1647 : };
1648 :
1649 : enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_udp[] = {
1650 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1651 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV4,
1652 : AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1653 : };
1654 :
1655 : enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_tcp[] = {
1656 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1657 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV4,
1658 : AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1659 : };
1660 :
1661 : enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_udp[] = {
1662 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1663 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV6,
1664 : AVF_FLOW_ITEM_TYPE_UDP, AVF_FLOW_ITEM_TYPE_END,
1665 : };
1666 :
1667 : enum avf_flow_item_type avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_tcp[] = {
1668 : AVF_FLOW_ITEM_TYPE_ETH, AVF_FLOW_ITEM_TYPE_IPV6, AVF_FLOW_ITEM_TYPE_UDP,
1669 : AVF_FLOW_ITEM_TYPE_L2TPV2, AVF_FLOW_ITEM_TYPE_PPP, AVF_FLOW_ITEM_TYPE_IPV6,
1670 : AVF_FLOW_ITEM_TYPE_TCP, AVF_FLOW_ITEM_TYPE_END,
1671 : };
1672 :
1673 : static struct avf_pattern_match_item avf_hash_pattern_list[] = {
1674 : /* IPv4 */
1675 : { avf_pattern_raw, AVF_INSET_NONE, NULL },
1676 : { avf_pattern_eth_ipv4, AVF_RSS_TYPE_OUTER_IPV4, &outer_ipv4_tmplt },
1677 : { avf_pattern_eth_ipv4_udp, AVF_RSS_TYPE_OUTER_IPV4_UDP,
1678 : &outer_ipv4_udp_tmplt },
1679 : { avf_pattern_eth_ipv4_tcp, AVF_RSS_TYPE_OUTER_IPV4_TCP,
1680 : &outer_ipv4_tcp_tmplt },
1681 : { avf_pattern_eth_ipv4_sctp, AVF_RSS_TYPE_OUTER_IPV4_SCTP,
1682 : &outer_ipv4_sctp_tmplt },
1683 : { avf_pattern_eth_vlan_ipv4, AVF_RSS_TYPE_VLAN_IPV4, &outer_ipv4_tmplt },
1684 : { avf_pattern_eth_vlan_ipv4_udp, AVF_RSS_TYPE_VLAN_IPV4_UDP,
1685 : &outer_ipv4_udp_tmplt },
1686 : { avf_pattern_eth_vlan_ipv4_tcp, AVF_RSS_TYPE_VLAN_IPV4_TCP,
1687 : &outer_ipv4_tcp_tmplt },
1688 : { avf_pattern_eth_vlan_ipv4_sctp, AVF_RSS_TYPE_VLAN_IPV4_SCTP,
1689 : &outer_ipv4_sctp_tmplt },
1690 : { avf_pattern_eth_ipv4_gtpu, AVF_ETH_RSS_IPV4, &outer_ipv4_udp_tmplt },
1691 : { avf_pattern_eth_ipv4_gtpu_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
1692 : &inner_ipv4_tmplt },
1693 : { avf_pattern_eth_ipv4_gtpu_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
1694 : &inner_ipv4_udp_tmplt },
1695 : { avf_pattern_eth_ipv4_gtpu_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
1696 : &inner_ipv4_tcp_tmplt },
1697 : { avf_pattern_eth_ipv6_gtpu_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
1698 : &inner_ipv4_tmplt },
1699 : { avf_pattern_eth_ipv6_gtpu_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
1700 : &inner_ipv4_udp_tmplt },
1701 : { avf_pattern_eth_ipv6_gtpu_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
1702 : &inner_ipv4_tcp_tmplt },
1703 : { avf_pattern_eth_ipv4_gtpu_eh_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
1704 : &inner_ipv4_tmplt },
1705 : { avf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
1706 : &inner_ipv4_udp_tmplt },
1707 : { avf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
1708 : &inner_ipv4_tcp_tmplt },
1709 : { avf_pattern_eth_ipv6_gtpu_eh_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
1710 : &inner_ipv4_tmplt },
1711 : { avf_pattern_eth_ipv6_gtpu_eh_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
1712 : &inner_ipv4_udp_tmplt },
1713 : { avf_pattern_eth_ipv6_gtpu_eh_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
1714 : &inner_ipv4_tcp_tmplt },
1715 : { avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
1716 : &second_inner_ipv4_tmplt },
1717 : { avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
1718 : &second_inner_ipv4_udp_tmplt },
1719 : { avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
1720 : &second_inner_ipv4_tcp_tmplt },
1721 : { avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
1722 : &second_inner_ipv4_tmplt },
1723 : { avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
1724 : &second_inner_ipv4_udp_tmplt },
1725 : { avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
1726 : &second_inner_ipv4_tcp_tmplt },
1727 : { avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
1728 : &second_inner_ipv4_tmplt },
1729 : { avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
1730 : &second_inner_ipv4_udp_tmplt },
1731 : { avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
1732 : &second_inner_ipv4_tcp_tmplt },
1733 : { avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
1734 : &second_inner_ipv4_tmplt },
1735 : { avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
1736 : &second_inner_ipv4_udp_tmplt },
1737 : { avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
1738 : &second_inner_ipv4_tcp_tmplt },
1739 : { avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
1740 : &second_inner_ipv4_tmplt },
1741 : { avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
1742 : &second_inner_ipv4_udp_tmplt },
1743 : { avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
1744 : &second_inner_ipv4_tcp_tmplt },
1745 : { avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
1746 : &second_inner_ipv4_tmplt },
1747 : { avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
1748 : &second_inner_ipv4_udp_tmplt },
1749 : { avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
1750 : &second_inner_ipv4_tcp_tmplt },
1751 : { avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
1752 : &second_inner_ipv4_tmplt },
1753 : { avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
1754 : &second_inner_ipv4_udp_tmplt },
1755 : { avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
1756 : &second_inner_ipv4_tcp_tmplt },
1757 : { avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4, AVF_RSS_TYPE_GTPU_IPV4,
1758 : &second_inner_ipv4_tmplt },
1759 : { avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4_udp, AVF_RSS_TYPE_GTPU_IPV4_UDP,
1760 : &second_inner_ipv4_udp_tmplt },
1761 : { avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv4_tcp, AVF_RSS_TYPE_GTPU_IPV4_TCP,
1762 : &second_inner_ipv4_tcp_tmplt },
1763 : { avf_pattern_eth_ipv4_esp, AVF_RSS_TYPE_IPV4_ESP, &ipv4_esp_tmplt },
1764 : { avf_pattern_eth_ipv4_udp_esp, AVF_RSS_TYPE_IPV4_ESP, &ipv4_udp_esp_tmplt },
1765 : { avf_pattern_eth_ipv4_ah, AVF_RSS_TYPE_IPV4_AH, &ipv4_ah_tmplt },
1766 : { avf_pattern_eth_ipv4_l2tpv3, AVF_RSS_TYPE_IPV4_L2TPV3,
1767 : &ipv4_l2tpv3_tmplt },
1768 : { avf_pattern_eth_ipv4_pfcp, AVF_RSS_TYPE_IPV4_PFCP, &ipv4_pfcp_tmplt },
1769 : { avf_pattern_eth_ipv4_gtpc, AVF_ETH_RSS_IPV4, &ipv4_udp_gtpc_tmplt },
1770 : { avf_pattern_eth_ecpri, AVF_ETH_RSS_ECPRI, ð_ecpri_tmplt },
1771 : { avf_pattern_eth_ipv4_ecpri, AVF_ETH_RSS_ECPRI, &ipv4_ecpri_tmplt },
1772 : { avf_pattern_eth_ipv4_gre_ipv4, AVF_RSS_TYPE_INNER_IPV4,
1773 : &inner_ipv4_tmplt },
1774 : { avf_pattern_eth_ipv6_gre_ipv4, AVF_RSS_TYPE_INNER_IPV4,
1775 : &inner_ipv4_tmplt },
1776 : { avf_pattern_eth_ipv4_gre_ipv4_tcp, AVF_RSS_TYPE_INNER_IPV4_TCP,
1777 : &inner_ipv4_tcp_tmplt },
1778 : { avf_pattern_eth_ipv6_gre_ipv4_tcp, AVF_RSS_TYPE_INNER_IPV4_TCP,
1779 : &inner_ipv4_tcp_tmplt },
1780 : { avf_pattern_eth_ipv4_gre_ipv4_udp, AVF_RSS_TYPE_INNER_IPV4_UDP,
1781 : &inner_ipv4_udp_tmplt },
1782 : { avf_pattern_eth_ipv6_gre_ipv4_udp, AVF_RSS_TYPE_INNER_IPV4_UDP,
1783 : &inner_ipv4_udp_tmplt },
1784 : { avf_pattern_eth_ipv4_udp_l2tpv2, AVF_RSS_TYPE_ETH_L2TPV2,
1785 : &ipv4_l2tpv2_tmplt },
1786 : { avf_pattern_eth_ipv4_udp_l2tpv2_ppp, AVF_RSS_TYPE_ETH_L2TPV2,
1787 : &ipv4_l2tpv2_ppp_tmplt },
1788 : { avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4, AVF_RSS_TYPE_INNER_IPV4,
1789 : &udp_l2tpv2_ppp_ipv4_tmplt },
1790 : { avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp, AVF_RSS_TYPE_INNER_IPV4_UDP,
1791 : &udp_l2tpv2_ppp_ipv4_udp_tmplt },
1792 : { avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp, AVF_RSS_TYPE_INNER_IPV4_TCP,
1793 : &udp_l2tpv2_ppp_ipv4_tcp_tmplt },
1794 : { avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4, AVF_RSS_TYPE_INNER_IPV4,
1795 : &udp_l2tpv2_ppp_ipv4_tmplt },
1796 : { avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_udp, AVF_RSS_TYPE_INNER_IPV4_UDP,
1797 : &udp_l2tpv2_ppp_ipv4_udp_tmplt },
1798 : { avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_tcp, AVF_RSS_TYPE_INNER_IPV4_TCP,
1799 : &udp_l2tpv2_ppp_ipv4_tcp_tmplt },
1800 :
1801 : /* IPv6 */
1802 : { avf_pattern_eth_ipv6, AVF_RSS_TYPE_OUTER_IPV6, &outer_ipv6_tmplt },
1803 : { avf_pattern_eth_ipv6_frag_ext, AVF_RSS_TYPE_OUTER_IPV6_FRAG,
1804 : &outer_ipv6_frag_tmplt },
1805 : { avf_pattern_eth_ipv6_udp, AVF_RSS_TYPE_OUTER_IPV6_UDP,
1806 : &outer_ipv6_udp_tmplt },
1807 : { avf_pattern_eth_ipv6_tcp, AVF_RSS_TYPE_OUTER_IPV6_TCP,
1808 : &outer_ipv6_tcp_tmplt },
1809 : { avf_pattern_eth_ipv6_sctp, AVF_RSS_TYPE_OUTER_IPV6_SCTP,
1810 : &outer_ipv6_sctp_tmplt },
1811 : { avf_pattern_eth_vlan_ipv6, AVF_RSS_TYPE_VLAN_IPV6, &outer_ipv6_tmplt },
1812 : { avf_pattern_eth_vlan_ipv6_frag_ext, AVF_RSS_TYPE_OUTER_IPV6_FRAG,
1813 : &outer_ipv6_frag_tmplt },
1814 : { avf_pattern_eth_vlan_ipv6_udp, AVF_RSS_TYPE_VLAN_IPV6_UDP,
1815 : &outer_ipv6_udp_tmplt },
1816 : { avf_pattern_eth_vlan_ipv6_tcp, AVF_RSS_TYPE_VLAN_IPV6_TCP,
1817 : &outer_ipv6_tcp_tmplt },
1818 : { avf_pattern_eth_vlan_ipv6_sctp, AVF_RSS_TYPE_VLAN_IPV6_SCTP,
1819 : &outer_ipv6_sctp_tmplt },
1820 : { avf_pattern_eth_ipv6_gtpu, AVF_ETH_RSS_IPV6, &outer_ipv6_udp_tmplt },
1821 : { avf_pattern_eth_ipv4_gtpu_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
1822 : &inner_ipv6_tmplt },
1823 : { avf_pattern_eth_ipv4_gtpu_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
1824 : &inner_ipv6_udp_tmplt },
1825 : { avf_pattern_eth_ipv4_gtpu_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
1826 : &inner_ipv6_tcp_tmplt },
1827 : { avf_pattern_eth_ipv6_gtpu_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
1828 : &inner_ipv6_tmplt },
1829 : { avf_pattern_eth_ipv6_gtpu_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
1830 : &inner_ipv6_udp_tmplt },
1831 : { avf_pattern_eth_ipv6_gtpu_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
1832 : &inner_ipv6_tcp_tmplt },
1833 : { avf_pattern_eth_ipv4_gtpu_eh_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
1834 : &inner_ipv6_tmplt },
1835 : { avf_pattern_eth_ipv4_gtpu_eh_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
1836 : &inner_ipv6_udp_tmplt },
1837 : { avf_pattern_eth_ipv4_gtpu_eh_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
1838 : &inner_ipv6_tcp_tmplt },
1839 : { avf_pattern_eth_ipv6_gtpu_eh_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
1840 : &inner_ipv6_tmplt },
1841 : { avf_pattern_eth_ipv6_gtpu_eh_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
1842 : &inner_ipv6_udp_tmplt },
1843 : { avf_pattern_eth_ipv6_gtpu_eh_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
1844 : &inner_ipv6_tcp_tmplt },
1845 : { avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
1846 : &second_inner_ipv6_tmplt },
1847 : { avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
1848 : &second_inner_ipv6_udp_tmplt },
1849 : { avf_pattern_eth_ipv4_gre_ipv4_gtpu_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
1850 : &second_inner_ipv6_tcp_tmplt },
1851 : { avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
1852 : &second_inner_ipv6_tmplt },
1853 : { avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
1854 : &second_inner_ipv6_udp_tmplt },
1855 : { avf_pattern_eth_ipv4_gre_ipv6_gtpu_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
1856 : &second_inner_ipv6_tcp_tmplt },
1857 : { avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
1858 : &second_inner_ipv6_tmplt },
1859 : { avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
1860 : &second_inner_ipv6_udp_tmplt },
1861 : { avf_pattern_eth_ipv6_gre_ipv4_gtpu_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
1862 : &second_inner_ipv6_tcp_tmplt },
1863 : { avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
1864 : &second_inner_ipv6_tmplt },
1865 : { avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
1866 : &second_inner_ipv6_udp_tmplt },
1867 : { avf_pattern_eth_ipv6_gre_ipv6_gtpu_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
1868 : &second_inner_ipv6_tcp_tmplt },
1869 : { avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
1870 : &second_inner_ipv6_tmplt },
1871 : { avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
1872 : &second_inner_ipv6_udp_tmplt },
1873 : { avf_pattern_eth_ipv4_gre_ipv4_gtpu_eh_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
1874 : &second_inner_ipv6_tcp_tmplt },
1875 : { avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
1876 : &second_inner_ipv6_tmplt },
1877 : { avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
1878 : &second_inner_ipv6_udp_tmplt },
1879 : { avf_pattern_eth_ipv4_gre_ipv6_gtpu_eh_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
1880 : &second_inner_ipv6_tcp_tmplt },
1881 : { avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
1882 : &second_inner_ipv6_tmplt },
1883 : { avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
1884 : &second_inner_ipv6_udp_tmplt },
1885 : { avf_pattern_eth_ipv6_gre_ipv4_gtpu_eh_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
1886 : &second_inner_ipv6_tcp_tmplt },
1887 : { avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6, AVF_RSS_TYPE_GTPU_IPV6,
1888 : &second_inner_ipv6_tmplt },
1889 : { avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6_udp, AVF_RSS_TYPE_GTPU_IPV6_UDP,
1890 : &second_inner_ipv6_udp_tmplt },
1891 : { avf_pattern_eth_ipv6_gre_ipv6_gtpu_eh_ipv6_tcp, AVF_RSS_TYPE_GTPU_IPV6_TCP,
1892 : &second_inner_ipv6_tcp_tmplt },
1893 : { avf_pattern_eth_ipv6_esp, AVF_RSS_TYPE_IPV6_ESP, &ipv6_esp_tmplt },
1894 : { avf_pattern_eth_ipv6_udp_esp, AVF_RSS_TYPE_IPV6_ESP, &ipv6_udp_esp_tmplt },
1895 : { avf_pattern_eth_ipv6_ah, AVF_RSS_TYPE_IPV6_AH, &ipv6_ah_tmplt },
1896 : { avf_pattern_eth_ipv6_l2tpv3, AVF_RSS_TYPE_IPV6_L2TPV3,
1897 : &ipv6_l2tpv3_tmplt },
1898 : { avf_pattern_eth_ipv6_pfcp, AVF_RSS_TYPE_IPV6_PFCP, &ipv6_pfcp_tmplt },
1899 : { avf_pattern_eth_ipv6_gtpc, AVF_ETH_RSS_IPV6, &ipv6_udp_gtpc_tmplt },
1900 : { avf_pattern_eth_ipv4_gre_ipv6, AVF_RSS_TYPE_INNER_IPV6,
1901 : &inner_ipv6_tmplt },
1902 : { avf_pattern_eth_ipv6_gre_ipv6, AVF_RSS_TYPE_INNER_IPV6,
1903 : &inner_ipv6_tmplt },
1904 : { avf_pattern_eth_ipv4_gre_ipv6_tcp, AVF_RSS_TYPE_INNER_IPV6_TCP,
1905 : &inner_ipv6_tcp_tmplt },
1906 : { avf_pattern_eth_ipv6_gre_ipv6_tcp, AVF_RSS_TYPE_INNER_IPV6_TCP,
1907 : &inner_ipv6_tcp_tmplt },
1908 : { avf_pattern_eth_ipv4_gre_ipv6_udp, AVF_RSS_TYPE_INNER_IPV6_UDP,
1909 : &inner_ipv6_udp_tmplt },
1910 : { avf_pattern_eth_ipv6_gre_ipv6_udp, AVF_RSS_TYPE_INNER_IPV6_UDP,
1911 : &inner_ipv6_udp_tmplt },
1912 : { avf_pattern_eth_ipv6_udp_l2tpv2, AVF_RSS_TYPE_ETH_L2TPV2,
1913 : &ipv6_l2tpv2_tmplt },
1914 : { avf_pattern_eth_ipv6_udp_l2tpv2_ppp, AVF_RSS_TYPE_ETH_L2TPV2,
1915 : &ipv6_l2tpv2_ppp_tmplt },
1916 : { avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6, AVF_RSS_TYPE_INNER_IPV6,
1917 : &udp_l2tpv2_ppp_ipv6_tmplt },
1918 : { avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp, AVF_RSS_TYPE_INNER_IPV6_UDP,
1919 : &udp_l2tpv2_ppp_ipv6_udp_tmplt },
1920 : { avf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp, AVF_RSS_TYPE_INNER_IPV6_TCP,
1921 : &udp_l2tpv2_ppp_ipv6_tcp_tmplt },
1922 : { avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6, AVF_RSS_TYPE_INNER_IPV6,
1923 : &udp_l2tpv2_ppp_ipv6_tmplt },
1924 : { avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_udp, AVF_RSS_TYPE_INNER_IPV6_UDP,
1925 : &udp_l2tpv2_ppp_ipv6_udp_tmplt },
1926 : { avf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_tcp, AVF_RSS_TYPE_INNER_IPV6_TCP,
1927 : &udp_l2tpv2_ppp_ipv6_tcp_tmplt },
1928 :
1929 : };
1930 :
1931 : static inline u64
1932 0 : avf_eth_rss_hf_refine (u64 rss_hf)
1933 : {
1934 0 : if ((rss_hf & AVF_ETH_RSS_L3_SRC_ONLY) && (rss_hf & AVF_ETH_RSS_L3_DST_ONLY))
1935 0 : rss_hf &= ~(AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY);
1936 :
1937 0 : if ((rss_hf & AVF_ETH_RSS_L4_SRC_ONLY) && (rss_hf & AVF_ETH_RSS_L4_DST_ONLY))
1938 0 : rss_hf &= ~(AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY);
1939 :
1940 0 : return rss_hf;
1941 : }
1942 :
1943 : static int
1944 0 : avf_any_invalid_rss_type (enum avf_eth_hash_function rss_func, u64 rss_type,
1945 : u64 allow_rss_type)
1946 : {
1947 : u32 i;
1948 :
1949 : /**
1950 : * Check if l3/l4 SRC/DST_ONLY is set for SYMMETRIC_TOEPLITZ
1951 : * hash function.
1952 : */
1953 0 : if (rss_func == AVF_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
1954 : {
1955 0 : if (rss_type & (AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY |
1956 : AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY))
1957 0 : return 1;
1958 :
1959 0 : if (!(rss_type &
1960 : (AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_IPV6 |
1961 : AVF_ETH_RSS_NONFRAG_IPV4_UDP | AVF_ETH_RSS_NONFRAG_IPV6_UDP |
1962 : AVF_ETH_RSS_NONFRAG_IPV4_TCP | AVF_ETH_RSS_NONFRAG_IPV6_TCP |
1963 : AVF_ETH_RSS_NONFRAG_IPV4_SCTP | AVF_ETH_RSS_NONFRAG_IPV6_SCTP)))
1964 0 : return 1;
1965 : }
1966 :
1967 : /* check invalid combination */
1968 0 : for (i = 0; i < _vec_len (invalid_rss_comb); i++)
1969 : {
1970 0 : if (__builtin_popcountll (rss_type & invalid_rss_comb[i]) > 1)
1971 0 : return 1;
1972 : }
1973 :
1974 : /* check invalid RSS attribute */
1975 0 : for (i = 0; i < _vec_len (rss_attr_to_valid_type); i++)
1976 : {
1977 0 : struct rss_attr_type *rat = &rss_attr_to_valid_type[i];
1978 :
1979 0 : if (rat->attr & rss_type && !(rat->type & rss_type))
1980 0 : return 1;
1981 : }
1982 :
1983 : /* check not allowed RSS type */
1984 0 : rss_type &= ~VALID_RSS_ATTR;
1985 :
1986 0 : return ((rss_type & allow_rss_type) != rss_type);
1987 : }
1988 :
1989 : int
1990 0 : avf_rss_cfg_create (struct virtchnl_rss_cfg **rss_cfg, int tunnel_level)
1991 : {
1992 0 : *rss_cfg = clib_mem_alloc (sizeof (**rss_cfg));
1993 :
1994 0 : clib_memset (*rss_cfg, 0, sizeof (**rss_cfg));
1995 :
1996 0 : (*rss_cfg)->proto_hdrs.tunnel_level = tunnel_level;
1997 :
1998 0 : return 0;
1999 : }
2000 :
2001 : int
2002 0 : avf_rss_rcfg_destroy (struct virtchnl_rss_cfg *rss_cfg)
2003 : {
2004 0 : clib_mem_free (rss_cfg);
2005 :
2006 0 : return 0;
2007 : }
2008 :
2009 : /* refine proto hdrs base on gtpu rss type */
2010 : static void
2011 0 : avf_refine_proto_hdrs_gtpu (struct virtchnl_proto_hdrs *proto_hdrs,
2012 : u64 rss_type)
2013 : {
2014 : struct virtchnl_proto_hdr *hdr;
2015 : int i;
2016 :
2017 0 : if (!(rss_type & AVF_ETH_RSS_GTPU))
2018 0 : return;
2019 :
2020 0 : for (i = 0; i < proto_hdrs->count; i++)
2021 : {
2022 0 : hdr = &proto_hdrs->proto_hdr[i];
2023 0 : switch (hdr->type)
2024 : {
2025 0 : case VIRTCHNL_PROTO_HDR_GTPU_IP:
2026 0 : REFINE_PROTO_FLD (ADD, GTPU_IP_TEID);
2027 0 : break;
2028 0 : default:
2029 0 : break;
2030 : }
2031 : }
2032 : }
2033 :
2034 : static void
2035 0 : avf_hash_add_fragment_hdr (struct virtchnl_proto_hdrs *hdrs, int layer)
2036 : {
2037 : struct virtchnl_proto_hdr *hdr1;
2038 : struct virtchnl_proto_hdr *hdr2;
2039 : int i;
2040 :
2041 0 : if (layer < 0 || layer > hdrs->count)
2042 0 : return;
2043 :
2044 : /* shift headers layer */
2045 0 : for (i = hdrs->count; i >= layer; i--)
2046 : {
2047 0 : hdr1 = &hdrs->proto_hdr[i];
2048 0 : hdr2 = &hdrs->proto_hdr[i - 1];
2049 0 : *hdr1 = *hdr2;
2050 : }
2051 :
2052 : /* adding dummy fragment header */
2053 0 : hdr1 = &hdrs->proto_hdr[layer];
2054 0 : VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, IPV4_FRAG);
2055 0 : hdrs->count = ++layer;
2056 : }
2057 :
2058 : /* refine proto hdrs base on l2, l3, l4 rss type */
2059 : static void
2060 0 : avf_refine_proto_hdrs_l234 (struct virtchnl_proto_hdrs *proto_hdrs,
2061 : u64 rss_type)
2062 : {
2063 : struct virtchnl_proto_hdr *hdr;
2064 : int i;
2065 :
2066 0 : for (i = 0; i < proto_hdrs->count; i++)
2067 : {
2068 0 : hdr = &proto_hdrs->proto_hdr[i];
2069 0 : switch (hdr->type)
2070 : {
2071 0 : case VIRTCHNL_PROTO_HDR_ETH:
2072 0 : if (!(rss_type & AVF_ETH_RSS_ETH))
2073 0 : hdr->field_selector = 0;
2074 0 : else if (rss_type & AVF_ETH_RSS_L2_SRC_ONLY)
2075 0 : REFINE_PROTO_FLD (DEL, ETH_DST);
2076 0 : else if (rss_type & AVF_ETH_RSS_L2_DST_ONLY)
2077 0 : REFINE_PROTO_FLD (DEL, ETH_SRC);
2078 0 : break;
2079 0 : case VIRTCHNL_PROTO_HDR_IPV4:
2080 0 : if (rss_type &
2081 : (AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_FRAG_IPV4 |
2082 : AVF_ETH_RSS_NONFRAG_IPV4_UDP | AVF_ETH_RSS_NONFRAG_IPV4_TCP |
2083 : AVF_ETH_RSS_NONFRAG_IPV4_SCTP))
2084 : {
2085 0 : if (rss_type & AVF_ETH_RSS_FRAG_IPV4)
2086 : {
2087 0 : avf_hash_add_fragment_hdr (proto_hdrs, i + 1);
2088 : }
2089 0 : else if (rss_type & AVF_ETH_RSS_L3_SRC_ONLY)
2090 : {
2091 0 : REFINE_PROTO_FLD (DEL, IPV4_DST);
2092 : }
2093 0 : else if (rss_type & AVF_ETH_RSS_L3_DST_ONLY)
2094 : {
2095 0 : REFINE_PROTO_FLD (DEL, IPV4_SRC);
2096 : }
2097 0 : else if (rss_type &
2098 : (AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY))
2099 : {
2100 0 : REFINE_PROTO_FLD (DEL, IPV4_DST);
2101 0 : REFINE_PROTO_FLD (DEL, IPV4_SRC);
2102 : }
2103 : }
2104 : else
2105 : {
2106 0 : hdr->field_selector = 0;
2107 : }
2108 :
2109 0 : if (rss_type & AVF_ETH_RSS_IPV4_CHKSUM)
2110 0 : REFINE_PROTO_FLD (ADD, IPV4_CHKSUM);
2111 :
2112 0 : break;
2113 0 : case VIRTCHNL_PROTO_HDR_IPV4_FRAG:
2114 0 : if (rss_type &
2115 : (AVF_ETH_RSS_IPV4 | AVF_ETH_RSS_FRAG_IPV4 |
2116 : AVF_ETH_RSS_NONFRAG_IPV4_UDP | AVF_ETH_RSS_NONFRAG_IPV4_TCP |
2117 : AVF_ETH_RSS_NONFRAG_IPV4_SCTP))
2118 : {
2119 0 : if (rss_type & AVF_ETH_RSS_FRAG_IPV4)
2120 0 : REFINE_PROTO_FLD (ADD, IPV4_FRAG_PKID);
2121 : }
2122 : else
2123 : {
2124 0 : hdr->field_selector = 0;
2125 : }
2126 :
2127 0 : if (rss_type & AVF_ETH_RSS_IPV4_CHKSUM)
2128 0 : REFINE_PROTO_FLD (ADD, IPV4_CHKSUM);
2129 :
2130 0 : break;
2131 0 : case VIRTCHNL_PROTO_HDR_IPV6:
2132 0 : if (rss_type &
2133 : (AVF_ETH_RSS_IPV6 | AVF_ETH_RSS_FRAG_IPV6 |
2134 : AVF_ETH_RSS_NONFRAG_IPV6_UDP | AVF_ETH_RSS_NONFRAG_IPV6_TCP |
2135 : AVF_ETH_RSS_NONFRAG_IPV6_SCTP))
2136 : {
2137 0 : if (rss_type & AVF_ETH_RSS_L3_SRC_ONLY)
2138 : {
2139 0 : REFINE_PROTO_FLD (DEL, IPV6_DST);
2140 : }
2141 0 : else if (rss_type & AVF_ETH_RSS_L3_DST_ONLY)
2142 : {
2143 0 : REFINE_PROTO_FLD (DEL, IPV6_SRC);
2144 : }
2145 0 : else if (rss_type &
2146 : (AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY))
2147 : {
2148 0 : REFINE_PROTO_FLD (DEL, IPV6_DST);
2149 0 : REFINE_PROTO_FLD (DEL, IPV6_SRC);
2150 : }
2151 : }
2152 : else
2153 : {
2154 0 : hdr->field_selector = 0;
2155 : }
2156 0 : if (rss_type & AVF_ETH_RSS_L3_PRE64)
2157 : {
2158 0 : if (REFINE_PROTO_FLD (TEST, IPV6_SRC))
2159 0 : REPALCE_PROTO_FLD (IPV6_SRC, IPV6_PREFIX64_SRC);
2160 0 : if (REFINE_PROTO_FLD (TEST, IPV6_DST))
2161 0 : REPALCE_PROTO_FLD (IPV6_DST, IPV6_PREFIX64_DST);
2162 : }
2163 0 : break;
2164 0 : case VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG:
2165 0 : if (rss_type & AVF_ETH_RSS_FRAG_IPV6)
2166 0 : REFINE_PROTO_FLD (ADD, IPV6_EH_FRAG_PKID);
2167 : else
2168 0 : hdr->field_selector = 0;
2169 :
2170 0 : break;
2171 0 : case VIRTCHNL_PROTO_HDR_UDP:
2172 0 : if (rss_type &
2173 : (AVF_ETH_RSS_NONFRAG_IPV4_UDP | AVF_ETH_RSS_NONFRAG_IPV6_UDP))
2174 : {
2175 0 : if (rss_type & AVF_ETH_RSS_L4_SRC_ONLY)
2176 0 : REFINE_PROTO_FLD (DEL, UDP_DST_PORT);
2177 0 : else if (rss_type & AVF_ETH_RSS_L4_DST_ONLY)
2178 0 : REFINE_PROTO_FLD (DEL, UDP_SRC_PORT);
2179 0 : else if (rss_type &
2180 : (AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY))
2181 0 : hdr->field_selector = 0;
2182 : }
2183 : else
2184 : {
2185 0 : hdr->field_selector = 0;
2186 : }
2187 :
2188 0 : if (rss_type & AVF_ETH_RSS_L4_CHKSUM)
2189 0 : REFINE_PROTO_FLD (ADD, UDP_CHKSUM);
2190 0 : break;
2191 0 : case VIRTCHNL_PROTO_HDR_TCP:
2192 0 : if (rss_type &
2193 : (AVF_ETH_RSS_NONFRAG_IPV4_TCP | AVF_ETH_RSS_NONFRAG_IPV6_TCP))
2194 : {
2195 0 : if (rss_type & AVF_ETH_RSS_L4_SRC_ONLY)
2196 0 : REFINE_PROTO_FLD (DEL, TCP_DST_PORT);
2197 0 : else if (rss_type & AVF_ETH_RSS_L4_DST_ONLY)
2198 0 : REFINE_PROTO_FLD (DEL, TCP_SRC_PORT);
2199 0 : else if (rss_type &
2200 : (AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY))
2201 0 : hdr->field_selector = 0;
2202 : }
2203 : else
2204 : {
2205 0 : hdr->field_selector = 0;
2206 : }
2207 :
2208 0 : if (rss_type & AVF_ETH_RSS_L4_CHKSUM)
2209 0 : REFINE_PROTO_FLD (ADD, TCP_CHKSUM);
2210 0 : break;
2211 0 : case VIRTCHNL_PROTO_HDR_SCTP:
2212 0 : if (rss_type &
2213 : (AVF_ETH_RSS_NONFRAG_IPV4_SCTP | AVF_ETH_RSS_NONFRAG_IPV6_SCTP))
2214 : {
2215 0 : if (rss_type & AVF_ETH_RSS_L4_SRC_ONLY)
2216 0 : REFINE_PROTO_FLD (DEL, SCTP_DST_PORT);
2217 0 : else if (rss_type & AVF_ETH_RSS_L4_DST_ONLY)
2218 0 : REFINE_PROTO_FLD (DEL, SCTP_SRC_PORT);
2219 0 : else if (rss_type &
2220 : (AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY))
2221 0 : hdr->field_selector = 0;
2222 : }
2223 : else
2224 : {
2225 0 : hdr->field_selector = 0;
2226 : }
2227 :
2228 0 : if (rss_type & AVF_ETH_RSS_L4_CHKSUM)
2229 0 : REFINE_PROTO_FLD (ADD, SCTP_CHKSUM);
2230 0 : break;
2231 0 : case VIRTCHNL_PROTO_HDR_S_VLAN:
2232 0 : if (!(rss_type & AVF_ETH_RSS_S_VLAN))
2233 0 : hdr->field_selector = 0;
2234 0 : break;
2235 0 : case VIRTCHNL_PROTO_HDR_C_VLAN:
2236 0 : if (!(rss_type & AVF_ETH_RSS_C_VLAN))
2237 0 : hdr->field_selector = 0;
2238 0 : break;
2239 0 : case VIRTCHNL_PROTO_HDR_L2TPV3:
2240 0 : if (!(rss_type & AVF_ETH_RSS_L2TPV3))
2241 0 : hdr->field_selector = 0;
2242 0 : break;
2243 0 : case VIRTCHNL_PROTO_HDR_ESP:
2244 0 : if (!(rss_type & AVF_ETH_RSS_ESP))
2245 0 : hdr->field_selector = 0;
2246 0 : break;
2247 0 : case VIRTCHNL_PROTO_HDR_AH:
2248 0 : if (!(rss_type & AVF_ETH_RSS_AH))
2249 0 : hdr->field_selector = 0;
2250 0 : break;
2251 0 : case VIRTCHNL_PROTO_HDR_PFCP:
2252 0 : if (!(rss_type & AVF_ETH_RSS_PFCP))
2253 0 : hdr->field_selector = 0;
2254 0 : break;
2255 0 : case VIRTCHNL_PROTO_HDR_ECPRI:
2256 0 : if (!(rss_type & AVF_ETH_RSS_ECPRI))
2257 0 : hdr->field_selector = 0;
2258 0 : break;
2259 0 : case VIRTCHNL_PROTO_HDR_L2TPV2:
2260 0 : if (!(rss_type & AVF_ETH_RSS_L2TPV2))
2261 0 : hdr->field_selector = 0;
2262 0 : break;
2263 0 : default:
2264 0 : break;
2265 : }
2266 : }
2267 0 : }
2268 :
2269 : static void
2270 0 : avf_refine_proto_hdrs_by_pattern (struct virtchnl_proto_hdrs *proto_hdrs,
2271 : u64 phint)
2272 : {
2273 : struct virtchnl_proto_hdr *hdr1;
2274 : struct virtchnl_proto_hdr *hdr2;
2275 0 : int i, shift_count = 1;
2276 0 : int tun_lvl = proto_hdrs->tunnel_level;
2277 :
2278 0 : if (!(phint & AVF_PHINT_GTPU_MSK) && !(phint & AVF_PHINT_GRE))
2279 0 : return;
2280 :
2281 0 : while (tun_lvl)
2282 : {
2283 0 : if (phint & AVF_PHINT_LAYERS_MSK)
2284 0 : shift_count = 2;
2285 :
2286 : /* shift headers layer */
2287 0 : for (i = proto_hdrs->count - 1 + shift_count; i > shift_count - 1; i--)
2288 : {
2289 0 : hdr1 = &proto_hdrs->proto_hdr[i];
2290 0 : hdr2 = &proto_hdrs->proto_hdr[i - shift_count];
2291 0 : *hdr1 = *hdr2;
2292 : }
2293 :
2294 0 : if (shift_count == 1)
2295 : {
2296 : /* adding tunnel header at layer 0 */
2297 0 : hdr1 = &proto_hdrs->proto_hdr[0];
2298 : }
2299 : else
2300 : {
2301 : /* adding tunnel header and outer ip header */
2302 0 : hdr1 = &proto_hdrs->proto_hdr[1];
2303 0 : hdr2 = &proto_hdrs->proto_hdr[0];
2304 0 : hdr2->field_selector = 0;
2305 0 : proto_hdrs->count++;
2306 0 : tun_lvl--;
2307 :
2308 0 : if (tun_lvl == TUNNEL_LEVEL_OUTER)
2309 : {
2310 0 : if (phint & AVF_PHINT_OUTER_IPV4)
2311 0 : VIRTCHNL_SET_PROTO_HDR_TYPE (hdr2, IPV4);
2312 0 : else if (phint & AVF_PHINT_OUTER_IPV6)
2313 0 : VIRTCHNL_SET_PROTO_HDR_TYPE (hdr2, IPV6);
2314 : }
2315 0 : else if (tun_lvl == TUNNEL_LEVEL_INNER)
2316 : {
2317 0 : if (phint & AVF_PHINT_MID_IPV4)
2318 0 : VIRTCHNL_SET_PROTO_HDR_TYPE (hdr2, IPV4);
2319 0 : else if (phint & AVF_PHINT_MID_IPV6)
2320 0 : VIRTCHNL_SET_PROTO_HDR_TYPE (hdr2, IPV6);
2321 : }
2322 : }
2323 :
2324 0 : hdr1->field_selector = 0;
2325 0 : proto_hdrs->count++;
2326 :
2327 0 : if (phint & AVF_PHINT_GTPU_EH_DWN)
2328 0 : VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GTPU_EH_PDU_DWN);
2329 0 : else if (phint & AVF_PHINT_GTPU_EH_UP)
2330 0 : VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GTPU_EH_PDU_UP);
2331 0 : else if (phint & AVF_PHINT_GTPU_EH)
2332 0 : VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GTPU_EH);
2333 0 : else if (phint & AVF_PHINT_GTPU)
2334 0 : VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GTPU_IP);
2335 :
2336 0 : if (phint & AVF_PHINT_GRE)
2337 : {
2338 0 : if (phint & AVF_PHINT_GTPU)
2339 : {
2340 : /* if GTPoGRE, add GRE header at the outer tunnel */
2341 0 : if (tun_lvl == TUNNEL_LEVEL_OUTER)
2342 0 : VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GRE);
2343 : }
2344 : else
2345 : {
2346 0 : VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GRE);
2347 : }
2348 : }
2349 : }
2350 0 : proto_hdrs->tunnel_level = tun_lvl;
2351 : }
2352 :
2353 : static void
2354 0 : avf_refine_proto_hdrs (struct virtchnl_proto_hdrs *proto_hdrs, u64 rss_type,
2355 : u64 phint)
2356 : {
2357 0 : avf_refine_proto_hdrs_l234 (proto_hdrs, rss_type);
2358 0 : avf_refine_proto_hdrs_by_pattern (proto_hdrs, phint);
2359 0 : avf_refine_proto_hdrs_gtpu (proto_hdrs, rss_type);
2360 0 : }
2361 :
2362 : static int
2363 0 : avf_rss_parse_action (const struct avf_flow_action actions[],
2364 : struct virtchnl_rss_cfg *rss_cfg,
2365 : struct avf_pattern_match_item *match_item, u64 phint,
2366 : struct avf_flow_error *error)
2367 : {
2368 : const struct avf_flow_action_rss *rss;
2369 : const struct avf_flow_action *action;
2370 : u64 rss_type;
2371 : int ret;
2372 :
2373 0 : for (action = actions; action->type != AVF_FLOW_ACTION_TYPE_END; action++)
2374 : {
2375 0 : switch (action->type)
2376 : {
2377 0 : case AVF_FLOW_ACTION_TYPE_RSS:
2378 0 : rss = action->conf;
2379 :
2380 0 : if (rss->func == AVF_ETH_HASH_FUNCTION_SIMPLE_XOR)
2381 : {
2382 0 : rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
2383 0 : ret = avf_flow_error_set (error, AVF_FAILURE,
2384 : AVF_FLOW_ERROR_TYPE_ACTION, actions,
2385 : "simple xor is not supported.");
2386 0 : return ret;
2387 : }
2388 0 : else if (rss->func == AVF_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
2389 : {
2390 0 : rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
2391 : }
2392 : else
2393 : {
2394 0 : rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
2395 : }
2396 :
2397 0 : if (rss->level)
2398 0 : return avf_flow_error_set (
2399 : error, AVF_FAILURE, AVF_FLOW_ERROR_TYPE_ACTION, actions,
2400 : "a nonzero RSS encapsulation level is not supported");
2401 :
2402 0 : if (rss->key_len)
2403 0 : return avf_flow_error_set (
2404 : error, AVF_FAILURE, AVF_FLOW_ERROR_TYPE_ACTION, actions,
2405 : "a nonzero RSS key_len is not supported");
2406 :
2407 0 : if (rss->queue_num)
2408 0 : return avf_flow_error_set (
2409 : error, AVF_FAILURE, AVF_FLOW_ERROR_TYPE_ACTION, actions,
2410 : "a non-NULL RSS queue is not supported");
2411 :
2412 0 : if (phint == AVF_PHINT_RAW)
2413 0 : break;
2414 :
2415 0 : rss_type = avf_eth_rss_hf_refine (rss->types);
2416 :
2417 0 : if (avf_any_invalid_rss_type (rss->func, rss_type,
2418 : match_item->input_set_mask))
2419 0 : return avf_flow_error_set (error, AVF_FAILURE,
2420 : AVF_FLOW_ERROR_TYPE_ACTION, actions,
2421 : "RSS type not supported");
2422 :
2423 0 : memcpy (&rss_cfg->proto_hdrs, match_item->meta,
2424 : sizeof (struct virtchnl_proto_hdrs));
2425 :
2426 0 : avf_refine_proto_hdrs (&rss_cfg->proto_hdrs, rss_type, phint);
2427 :
2428 0 : break;
2429 :
2430 0 : default:
2431 0 : return avf_flow_error_set (error, AVF_FAILURE,
2432 : AVF_FLOW_ERROR_TYPE_ACTION, actions,
2433 : "Invalid action.");
2434 : }
2435 : }
2436 :
2437 0 : return 0;
2438 : }
2439 :
2440 : static int
2441 0 : avf_rss_parse_generic_pattern (struct virtchnl_rss_cfg *rss_cfg,
2442 : struct avf_flow_item avf_items[],
2443 : struct avf_flow_error *error)
2444 : {
2445 0 : struct avf_flow_item *item = avf_items;
2446 : u8 *pkt_buf, *msk_buf;
2447 : u16 spec_len, pkt_len;
2448 :
2449 0 : spec_len = clib_strnlen (item->spec, VIRTCHNL_MAX_SIZE_GEN_PACKET);
2450 0 : pkt_len = spec_len / 2;
2451 :
2452 0 : pkt_buf = clib_mem_alloc (pkt_len);
2453 0 : msk_buf = clib_mem_alloc (pkt_len);
2454 :
2455 0 : avf_parse_generic_pattern (item, pkt_buf, msk_buf, spec_len);
2456 :
2457 0 : clib_memcpy (rss_cfg->proto_hdrs.raw.spec, pkt_buf, pkt_len);
2458 0 : clib_memcpy (rss_cfg->proto_hdrs.raw.mask, msk_buf, pkt_len);
2459 :
2460 0 : rss_cfg->proto_hdrs.count = 0;
2461 0 : rss_cfg->proto_hdrs.tunnel_level = 0;
2462 0 : rss_cfg->proto_hdrs.raw.pkt_len = pkt_len;
2463 :
2464 0 : clib_mem_free (pkt_buf);
2465 0 : clib_mem_free (msk_buf);
2466 :
2467 0 : return 0;
2468 : }
2469 :
2470 : /* Find the first VOID or non-VOID item pointer */
2471 : static const struct avf_flow_item *
2472 0 : avf_find_first_item (const struct avf_flow_item *item, int is_void)
2473 : {
2474 : int is_find;
2475 :
2476 0 : while (item->type != AVF_FLOW_ITEM_TYPE_END)
2477 : {
2478 0 : if (is_void)
2479 0 : is_find = item->type == AVF_FLOW_ITEM_TYPE_VOID;
2480 : else
2481 0 : is_find = item->type != AVF_FLOW_ITEM_TYPE_VOID;
2482 0 : if (is_find)
2483 0 : break;
2484 0 : item++;
2485 : }
2486 0 : return item;
2487 : }
2488 :
2489 : /* Skip all VOID items of the pattern */
2490 : static void
2491 0 : avf_pattern_skip_void_item (struct avf_flow_item *items,
2492 : const struct avf_flow_item *pattern)
2493 : {
2494 0 : u32 cpy_count = 0;
2495 0 : const struct avf_flow_item *pb = pattern, *pe = pattern;
2496 :
2497 : for (;;)
2498 : {
2499 : /* Find a non-void item first */
2500 0 : pb = avf_find_first_item (pb, 0);
2501 0 : if (pb->type == AVF_FLOW_ITEM_TYPE_END)
2502 : {
2503 0 : pe = pb;
2504 0 : break;
2505 : }
2506 :
2507 : /* Find a void item */
2508 0 : pe = avf_find_first_item (pb + 1, 1);
2509 :
2510 0 : cpy_count = pe - pb;
2511 0 : clib_memcpy (items, pb, sizeof (struct avf_flow_item) * cpy_count);
2512 :
2513 0 : items += cpy_count;
2514 :
2515 0 : if (pe->type == AVF_FLOW_ITEM_TYPE_END)
2516 0 : break;
2517 :
2518 0 : pb = pe + 1;
2519 : }
2520 : /* Copy the END item. */
2521 0 : clib_memcpy (items, pe, sizeof (struct avf_flow_item));
2522 0 : }
2523 :
2524 : /* Check if the pattern matches a supported item type array */
2525 : static int
2526 0 : avf_match_pattern (enum avf_flow_item_type *item_array,
2527 : const struct avf_flow_item *pattern)
2528 : {
2529 0 : const struct avf_flow_item *item = pattern;
2530 :
2531 0 : while ((*item_array == item->type) &&
2532 0 : (*item_array != AVF_FLOW_ITEM_TYPE_END))
2533 : {
2534 0 : item_array++;
2535 0 : item++;
2536 : }
2537 :
2538 0 : return (*item_array == AVF_FLOW_ITEM_TYPE_END &&
2539 0 : item->type == AVF_FLOW_ITEM_TYPE_END);
2540 : }
2541 :
2542 : static int
2543 0 : avf_rss_search_pattern_match_item (const struct avf_flow_item pattern[],
2544 : struct avf_pattern_match_item **match_item,
2545 : struct avf_flow_error *error)
2546 : {
2547 0 : u16 i = 0;
2548 0 : struct avf_pattern_match_item *array = avf_hash_pattern_list;
2549 0 : u32 array_len =
2550 : sizeof (avf_hash_pattern_list) / sizeof (avf_hash_pattern_list[0]);
2551 : /* need free by each filter */
2552 : struct avf_flow_item *items; /* used for pattern without VOID items */
2553 0 : u32 item_num = 0; /* non-void item number */
2554 :
2555 : /* Get the non-void item number of pattern */
2556 0 : while ((pattern + i)->type != AVF_FLOW_ITEM_TYPE_END)
2557 : {
2558 0 : if ((pattern + i)->type != AVF_FLOW_ITEM_TYPE_VOID)
2559 0 : item_num++;
2560 0 : i++;
2561 : }
2562 0 : item_num++;
2563 :
2564 0 : items = clib_mem_alloc (item_num * sizeof (struct avf_flow_item));
2565 0 : avf_pattern_skip_void_item (items, pattern);
2566 :
2567 0 : for (i = 0; i < array_len; i++)
2568 0 : if (avf_match_pattern (array[i].pattern_list, items))
2569 : {
2570 0 : *match_item = &array[i];
2571 0 : clib_mem_free (items);
2572 0 : return 0;
2573 : }
2574 0 : avf_flow_error_set (error, AVF_FAILURE, AVF_FLOW_ERROR_TYPE_ITEM, pattern,
2575 : "Unsupported pattern");
2576 :
2577 0 : *match_item = NULL;
2578 0 : clib_mem_free (items);
2579 0 : return -1;
2580 : }
2581 :
2582 : static void
2583 0 : avf_rss_parse_pattern (const struct avf_flow_item pattern[], u64 *phint)
2584 : {
2585 0 : const struct avf_flow_item *item = pattern;
2586 : const struct avf_gtp_psc_hdr *psc;
2587 :
2588 0 : for (item = pattern; item->type != AVF_FLOW_ITEM_TYPE_END; item++)
2589 : {
2590 :
2591 0 : switch (item->type)
2592 : {
2593 0 : case AVF_FLOW_ITEM_TYPE_RAW:
2594 0 : *phint |= AVF_PHINT_RAW;
2595 0 : break;
2596 0 : case AVF_FLOW_ITEM_TYPE_IPV4:
2597 0 : if (!(*phint & AVF_PHINT_GTPU_MSK) && !(*phint & AVF_PHINT_GRE) &&
2598 0 : !(*phint & AVF_PHINT_L2TPV2))
2599 0 : *phint |= AVF_PHINT_OUTER_IPV4;
2600 0 : if ((*phint & AVF_PHINT_GRE) && !(*phint & AVF_PHINT_GTPU_MSK))
2601 0 : *phint |= AVF_PHINT_MID_IPV4;
2602 0 : break;
2603 0 : case AVF_FLOW_ITEM_TYPE_IPV6:
2604 0 : if (!(*phint & AVF_PHINT_GTPU_MSK) && !(*phint & AVF_PHINT_GRE) &&
2605 0 : !(*phint & AVF_PHINT_L2TPV2))
2606 0 : *phint |= AVF_PHINT_OUTER_IPV6;
2607 0 : if ((*phint & AVF_PHINT_GRE) && !(*phint & AVF_PHINT_GTPU_MSK))
2608 0 : *phint |= AVF_PHINT_MID_IPV6;
2609 0 : break;
2610 0 : case AVF_FLOW_ITEM_TYPE_GTPU:
2611 0 : *phint |= AVF_PHINT_GTPU;
2612 0 : break;
2613 0 : case AVF_FLOW_ITEM_TYPE_GTP_PSC:
2614 0 : *phint |= AVF_PHINT_GTPU_EH;
2615 0 : psc = item->spec;
2616 0 : if (!psc)
2617 0 : break;
2618 0 : else if (psc->pdu_type == AVF_GTPU_EH_UPLINK)
2619 0 : *phint |= AVF_PHINT_GTPU_EH_UP;
2620 0 : else if (psc->pdu_type == AVF_GTPU_EH_DWNLINK)
2621 0 : *phint |= AVF_PHINT_GTPU_EH_DWN;
2622 0 : break;
2623 0 : case AVF_FLOW_ITEM_TYPE_GRE:
2624 0 : *phint |= AVF_PHINT_GRE;
2625 0 : break;
2626 0 : default:
2627 0 : break;
2628 : }
2629 : }
2630 0 : }
2631 :
2632 : int
2633 0 : avf_rss_parse_pattern_action (struct avf_flow_item avf_items[],
2634 : struct avf_flow_action avf_actions[],
2635 : struct virtchnl_rss_cfg *rss_cfg,
2636 : struct avf_flow_error *error)
2637 : {
2638 0 : struct avf_pattern_match_item *match_item = NULL;
2639 0 : u64 pattern_hint = 0;
2640 0 : int ret = 0;
2641 :
2642 0 : ret = avf_rss_search_pattern_match_item (avf_items, &match_item, error);
2643 0 : if (ret)
2644 0 : return ret;
2645 :
2646 0 : avf_rss_parse_pattern (avf_items, &pattern_hint);
2647 :
2648 0 : if (pattern_hint == AVF_PHINT_RAW)
2649 : {
2650 0 : ret = avf_rss_parse_generic_pattern (rss_cfg, avf_items, error);
2651 0 : if (ret)
2652 0 : return ret;
2653 : }
2654 :
2655 0 : ret = avf_rss_parse_action (avf_actions, rss_cfg, match_item, pattern_hint,
2656 : error);
2657 0 : return ret;
2658 : }
2659 :
2660 : int
2661 0 : avf_rss_rule_create (struct avf_flow_vc_ctx *ctx,
2662 : struct virtchnl_rss_cfg *rss_cfg)
2663 : {
2664 : int ret;
2665 :
2666 0 : ret = ctx->vc_op (ctx->vc_hdl, VIRTCHNL_ADV_OP_ADD_RSS_CFG, rss_cfg,
2667 : sizeof (*rss_cfg), 0, 0);
2668 :
2669 0 : return ret;
2670 : }
2671 :
2672 : int
2673 0 : avf_rss_rule_destroy (struct avf_flow_vc_ctx *ctx,
2674 : struct virtchnl_rss_cfg *rss_cfg)
2675 : {
2676 : int ret;
2677 :
2678 0 : ret = ctx->vc_op (ctx->vc_hdl, VIRTCHNL_ADV_OP_DEL_RSS_CFG, rss_cfg,
2679 : sizeof (*rss_cfg), 0, 0);
2680 :
2681 0 : return ret;
2682 : }
2683 :
2684 : /*
2685 : * fd.io coding-style-patch-verification: ON
2686 : *
2687 : * Local Variables:
2688 : * eval: (c-set-style "gnu")
2689 : * End:
2690 : */
|