netmap: Reinstate and update netmap plugin
[vpp.git] / src / plugins / avf / avf_rss_lib.c
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, &eth_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 avf_eth_rss_hf_refine (u64 rss_hf)
1933 {
1934   if ((rss_hf & AVF_ETH_RSS_L3_SRC_ONLY) && (rss_hf & AVF_ETH_RSS_L3_DST_ONLY))
1935     rss_hf &= ~(AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY);
1936
1937   if ((rss_hf & AVF_ETH_RSS_L4_SRC_ONLY) && (rss_hf & AVF_ETH_RSS_L4_DST_ONLY))
1938     rss_hf &= ~(AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY);
1939
1940   return rss_hf;
1941 }
1942
1943 static int
1944 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   if (rss_func == AVF_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
1954     {
1955       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         return 1;
1958
1959       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         return 1;
1965     }
1966
1967   /* check invalid combination */
1968   for (i = 0; i < _vec_len (invalid_rss_comb); i++)
1969     {
1970       if (__builtin_popcountll (rss_type & invalid_rss_comb[i]) > 1)
1971         return 1;
1972     }
1973
1974   /* check invalid RSS attribute */
1975   for (i = 0; i < _vec_len (rss_attr_to_valid_type); i++)
1976     {
1977       struct rss_attr_type *rat = &rss_attr_to_valid_type[i];
1978
1979       if (rat->attr & rss_type && !(rat->type & rss_type))
1980         return 1;
1981     }
1982
1983   /* check not allowed RSS type */
1984   rss_type &= ~VALID_RSS_ATTR;
1985
1986   return ((rss_type & allow_rss_type) != rss_type);
1987 }
1988
1989 int
1990 avf_rss_cfg_create (struct virtchnl_rss_cfg **rss_cfg, int tunnel_level)
1991 {
1992   *rss_cfg = clib_mem_alloc (sizeof (**rss_cfg));
1993
1994   clib_memset (*rss_cfg, 0, sizeof (**rss_cfg));
1995
1996   (*rss_cfg)->proto_hdrs.tunnel_level = tunnel_level;
1997
1998   return 0;
1999 }
2000
2001 int
2002 avf_rss_rcfg_destroy (struct virtchnl_rss_cfg *rss_cfg)
2003 {
2004   clib_mem_free (rss_cfg);
2005
2006   return 0;
2007 }
2008
2009 /* refine proto hdrs base on gtpu rss type */
2010 static void
2011 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   if (!(rss_type & AVF_ETH_RSS_GTPU))
2018     return;
2019
2020   for (i = 0; i < proto_hdrs->count; i++)
2021     {
2022       hdr = &proto_hdrs->proto_hdr[i];
2023       switch (hdr->type)
2024         {
2025         case VIRTCHNL_PROTO_HDR_GTPU_IP:
2026           REFINE_PROTO_FLD (ADD, GTPU_IP_TEID);
2027           break;
2028         default:
2029           break;
2030         }
2031     }
2032 }
2033
2034 static void
2035 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   if (layer < 0 || layer > hdrs->count)
2042     return;
2043
2044   /* shift headers layer */
2045   for (i = hdrs->count; i >= layer; i--)
2046     {
2047       hdr1 = &hdrs->proto_hdr[i];
2048       hdr2 = &hdrs->proto_hdr[i - 1];
2049       *hdr1 = *hdr2;
2050     }
2051
2052   /* adding dummy fragment header */
2053   hdr1 = &hdrs->proto_hdr[layer];
2054   VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, IPV4_FRAG);
2055   hdrs->count = ++layer;
2056 }
2057
2058 /* refine proto hdrs base on l2, l3, l4 rss type */
2059 static void
2060 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   for (i = 0; i < proto_hdrs->count; i++)
2067     {
2068       hdr = &proto_hdrs->proto_hdr[i];
2069       switch (hdr->type)
2070         {
2071         case VIRTCHNL_PROTO_HDR_ETH:
2072           if (!(rss_type & AVF_ETH_RSS_ETH))
2073             hdr->field_selector = 0;
2074           else if (rss_type & AVF_ETH_RSS_L2_SRC_ONLY)
2075             REFINE_PROTO_FLD (DEL, ETH_DST);
2076           else if (rss_type & AVF_ETH_RSS_L2_DST_ONLY)
2077             REFINE_PROTO_FLD (DEL, ETH_SRC);
2078           break;
2079         case VIRTCHNL_PROTO_HDR_IPV4:
2080           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               if (rss_type & AVF_ETH_RSS_FRAG_IPV4)
2086                 {
2087                   avf_hash_add_fragment_hdr (proto_hdrs, i + 1);
2088                 }
2089               else if (rss_type & AVF_ETH_RSS_L3_SRC_ONLY)
2090                 {
2091                   REFINE_PROTO_FLD (DEL, IPV4_DST);
2092                 }
2093               else if (rss_type & AVF_ETH_RSS_L3_DST_ONLY)
2094                 {
2095                   REFINE_PROTO_FLD (DEL, IPV4_SRC);
2096                 }
2097               else if (rss_type &
2098                        (AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY))
2099                 {
2100                   REFINE_PROTO_FLD (DEL, IPV4_DST);
2101                   REFINE_PROTO_FLD (DEL, IPV4_SRC);
2102                 }
2103             }
2104           else
2105             {
2106               hdr->field_selector = 0;
2107             }
2108
2109           if (rss_type & AVF_ETH_RSS_IPV4_CHKSUM)
2110             REFINE_PROTO_FLD (ADD, IPV4_CHKSUM);
2111
2112           break;
2113         case VIRTCHNL_PROTO_HDR_IPV4_FRAG:
2114           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               if (rss_type & AVF_ETH_RSS_FRAG_IPV4)
2120                 REFINE_PROTO_FLD (ADD, IPV4_FRAG_PKID);
2121             }
2122           else
2123             {
2124               hdr->field_selector = 0;
2125             }
2126
2127           if (rss_type & AVF_ETH_RSS_IPV4_CHKSUM)
2128             REFINE_PROTO_FLD (ADD, IPV4_CHKSUM);
2129
2130           break;
2131         case VIRTCHNL_PROTO_HDR_IPV6:
2132           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               if (rss_type & AVF_ETH_RSS_L3_SRC_ONLY)
2138                 {
2139                   REFINE_PROTO_FLD (DEL, IPV6_DST);
2140                 }
2141               else if (rss_type & AVF_ETH_RSS_L3_DST_ONLY)
2142                 {
2143                   REFINE_PROTO_FLD (DEL, IPV6_SRC);
2144                 }
2145               else if (rss_type &
2146                        (AVF_ETH_RSS_L4_SRC_ONLY | AVF_ETH_RSS_L4_DST_ONLY))
2147                 {
2148                   REFINE_PROTO_FLD (DEL, IPV6_DST);
2149                   REFINE_PROTO_FLD (DEL, IPV6_SRC);
2150                 }
2151             }
2152           else
2153             {
2154               hdr->field_selector = 0;
2155             }
2156           if (rss_type & AVF_ETH_RSS_L3_PRE64)
2157             {
2158               if (REFINE_PROTO_FLD (TEST, IPV6_SRC))
2159                 REPALCE_PROTO_FLD (IPV6_SRC, IPV6_PREFIX64_SRC);
2160               if (REFINE_PROTO_FLD (TEST, IPV6_DST))
2161                 REPALCE_PROTO_FLD (IPV6_DST, IPV6_PREFIX64_DST);
2162             }
2163           break;
2164         case VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG:
2165           if (rss_type & AVF_ETH_RSS_FRAG_IPV6)
2166             REFINE_PROTO_FLD (ADD, IPV6_EH_FRAG_PKID);
2167           else
2168             hdr->field_selector = 0;
2169
2170           break;
2171         case VIRTCHNL_PROTO_HDR_UDP:
2172           if (rss_type &
2173               (AVF_ETH_RSS_NONFRAG_IPV4_UDP | AVF_ETH_RSS_NONFRAG_IPV6_UDP))
2174             {
2175               if (rss_type & AVF_ETH_RSS_L4_SRC_ONLY)
2176                 REFINE_PROTO_FLD (DEL, UDP_DST_PORT);
2177               else if (rss_type & AVF_ETH_RSS_L4_DST_ONLY)
2178                 REFINE_PROTO_FLD (DEL, UDP_SRC_PORT);
2179               else if (rss_type &
2180                        (AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY))
2181                 hdr->field_selector = 0;
2182             }
2183           else
2184             {
2185               hdr->field_selector = 0;
2186             }
2187
2188           if (rss_type & AVF_ETH_RSS_L4_CHKSUM)
2189             REFINE_PROTO_FLD (ADD, UDP_CHKSUM);
2190           break;
2191         case VIRTCHNL_PROTO_HDR_TCP:
2192           if (rss_type &
2193               (AVF_ETH_RSS_NONFRAG_IPV4_TCP | AVF_ETH_RSS_NONFRAG_IPV6_TCP))
2194             {
2195               if (rss_type & AVF_ETH_RSS_L4_SRC_ONLY)
2196                 REFINE_PROTO_FLD (DEL, TCP_DST_PORT);
2197               else if (rss_type & AVF_ETH_RSS_L4_DST_ONLY)
2198                 REFINE_PROTO_FLD (DEL, TCP_SRC_PORT);
2199               else if (rss_type &
2200                        (AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY))
2201                 hdr->field_selector = 0;
2202             }
2203           else
2204             {
2205               hdr->field_selector = 0;
2206             }
2207
2208           if (rss_type & AVF_ETH_RSS_L4_CHKSUM)
2209             REFINE_PROTO_FLD (ADD, TCP_CHKSUM);
2210           break;
2211         case VIRTCHNL_PROTO_HDR_SCTP:
2212           if (rss_type &
2213               (AVF_ETH_RSS_NONFRAG_IPV4_SCTP | AVF_ETH_RSS_NONFRAG_IPV6_SCTP))
2214             {
2215               if (rss_type & AVF_ETH_RSS_L4_SRC_ONLY)
2216                 REFINE_PROTO_FLD (DEL, SCTP_DST_PORT);
2217               else if (rss_type & AVF_ETH_RSS_L4_DST_ONLY)
2218                 REFINE_PROTO_FLD (DEL, SCTP_SRC_PORT);
2219               else if (rss_type &
2220                        (AVF_ETH_RSS_L3_SRC_ONLY | AVF_ETH_RSS_L3_DST_ONLY))
2221                 hdr->field_selector = 0;
2222             }
2223           else
2224             {
2225               hdr->field_selector = 0;
2226             }
2227
2228           if (rss_type & AVF_ETH_RSS_L4_CHKSUM)
2229             REFINE_PROTO_FLD (ADD, SCTP_CHKSUM);
2230           break;
2231         case VIRTCHNL_PROTO_HDR_S_VLAN:
2232           if (!(rss_type & AVF_ETH_RSS_S_VLAN))
2233             hdr->field_selector = 0;
2234           break;
2235         case VIRTCHNL_PROTO_HDR_C_VLAN:
2236           if (!(rss_type & AVF_ETH_RSS_C_VLAN))
2237             hdr->field_selector = 0;
2238           break;
2239         case VIRTCHNL_PROTO_HDR_L2TPV3:
2240           if (!(rss_type & AVF_ETH_RSS_L2TPV3))
2241             hdr->field_selector = 0;
2242           break;
2243         case VIRTCHNL_PROTO_HDR_ESP:
2244           if (!(rss_type & AVF_ETH_RSS_ESP))
2245             hdr->field_selector = 0;
2246           break;
2247         case VIRTCHNL_PROTO_HDR_AH:
2248           if (!(rss_type & AVF_ETH_RSS_AH))
2249             hdr->field_selector = 0;
2250           break;
2251         case VIRTCHNL_PROTO_HDR_PFCP:
2252           if (!(rss_type & AVF_ETH_RSS_PFCP))
2253             hdr->field_selector = 0;
2254           break;
2255         case VIRTCHNL_PROTO_HDR_ECPRI:
2256           if (!(rss_type & AVF_ETH_RSS_ECPRI))
2257             hdr->field_selector = 0;
2258           break;
2259         case VIRTCHNL_PROTO_HDR_L2TPV2:
2260           if (!(rss_type & AVF_ETH_RSS_L2TPV2))
2261             hdr->field_selector = 0;
2262           break;
2263         default:
2264           break;
2265         }
2266     }
2267 }
2268
2269 static void
2270 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   int i, shift_count = 1;
2276   int tun_lvl = proto_hdrs->tunnel_level;
2277
2278   if (!(phint & AVF_PHINT_GTPU_MSK) && !(phint & AVF_PHINT_GRE))
2279     return;
2280
2281   while (tun_lvl)
2282     {
2283       if (phint & AVF_PHINT_LAYERS_MSK)
2284         shift_count = 2;
2285
2286       /* shift headers layer */
2287       for (i = proto_hdrs->count - 1 + shift_count; i > shift_count - 1; i--)
2288         {
2289           hdr1 = &proto_hdrs->proto_hdr[i];
2290           hdr2 = &proto_hdrs->proto_hdr[i - shift_count];
2291           *hdr1 = *hdr2;
2292         }
2293
2294       if (shift_count == 1)
2295         {
2296           /* adding tunnel header at layer 0 */
2297           hdr1 = &proto_hdrs->proto_hdr[0];
2298         }
2299       else
2300         {
2301           /* adding tunnel header and outer ip header */
2302           hdr1 = &proto_hdrs->proto_hdr[1];
2303           hdr2 = &proto_hdrs->proto_hdr[0];
2304           hdr2->field_selector = 0;
2305           proto_hdrs->count++;
2306           tun_lvl--;
2307
2308           if (tun_lvl == TUNNEL_LEVEL_OUTER)
2309             {
2310               if (phint & AVF_PHINT_OUTER_IPV4)
2311                 VIRTCHNL_SET_PROTO_HDR_TYPE (hdr2, IPV4);
2312               else if (phint & AVF_PHINT_OUTER_IPV6)
2313                 VIRTCHNL_SET_PROTO_HDR_TYPE (hdr2, IPV6);
2314             }
2315           else if (tun_lvl == TUNNEL_LEVEL_INNER)
2316             {
2317               if (phint & AVF_PHINT_MID_IPV4)
2318                 VIRTCHNL_SET_PROTO_HDR_TYPE (hdr2, IPV4);
2319               else if (phint & AVF_PHINT_MID_IPV6)
2320                 VIRTCHNL_SET_PROTO_HDR_TYPE (hdr2, IPV6);
2321             }
2322         }
2323
2324       hdr1->field_selector = 0;
2325       proto_hdrs->count++;
2326
2327       if (phint & AVF_PHINT_GTPU_EH_DWN)
2328         VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GTPU_EH_PDU_DWN);
2329       else if (phint & AVF_PHINT_GTPU_EH_UP)
2330         VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GTPU_EH_PDU_UP);
2331       else if (phint & AVF_PHINT_GTPU_EH)
2332         VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GTPU_EH);
2333       else if (phint & AVF_PHINT_GTPU)
2334         VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GTPU_IP);
2335
2336       if (phint & AVF_PHINT_GRE)
2337         {
2338           if (phint & AVF_PHINT_GTPU)
2339             {
2340               /* if GTPoGRE, add GRE header at the outer tunnel  */
2341               if (tun_lvl == TUNNEL_LEVEL_OUTER)
2342                 VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GRE);
2343             }
2344           else
2345             {
2346               VIRTCHNL_SET_PROTO_HDR_TYPE (hdr1, GRE);
2347             }
2348         }
2349     }
2350   proto_hdrs->tunnel_level = tun_lvl;
2351 }
2352
2353 static void
2354 avf_refine_proto_hdrs (struct virtchnl_proto_hdrs *proto_hdrs, u64 rss_type,
2355                        u64 phint)
2356 {
2357   avf_refine_proto_hdrs_l234 (proto_hdrs, rss_type);
2358   avf_refine_proto_hdrs_by_pattern (proto_hdrs, phint);
2359   avf_refine_proto_hdrs_gtpu (proto_hdrs, rss_type);
2360 }
2361
2362 static int
2363 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   for (action = actions; action->type != AVF_FLOW_ACTION_TYPE_END; action++)
2374     {
2375       switch (action->type)
2376         {
2377         case AVF_FLOW_ACTION_TYPE_RSS:
2378           rss = action->conf;
2379
2380           if (rss->func == AVF_ETH_HASH_FUNCTION_SIMPLE_XOR)
2381             {
2382               rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
2383               ret = avf_flow_error_set (error, AVF_FAILURE,
2384                                         AVF_FLOW_ERROR_TYPE_ACTION, actions,
2385                                         "simple xor is not supported.");
2386               return ret;
2387             }
2388           else if (rss->func == AVF_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
2389             {
2390               rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
2391             }
2392           else
2393             {
2394               rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
2395             }
2396
2397           if (rss->level)
2398             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           if (rss->key_len)
2403             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           if (rss->queue_num)
2408             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           if (phint == AVF_PHINT_RAW)
2413             break;
2414
2415           rss_type = avf_eth_rss_hf_refine (rss->types);
2416
2417           if (avf_any_invalid_rss_type (rss->func, rss_type,
2418                                         match_item->input_set_mask))
2419             return avf_flow_error_set (error, AVF_FAILURE,
2420                                        AVF_FLOW_ERROR_TYPE_ACTION, actions,
2421                                        "RSS type not supported");
2422
2423           memcpy (&rss_cfg->proto_hdrs, match_item->meta,
2424                   sizeof (struct virtchnl_proto_hdrs));
2425
2426           avf_refine_proto_hdrs (&rss_cfg->proto_hdrs, rss_type, phint);
2427
2428           break;
2429
2430         default:
2431           return avf_flow_error_set (error, AVF_FAILURE,
2432                                      AVF_FLOW_ERROR_TYPE_ACTION, actions,
2433                                      "Invalid action.");
2434         }
2435     }
2436
2437   return 0;
2438 }
2439
2440 static int
2441 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   struct avf_flow_item *item = avf_items;
2446   u8 *pkt_buf, *msk_buf;
2447   u16 spec_len, pkt_len;
2448
2449   spec_len = clib_strnlen (item->spec, VIRTCHNL_MAX_SIZE_GEN_PACKET);
2450   pkt_len = spec_len / 2;
2451
2452   pkt_buf = clib_mem_alloc (pkt_len);
2453   msk_buf = clib_mem_alloc (pkt_len);
2454
2455   avf_parse_generic_pattern (item, pkt_buf, msk_buf, spec_len);
2456
2457   clib_memcpy (rss_cfg->proto_hdrs.raw.spec, pkt_buf, pkt_len);
2458   clib_memcpy (rss_cfg->proto_hdrs.raw.mask, msk_buf, pkt_len);
2459
2460   rss_cfg->proto_hdrs.count = 0;
2461   rss_cfg->proto_hdrs.tunnel_level = 0;
2462   rss_cfg->proto_hdrs.raw.pkt_len = pkt_len;
2463
2464   clib_mem_free (pkt_buf);
2465   clib_mem_free (msk_buf);
2466
2467   return 0;
2468 }
2469
2470 /* Find the first VOID or non-VOID item pointer */
2471 static const struct avf_flow_item *
2472 avf_find_first_item (const struct avf_flow_item *item, int is_void)
2473 {
2474   int is_find;
2475
2476   while (item->type != AVF_FLOW_ITEM_TYPE_END)
2477     {
2478       if (is_void)
2479         is_find = item->type == AVF_FLOW_ITEM_TYPE_VOID;
2480       else
2481         is_find = item->type != AVF_FLOW_ITEM_TYPE_VOID;
2482       if (is_find)
2483         break;
2484       item++;
2485     }
2486   return item;
2487 }
2488
2489 /* Skip all VOID items of the pattern */
2490 static void
2491 avf_pattern_skip_void_item (struct avf_flow_item *items,
2492                             const struct avf_flow_item *pattern)
2493 {
2494   u32 cpy_count = 0;
2495   const struct avf_flow_item *pb = pattern, *pe = pattern;
2496
2497   for (;;)
2498     {
2499       /* Find a non-void item first */
2500       pb = avf_find_first_item (pb, 0);
2501       if (pb->type == AVF_FLOW_ITEM_TYPE_END)
2502         {
2503           pe = pb;
2504           break;
2505         }
2506
2507       /* Find a void item */
2508       pe = avf_find_first_item (pb + 1, 1);
2509
2510       cpy_count = pe - pb;
2511       clib_memcpy (items, pb, sizeof (struct avf_flow_item) * cpy_count);
2512
2513       items += cpy_count;
2514
2515       if (pe->type == AVF_FLOW_ITEM_TYPE_END)
2516         break;
2517
2518       pb = pe + 1;
2519     }
2520   /* Copy the END item. */
2521   clib_memcpy (items, pe, sizeof (struct avf_flow_item));
2522 }
2523
2524 /* Check if the pattern matches a supported item type array */
2525 static int
2526 avf_match_pattern (enum avf_flow_item_type *item_array,
2527                    const struct avf_flow_item *pattern)
2528 {
2529   const struct avf_flow_item *item = pattern;
2530
2531   while ((*item_array == item->type) &&
2532          (*item_array != AVF_FLOW_ITEM_TYPE_END))
2533     {
2534       item_array++;
2535       item++;
2536     }
2537
2538   return (*item_array == AVF_FLOW_ITEM_TYPE_END &&
2539           item->type == AVF_FLOW_ITEM_TYPE_END);
2540 }
2541
2542 static int
2543 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   u16 i = 0;
2548   struct avf_pattern_match_item *array = avf_hash_pattern_list;
2549   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   u32 item_num = 0;            /* non-void item number */
2554
2555   /* Get the non-void item number of pattern */
2556   while ((pattern + i)->type != AVF_FLOW_ITEM_TYPE_END)
2557     {
2558       if ((pattern + i)->type != AVF_FLOW_ITEM_TYPE_VOID)
2559         item_num++;
2560       i++;
2561     }
2562   item_num++;
2563
2564   items = clib_mem_alloc (item_num * sizeof (struct avf_flow_item));
2565   avf_pattern_skip_void_item (items, pattern);
2566
2567   for (i = 0; i < array_len; i++)
2568     if (avf_match_pattern (array[i].pattern_list, items))
2569       {
2570         *match_item = &array[i];
2571         clib_mem_free (items);
2572         return 0;
2573       }
2574   avf_flow_error_set (error, AVF_FAILURE, AVF_FLOW_ERROR_TYPE_ITEM, pattern,
2575                       "Unsupported pattern");
2576
2577   *match_item = NULL;
2578   clib_mem_free (items);
2579   return -1;
2580 }
2581
2582 static void
2583 avf_rss_parse_pattern (const struct avf_flow_item pattern[], u64 *phint)
2584 {
2585   const struct avf_flow_item *item = pattern;
2586   const struct avf_gtp_psc_hdr *psc;
2587
2588   for (item = pattern; item->type != AVF_FLOW_ITEM_TYPE_END; item++)
2589     {
2590
2591       switch (item->type)
2592         {
2593         case AVF_FLOW_ITEM_TYPE_RAW:
2594           *phint |= AVF_PHINT_RAW;
2595           break;
2596         case AVF_FLOW_ITEM_TYPE_IPV4:
2597           if (!(*phint & AVF_PHINT_GTPU_MSK) && !(*phint & AVF_PHINT_GRE) &&
2598               !(*phint & AVF_PHINT_L2TPV2))
2599             *phint |= AVF_PHINT_OUTER_IPV4;
2600           if ((*phint & AVF_PHINT_GRE) && !(*phint & AVF_PHINT_GTPU_MSK))
2601             *phint |= AVF_PHINT_MID_IPV4;
2602           break;
2603         case AVF_FLOW_ITEM_TYPE_IPV6:
2604           if (!(*phint & AVF_PHINT_GTPU_MSK) && !(*phint & AVF_PHINT_GRE) &&
2605               !(*phint & AVF_PHINT_L2TPV2))
2606             *phint |= AVF_PHINT_OUTER_IPV6;
2607           if ((*phint & AVF_PHINT_GRE) && !(*phint & AVF_PHINT_GTPU_MSK))
2608             *phint |= AVF_PHINT_MID_IPV6;
2609           break;
2610         case AVF_FLOW_ITEM_TYPE_GTPU:
2611           *phint |= AVF_PHINT_GTPU;
2612           break;
2613         case AVF_FLOW_ITEM_TYPE_GTP_PSC:
2614           *phint |= AVF_PHINT_GTPU_EH;
2615           psc = item->spec;
2616           if (!psc)
2617             break;
2618           else if (psc->pdu_type == AVF_GTPU_EH_UPLINK)
2619             *phint |= AVF_PHINT_GTPU_EH_UP;
2620           else if (psc->pdu_type == AVF_GTPU_EH_DWNLINK)
2621             *phint |= AVF_PHINT_GTPU_EH_DWN;
2622           break;
2623         case AVF_FLOW_ITEM_TYPE_GRE:
2624           *phint |= AVF_PHINT_GRE;
2625           break;
2626         default:
2627           break;
2628         }
2629     }
2630 }
2631
2632 int
2633 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   struct avf_pattern_match_item *match_item = NULL;
2639   u64 pattern_hint = 0;
2640   int ret = 0;
2641
2642   ret = avf_rss_search_pattern_match_item (avf_items, &match_item, error);
2643   if (ret)
2644     return ret;
2645
2646   avf_rss_parse_pattern (avf_items, &pattern_hint);
2647
2648   if (pattern_hint == AVF_PHINT_RAW)
2649     {
2650       ret = avf_rss_parse_generic_pattern (rss_cfg, avf_items, error);
2651       if (ret)
2652         return ret;
2653     }
2654
2655   ret = avf_rss_parse_action (avf_actions, rss_cfg, match_item, pattern_hint,
2656                               error);
2657   return ret;
2658 }
2659
2660 int
2661 avf_rss_rule_create (struct avf_flow_vc_ctx *ctx,
2662                      struct virtchnl_rss_cfg *rss_cfg)
2663 {
2664   int ret;
2665
2666   ret = ctx->vc_op (ctx->vc_hdl, VIRTCHNL_ADV_OP_ADD_RSS_CFG, rss_cfg,
2667                     sizeof (*rss_cfg), 0, 0);
2668
2669   return ret;
2670 }
2671
2672 int
2673 avf_rss_rule_destroy (struct avf_flow_vc_ctx *ctx,
2674                       struct virtchnl_rss_cfg *rss_cfg)
2675 {
2676   int ret;
2677
2678   ret = ctx->vc_op (ctx->vc_hdl, VIRTCHNL_ADV_OP_DEL_RSS_CFG, rss_cfg,
2679                     sizeof (*rss_cfg), 0, 0);
2680
2681   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  */