LCOV - code coverage report
Current view: top level - plugins/avf - avf_rss_lib.c (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 0 385 0.0 %
Date: 2023-07-05 22:20:52 Functions: 0 19 0.0 %

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

Generated by: LCOV version 1.14