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