xref: /linux/drivers/net/ethernet/intel/ice/ice_flow.h (revision 8f7aa3d3c7323f4ca2768a9e74ebbe359c4f8f88)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) 2019, Intel Corporation. */
3 
4 #ifndef _ICE_FLOW_H_
5 #define _ICE_FLOW_H_
6 
7 #include <linux/net/intel/libie/pctype.h>
8 
9 #include "ice_flex_type.h"
10 #include "ice_parser.h"
11 
12 #define ICE_FLOW_ENTRY_HANDLE_INVAL	0
13 #define ICE_FLOW_FLD_OFF_INVAL		0xffff
14 
15 /* Generate flow hash field from flow field type(s) */
16 #define ICE_FLOW_HASH_ETH	\
17 	(BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA) | \
18 	 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA))
19 #define ICE_FLOW_HASH_IPV4	\
20 	(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | \
21 	 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA))
22 #define ICE_FLOW_HASH_IPV6	\
23 	(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | \
24 	 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA))
25 #define ICE_FLOW_HASH_IPV6_PRE32	\
26 	(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) | \
27 	 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA))
28 #define ICE_FLOW_HASH_IPV6_PRE48	\
29 	(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) | \
30 	 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA))
31 #define ICE_FLOW_HASH_IPV6_PRE64	\
32 	(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) | \
33 	 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA))
34 #define ICE_FLOW_HASH_TCP_PORT	\
35 	(BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT) | \
36 	 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT))
37 #define ICE_FLOW_HASH_UDP_PORT	\
38 	(BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT) | \
39 	 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT))
40 #define ICE_FLOW_HASH_SCTP_PORT	\
41 	(BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT) | \
42 	 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT))
43 
44 #define ICE_HASH_INVALID	0
45 #define ICE_HASH_TCP_IPV4	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_TCP_PORT)
46 #define ICE_HASH_TCP_IPV6	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_TCP_PORT)
47 #define ICE_HASH_UDP_IPV4	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_UDP_PORT)
48 #define ICE_HASH_UDP_IPV6	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_UDP_PORT)
49 #define ICE_HASH_SCTP_IPV4	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_SCTP_PORT)
50 #define ICE_HASH_SCTP_IPV6	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_SCTP_PORT)
51 
52 #define ICE_HASH_TCP_IPV6_PRE32	 \
53 	(ICE_FLOW_HASH_IPV6_PRE32 | ICE_FLOW_HASH_TCP_PORT)
54 #define ICE_HASH_UDP_IPV6_PRE32	 \
55 	(ICE_FLOW_HASH_IPV6_PRE32 | ICE_FLOW_HASH_UDP_PORT)
56 #define ICE_HASH_SCTP_IPV6_PRE32 \
57 	(ICE_FLOW_HASH_IPV6_PRE32 | ICE_FLOW_HASH_SCTP_PORT)
58 #define ICE_HASH_TCP_IPV6_PRE48	 \
59 	(ICE_FLOW_HASH_IPV6_PRE48 | ICE_FLOW_HASH_TCP_PORT)
60 #define ICE_HASH_UDP_IPV6_PRE48	 \
61 	(ICE_FLOW_HASH_IPV6_PRE48 | ICE_FLOW_HASH_UDP_PORT)
62 #define ICE_HASH_SCTP_IPV6_PRE48 \
63 	(ICE_FLOW_HASH_IPV6_PRE48 | ICE_FLOW_HASH_SCTP_PORT)
64 #define ICE_HASH_TCP_IPV6_PRE64	 \
65 	(ICE_FLOW_HASH_IPV6_PRE64 | ICE_FLOW_HASH_TCP_PORT)
66 #define ICE_HASH_UDP_IPV6_PRE64	 \
67 	(ICE_FLOW_HASH_IPV6_PRE64 | ICE_FLOW_HASH_UDP_PORT)
68 #define ICE_HASH_SCTP_IPV6_PRE64 \
69 	(ICE_FLOW_HASH_IPV6_PRE64 | ICE_FLOW_HASH_SCTP_PORT)
70 
71 #define ICE_FLOW_HASH_GTP_TEID \
72 	(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_TEID))
73 
74 #define ICE_FLOW_HASH_GTP_IPV4_TEID \
75 	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_TEID)
76 #define ICE_FLOW_HASH_GTP_IPV6_TEID \
77 	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_TEID)
78 
79 #define ICE_FLOW_HASH_GTP_C_TEID \
80 	(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_TEID))
81 
82 #define ICE_FLOW_HASH_GTP_C_IPV4_TEID \
83 	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_C_TEID)
84 #define ICE_FLOW_HASH_GTP_C_IPV6_TEID \
85 	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_C_TEID)
86 
87 #define ICE_FLOW_HASH_GTP_U_TEID \
88 	(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID))
89 
90 #define ICE_FLOW_HASH_GTP_U_IPV4_TEID \
91 	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_U_TEID)
92 #define ICE_FLOW_HASH_GTP_U_IPV6_TEID \
93 	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_TEID)
94 
95 #define ICE_FLOW_HASH_GTP_U_EH_TEID \
96 	(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_TEID))
97 
98 #define ICE_FLOW_HASH_GTP_U_EH_QFI \
99 	(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_QFI))
100 
101 #define ICE_FLOW_HASH_GTP_U_IPV4_EH \
102 	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_U_EH_TEID | \
103 	 ICE_FLOW_HASH_GTP_U_EH_QFI)
104 #define ICE_FLOW_HASH_GTP_U_IPV6_EH \
105 	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_EH_TEID | \
106 	 ICE_FLOW_HASH_GTP_U_EH_QFI)
107 
108 #define ICE_FLOW_HASH_GTP_U_UP \
109 	(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_UP_TEID))
110 #define ICE_FLOW_HASH_GTP_U_DWN \
111 	(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID))
112 
113 #define ICE_FLOW_HASH_GTP_U_IPV4_UP \
114 	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_U_UP)
115 #define ICE_FLOW_HASH_GTP_U_IPV6_UP \
116 	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_UP)
117 #define ICE_FLOW_HASH_GTP_U_IPV4_DWN \
118 	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_U_DWN)
119 #define ICE_FLOW_HASH_GTP_U_IPV6_DWN \
120 	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_DWN)
121 
122 #define ICE_FLOW_HASH_PPPOE_SESS_ID \
123 	(BIT_ULL(ICE_FLOW_FIELD_IDX_PPPOE_SESS_ID))
124 
125 #define ICE_FLOW_HASH_PPPOE_SESS_ID_ETH \
126 	(ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_PPPOE_SESS_ID)
127 #define ICE_FLOW_HASH_PPPOE_TCP_ID \
128 	(ICE_FLOW_HASH_TCP_PORT | ICE_FLOW_HASH_PPPOE_SESS_ID)
129 #define ICE_FLOW_HASH_PPPOE_UDP_ID \
130 	(ICE_FLOW_HASH_UDP_PORT | ICE_FLOW_HASH_PPPOE_SESS_ID)
131 
132 #define ICE_FLOW_HASH_PFCP_SEID \
133 	(BIT_ULL(ICE_FLOW_FIELD_IDX_PFCP_SEID))
134 #define ICE_FLOW_HASH_PFCP_IPV4_SEID \
135 	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_PFCP_SEID)
136 #define ICE_FLOW_HASH_PFCP_IPV6_SEID \
137 	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_PFCP_SEID)
138 
139 #define ICE_FLOW_HASH_L2TPV3_SESS_ID \
140 	(BIT_ULL(ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID))
141 #define ICE_FLOW_HASH_L2TPV3_IPV4_SESS_ID \
142 	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_L2TPV3_SESS_ID)
143 #define ICE_FLOW_HASH_L2TPV3_IPV6_SESS_ID \
144 	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_L2TPV3_SESS_ID)
145 
146 #define ICE_FLOW_HASH_ESP_SPI \
147 	(BIT_ULL(ICE_FLOW_FIELD_IDX_ESP_SPI))
148 #define ICE_FLOW_HASH_ESP_IPV4_SPI \
149 	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_ESP_SPI)
150 #define ICE_FLOW_HASH_ESP_IPV6_SPI \
151 	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_ESP_SPI)
152 
153 #define ICE_FLOW_HASH_AH_SPI \
154 	(BIT_ULL(ICE_FLOW_FIELD_IDX_AH_SPI))
155 #define ICE_FLOW_HASH_AH_IPV4_SPI \
156 	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_AH_SPI)
157 #define ICE_FLOW_HASH_AH_IPV6_SPI \
158 	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_AH_SPI)
159 
160 #define ICE_FLOW_HASH_NAT_T_ESP_SPI \
161 	(BIT_ULL(ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI))
162 #define ICE_FLOW_HASH_NAT_T_ESP_IPV4_SPI \
163 	(ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_NAT_T_ESP_SPI)
164 #define ICE_FLOW_HASH_NAT_T_ESP_IPV6_SPI \
165 	(ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_NAT_T_ESP_SPI)
166 
167 #define ICE_FLOW_HASH_L2TPV2_SESS_ID \
168 	(BIT_ULL(ICE_FLOW_FIELD_IDX_L2TPV2_SESS_ID))
169 #define ICE_FLOW_HASH_L2TPV2_SESS_ID_ETH \
170 	(ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_L2TPV2_SESS_ID)
171 
172 #define ICE_FLOW_HASH_L2TPV2_LEN_SESS_ID \
173 	(BIT_ULL(ICE_FLOW_FIELD_IDX_L2TPV2_LEN_SESS_ID))
174 #define ICE_FLOW_HASH_L2TPV2_LEN_SESS_ID_ETH \
175 	(ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_L2TPV2_LEN_SESS_ID)
176 
177 #define ICE_FLOW_FIELD_IPV4_SRC_OFFSET 12
178 #define ICE_FLOW_FIELD_IPV4_DST_OFFSET 16
179 #define ICE_FLOW_FIELD_IPV6_SRC_OFFSET 8
180 #define ICE_FLOW_FIELD_IPV6_DST_OFFSET 24
181 #define ICE_FLOW_FIELD_SRC_PORT_OFFSET 0
182 #define ICE_FLOW_FIELD_DST_PORT_OFFSET 2
183 
184 /* Protocol header fields within a packet segment. A segment consists of one or
185  * more protocol headers that make up a logical group of protocol headers. Each
186  * logical group of protocol headers encapsulates or is encapsulated using/by
187  * tunneling or encapsulation protocols for network virtualization such as GRE,
188  * VxLAN, etc.
189  */
190 enum ice_flow_seg_hdr {
191 	ICE_FLOW_SEG_HDR_NONE		= 0x00000000,
192 	ICE_FLOW_SEG_HDR_ETH		= 0x00000001,
193 	ICE_FLOW_SEG_HDR_VLAN		= 0x00000002,
194 	ICE_FLOW_SEG_HDR_IPV4		= 0x00000004,
195 	ICE_FLOW_SEG_HDR_IPV6		= 0x00000008,
196 	ICE_FLOW_SEG_HDR_ARP		= 0x00000010,
197 	ICE_FLOW_SEG_HDR_ICMP		= 0x00000020,
198 	ICE_FLOW_SEG_HDR_TCP		= 0x00000040,
199 	ICE_FLOW_SEG_HDR_UDP		= 0x00000080,
200 	ICE_FLOW_SEG_HDR_SCTP		= 0x00000100,
201 	ICE_FLOW_SEG_HDR_GRE		= 0x00000200,
202 	ICE_FLOW_SEG_HDR_GTPC		= 0x00000400,
203 	ICE_FLOW_SEG_HDR_GTPC_TEID	= 0x00000800,
204 	ICE_FLOW_SEG_HDR_GTPU_IP	= 0x00001000,
205 	ICE_FLOW_SEG_HDR_GTPU_EH	= 0x00002000,
206 	ICE_FLOW_SEG_HDR_GTPU_DWN	= 0x00004000,
207 	ICE_FLOW_SEG_HDR_GTPU_UP	= 0x00008000,
208 	ICE_FLOW_SEG_HDR_PPPOE		= 0x00010000,
209 	ICE_FLOW_SEG_HDR_PFCP_NODE	= 0x00020000,
210 	ICE_FLOW_SEG_HDR_PFCP_SESSION	= 0x00040000,
211 	ICE_FLOW_SEG_HDR_L2TPV3		= 0x00080000,
212 	ICE_FLOW_SEG_HDR_ESP		= 0x00100000,
213 	ICE_FLOW_SEG_HDR_AH		= 0x00200000,
214 	ICE_FLOW_SEG_HDR_NAT_T_ESP	= 0x00400000,
215 	ICE_FLOW_SEG_HDR_ETH_NON_IP	= 0x00800000,
216 	ICE_FLOW_SEG_HDR_GTPU_NON_IP	= 0x01000000,
217 	ICE_FLOW_SEG_HDR_L2TPV2		= 0x10000000,
218 	/* The following is an additive bit for ICE_FLOW_SEG_HDR_IPV4 and
219 	 * ICE_FLOW_SEG_HDR_IPV6.
220 	 */
221 	ICE_FLOW_SEG_HDR_IPV_FRAG	= 0x40000000,
222 	ICE_FLOW_SEG_HDR_IPV_OTHER	= 0x80000000,
223 };
224 
225 /* These segments all have the same PTYPES, but are otherwise distinguished by
226  * the value of the gtp_eh_pdu and gtp_eh_pdu_link flags:
227  *
228  *                                gtp_eh_pdu     gtp_eh_pdu_link
229  * ICE_FLOW_SEG_HDR_GTPU_IP           0              0
230  * ICE_FLOW_SEG_HDR_GTPU_EH           1              don't care
231  * ICE_FLOW_SEG_HDR_GTPU_DWN          1              0
232  * ICE_FLOW_SEG_HDR_GTPU_UP           1              1
233  */
234 #define ICE_FLOW_SEG_HDR_GTPU (ICE_FLOW_SEG_HDR_GTPU_IP | \
235 			       ICE_FLOW_SEG_HDR_GTPU_EH | \
236 			       ICE_FLOW_SEG_HDR_GTPU_DWN | \
237 			       ICE_FLOW_SEG_HDR_GTPU_UP)
238 #define ICE_FLOW_SEG_HDR_PFCP (ICE_FLOW_SEG_HDR_PFCP_NODE | \
239 			       ICE_FLOW_SEG_HDR_PFCP_SESSION)
240 
241 enum ice_flow_field {
242 	/* L2 */
243 	ICE_FLOW_FIELD_IDX_ETH_DA,
244 	ICE_FLOW_FIELD_IDX_ETH_SA,
245 	ICE_FLOW_FIELD_IDX_S_VLAN,
246 	ICE_FLOW_FIELD_IDX_C_VLAN,
247 	ICE_FLOW_FIELD_IDX_ETH_TYPE,
248 	/* L3 */
249 	ICE_FLOW_FIELD_IDX_IPV4_DSCP,
250 	ICE_FLOW_FIELD_IDX_IPV6_DSCP,
251 	ICE_FLOW_FIELD_IDX_IPV4_TTL,
252 	ICE_FLOW_FIELD_IDX_IPV4_PROT,
253 	ICE_FLOW_FIELD_IDX_IPV6_TTL,
254 	ICE_FLOW_FIELD_IDX_IPV6_PROT,
255 	ICE_FLOW_FIELD_IDX_IPV4_SA,
256 	ICE_FLOW_FIELD_IDX_IPV4_DA,
257 	ICE_FLOW_FIELD_IDX_IPV6_SA,
258 	ICE_FLOW_FIELD_IDX_IPV6_DA,
259 	ICE_FLOW_FIELD_IDX_IPV4_CHKSUM,
260 	ICE_FLOW_FIELD_IDX_IPV4_ID,
261 	ICE_FLOW_FIELD_IDX_IPV6_ID,
262 	ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA,
263 	ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA,
264 	ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA,
265 	ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA,
266 	ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA,
267 	ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA,
268 	/* L4 */
269 	ICE_FLOW_FIELD_IDX_TCP_SRC_PORT,
270 	ICE_FLOW_FIELD_IDX_TCP_DST_PORT,
271 	ICE_FLOW_FIELD_IDX_UDP_SRC_PORT,
272 	ICE_FLOW_FIELD_IDX_UDP_DST_PORT,
273 	ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT,
274 	ICE_FLOW_FIELD_IDX_SCTP_DST_PORT,
275 	ICE_FLOW_FIELD_IDX_TCP_FLAGS,
276 	ICE_FLOW_FIELD_IDX_TCP_CHKSUM,
277 	ICE_FLOW_FIELD_IDX_UDP_CHKSUM,
278 	ICE_FLOW_FIELD_IDX_SCTP_CHKSUM,
279 	/* ARP */
280 	ICE_FLOW_FIELD_IDX_ARP_SIP,
281 	ICE_FLOW_FIELD_IDX_ARP_DIP,
282 	ICE_FLOW_FIELD_IDX_ARP_SHA,
283 	ICE_FLOW_FIELD_IDX_ARP_DHA,
284 	ICE_FLOW_FIELD_IDX_ARP_OP,
285 	/* ICMP */
286 	ICE_FLOW_FIELD_IDX_ICMP_TYPE,
287 	ICE_FLOW_FIELD_IDX_ICMP_CODE,
288 	/* GRE */
289 	ICE_FLOW_FIELD_IDX_GRE_KEYID,
290 	/* GTPC_TEID */
291 	ICE_FLOW_FIELD_IDX_GTPC_TEID,
292 	/* GTPU_IP */
293 	ICE_FLOW_FIELD_IDX_GTPU_IP_TEID,
294 	/* GTPU_EH */
295 	ICE_FLOW_FIELD_IDX_GTPU_EH_TEID,
296 	ICE_FLOW_FIELD_IDX_GTPU_EH_QFI,
297 	/* GTPU_UP */
298 	ICE_FLOW_FIELD_IDX_GTPU_UP_TEID,
299 	ICE_FLOW_FIELD_IDX_GTPU_UP_QFI,
300 	/* GTPU_DWN */
301 	ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID,
302 	ICE_FLOW_FIELD_IDX_GTPU_DWN_QFI,
303 	ICE_FLOW_FIELD_IDX_PPPOE_SESS_ID,
304 	/* PFCP */
305 	ICE_FLOW_FIELD_IDX_PFCP_SEID,
306 	ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID,
307 	/* ESP */
308 	ICE_FLOW_FIELD_IDX_ESP_SPI,
309 	/* AH */
310 	ICE_FLOW_FIELD_IDX_AH_SPI,
311 	/* NAT_T ESP */
312 	ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI,
313 	/* L2TPV2 SESSION ID*/
314 	ICE_FLOW_FIELD_IDX_L2TPV2_SESS_ID,
315 	/* L2TPV2_LEN SESSION ID */
316 	ICE_FLOW_FIELD_IDX_L2TPV2_LEN_SESS_ID,
317 	 /* The total number of enums must not exceed 64 */
318 	ICE_FLOW_FIELD_IDX_MAX
319 };
320 
321 static_assert(ICE_FLOW_FIELD_IDX_MAX <= 64, "The total number of enums must not exceed 64");
322 
323 #define ICE_FLOW_HASH_FLD_IPV4_SA	BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)
324 #define ICE_FLOW_HASH_FLD_IPV6_SA	BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)
325 #define ICE_FLOW_HASH_FLD_IPV4_DA	BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)
326 #define ICE_FLOW_HASH_FLD_IPV6_DA	BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)
327 #define ICE_FLOW_HASH_FLD_TCP_SRC_PORT	BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)
328 #define ICE_FLOW_HASH_FLD_TCP_DST_PORT	BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)
329 #define ICE_FLOW_HASH_FLD_UDP_SRC_PORT	BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)
330 #define ICE_FLOW_HASH_FLD_UDP_DST_PORT	BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)
331 #define ICE_FLOW_HASH_FLD_SCTP_SRC_PORT	\
332 	BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)
333 #define ICE_FLOW_HASH_FLD_SCTP_DST_PORT	\
334 	BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)
335 
336 #define ICE_FLOW_HASH_FLD_GTPC_TEID	BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_TEID)
337 #define ICE_FLOW_HASH_FLD_GTPU_IP_TEID BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID)
338 #define ICE_FLOW_HASH_FLD_GTPU_EH_TEID BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_TEID)
339 #define ICE_FLOW_HASH_FLD_GTPU_UP_TEID BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_UP_TEID)
340 #define ICE_FLOW_HASH_FLD_GTPU_DWN_TEID \
341 	BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID)
342 
343 /* Supported RSS offloads  This macro is defined to support
344  * VIRTCHNL_OP_GET_RSS_HASHCFG_CAPS ops. PF driver sends the RSS hardware
345  * capabilities to the caller of this ops.
346  */
347 #define ICE_DEFAULT_RSS_HASHCFG ( \
348 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_IPV4_UDP) | \
349 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_IPV4_SCTP) | \
350 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_IPV4_TCP) | \
351 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_IPV4_OTHER) | \
352 	BIT_ULL(LIBIE_FILTER_PCTYPE_FRAG_IPV4) | \
353 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_IPV6_UDP) | \
354 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_IPV6_TCP) | \
355 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_IPV6_SCTP) | \
356 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_IPV6_OTHER) | \
357 	BIT_ULL(LIBIE_FILTER_PCTYPE_FRAG_IPV6) | \
358 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK) | \
359 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP) | \
360 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP) | \
361 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK) | \
362 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP) | \
363 	BIT_ULL(LIBIE_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP))
364 
365 enum ice_rss_cfg_hdr_type {
366 	ICE_RSS_OUTER_HEADERS, /* take outer headers as inputset. */
367 	ICE_RSS_INNER_HEADERS, /* take inner headers as inputset. */
368 	/* take inner headers as inputset for packet with outer ipv4. */
369 	ICE_RSS_INNER_HEADERS_W_OUTER_IPV4,
370 	/* take inner headers as inputset for packet with outer ipv6. */
371 	ICE_RSS_INNER_HEADERS_W_OUTER_IPV6,
372 	/* take outer headers first then inner headers as inputset */
373 	/* take inner as inputset for GTPoGRE with outer IPv4 + GRE. */
374 	ICE_RSS_INNER_HEADERS_W_OUTER_IPV4_GRE,
375 	/* take inner as inputset for GTPoGRE with outer IPv6 + GRE. */
376 	ICE_RSS_INNER_HEADERS_W_OUTER_IPV6_GRE,
377 	ICE_RSS_ANY_HEADERS
378 };
379 
380 struct ice_vsi;
381 struct ice_rss_hash_cfg {
382 	u32 addl_hdrs; /* protocol header fields */
383 	u64 hash_flds; /* hash bit field (ICE_FLOW_HASH_*) to configure */
384 	enum ice_rss_cfg_hdr_type hdr_type; /* to specify inner or outer */
385 	bool symm; /* symmetric or asymmetric hash */
386 };
387 
388 enum ice_flow_dir {
389 	ICE_FLOW_RX		= 0x02,
390 };
391 
392 enum ice_flow_priority {
393 	ICE_FLOW_PRIO_LOW,
394 	ICE_FLOW_PRIO_NORMAL,
395 	ICE_FLOW_PRIO_HIGH
396 };
397 
398 #define ICE_FLOW_SEG_SINGLE		1
399 #define ICE_FLOW_SEG_MAX		2
400 #define ICE_FLOW_SEG_RAW_FLD_MAX	2
401 #define ICE_FLOW_SW_FIELD_VECTOR_MAX	48
402 #define ICE_FLOW_FV_EXTRACT_SZ		2
403 
404 #define ICE_FLOW_SET_HDRS(seg, val)	((seg)->hdrs |= (u32)(val))
405 
406 struct ice_flow_seg_xtrct {
407 	u8 prot_id;	/* Protocol ID of extracted header field */
408 	u16 off;	/* Starting offset of the field in header in bytes */
409 	u8 idx;		/* Index of FV entry used */
410 	u8 disp;	/* Displacement of field in bits fr. FV entry's start */
411 	u16 mask;	/* Mask for field */
412 };
413 
414 enum ice_flow_fld_match_type {
415 	ICE_FLOW_FLD_TYPE_REG,		/* Value, mask */
416 	ICE_FLOW_FLD_TYPE_RANGE,	/* Value, mask, last (upper bound) */
417 	ICE_FLOW_FLD_TYPE_PREFIX,	/* IP address, prefix, size of prefix */
418 	ICE_FLOW_FLD_TYPE_SIZE,		/* Value, mask, size of match */
419 };
420 
421 struct ice_flow_fld_loc {
422 	/* Describe offsets of field information relative to the beginning of
423 	 * input buffer provided when adding flow entries.
424 	 */
425 	u16 val;	/* Offset where the value is located */
426 	u16 mask;	/* Offset where the mask/prefix value is located */
427 	u16 last;	/* Length or offset where the upper value is located */
428 };
429 
430 struct ice_flow_fld_info {
431 	enum ice_flow_fld_match_type type;
432 	/* Location where to retrieve data from an input buffer */
433 	struct ice_flow_fld_loc src;
434 	/* Location where to put the data into the final entry buffer */
435 	struct ice_flow_fld_loc entry;
436 	struct ice_flow_seg_xtrct xtrct;
437 };
438 
439 struct ice_flow_seg_fld_raw {
440 	struct ice_flow_fld_info info;
441 	u16 off;	/* Offset from the start of the segment */
442 };
443 
444 struct ice_flow_seg_info {
445 	u32 hdrs;	/* Bitmask indicating protocol headers present */
446 	u64 match;	/* Bitmask indicating header fields to be matched */
447 	u64 range;	/* Bitmask indicating header fields matched as ranges */
448 
449 	struct ice_flow_fld_info fields[ICE_FLOW_FIELD_IDX_MAX];
450 
451 	u8 raws_cnt;	/* Number of raw fields to be matched */
452 	struct ice_flow_seg_fld_raw raws[ICE_FLOW_SEG_RAW_FLD_MAX];
453 };
454 
455 /* This structure describes a flow entry, and is tracked only in this file */
456 struct ice_flow_entry {
457 	struct list_head l_entry;
458 
459 	u64 id;
460 	struct ice_flow_prof *prof;
461 	enum ice_flow_priority priority;
462 	u16 vsi_handle;
463 };
464 
465 #define ICE_FLOW_ENTRY_HNDL(e)	((u64)(uintptr_t)e)
466 #define ICE_FLOW_ENTRY_PTR(h)	((struct ice_flow_entry *)(uintptr_t)(h))
467 
468 struct ice_flow_prof {
469 	struct list_head l_entry;
470 
471 	u64 id;
472 	enum ice_flow_dir dir;
473 	u8 segs_cnt;
474 
475 	/* Keep track of flow entries associated with this flow profile */
476 	struct mutex entries_lock;
477 	struct list_head entries;
478 
479 	struct ice_flow_seg_info segs[ICE_FLOW_SEG_MAX];
480 
481 	/* software VSI handles referenced by this flow profile */
482 	DECLARE_BITMAP(vsis, ICE_MAX_VSI);
483 
484 	bool symm; /* Symmetric Hash for RSS */
485 };
486 
487 struct ice_rss_raw_cfg {
488 	struct ice_parser_profile prof;
489 	bool raw_ena;
490 	bool symm;
491 };
492 
493 struct ice_rss_cfg {
494 	struct list_head l_entry;
495 	/* bitmap of VSIs added to the RSS entry */
496 	DECLARE_BITMAP(vsis, ICE_MAX_VSI);
497 	struct ice_rss_hash_cfg hash;
498 };
499 
500 int
501 ice_flow_add_prof(struct ice_hw *hw, enum ice_block blk, enum ice_flow_dir dir,
502 		  struct ice_flow_seg_info *segs, u8 segs_cnt,
503 		  bool symm, struct ice_flow_prof **prof);
504 int ice_flow_rem_prof(struct ice_hw *hw, enum ice_block blk, u64 prof_id);
505 int
506 ice_flow_set_parser_prof(struct ice_hw *hw, u16 dest_vsi, u16 fdir_vsi,
507 			 struct ice_parser_profile *prof, enum ice_block blk);
508 int
509 ice_flow_add_entry(struct ice_hw *hw, enum ice_block blk, u64 prof_id,
510 		   u64 entry_id, u16 vsi, enum ice_flow_priority prio,
511 		   void *data, u64 *entry_h);
512 int ice_flow_rem_entry(struct ice_hw *hw, enum ice_block blk, u64 entry_h);
513 void
514 ice_flow_set_fld(struct ice_flow_seg_info *seg, enum ice_flow_field fld,
515 		 u16 val_loc, u16 mask_loc, u16 last_loc, bool range);
516 void
517 ice_flow_add_fld_raw(struct ice_flow_seg_info *seg, u16 off, u8 len,
518 		     u16 val_loc, u16 mask_loc);
519 int ice_flow_rem_vsi_prof(struct ice_hw *hw, u16 vsi_handle, u64 prof_id);
520 void ice_rem_vsi_rss_list(struct ice_hw *hw, u16 vsi_handle);
521 int ice_replay_rss_cfg(struct ice_hw *hw, u16 vsi_handle);
522 int ice_set_rss_cfg_symm(struct ice_hw *hw, struct ice_vsi *vsi, bool symm);
523 int ice_add_avf_rss_cfg(struct ice_hw *hw, struct ice_vsi *vsi,
524 			u64 hashed_flds);
525 int ice_rem_vsi_rss_cfg(struct ice_hw *hw, u16 vsi_handle);
526 int ice_add_rss_cfg(struct ice_hw *hw, struct ice_vsi *vsi,
527 		    const struct ice_rss_hash_cfg *cfg);
528 int ice_rem_rss_cfg(struct ice_hw *hw, u16 vsi_handle,
529 		    const struct ice_rss_hash_cfg *cfg);
530 u64 ice_get_rss_cfg(struct ice_hw *hw, u16 vsi_handle, u32 hdrs, bool *symm);
531 void ice_rss_update_raw_symm(struct ice_hw *hw,
532 			     struct ice_rss_raw_cfg *cfg, u64 id);
533 #endif /* _ICE_FLOW_H_ */
534