1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2019 Intel Corporation 3 */ 4 5 #include <sys/queue.h> 6 #include <stdio.h> 7 #include <errno.h> 8 #include <stdint.h> 9 #include <string.h> 10 #include <unistd.h> 11 #include <stdarg.h> 12 13 #include <rte_debug.h> 14 #include <rte_ether.h> 15 #include <rte_ethdev_driver.h> 16 #include <rte_log.h> 17 #include <rte_malloc.h> 18 #include <rte_eth_ctrl.h> 19 #include <rte_tailq.h> 20 #include <rte_flow_driver.h> 21 22 #include "ice_logs.h" 23 #include "base/ice_type.h" 24 #include "base/ice_flow.h" 25 #include "ice_ethdev.h" 26 #include "ice_generic_flow.h" 27 28 #define ICE_GTPU_EH_DWNLINK 0 29 #define ICE_GTPU_EH_UPLINK 1 30 31 struct rss_type_match_hdr { 32 uint32_t hdr_mask; 33 uint64_t eth_rss_hint; 34 }; 35 36 struct ice_hash_match_type { 37 uint64_t hash_type; 38 uint64_t hash_flds; 39 }; 40 41 struct rss_meta { 42 uint32_t pkt_hdr; 43 uint64_t hash_flds; 44 uint8_t hash_function; 45 }; 46 47 struct ice_hash_flow_cfg { 48 bool simple_xor; 49 struct ice_rss_cfg rss_cfg; 50 }; 51 52 static int 53 ice_hash_init(struct ice_adapter *ad); 54 55 static int 56 ice_hash_create(struct ice_adapter *ad, 57 struct rte_flow *flow, 58 void *meta, 59 struct rte_flow_error *error); 60 61 static int 62 ice_hash_destroy(struct ice_adapter *ad, 63 struct rte_flow *flow, 64 struct rte_flow_error *error); 65 66 static void 67 ice_hash_uninit(struct ice_adapter *ad); 68 69 static void 70 ice_hash_free(struct rte_flow *flow); 71 72 static int 73 ice_hash_parse_pattern_action(struct ice_adapter *ad, 74 struct ice_pattern_match_item *array, 75 uint32_t array_len, 76 const struct rte_flow_item pattern[], 77 const struct rte_flow_action actions[], 78 void **meta, 79 struct rte_flow_error *error); 80 81 /* The first member is protocol header, the second member is ETH_RSS_*. */ 82 struct rss_type_match_hdr hint_empty = { 83 ICE_FLOW_SEG_HDR_NONE, 0}; 84 struct rss_type_match_hdr hint_eth_ipv4 = { 85 ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER, 86 ETH_RSS_ETH | ETH_RSS_IPV4}; 87 struct rss_type_match_hdr hint_eth_ipv4_udp = { 88 ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | 89 ICE_FLOW_SEG_HDR_UDP, 90 ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_UDP}; 91 struct rss_type_match_hdr hint_eth_ipv4_tcp = { 92 ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | 93 ICE_FLOW_SEG_HDR_TCP, 94 ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_TCP}; 95 struct rss_type_match_hdr hint_eth_ipv4_sctp = { 96 ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | 97 ICE_FLOW_SEG_HDR_SCTP, 98 ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_SCTP}; 99 struct rss_type_match_hdr hint_eth_ipv4_gtpu_ipv4 = { 100 ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 | 101 ICE_FLOW_SEG_HDR_IPV_OTHER, 102 ETH_RSS_GTPU | ETH_RSS_IPV4}; 103 struct rss_type_match_hdr hint_eth_ipv4_gtpu_ipv4_udp = { 104 ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 | 105 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, 106 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_UDP}; 107 struct rss_type_match_hdr hint_eth_ipv4_gtpu_ipv4_tcp = { 108 ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 | 109 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, 110 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_TCP}; 111 struct rss_type_match_hdr hint_eth_ipv4_gtpu_ipv6 = { 112 ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 | 113 ICE_FLOW_SEG_HDR_IPV_OTHER, 114 ETH_RSS_GTPU | ETH_RSS_IPV6}; 115 struct rss_type_match_hdr hint_eth_ipv4_gtpu_ipv6_udp = { 116 ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 | 117 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, 118 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_UDP}; 119 struct rss_type_match_hdr hint_eth_ipv4_gtpu_ipv6_tcp = { 120 ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 | 121 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, 122 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_TCP}; 123 struct rss_type_match_hdr hint_eth_ipv6_gtpu_ipv4 = { 124 ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 | 125 ICE_FLOW_SEG_HDR_IPV_OTHER, 126 ETH_RSS_GTPU | ETH_RSS_IPV4}; 127 struct rss_type_match_hdr hint_eth_ipv6_gtpu_ipv4_udp = { 128 ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 | 129 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, 130 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_UDP}; 131 struct rss_type_match_hdr hint_eth_ipv6_gtpu_ipv4_tcp = { 132 ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 | 133 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, 134 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_TCP}; 135 struct rss_type_match_hdr hint_eth_ipv6_gtpu_ipv6 = { 136 ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 | 137 ICE_FLOW_SEG_HDR_IPV_OTHER, 138 ETH_RSS_GTPU | ETH_RSS_IPV6}; 139 struct rss_type_match_hdr hint_eth_ipv6_gtpu_ipv6_udp = { 140 ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 | 141 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, 142 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_UDP}; 143 struct rss_type_match_hdr hint_eth_ipv6_gtpu_ipv6_tcp = { 144 ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 | 145 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, 146 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_TCP}; 147 struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv4 = { 148 ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 | 149 ICE_FLOW_SEG_HDR_IPV_OTHER, 150 ETH_RSS_GTPU | ETH_RSS_IPV4}; 151 struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv4_udp = { 152 ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 | 153 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, 154 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_UDP}; 155 struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv4_tcp = { 156 ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 | 157 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, 158 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_TCP}; 159 struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv6 = { 160 ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 | 161 ICE_FLOW_SEG_HDR_IPV_OTHER, 162 ETH_RSS_GTPU | ETH_RSS_IPV6}; 163 struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv6_udp = { 164 ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 | 165 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, 166 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_UDP}; 167 struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv6_tcp = { 168 ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 | 169 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, 170 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_TCP}; 171 struct rss_type_match_hdr hint_eth_ipv6_gtpu_eh_ipv4 = { 172 ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 | 173 ICE_FLOW_SEG_HDR_IPV_OTHER, 174 ETH_RSS_GTPU | ETH_RSS_IPV4}; 175 struct rss_type_match_hdr hint_eth_ipv6_gtpu_eh_ipv4_udp = { 176 ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 | 177 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, 178 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_UDP}; 179 struct rss_type_match_hdr hint_eth_ipv6_gtpu_eh_ipv4_tcp = { 180 ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 | 181 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, 182 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_TCP}; 183 struct rss_type_match_hdr hint_eth_ipv6_gtpu_eh_ipv6 = { 184 ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 | 185 ICE_FLOW_SEG_HDR_IPV_OTHER, 186 ETH_RSS_GTPU | ETH_RSS_IPV6}; 187 struct rss_type_match_hdr hint_eth_ipv6_gtpu_eh_ipv6_udp = { 188 ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 | 189 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, 190 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_UDP}; 191 struct rss_type_match_hdr hint_eth_ipv6_gtpu_eh_ipv6_tcp = { 192 ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 | 193 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, 194 ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_TCP}; 195 struct rss_type_match_hdr hint_eth_pppoes_ipv4 = { 196 ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV4 | 197 ICE_FLOW_SEG_HDR_IPV_OTHER, 198 ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_IPV4}; 199 struct rss_type_match_hdr hint_eth_pppoes_ipv4_udp = { 200 ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV4 | 201 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, 202 ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV4_UDP}; 203 struct rss_type_match_hdr hint_eth_pppoes_ipv4_tcp = { 204 ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV4 | 205 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, 206 ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV4_TCP}; 207 struct rss_type_match_hdr hint_eth_ipv4_esp = { 208 ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | 209 ICE_FLOW_SEG_HDR_ESP, 210 ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_ESP}; 211 struct rss_type_match_hdr hint_eth_ipv4_udp_esp = { 212 ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | 213 ICE_FLOW_SEG_HDR_NAT_T_ESP, 214 ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_ESP}; 215 struct rss_type_match_hdr hint_eth_ipv4_ah = { 216 ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | 217 ICE_FLOW_SEG_HDR_AH, 218 ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_AH}; 219 struct rss_type_match_hdr hint_eth_ipv4_l2tpv3 = { 220 ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | 221 ICE_FLOW_SEG_HDR_L2TPV3, 222 ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_L2TPV3}; 223 struct rss_type_match_hdr hint_eth_ipv4_pfcp = { 224 ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | 225 ICE_FLOW_SEG_HDR_PFCP_SESSION, 226 ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_PFCP}; 227 struct rss_type_match_hdr hint_eth_vlan_ipv4 = { 228 ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV4 | 229 ICE_FLOW_SEG_HDR_IPV_OTHER, 230 ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_C_VLAN}; 231 struct rss_type_match_hdr hint_eth_vlan_ipv4_udp = { 232 ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV4 | 233 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, 234 ETH_RSS_ETH | ETH_RSS_C_VLAN | 235 ETH_RSS_NONFRAG_IPV4_UDP}; 236 struct rss_type_match_hdr hint_eth_vlan_ipv4_tcp = { 237 ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV4 | 238 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, 239 ETH_RSS_ETH | ETH_RSS_C_VLAN | 240 ETH_RSS_NONFRAG_IPV4_TCP}; 241 struct rss_type_match_hdr hint_eth_vlan_ipv4_sctp = { 242 ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV4 | 243 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_SCTP, 244 ETH_RSS_ETH | ETH_RSS_C_VLAN | 245 ETH_RSS_NONFRAG_IPV4_SCTP}; 246 struct rss_type_match_hdr hint_eth_ipv6 = { 247 ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER, 248 ETH_RSS_ETH | ETH_RSS_IPV6}; 249 struct rss_type_match_hdr hint_eth_ipv6_udp = { 250 ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | 251 ICE_FLOW_SEG_HDR_UDP, 252 ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_UDP}; 253 struct rss_type_match_hdr hint_eth_ipv6_tcp = { 254 ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | 255 ICE_FLOW_SEG_HDR_TCP, 256 ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_TCP}; 257 struct rss_type_match_hdr hint_eth_ipv6_sctp = { 258 ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | 259 ICE_FLOW_SEG_HDR_SCTP, 260 ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_SCTP}; 261 struct rss_type_match_hdr hint_eth_ipv6_esp = { 262 ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | 263 ICE_FLOW_SEG_HDR_ESP, 264 ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_ESP}; 265 struct rss_type_match_hdr hint_eth_ipv6_udp_esp = { 266 ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | 267 ICE_FLOW_SEG_HDR_NAT_T_ESP, 268 ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_ESP}; 269 struct rss_type_match_hdr hint_eth_ipv6_ah = { 270 ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | 271 ICE_FLOW_SEG_HDR_AH, 272 ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_AH}; 273 struct rss_type_match_hdr hint_eth_ipv6_l2tpv3 = { 274 ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | 275 ICE_FLOW_SEG_HDR_L2TPV3, 276 ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_L2TPV3}; 277 struct rss_type_match_hdr hint_eth_ipv6_pfcp = { 278 ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | 279 ICE_FLOW_SEG_HDR_PFCP_SESSION, 280 ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_PFCP}; 281 struct rss_type_match_hdr hint_eth_vlan_ipv6 = { 282 ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV6 | 283 ICE_FLOW_SEG_HDR_IPV_OTHER, 284 ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_C_VLAN}; 285 struct rss_type_match_hdr hint_eth_vlan_ipv6_udp = { 286 ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV6 | 287 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, 288 ETH_RSS_ETH | ETH_RSS_C_VLAN | 289 ETH_RSS_NONFRAG_IPV6_UDP}; 290 struct rss_type_match_hdr hint_eth_vlan_ipv6_tcp = { 291 ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV6 | 292 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, 293 ETH_RSS_ETH | ETH_RSS_C_VLAN | 294 ETH_RSS_NONFRAG_IPV6_TCP}; 295 struct rss_type_match_hdr hint_eth_vlan_ipv6_sctp = { 296 ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV6 | 297 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_SCTP, 298 ETH_RSS_ETH | ETH_RSS_C_VLAN | 299 ETH_RSS_NONFRAG_IPV6_SCTP}; 300 struct rss_type_match_hdr hint_eth_pppoes_ipv6 = { 301 ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV6 | 302 ICE_FLOW_SEG_HDR_IPV_OTHER, 303 ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_IPV6}; 304 struct rss_type_match_hdr hint_eth_pppoes_ipv6_udp = { 305 ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV6 | 306 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, 307 ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV6_UDP}; 308 struct rss_type_match_hdr hint_eth_pppoes_ipv6_tcp = { 309 ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV6 | 310 ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, 311 ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV6_TCP}; 312 struct rss_type_match_hdr hint_eth_pppoes = { 313 ICE_FLOW_SEG_HDR_PPPOE, 314 ETH_RSS_ETH | ETH_RSS_PPPOE}; 315 316 /* Supported pattern for os default package. */ 317 static struct ice_pattern_match_item ice_hash_pattern_list_os[] = { 318 {pattern_eth_ipv4, ICE_INSET_NONE, &hint_eth_ipv4}, 319 {pattern_eth_ipv4_udp, ICE_INSET_NONE, &hint_eth_ipv4_udp}, 320 {pattern_eth_ipv4_tcp, ICE_INSET_NONE, &hint_eth_ipv4_tcp}, 321 {pattern_eth_ipv4_sctp, ICE_INSET_NONE, &hint_eth_ipv4_sctp}, 322 {pattern_eth_ipv6, ICE_INSET_NONE, &hint_eth_ipv6}, 323 {pattern_eth_ipv6_udp, ICE_INSET_NONE, &hint_eth_ipv6_udp}, 324 {pattern_eth_ipv6_tcp, ICE_INSET_NONE, &hint_eth_ipv6_tcp}, 325 {pattern_eth_ipv6_sctp, ICE_INSET_NONE, &hint_eth_ipv6_sctp}, 326 {pattern_empty, ICE_INSET_NONE, &hint_empty}, 327 }; 328 329 /* Supported pattern for comms package. */ 330 static struct ice_pattern_match_item ice_hash_pattern_list_comms[] = { 331 {pattern_empty, ICE_INSET_NONE, 332 &hint_empty}, 333 {pattern_eth_ipv4, ICE_INSET_NONE, 334 &hint_eth_ipv4}, 335 {pattern_eth_ipv4_udp, ICE_INSET_NONE, 336 &hint_eth_ipv4_udp}, 337 {pattern_eth_ipv4_tcp, ICE_INSET_NONE, 338 &hint_eth_ipv4_tcp}, 339 {pattern_eth_ipv4_sctp, ICE_INSET_NONE, 340 &hint_eth_ipv4_sctp}, 341 {pattern_eth_ipv4_gtpu_ipv4, ICE_INSET_NONE, 342 &hint_eth_ipv4_gtpu_ipv4}, 343 {pattern_eth_ipv4_gtpu_ipv4_udp, ICE_INSET_NONE, 344 &hint_eth_ipv4_gtpu_ipv4_udp}, 345 {pattern_eth_ipv4_gtpu_ipv4_tcp, ICE_INSET_NONE, 346 &hint_eth_ipv4_gtpu_ipv4_tcp}, 347 {pattern_eth_ipv4_gtpu_ipv6, ICE_INSET_NONE, 348 &hint_eth_ipv4_gtpu_ipv6}, 349 {pattern_eth_ipv4_gtpu_ipv6_udp, ICE_INSET_NONE, 350 &hint_eth_ipv4_gtpu_ipv6_udp}, 351 {pattern_eth_ipv4_gtpu_ipv6_tcp, ICE_INSET_NONE, 352 &hint_eth_ipv4_gtpu_ipv6_tcp}, 353 {pattern_eth_ipv6_gtpu_ipv4, ICE_INSET_NONE, 354 &hint_eth_ipv6_gtpu_ipv4}, 355 {pattern_eth_ipv6_gtpu_ipv4_udp, ICE_INSET_NONE, 356 &hint_eth_ipv6_gtpu_ipv4_udp}, 357 {pattern_eth_ipv6_gtpu_ipv4_tcp, ICE_INSET_NONE, 358 &hint_eth_ipv6_gtpu_ipv4_tcp}, 359 {pattern_eth_ipv6_gtpu_ipv6, ICE_INSET_NONE, 360 &hint_eth_ipv6_gtpu_ipv6}, 361 {pattern_eth_ipv6_gtpu_ipv6_udp, ICE_INSET_NONE, 362 &hint_eth_ipv6_gtpu_ipv6_udp}, 363 {pattern_eth_ipv6_gtpu_ipv6_tcp, ICE_INSET_NONE, 364 &hint_eth_ipv6_gtpu_ipv6_tcp}, 365 {pattern_eth_ipv4_gtpu_eh_ipv4, ICE_INSET_NONE, 366 &hint_eth_ipv4_gtpu_eh_ipv4}, 367 {pattern_eth_ipv4_gtpu_eh_ipv4_udp, ICE_INSET_NONE, 368 &hint_eth_ipv4_gtpu_eh_ipv4_udp}, 369 {pattern_eth_ipv4_gtpu_eh_ipv4_tcp, ICE_INSET_NONE, 370 &hint_eth_ipv4_gtpu_eh_ipv4_tcp}, 371 {pattern_eth_ipv4_gtpu_eh_ipv6, ICE_INSET_NONE, 372 &hint_eth_ipv4_gtpu_eh_ipv6}, 373 {pattern_eth_ipv4_gtpu_eh_ipv6_udp, ICE_INSET_NONE, 374 &hint_eth_ipv4_gtpu_eh_ipv6_udp}, 375 {pattern_eth_ipv4_gtpu_eh_ipv6_tcp, ICE_INSET_NONE, 376 &hint_eth_ipv4_gtpu_eh_ipv6_tcp}, 377 {pattern_eth_ipv6_gtpu_eh_ipv4, ICE_INSET_NONE, 378 &hint_eth_ipv6_gtpu_eh_ipv4}, 379 {pattern_eth_ipv6_gtpu_eh_ipv4_udp, ICE_INSET_NONE, 380 &hint_eth_ipv6_gtpu_eh_ipv4_udp}, 381 {pattern_eth_ipv6_gtpu_eh_ipv4_tcp, ICE_INSET_NONE, 382 &hint_eth_ipv6_gtpu_eh_ipv4_tcp}, 383 {pattern_eth_ipv6_gtpu_eh_ipv6, ICE_INSET_NONE, 384 &hint_eth_ipv6_gtpu_eh_ipv6}, 385 {pattern_eth_ipv6_gtpu_eh_ipv6_udp, ICE_INSET_NONE, 386 &hint_eth_ipv6_gtpu_eh_ipv6_udp}, 387 {pattern_eth_ipv6_gtpu_eh_ipv6_tcp, ICE_INSET_NONE, 388 &hint_eth_ipv6_gtpu_eh_ipv6_tcp}, 389 {pattern_eth_pppoes_ipv4, ICE_INSET_NONE, 390 &hint_eth_pppoes_ipv4}, 391 {pattern_eth_pppoes_ipv4_udp, ICE_INSET_NONE, 392 &hint_eth_pppoes_ipv4_udp}, 393 {pattern_eth_pppoes_ipv4_tcp, ICE_INSET_NONE, 394 &hint_eth_pppoes_ipv4_tcp}, 395 {pattern_eth_ipv4_esp, ICE_INSET_NONE, 396 &hint_eth_ipv4_esp}, 397 {pattern_eth_ipv4_udp_esp, ICE_INSET_NONE, 398 &hint_eth_ipv4_udp_esp}, 399 {pattern_eth_ipv4_ah, ICE_INSET_NONE, 400 &hint_eth_ipv4_ah}, 401 {pattern_eth_ipv4_l2tp, ICE_INSET_NONE, 402 &hint_eth_ipv4_l2tpv3}, 403 {pattern_eth_ipv4_pfcp, ICE_INSET_NONE, 404 &hint_eth_ipv4_pfcp}, 405 {pattern_eth_vlan_ipv4, ICE_INSET_NONE, 406 &hint_eth_vlan_ipv4}, 407 {pattern_eth_vlan_ipv4_udp, ICE_INSET_NONE, 408 &hint_eth_vlan_ipv4_udp}, 409 {pattern_eth_vlan_ipv4_tcp, ICE_INSET_NONE, 410 &hint_eth_vlan_ipv4_tcp}, 411 {pattern_eth_vlan_ipv4_sctp, ICE_INSET_NONE, 412 &hint_eth_vlan_ipv4_sctp}, 413 {pattern_eth_ipv6, ICE_INSET_NONE, 414 &hint_eth_ipv6}, 415 {pattern_eth_ipv6_udp, ICE_INSET_NONE, 416 &hint_eth_ipv6_udp}, 417 {pattern_eth_ipv6_tcp, ICE_INSET_NONE, 418 &hint_eth_ipv6_tcp}, 419 {pattern_eth_ipv6_sctp, ICE_INSET_NONE, 420 &hint_eth_ipv6_sctp}, 421 {pattern_eth_ipv6_esp, ICE_INSET_NONE, 422 &hint_eth_ipv6_esp}, 423 {pattern_eth_ipv6_udp_esp, ICE_INSET_NONE, 424 &hint_eth_ipv6_udp_esp}, 425 {pattern_eth_ipv6_ah, ICE_INSET_NONE, 426 &hint_eth_ipv6_ah}, 427 {pattern_eth_ipv6_l2tp, ICE_INSET_NONE, 428 &hint_eth_ipv6_l2tpv3}, 429 {pattern_eth_ipv6_pfcp, ICE_INSET_NONE, 430 &hint_eth_ipv6_pfcp}, 431 {pattern_eth_vlan_ipv6, ICE_INSET_NONE, 432 &hint_eth_vlan_ipv6}, 433 {pattern_eth_vlan_ipv6_udp, ICE_INSET_NONE, 434 &hint_eth_vlan_ipv6_udp}, 435 {pattern_eth_vlan_ipv6_tcp, ICE_INSET_NONE, 436 &hint_eth_vlan_ipv6_tcp}, 437 {pattern_eth_vlan_ipv6_sctp, ICE_INSET_NONE, 438 &hint_eth_vlan_ipv6_sctp}, 439 {pattern_eth_pppoes_ipv6, ICE_INSET_NONE, 440 &hint_eth_pppoes_ipv6}, 441 {pattern_eth_pppoes_ipv6_udp, ICE_INSET_NONE, 442 &hint_eth_pppoes_ipv6_udp}, 443 {pattern_eth_pppoes_ipv6_tcp, ICE_INSET_NONE, 444 &hint_eth_pppoes_ipv6_tcp}, 445 {pattern_eth_pppoes, ICE_INSET_NONE, 446 &hint_eth_pppoes}, 447 }; 448 449 /** 450 * The first member is input set combination, 451 * the second member is hash fields. 452 */ 453 struct ice_hash_match_type ice_hash_type_list[] = { 454 {ETH_RSS_L2_SRC_ONLY, 455 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA)}, 456 {ETH_RSS_L2_DST_ONLY, 457 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA)}, 458 {ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY, 459 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA)}, 460 {ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY, 461 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA)}, 462 {ETH_RSS_ETH, 463 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA) | 464 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA)}, 465 {ETH_RSS_PPPOE, 466 ICE_FLOW_HASH_PPPOE_SESS_ID}, 467 {ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_L2_SRC_ONLY, 468 ICE_FLOW_HASH_PPPOE_SESS_ID | 469 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA)}, 470 {ETH_RSS_C_VLAN, 471 BIT_ULL(ICE_FLOW_FIELD_IDX_C_VLAN)}, 472 {ETH_RSS_S_VLAN, 473 BIT_ULL(ICE_FLOW_FIELD_IDX_S_VLAN)}, 474 {ETH_RSS_ESP, 475 BIT_ULL(ICE_FLOW_FIELD_IDX_ESP_SPI)}, 476 {ETH_RSS_AH, 477 BIT_ULL(ICE_FLOW_FIELD_IDX_AH_SPI)}, 478 {ETH_RSS_L2TPV3, 479 BIT_ULL(ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID)}, 480 {ETH_RSS_PFCP, 481 BIT_ULL(ICE_FLOW_FIELD_IDX_PFCP_SEID)}, 482 {ETH_RSS_GTPU, 483 BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID)}, 484 /* IPV4 */ 485 {ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY, 486 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)}, 487 {ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY, 488 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)}, 489 {ETH_RSS_IPV4, ICE_FLOW_HASH_IPV4}, 490 {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 491 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | 492 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 493 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 494 {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 495 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | 496 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 497 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 498 {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_SRC_ONLY, 499 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 500 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)}, 501 {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 502 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | 503 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 504 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 505 {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 506 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | 507 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 508 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 509 {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_DST_ONLY, 510 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 511 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)}, 512 {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_SRC_ONLY, 513 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT) | 514 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, 515 {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_DST_ONLY, 516 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT) | 517 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, 518 {ETH_RSS_NONFRAG_IPV4_UDP, 519 ICE_HASH_UDP_IPV4 | 520 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, 521 {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 522 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | 523 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 524 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 525 {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 526 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | 527 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 528 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 529 {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_SRC_ONLY, 530 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 531 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)}, 532 {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 533 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | 534 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 535 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 536 {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 537 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | 538 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 539 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 540 {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_DST_ONLY, 541 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 542 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)}, 543 {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_SRC_ONLY, 544 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT) | 545 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, 546 {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_DST_ONLY, 547 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT) | 548 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, 549 {ETH_RSS_NONFRAG_IPV4_TCP, 550 ICE_HASH_TCP_IPV4 | 551 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, 552 {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 553 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | 554 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 555 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 556 {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 557 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | 558 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 559 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 560 {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_SRC_ONLY, 561 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 562 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)}, 563 {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 564 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | 565 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 566 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 567 {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 568 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | 569 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 570 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 571 {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_DST_ONLY, 572 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | 573 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)}, 574 {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_SRC_ONLY, 575 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT) | 576 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, 577 {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_DST_ONLY, 578 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT) | 579 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, 580 {ETH_RSS_NONFRAG_IPV4_SCTP, 581 ICE_HASH_SCTP_IPV4 | 582 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, 583 /* IPV6 */ 584 {ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY, 585 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)}, 586 {ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY, 587 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)}, 588 {ETH_RSS_IPV6, ICE_FLOW_HASH_IPV6}, 589 {ETH_RSS_IPV6_PRE32 | ETH_RSS_L3_SRC_ONLY, 590 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA)}, 591 {ETH_RSS_IPV6_PRE32 | ETH_RSS_L3_DST_ONLY, 592 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA)}, 593 {ETH_RSS_IPV6_PRE32, ICE_FLOW_HASH_IPV6_PRE32}, 594 {ETH_RSS_IPV6_PRE48 | ETH_RSS_L3_SRC_ONLY, 595 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA)}, 596 {ETH_RSS_IPV6_PRE48 | ETH_RSS_L3_DST_ONLY, 597 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA)}, 598 {ETH_RSS_IPV6_PRE48, ICE_FLOW_HASH_IPV6_PRE48}, 599 {ETH_RSS_IPV6_PRE64 | ETH_RSS_L3_SRC_ONLY, 600 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA)}, 601 {ETH_RSS_IPV6_PRE64 | ETH_RSS_L3_DST_ONLY, 602 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA)}, 603 {ETH_RSS_IPV6_PRE64, ICE_FLOW_HASH_IPV6_PRE64}, 604 {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 605 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | 606 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 607 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 608 {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 609 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | 610 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 611 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 612 {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_SRC_ONLY, 613 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 614 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)}, 615 {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 616 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | 617 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 618 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 619 {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 620 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | 621 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 622 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 623 {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_DST_ONLY, 624 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 625 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)}, 626 {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_SRC_ONLY, 627 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT) | 628 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, 629 {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_DST_ONLY, 630 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT) | 631 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, 632 {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_PFCP, 633 BIT_ULL(ICE_FLOW_FIELD_IDX_PFCP_SEID)}, 634 {ETH_RSS_NONFRAG_IPV6_UDP, 635 ICE_HASH_UDP_IPV6 | 636 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, 637 {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 638 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) | 639 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 640 {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 641 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) | 642 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 643 {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L3_SRC_ONLY, 644 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 645 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA)}, 646 {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 647 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA) | 648 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 649 {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 650 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA) | 651 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 652 {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L3_DST_ONLY, 653 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 654 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA)}, 655 {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L4_SRC_ONLY, 656 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 657 {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L4_DST_ONLY, 658 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 659 {ETH_RSS_IPV6_PRE32_UDP, ICE_HASH_UDP_IPV6_PRE32}, 660 {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 661 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) | 662 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 663 {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 664 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) | 665 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 666 {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L3_SRC_ONLY, 667 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 668 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA)}, 669 {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 670 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA) | 671 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 672 {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 673 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA) | 674 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 675 {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L3_DST_ONLY, 676 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 677 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA)}, 678 {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L4_SRC_ONLY, 679 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 680 {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L4_DST_ONLY, 681 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 682 {ETH_RSS_IPV6_PRE48_UDP, ICE_HASH_UDP_IPV6_PRE48}, 683 {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 684 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) | 685 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 686 {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 687 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) | 688 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 689 {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L3_SRC_ONLY, 690 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 691 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA)}, 692 {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 693 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA) | 694 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 695 {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 696 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA) | 697 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 698 {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L3_DST_ONLY, 699 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 700 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA)}, 701 {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L4_SRC_ONLY, 702 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, 703 {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L4_DST_ONLY, 704 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, 705 {ETH_RSS_IPV6_PRE64_UDP, ICE_HASH_UDP_IPV6_PRE64}, 706 {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 707 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | 708 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 709 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 710 {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 711 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | 712 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 713 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 714 {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_SRC_ONLY, 715 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 716 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)}, 717 {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 718 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | 719 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 720 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 721 {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 722 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | 723 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 724 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 725 {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_DST_ONLY, 726 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 727 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)}, 728 {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_SRC_ONLY, 729 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT) | 730 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, 731 {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_DST_ONLY, 732 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT) | 733 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, 734 {ETH_RSS_NONFRAG_IPV6_TCP, 735 ICE_HASH_TCP_IPV6 | 736 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, 737 {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 738 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) | 739 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 740 {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 741 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) | 742 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 743 {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L3_SRC_ONLY, 744 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 745 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA)}, 746 {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 747 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA) | 748 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 749 {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 750 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA) | 751 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 752 {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L3_DST_ONLY, 753 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 754 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA)}, 755 {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L4_SRC_ONLY, 756 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 757 {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L4_DST_ONLY, 758 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 759 {ETH_RSS_IPV6_PRE32_TCP, ICE_HASH_TCP_IPV6_PRE32}, 760 {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 761 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) | 762 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 763 {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 764 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) | 765 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 766 {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L3_SRC_ONLY, 767 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 768 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA)}, 769 {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 770 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA) | 771 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 772 {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 773 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA) | 774 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 775 {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L3_DST_ONLY, 776 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 777 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA)}, 778 {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L4_SRC_ONLY, 779 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 780 {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L4_DST_ONLY, 781 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 782 {ETH_RSS_IPV6_PRE48_TCP, ICE_HASH_TCP_IPV6_PRE48}, 783 {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 784 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) | 785 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 786 {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 787 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) | 788 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 789 {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L3_SRC_ONLY, 790 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 791 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA)}, 792 {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 793 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA) | 794 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 795 {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 796 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA) | 797 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 798 {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L3_DST_ONLY, 799 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 800 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA)}, 801 {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L4_SRC_ONLY, 802 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, 803 {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L4_DST_ONLY, 804 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, 805 {ETH_RSS_IPV6_PRE64_TCP, ICE_HASH_TCP_IPV6_PRE64}, 806 {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 807 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | 808 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 809 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 810 {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 811 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | 812 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 813 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 814 {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_SRC_ONLY, 815 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 816 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)}, 817 {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 818 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | 819 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 820 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 821 {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 822 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | 823 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 824 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 825 {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY, 826 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 827 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)}, 828 {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_SRC_ONLY, 829 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT) | 830 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, 831 {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_DST_ONLY, 832 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT) | 833 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, 834 {ETH_RSS_NONFRAG_IPV6_SCTP, 835 ICE_HASH_SCTP_IPV6 | 836 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, 837 {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 838 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) | 839 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 840 {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 841 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) | 842 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 843 {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L3_SRC_ONLY, 844 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 845 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA)}, 846 {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 847 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA) | 848 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 849 {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 850 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA) | 851 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 852 {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L3_DST_ONLY, 853 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 854 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA)}, 855 {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L4_SRC_ONLY, 856 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 857 {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L4_DST_ONLY, 858 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 859 {ETH_RSS_IPV6_PRE32_SCTP, ICE_HASH_SCTP_IPV6_PRE32}, 860 {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 861 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) | 862 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 863 {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 864 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) | 865 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 866 {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L3_SRC_ONLY, 867 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 868 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA)}, 869 {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 870 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA) | 871 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 872 {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 873 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA) | 874 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 875 {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L3_DST_ONLY, 876 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 877 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA)}, 878 {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L4_SRC_ONLY, 879 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 880 {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L4_DST_ONLY, 881 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 882 {ETH_RSS_IPV6_PRE48_SCTP, ICE_HASH_SCTP_IPV6_PRE48}, 883 {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY, 884 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) | 885 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 886 {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY, 887 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) | 888 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 889 {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L3_SRC_ONLY, 890 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 891 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA)}, 892 {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY, 893 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA) | 894 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 895 {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY, 896 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA) | 897 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 898 {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L3_DST_ONLY, 899 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | 900 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA)}, 901 {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L4_SRC_ONLY, 902 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, 903 {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L4_DST_ONLY, 904 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, 905 {ETH_RSS_IPV6_PRE64_SCTP, ICE_HASH_SCTP_IPV6_PRE64}, 906 }; 907 908 static struct ice_flow_engine ice_hash_engine = { 909 .init = ice_hash_init, 910 .create = ice_hash_create, 911 .destroy = ice_hash_destroy, 912 .uninit = ice_hash_uninit, 913 .free = ice_hash_free, 914 .type = ICE_FLOW_ENGINE_HASH, 915 }; 916 917 /* Register parser for os package. */ 918 static struct ice_flow_parser ice_hash_parser_os = { 919 .engine = &ice_hash_engine, 920 .array = ice_hash_pattern_list_os, 921 .array_len = RTE_DIM(ice_hash_pattern_list_os), 922 .parse_pattern_action = ice_hash_parse_pattern_action, 923 .stage = ICE_FLOW_STAGE_RSS, 924 }; 925 926 /* Register parser for comms package. */ 927 static struct ice_flow_parser ice_hash_parser_comms = { 928 .engine = &ice_hash_engine, 929 .array = ice_hash_pattern_list_comms, 930 .array_len = RTE_DIM(ice_hash_pattern_list_comms), 931 .parse_pattern_action = ice_hash_parse_pattern_action, 932 .stage = ICE_FLOW_STAGE_RSS, 933 }; 934 935 RTE_INIT(ice_hash_engine_init) 936 { 937 struct ice_flow_engine *engine = &ice_hash_engine; 938 ice_register_flow_engine(engine); 939 } 940 941 static int 942 ice_hash_init(struct ice_adapter *ad) 943 { 944 struct ice_flow_parser *parser = NULL; 945 946 if (ad->hw.dcf_enabled) 947 return 0; 948 949 if (ad->active_pkg_type == ICE_PKG_TYPE_OS_DEFAULT) 950 parser = &ice_hash_parser_os; 951 else if (ad->active_pkg_type == ICE_PKG_TYPE_COMMS) 952 parser = &ice_hash_parser_comms; 953 else 954 return -EINVAL; 955 956 return ice_register_parser(parser, ad); 957 } 958 959 static int 960 ice_hash_parse_pattern(struct ice_pattern_match_item *pattern_match_item, 961 const struct rte_flow_item pattern[], void **meta, 962 struct rte_flow_error *error) 963 { 964 uint32_t hdr_mask = ((struct rss_type_match_hdr *) 965 (pattern_match_item->meta))->hdr_mask; 966 const struct rte_flow_item *item = pattern; 967 const struct rte_flow_item_gtp_psc *psc; 968 uint32_t hdrs = 0; 969 970 for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) { 971 if (item->last) { 972 rte_flow_error_set(error, EINVAL, 973 RTE_FLOW_ERROR_TYPE_ITEM, item, 974 "Not support range"); 975 return -rte_errno; 976 } 977 978 switch (item->type) { 979 case RTE_FLOW_ITEM_TYPE_GTPU: 980 hdrs |= ICE_FLOW_SEG_HDR_GTPU_IP; 981 break; 982 case RTE_FLOW_ITEM_TYPE_GTP_PSC: 983 psc = item->spec; 984 hdr_mask &= ~ICE_FLOW_SEG_HDR_GTPU_EH; 985 hdrs &= ~ICE_FLOW_SEG_HDR_GTPU_IP; 986 if (!psc) 987 hdrs |= ICE_FLOW_SEG_HDR_GTPU_EH; 988 else if (psc->pdu_type == ICE_GTPU_EH_UPLINK) 989 hdrs |= ICE_FLOW_SEG_HDR_GTPU_UP; 990 else if (psc->pdu_type == ICE_GTPU_EH_DWNLINK) 991 hdrs |= ICE_FLOW_SEG_HDR_GTPU_DWN; 992 break; 993 default: 994 break; 995 } 996 } 997 998 /* Save protocol header to rss_meta. */ 999 ((struct rss_meta *)*meta)->pkt_hdr |= hdr_mask | hdrs; 1000 1001 return 0; 1002 } 1003 1004 static int 1005 ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item, 1006 const struct rte_flow_action actions[], 1007 void **meta, 1008 struct rte_flow_error *error) 1009 { 1010 struct rss_type_match_hdr *m = (struct rss_type_match_hdr *) 1011 (pattern_match_item->meta); 1012 struct rss_meta *hash_meta = (struct rss_meta *)*meta; 1013 uint32_t type_list_len = RTE_DIM(ice_hash_type_list); 1014 enum rte_flow_action_type action_type; 1015 const struct rte_flow_action_rss *rss; 1016 const struct rte_flow_action *action; 1017 bool hash_map_found = false; 1018 uint64_t rss_attr_src_dst; 1019 uint64_t rss_attr_l3_pre; 1020 uint64_t rss_attr_symm; 1021 uint64_t rss_attr_all; 1022 uint64_t rss_type; 1023 uint16_t i; 1024 1025 /* Supported action is RSS. */ 1026 for (action = actions; action->type != 1027 RTE_FLOW_ACTION_TYPE_END; action++) { 1028 action_type = action->type; 1029 switch (action_type) { 1030 case RTE_FLOW_ACTION_TYPE_RSS: 1031 rss = action->conf; 1032 rss_type = rss->types; 1033 1034 /* Check hash function and save it to rss_meta. */ 1035 if (pattern_match_item->pattern_list != 1036 pattern_empty && rss->func == 1037 RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) { 1038 return rte_flow_error_set(error, ENOTSUP, 1039 RTE_FLOW_ERROR_TYPE_ACTION, action, 1040 "Not supported flow"); 1041 } else if (rss->func == 1042 RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){ 1043 ((struct rss_meta *)*meta)->hash_function = 1044 RTE_ETH_HASH_FUNCTION_SIMPLE_XOR; 1045 return 0; 1046 } else if (rss->func == 1047 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) { 1048 ((struct rss_meta *)*meta)->hash_function = 1049 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ; 1050 } 1051 1052 if (rss->level) 1053 return rte_flow_error_set(error, ENOTSUP, 1054 RTE_FLOW_ERROR_TYPE_ACTION, action, 1055 "a nonzero RSS encapsulation level is not supported"); 1056 1057 if (rss->key_len) 1058 return rte_flow_error_set(error, ENOTSUP, 1059 RTE_FLOW_ERROR_TYPE_ACTION, action, 1060 "a nonzero RSS key_len is not supported"); 1061 1062 if (rss->queue) 1063 return rte_flow_error_set(error, ENOTSUP, 1064 RTE_FLOW_ERROR_TYPE_ACTION, action, 1065 "a non-NULL RSS queue is not supported"); 1066 1067 /** 1068 * Check simultaneous use of SRC_ONLY and DST_ONLY 1069 * of the same level. 1070 */ 1071 rss_type = rte_eth_rss_hf_refine(rss_type); 1072 1073 rss_attr_src_dst = ETH_RSS_L2_SRC_ONLY | 1074 ETH_RSS_L2_DST_ONLY | 1075 ETH_RSS_L3_SRC_ONLY | 1076 ETH_RSS_L3_DST_ONLY | 1077 ETH_RSS_L4_SRC_ONLY | 1078 ETH_RSS_L4_DST_ONLY; 1079 1080 rss_attr_l3_pre = RTE_ETH_RSS_L3_PRE32 | 1081 RTE_ETH_RSS_L3_PRE48 | 1082 RTE_ETH_RSS_L3_PRE64; 1083 1084 rss_attr_symm = ETH_RSS_IPV4 | 1085 ETH_RSS_NONFRAG_IPV4_UDP | 1086 ETH_RSS_NONFRAG_IPV4_TCP | 1087 ETH_RSS_NONFRAG_IPV4_SCTP | 1088 ETH_RSS_IPV6 | 1089 ETH_RSS_NONFRAG_IPV6_UDP | 1090 ETH_RSS_NONFRAG_IPV6_TCP | 1091 ETH_RSS_NONFRAG_IPV6_SCTP; 1092 1093 rss_attr_all = rss_attr_src_dst | rss_attr_l3_pre; 1094 1095 /* Check if only SRC/DST_ONLY or ipv6 prefix exists. */ 1096 if ((rss_type & ~rss_attr_all) == 0) 1097 return rte_flow_error_set(error, ENOTSUP, 1098 RTE_FLOW_ERROR_TYPE_ACTION, action, 1099 "invalid rss types"); 1100 1101 /** 1102 * Check if SRC/DST_ONLY is set for SYMMETRIC_TOEPLITZ 1103 * hash function. 1104 */ 1105 if (rss->func == 1106 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) { 1107 if (rss_type & (rss_attr_src_dst | 1108 ~rss_attr_symm)) 1109 return rte_flow_error_set(error, 1110 ENOTSUP, 1111 RTE_FLOW_ERROR_TYPE_ACTION, 1112 action, 1113 "invalid rss types"); 1114 } 1115 1116 /* Check if rss types match pattern. */ 1117 if (rss_type & ~rss_attr_all & ~m->eth_rss_hint) { 1118 return rte_flow_error_set(error, 1119 ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, 1120 action, "Not supported RSS types"); 1121 } 1122 1123 /* Find matched hash fields according to hash type. */ 1124 for (i = 0; i < type_list_len; i++) { 1125 struct ice_hash_match_type *ht_map = 1126 &ice_hash_type_list[i]; 1127 1128 if (rss_type == ht_map->hash_type) { 1129 hash_meta->hash_flds = 1130 ht_map->hash_flds; 1131 hash_map_found = true; 1132 break; 1133 } 1134 } 1135 1136 if (pattern_match_item->pattern_list != 1137 pattern_empty && !hash_map_found) { 1138 return rte_flow_error_set(error, ENOTSUP, 1139 RTE_FLOW_ERROR_TYPE_ACTION, action, 1140 "Not supported flow"); 1141 } 1142 1143 /* update hash field for nat-t esp. */ 1144 if (rss_type & ETH_RSS_ESP && 1145 (m->eth_rss_hint & ETH_RSS_NONFRAG_IPV4_UDP || 1146 m->eth_rss_hint & ETH_RSS_NONFRAG_IPV6_UDP)) { 1147 hash_meta->hash_flds &= 1148 ~(BIT_ULL(ICE_FLOW_FIELD_IDX_ESP_SPI)); 1149 hash_meta->hash_flds |= 1150 BIT_ULL(ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI); 1151 } 1152 1153 /* update hash field for gtpu eh/gtpu dwn/gtpu up. */ 1154 if (!(rss_type & ETH_RSS_GTPU)) { 1155 break; 1156 } else if (hash_meta->pkt_hdr & 1157 ICE_FLOW_SEG_HDR_GTPU_EH) { 1158 hash_meta->hash_flds &= 1159 ~(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID)); 1160 hash_meta->hash_flds |= 1161 BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_TEID); 1162 } else if (hash_meta->pkt_hdr & 1163 ICE_FLOW_SEG_HDR_GTPU_DWN) { 1164 hash_meta->hash_flds &= 1165 ~(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID)); 1166 hash_meta->hash_flds |= 1167 BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID); 1168 } else if (hash_meta->pkt_hdr & 1169 ICE_FLOW_SEG_HDR_GTPU_UP) { 1170 hash_meta->hash_flds &= 1171 ~(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID)); 1172 hash_meta->hash_flds |= 1173 BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_UP_TEID); 1174 } 1175 1176 break; 1177 1178 case RTE_FLOW_ACTION_TYPE_END: 1179 break; 1180 1181 default: 1182 rte_flow_error_set(error, EINVAL, 1183 RTE_FLOW_ERROR_TYPE_ACTION, action, 1184 "Invalid action."); 1185 return -rte_errno; 1186 } 1187 } 1188 1189 return 0; 1190 } 1191 1192 static int 1193 ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad, 1194 struct ice_pattern_match_item *array, 1195 uint32_t array_len, 1196 const struct rte_flow_item pattern[], 1197 const struct rte_flow_action actions[], 1198 void **meta, 1199 struct rte_flow_error *error) 1200 { 1201 int ret = 0; 1202 struct ice_pattern_match_item *pattern_match_item; 1203 struct rss_meta *rss_meta_ptr; 1204 1205 rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0); 1206 if (!rss_meta_ptr) { 1207 rte_flow_error_set(error, EINVAL, 1208 RTE_FLOW_ERROR_TYPE_HANDLE, NULL, 1209 "No memory for rss_meta_ptr"); 1210 return -ENOMEM; 1211 } 1212 1213 /* Check rss supported pattern and find matched pattern. */ 1214 pattern_match_item = ice_search_pattern_match_item(pattern, 1215 array, array_len, error); 1216 if (!pattern_match_item) { 1217 ret = -rte_errno; 1218 goto error; 1219 } 1220 1221 ret = ice_hash_parse_pattern(pattern_match_item, pattern, 1222 (void **)&rss_meta_ptr, error); 1223 if (ret) 1224 goto error; 1225 1226 /* Check rss action. */ 1227 ret = ice_hash_parse_action(pattern_match_item, actions, 1228 (void **)&rss_meta_ptr, error); 1229 1230 error: 1231 if (!ret && meta) 1232 *meta = rss_meta_ptr; 1233 else 1234 rte_free(rss_meta_ptr); 1235 rte_free(pattern_match_item); 1236 1237 return ret; 1238 } 1239 1240 static int 1241 ice_hash_create(struct ice_adapter *ad, 1242 struct rte_flow *flow, 1243 void *meta, 1244 struct rte_flow_error *error) 1245 { 1246 struct ice_pf *pf = &ad->pf; 1247 struct ice_hw *hw = ICE_PF_TO_HW(pf); 1248 struct ice_vsi *vsi = pf->main_vsi; 1249 int ret; 1250 uint32_t reg; 1251 struct ice_hash_flow_cfg *filter_ptr; 1252 1253 uint32_t headermask = ((struct rss_meta *)meta)->pkt_hdr; 1254 uint64_t hash_field = ((struct rss_meta *)meta)->hash_flds; 1255 uint8_t hash_function = ((struct rss_meta *)meta)->hash_function; 1256 1257 filter_ptr = rte_zmalloc("ice_rss_filter", 1258 sizeof(struct ice_hash_flow_cfg), 0); 1259 if (!filter_ptr) { 1260 rte_flow_error_set(error, EINVAL, 1261 RTE_FLOW_ERROR_TYPE_HANDLE, NULL, 1262 "No memory for filter_ptr"); 1263 return -ENOMEM; 1264 } 1265 1266 if (hash_function == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) { 1267 /* Enable registers for simple_xor hash function. */ 1268 reg = ICE_READ_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id)); 1269 reg = (reg & (~VSIQF_HASH_CTL_HASH_SCHEME_M)) | 1270 (2 << VSIQF_HASH_CTL_HASH_SCHEME_S); 1271 ICE_WRITE_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id), reg); 1272 1273 filter_ptr->simple_xor = 1; 1274 1275 goto out; 1276 } else { 1277 filter_ptr->rss_cfg.packet_hdr = headermask; 1278 filter_ptr->rss_cfg.hashed_flds = hash_field; 1279 filter_ptr->rss_cfg.symm = 1280 (hash_function == 1281 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ); 1282 1283 ret = ice_add_rss_cfg_wrap(pf, vsi->idx, 1284 filter_ptr->rss_cfg.hashed_flds, 1285 filter_ptr->rss_cfg.packet_hdr, 1286 filter_ptr->rss_cfg.symm); 1287 if (ret) { 1288 rte_flow_error_set(error, EINVAL, 1289 RTE_FLOW_ERROR_TYPE_HANDLE, NULL, 1290 "rss flow create fail"); 1291 goto error; 1292 } 1293 } 1294 1295 out: 1296 flow->rule = filter_ptr; 1297 rte_free(meta); 1298 return 0; 1299 1300 error: 1301 rte_free(filter_ptr); 1302 rte_free(meta); 1303 return -rte_errno; 1304 } 1305 1306 static int 1307 ice_hash_destroy(struct ice_adapter *ad, 1308 struct rte_flow *flow, 1309 struct rte_flow_error *error) 1310 { 1311 struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(ad); 1312 struct ice_hw *hw = ICE_PF_TO_HW(pf); 1313 struct ice_vsi *vsi = pf->main_vsi; 1314 int ret; 1315 uint32_t reg; 1316 struct ice_hash_flow_cfg *filter_ptr; 1317 1318 filter_ptr = (struct ice_hash_flow_cfg *)flow->rule; 1319 1320 if (filter_ptr->simple_xor == 1) { 1321 /* Return to symmetric_toeplitz state. */ 1322 reg = ICE_READ_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id)); 1323 reg = (reg & (~VSIQF_HASH_CTL_HASH_SCHEME_M)) | 1324 (1 << VSIQF_HASH_CTL_HASH_SCHEME_S); 1325 ICE_WRITE_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id), reg); 1326 } else { 1327 ret = ice_rem_rss_cfg_wrap(pf, vsi->idx, 1328 filter_ptr->rss_cfg.hashed_flds, 1329 filter_ptr->rss_cfg.packet_hdr); 1330 /* Fixme: Ignore the error if a rule does not exist. 1331 * Currently a rule for inputset change or symm turn on/off 1332 * will overwrite an exist rule, while application still 1333 * have 2 rte_flow handles. 1334 **/ 1335 if (ret && ret != ICE_ERR_DOES_NOT_EXIST) { 1336 rte_flow_error_set(error, EINVAL, 1337 RTE_FLOW_ERROR_TYPE_HANDLE, NULL, 1338 "rss flow destroy fail"); 1339 goto error; 1340 } 1341 } 1342 1343 rte_free(filter_ptr); 1344 return 0; 1345 1346 error: 1347 rte_free(filter_ptr); 1348 return -rte_errno; 1349 } 1350 1351 static void 1352 ice_hash_uninit(struct ice_adapter *ad) 1353 { 1354 if (ad->hw.dcf_enabled) 1355 return; 1356 1357 if (ad->active_pkg_type == ICE_PKG_TYPE_OS_DEFAULT) 1358 ice_unregister_parser(&ice_hash_parser_os, ad); 1359 else if (ad->active_pkg_type == ICE_PKG_TYPE_COMMS) 1360 ice_unregister_parser(&ice_hash_parser_comms, ad); 1361 } 1362 1363 static void 1364 ice_hash_free(struct rte_flow *flow) 1365 { 1366 rte_free(flow->rule); 1367 } 1368