1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2001-2020 Intel Corporation 3 */ 4 5 #ifndef _ICE_FLOW_H_ 6 #define _ICE_FLOW_H_ 7 8 #include "ice_flex_type.h" 9 #include "ice_acl.h" 10 11 #define ICE_IPV4_MAKE_PREFIX_MASK(prefix) ((u32)(~0) << (32 - (prefix))) 12 #define ICE_FLOW_PROF_ID_INVAL 0xfffffffffffffffful 13 #define ICE_FLOW_PROF_ID_BYPASS 0 14 #define ICE_FLOW_PROF_ID_DEFAULT 1 15 #define ICE_FLOW_ENTRY_HANDLE_INVAL 0 16 #define ICE_FLOW_VSI_INVAL 0xffff 17 #define ICE_FLOW_FLD_OFF_INVAL 0xffff 18 19 /* Generate flow hash field from flow field type(s) */ 20 #define ICE_FLOW_HASH_ETH \ 21 (BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA) | \ 22 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA)) 23 #define ICE_FLOW_HASH_IPV4 \ 24 (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | \ 25 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)) 26 #define ICE_FLOW_HASH_IPV6 \ 27 (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | \ 28 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)) 29 #define ICE_FLOW_HASH_IPV6_PRE32 \ 30 (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) | \ 31 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA)) 32 #define ICE_FLOW_HASH_IPV6_PRE48 \ 33 (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) | \ 34 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA)) 35 #define ICE_FLOW_HASH_IPV6_PRE64 \ 36 (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) | \ 37 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA)) 38 #define ICE_FLOW_HASH_TCP_PORT \ 39 (BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT) | \ 40 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)) 41 #define ICE_FLOW_HASH_UDP_PORT \ 42 (BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT) | \ 43 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)) 44 #define ICE_FLOW_HASH_SCTP_PORT \ 45 (BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT) | \ 46 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)) 47 48 #define ICE_HASH_INVALID 0 49 #define ICE_HASH_TCP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_TCP_PORT) 50 #define ICE_HASH_TCP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_TCP_PORT) 51 #define ICE_HASH_UDP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_UDP_PORT) 52 #define ICE_HASH_UDP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_UDP_PORT) 53 #define ICE_HASH_SCTP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_SCTP_PORT) 54 #define ICE_HASH_SCTP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_SCTP_PORT) 55 56 #define ICE_HASH_TCP_IPV6_PRE32 \ 57 (ICE_FLOW_HASH_IPV6_PRE32 | ICE_FLOW_HASH_TCP_PORT) 58 #define ICE_HASH_UDP_IPV6_PRE32 \ 59 (ICE_FLOW_HASH_IPV6_PRE32 | ICE_FLOW_HASH_UDP_PORT) 60 #define ICE_HASH_SCTP_IPV6_PRE32 \ 61 (ICE_FLOW_HASH_IPV6_PRE32 | ICE_FLOW_HASH_SCTP_PORT) 62 #define ICE_HASH_TCP_IPV6_PRE48 \ 63 (ICE_FLOW_HASH_IPV6_PRE48 | ICE_FLOW_HASH_TCP_PORT) 64 #define ICE_HASH_UDP_IPV6_PRE48 \ 65 (ICE_FLOW_HASH_IPV6_PRE48 | ICE_FLOW_HASH_UDP_PORT) 66 #define ICE_HASH_SCTP_IPV6_PRE48 \ 67 (ICE_FLOW_HASH_IPV6_PRE48 | ICE_FLOW_HASH_SCTP_PORT) 68 #define ICE_HASH_TCP_IPV6_PRE64 \ 69 (ICE_FLOW_HASH_IPV6_PRE64 | ICE_FLOW_HASH_TCP_PORT) 70 #define ICE_HASH_UDP_IPV6_PRE64 \ 71 (ICE_FLOW_HASH_IPV6_PRE64 | ICE_FLOW_HASH_UDP_PORT) 72 #define ICE_HASH_SCTP_IPV6_PRE64 \ 73 (ICE_FLOW_HASH_IPV6_PRE64 | ICE_FLOW_HASH_SCTP_PORT) 74 75 #define ICE_FLOW_HASH_GTP_TEID \ 76 (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_TEID)) 77 78 #define ICE_FLOW_HASH_GTP_IPV4_TEID \ 79 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_TEID) 80 #define ICE_FLOW_HASH_GTP_IPV6_TEID \ 81 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_TEID) 82 83 #define ICE_FLOW_HASH_GTP_U_TEID \ 84 (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID)) 85 86 #define ICE_FLOW_HASH_GTP_U_IPV4_TEID \ 87 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_U_TEID) 88 #define ICE_FLOW_HASH_GTP_U_IPV6_TEID \ 89 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_TEID) 90 91 #define ICE_FLOW_HASH_GTP_U_EH_TEID \ 92 (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_TEID)) 93 94 #define ICE_FLOW_HASH_GTP_U_EH_QFI \ 95 (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_QFI)) 96 97 #define ICE_FLOW_HASH_GTP_U_IPV4_EH \ 98 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_U_EH_TEID | \ 99 ICE_FLOW_HASH_GTP_U_EH_QFI) 100 #define ICE_FLOW_HASH_GTP_U_IPV6_EH \ 101 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_EH_TEID | \ 102 ICE_FLOW_HASH_GTP_U_EH_QFI) 103 104 #define ICE_FLOW_HASH_PPPOE_SESS_ID \ 105 (BIT_ULL(ICE_FLOW_FIELD_IDX_PPPOE_SESS_ID)) 106 107 #define ICE_FLOW_HASH_PPPOE_SESS_ID_ETH \ 108 (ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_PPPOE_SESS_ID) 109 #define ICE_FLOW_HASH_PPPOE_TCP_ID \ 110 (ICE_FLOW_HASH_TCP_PORT | ICE_FLOW_HASH_PPPOE_SESS_ID) 111 #define ICE_FLOW_HASH_PPPOE_UDP_ID \ 112 (ICE_FLOW_HASH_UDP_PORT | ICE_FLOW_HASH_PPPOE_SESS_ID) 113 114 #define ICE_FLOW_HASH_PFCP_SEID \ 115 (BIT_ULL(ICE_FLOW_FIELD_IDX_PFCP_SEID)) 116 #define ICE_FLOW_HASH_PFCP_IPV4_SEID \ 117 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_PFCP_SEID) 118 #define ICE_FLOW_HASH_PFCP_IPV6_SEID \ 119 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_PFCP_SEID) 120 121 #define ICE_FLOW_HASH_L2TPV3_SESS_ID \ 122 (BIT_ULL(ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID)) 123 #define ICE_FLOW_HASH_L2TPV3_IPV4_SESS_ID \ 124 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_L2TPV3_SESS_ID) 125 #define ICE_FLOW_HASH_L2TPV3_IPV6_SESS_ID \ 126 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_L2TPV3_SESS_ID) 127 128 #define ICE_FLOW_HASH_ESP_SPI \ 129 (BIT_ULL(ICE_FLOW_FIELD_IDX_ESP_SPI)) 130 #define ICE_FLOW_HASH_ESP_IPV4_SPI \ 131 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_ESP_SPI) 132 #define ICE_FLOW_HASH_ESP_IPV6_SPI \ 133 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_ESP_SPI) 134 135 #define ICE_FLOW_HASH_AH_SPI \ 136 (BIT_ULL(ICE_FLOW_FIELD_IDX_AH_SPI)) 137 #define ICE_FLOW_HASH_AH_IPV4_SPI \ 138 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_AH_SPI) 139 #define ICE_FLOW_HASH_AH_IPV6_SPI \ 140 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_AH_SPI) 141 142 #define ICE_FLOW_HASH_NAT_T_ESP_SPI \ 143 (BIT_ULL(ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI)) 144 #define ICE_FLOW_HASH_NAT_T_ESP_IPV4_SPI \ 145 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_NAT_T_ESP_SPI) 146 #define ICE_FLOW_HASH_NAT_T_ESP_IPV6_SPI \ 147 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_NAT_T_ESP_SPI) 148 149 /* Protocol header fields within a packet segment. A segment consists of one or 150 * more protocol headers that make up a logical group of protocol headers. Each 151 * logical group of protocol headers encapsulates or is encapsulated using/by 152 * tunneling or encapsulation protocols for network virtualization such as GRE, 153 * VxLAN, etc. 154 */ 155 enum ice_flow_seg_hdr { 156 ICE_FLOW_SEG_HDR_NONE = 0x00000000, 157 ICE_FLOW_SEG_HDR_ETH = 0x00000001, 158 ICE_FLOW_SEG_HDR_VLAN = 0x00000002, 159 ICE_FLOW_SEG_HDR_IPV4 = 0x00000004, 160 ICE_FLOW_SEG_HDR_IPV6 = 0x00000008, 161 ICE_FLOW_SEG_HDR_ARP = 0x00000010, 162 ICE_FLOW_SEG_HDR_ICMP = 0x00000020, 163 ICE_FLOW_SEG_HDR_TCP = 0x00000040, 164 ICE_FLOW_SEG_HDR_UDP = 0x00000080, 165 ICE_FLOW_SEG_HDR_SCTP = 0x00000100, 166 ICE_FLOW_SEG_HDR_GRE = 0x00000200, 167 ICE_FLOW_SEG_HDR_GTPC = 0x00000400, 168 ICE_FLOW_SEG_HDR_GTPC_TEID = 0x00000800, 169 ICE_FLOW_SEG_HDR_GTPU_IP = 0x00001000, 170 ICE_FLOW_SEG_HDR_GTPU_EH = 0x00002000, 171 ICE_FLOW_SEG_HDR_GTPU_DWN = 0x00004000, 172 ICE_FLOW_SEG_HDR_GTPU_UP = 0x00008000, 173 ICE_FLOW_SEG_HDR_PPPOE = 0x00010000, 174 ICE_FLOW_SEG_HDR_PFCP_NODE = 0x00020000, 175 ICE_FLOW_SEG_HDR_PFCP_SESSION = 0x00040000, 176 ICE_FLOW_SEG_HDR_L2TPV3 = 0x00080000, 177 ICE_FLOW_SEG_HDR_ESP = 0x00100000, 178 ICE_FLOW_SEG_HDR_AH = 0x00200000, 179 ICE_FLOW_SEG_HDR_NAT_T_ESP = 0x00400000, 180 ICE_FLOW_SEG_HDR_ETH_NON_IP = 0x00800000, 181 ICE_FLOW_SEG_HDR_GTPU_NON_IP = 0x01000000, 182 /* The following is an additive bit for ICE_FLOW_SEG_HDR_IPV4 and 183 * ICE_FLOW_SEG_HDR_IPV6 which include the IPV4 other PTYPEs 184 */ 185 ICE_FLOW_SEG_HDR_IPV_OTHER = 0x20000000, 186 }; 187 188 /* These segements all have the same PTYPES, but are otherwise distinguished by 189 * the value of the gtp_eh_pdu and gtp_eh_pdu_link flags: 190 * 191 * gtp_eh_pdu gtp_eh_pdu_link 192 * ICE_FLOW_SEG_HDR_GTPU_IP 0 0 193 * ICE_FLOW_SEG_HDR_GTPU_EH 1 don't care 194 * ICE_FLOW_SEG_HDR_GTPU_DWN 1 0 195 * ICE_FLOW_SEG_HDR_GTPU_UP 1 1 196 */ 197 #define ICE_FLOW_SEG_HDR_GTPU (ICE_FLOW_SEG_HDR_GTPU_IP | \ 198 ICE_FLOW_SEG_HDR_GTPU_EH | \ 199 ICE_FLOW_SEG_HDR_GTPU_DWN | \ 200 ICE_FLOW_SEG_HDR_GTPU_UP) 201 #define ICE_FLOW_SEG_HDR_PFCP (ICE_FLOW_SEG_HDR_PFCP_NODE | \ 202 ICE_FLOW_SEG_HDR_PFCP_SESSION) 203 204 enum ice_flow_field { 205 /* L2 */ 206 ICE_FLOW_FIELD_IDX_ETH_DA, 207 ICE_FLOW_FIELD_IDX_ETH_SA, 208 ICE_FLOW_FIELD_IDX_S_VLAN, 209 ICE_FLOW_FIELD_IDX_C_VLAN, 210 ICE_FLOW_FIELD_IDX_ETH_TYPE, 211 /* L3 */ 212 ICE_FLOW_FIELD_IDX_IPV4_DSCP, 213 ICE_FLOW_FIELD_IDX_IPV6_DSCP, 214 ICE_FLOW_FIELD_IDX_IPV4_TTL, 215 ICE_FLOW_FIELD_IDX_IPV4_PROT, 216 ICE_FLOW_FIELD_IDX_IPV6_TTL, 217 ICE_FLOW_FIELD_IDX_IPV6_PROT, 218 ICE_FLOW_FIELD_IDX_IPV4_SA, 219 ICE_FLOW_FIELD_IDX_IPV4_DA, 220 ICE_FLOW_FIELD_IDX_IPV6_SA, 221 ICE_FLOW_FIELD_IDX_IPV6_DA, 222 ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA, 223 ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA, 224 ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA, 225 ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA, 226 ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA, 227 ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA, 228 /* L4 */ 229 ICE_FLOW_FIELD_IDX_TCP_SRC_PORT, 230 ICE_FLOW_FIELD_IDX_TCP_DST_PORT, 231 ICE_FLOW_FIELD_IDX_UDP_SRC_PORT, 232 ICE_FLOW_FIELD_IDX_UDP_DST_PORT, 233 ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT, 234 ICE_FLOW_FIELD_IDX_SCTP_DST_PORT, 235 ICE_FLOW_FIELD_IDX_TCP_FLAGS, 236 /* ARP */ 237 ICE_FLOW_FIELD_IDX_ARP_SIP, 238 ICE_FLOW_FIELD_IDX_ARP_DIP, 239 ICE_FLOW_FIELD_IDX_ARP_SHA, 240 ICE_FLOW_FIELD_IDX_ARP_DHA, 241 ICE_FLOW_FIELD_IDX_ARP_OP, 242 /* ICMP */ 243 ICE_FLOW_FIELD_IDX_ICMP_TYPE, 244 ICE_FLOW_FIELD_IDX_ICMP_CODE, 245 /* GRE */ 246 ICE_FLOW_FIELD_IDX_GRE_KEYID, 247 /* GTPC_TEID */ 248 ICE_FLOW_FIELD_IDX_GTPC_TEID, 249 /* GTPU_IP */ 250 ICE_FLOW_FIELD_IDX_GTPU_IP_TEID, 251 /* GTPU_EH */ 252 ICE_FLOW_FIELD_IDX_GTPU_EH_TEID, 253 ICE_FLOW_FIELD_IDX_GTPU_EH_QFI, 254 /* GTPU_UP */ 255 ICE_FLOW_FIELD_IDX_GTPU_UP_TEID, 256 /* GTPU_DWN */ 257 ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID, 258 /* PPPOE */ 259 ICE_FLOW_FIELD_IDX_PPPOE_SESS_ID, 260 /* PFCP */ 261 ICE_FLOW_FIELD_IDX_PFCP_SEID, 262 /* L2TPV3 */ 263 ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID, 264 /* ESP */ 265 ICE_FLOW_FIELD_IDX_ESP_SPI, 266 /* AH */ 267 ICE_FLOW_FIELD_IDX_AH_SPI, 268 /* NAT_T ESP */ 269 ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI, 270 /* The total number of enums must not exceed 64 */ 271 ICE_FLOW_FIELD_IDX_MAX 272 }; 273 274 /* Flow headers and fields for AVF support */ 275 enum ice_flow_avf_hdr_field { 276 /* Values 0 - 28 are reserved for future use */ 277 ICE_AVF_FLOW_FIELD_INVALID = 0, 278 ICE_AVF_FLOW_FIELD_UNICAST_IPV4_UDP = 29, 279 ICE_AVF_FLOW_FIELD_MULTICAST_IPV4_UDP, 280 ICE_AVF_FLOW_FIELD_IPV4_UDP, 281 ICE_AVF_FLOW_FIELD_IPV4_TCP_SYN_NO_ACK, 282 ICE_AVF_FLOW_FIELD_IPV4_TCP, 283 ICE_AVF_FLOW_FIELD_IPV4_SCTP, 284 ICE_AVF_FLOW_FIELD_IPV4_OTHER, 285 ICE_AVF_FLOW_FIELD_FRAG_IPV4, 286 /* Values 37-38 are reserved */ 287 ICE_AVF_FLOW_FIELD_UNICAST_IPV6_UDP = 39, 288 ICE_AVF_FLOW_FIELD_MULTICAST_IPV6_UDP, 289 ICE_AVF_FLOW_FIELD_IPV6_UDP, 290 ICE_AVF_FLOW_FIELD_IPV6_TCP_SYN_NO_ACK, 291 ICE_AVF_FLOW_FIELD_IPV6_TCP, 292 ICE_AVF_FLOW_FIELD_IPV6_SCTP, 293 ICE_AVF_FLOW_FIELD_IPV6_OTHER, 294 ICE_AVF_FLOW_FIELD_FRAG_IPV6, 295 ICE_AVF_FLOW_FIELD_RSVD47, 296 ICE_AVF_FLOW_FIELD_FCOE_OX, 297 ICE_AVF_FLOW_FIELD_FCOE_RX, 298 ICE_AVF_FLOW_FIELD_FCOE_OTHER, 299 /* Values 51-62 are reserved */ 300 ICE_AVF_FLOW_FIELD_L2_PAYLOAD = 63, 301 ICE_AVF_FLOW_FIELD_MAX 302 }; 303 304 /* Supported RSS offloads This macro is defined to support 305 * VIRTCHNL_OP_GET_RSS_HENA_CAPS ops. PF driver sends the RSS hardware 306 * capabilities to the caller of this ops. 307 */ 308 #define ICE_DEFAULT_RSS_HENA ( \ 309 BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_UDP) | \ 310 BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_SCTP) | \ 311 BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_TCP) | \ 312 BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_OTHER) | \ 313 BIT_ULL(ICE_AVF_FLOW_FIELD_FRAG_IPV4) | \ 314 BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_UDP) | \ 315 BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_TCP) | \ 316 BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_SCTP) | \ 317 BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_OTHER) | \ 318 BIT_ULL(ICE_AVF_FLOW_FIELD_FRAG_IPV6) | \ 319 BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_TCP_SYN_NO_ACK) | \ 320 BIT_ULL(ICE_AVF_FLOW_FIELD_UNICAST_IPV4_UDP) | \ 321 BIT_ULL(ICE_AVF_FLOW_FIELD_MULTICAST_IPV4_UDP) | \ 322 BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_TCP_SYN_NO_ACK) | \ 323 BIT_ULL(ICE_AVF_FLOW_FIELD_UNICAST_IPV6_UDP) | \ 324 BIT_ULL(ICE_AVF_FLOW_FIELD_MULTICAST_IPV6_UDP)) 325 326 enum ice_rss_cfg_hdr_type { 327 ICE_RSS_OUTER_HEADERS, /* take outer headers as inputset. */ 328 ICE_RSS_INNER_HEADERS, /* take inner headers as inputset. */ 329 /* take inner headers as inputset for packet with outer ipv4. */ 330 ICE_RSS_INNER_HEADERS_W_OUTER_IPV4, 331 /* take inner headers as inputset for packet with outer ipv6. */ 332 ICE_RSS_INNER_HEADERS_W_OUTER_IPV6, 333 /* take outer headers first then inner headers as inputset */ 334 ICE_RSS_ANY_HEADERS 335 }; 336 337 struct ice_rss_hash_cfg { 338 u32 addl_hdrs; /* protocol header fields */ 339 u64 hash_flds; /* hash bit field (ICE_FLOW_HASH_*) to configure */ 340 enum ice_rss_cfg_hdr_type hdr_type; /* to specify inner or outer */ 341 bool symm; /* symmetric or asymmetric hash */ 342 }; 343 344 enum ice_flow_dir { 345 ICE_FLOW_DIR_UNDEFINED = 0, 346 ICE_FLOW_TX = 0x01, 347 ICE_FLOW_RX = 0x02, 348 ICE_FLOW_TX_RX = ICE_FLOW_RX | ICE_FLOW_TX 349 }; 350 351 enum ice_flow_priority { 352 ICE_FLOW_PRIO_LOW, 353 ICE_FLOW_PRIO_NORMAL, 354 ICE_FLOW_PRIO_HIGH 355 }; 356 357 #define ICE_FLOW_SEG_SINGLE 1 358 #define ICE_FLOW_SEG_MAX 2 359 #define ICE_FLOW_SEG_RAW_FLD_MAX 2 360 #define ICE_FLOW_PROFILE_MAX 1024 361 #define ICE_FLOW_SW_FIELD_VECTOR_MAX 48 362 #define ICE_FLOW_ACL_FIELD_VECTOR_MAX 32 363 #define ICE_FLOW_FV_EXTRACT_SZ 2 364 365 #define ICE_FLOW_SET_HDRS(seg, val) ((seg)->hdrs |= (u32)(val)) 366 367 struct ice_flow_seg_xtrct { 368 u8 prot_id; /* Protocol ID of extracted header field */ 369 u16 off; /* Starting offset of the field in header in bytes */ 370 u8 idx; /* Index of FV entry used */ 371 u8 disp; /* Displacement of field in bits fr. FV entry's start */ 372 u16 mask; /* Mask for field */ 373 }; 374 375 enum ice_flow_fld_match_type { 376 ICE_FLOW_FLD_TYPE_REG, /* Value, mask */ 377 ICE_FLOW_FLD_TYPE_RANGE, /* Value, mask, last (upper bound) */ 378 ICE_FLOW_FLD_TYPE_PREFIX, /* IP address, prefix, size of prefix */ 379 ICE_FLOW_FLD_TYPE_SIZE, /* Value, mask, size of match */ 380 }; 381 382 struct ice_flow_fld_loc { 383 /* Describe offsets of field information relative to the beginning of 384 * input buffer provided when adding flow entries. 385 */ 386 u16 val; /* Offset where the value is located */ 387 u16 mask; /* Offset where the mask/prefix value is located */ 388 u16 last; /* Length or offset where the upper value is located */ 389 }; 390 391 struct ice_flow_fld_info { 392 enum ice_flow_fld_match_type type; 393 /* Location where to retrieve data from an input buffer */ 394 struct ice_flow_fld_loc src; 395 /* Location where to put the data into the final entry buffer */ 396 struct ice_flow_fld_loc entry; 397 struct ice_flow_seg_xtrct xtrct; 398 }; 399 400 struct ice_flow_seg_fld_raw { 401 struct ice_flow_fld_info info; 402 u16 off; /* Offset from the start of the segment */ 403 }; 404 405 struct ice_flow_seg_info { 406 u32 hdrs; /* Bitmask indicating protocol headers present */ 407 u64 match; /* Bitmask indicating header fields to be matched */ 408 u64 range; /* Bitmask indicating header fields matched as ranges */ 409 410 struct ice_flow_fld_info fields[ICE_FLOW_FIELD_IDX_MAX]; 411 412 u8 raws_cnt; /* Number of raw fields to be matched */ 413 struct ice_flow_seg_fld_raw raws[ICE_FLOW_SEG_RAW_FLD_MAX]; 414 }; 415 416 /* This structure describes a flow entry, and is tracked only in this file */ 417 struct ice_flow_entry { 418 struct LIST_ENTRY_TYPE l_entry; 419 420 u64 id; 421 struct ice_flow_prof *prof; 422 /* Action list */ 423 struct ice_flow_action *acts; 424 /* Flow entry's content */ 425 void *entry; 426 /* Range buffer (For ACL only) */ 427 struct ice_aqc_acl_profile_ranges *range_buf; 428 enum ice_flow_priority priority; 429 u16 vsi_handle; 430 u16 entry_sz; 431 /* Entry index in the ACL's scenario */ 432 u16 scen_entry_idx; 433 #define ICE_FLOW_ACL_MAX_NUM_ACT 2 434 u8 acts_cnt; 435 }; 436 437 #define ICE_FLOW_ENTRY_HNDL(e) ((unsigned long)e) 438 #define ICE_FLOW_ENTRY_PTR(h) ((struct ice_flow_entry *)(h)) 439 440 struct ice_flow_prof { 441 struct LIST_ENTRY_TYPE l_entry; 442 443 u64 id; 444 enum ice_flow_dir dir; 445 u8 segs_cnt; 446 u8 acts_cnt; 447 448 /* Keep track of flow entries associated with this flow profile */ 449 struct ice_lock entries_lock; 450 struct LIST_HEAD_TYPE entries; 451 452 struct ice_flow_seg_info segs[ICE_FLOW_SEG_MAX]; 453 454 /* software VSI handles referenced by this flow profile */ 455 ice_declare_bitmap(vsis, ICE_MAX_VSI); 456 457 union { 458 /* struct sw_recipe */ 459 struct ice_acl_scen *scen; 460 /* struct fd */ 461 u32 data; 462 bool symm; /* Symmetric Hash for RSS */ 463 } cfg; 464 465 /* Default actions */ 466 struct ice_flow_action *acts; 467 }; 468 469 struct ice_rss_cfg { 470 struct LIST_ENTRY_TYPE l_entry; 471 /* bitmap of VSIs added to the RSS entry */ 472 ice_declare_bitmap(vsis, ICE_MAX_VSI); 473 struct ice_rss_hash_cfg hash; 474 }; 475 476 enum ice_flow_action_type { 477 ICE_FLOW_ACT_NOP, 478 ICE_FLOW_ACT_ALLOW, 479 ICE_FLOW_ACT_DROP, 480 ICE_FLOW_ACT_CNTR_PKT, 481 ICE_FLOW_ACT_FWD_VSI, 482 ICE_FLOW_ACT_FWD_VSI_LIST, /* Should be abstracted away */ 483 ICE_FLOW_ACT_FWD_QUEUE, /* Can Queues be abstracted away? */ 484 ICE_FLOW_ACT_FWD_QUEUE_GROUP, /* Can Queues be abstracted away? */ 485 ICE_FLOW_ACT_PUSH, 486 ICE_FLOW_ACT_POP, 487 ICE_FLOW_ACT_MODIFY, 488 ICE_FLOW_ACT_CNTR_BYTES, 489 ICE_FLOW_ACT_CNTR_PKT_BYTES, 490 ICE_FLOW_ACT_GENERIC_0, 491 ICE_FLOW_ACT_GENERIC_1, 492 ICE_FLOW_ACT_GENERIC_2, 493 ICE_FLOW_ACT_GENERIC_3, 494 ICE_FLOW_ACT_GENERIC_4, 495 ICE_FLOW_ACT_RPT_FLOW_ID, 496 ICE_FLOW_ACT_BUILD_PROF_IDX, 497 }; 498 499 struct ice_flow_action { 500 enum ice_flow_action_type type; 501 union { 502 struct ice_acl_act_entry acl_act; 503 u32 dummy; 504 } data; 505 }; 506 507 u64 508 ice_flow_find_prof(struct ice_hw *hw, enum ice_block blk, enum ice_flow_dir dir, 509 struct ice_flow_seg_info *segs, u8 segs_cnt); 510 enum ice_status 511 ice_flow_add_prof(struct ice_hw *hw, enum ice_block blk, enum ice_flow_dir dir, 512 u64 prof_id, struct ice_flow_seg_info *segs, u8 segs_cnt, 513 struct ice_flow_action *acts, u8 acts_cnt, 514 struct ice_flow_prof **prof); 515 enum ice_status 516 ice_flow_rem_prof(struct ice_hw *hw, enum ice_block blk, u64 prof_id); 517 enum ice_status 518 ice_flow_assoc_prof(struct ice_hw *hw, enum ice_block blk, 519 struct ice_flow_prof *prof, u16 vsi_handle); 520 enum ice_status 521 ice_flow_assoc_vsig_vsi(struct ice_hw *hw, enum ice_block blk, u16 vsi_handle, 522 u16 vsig); 523 enum ice_status 524 ice_flow_get_hw_prof(struct ice_hw *hw, enum ice_block blk, u64 prof_id, 525 u8 *hw_prof); 526 527 u64 ice_flow_find_entry(struct ice_hw *hw, enum ice_block blk, u64 entry_id); 528 enum ice_status 529 ice_flow_add_entry(struct ice_hw *hw, enum ice_block blk, u64 prof_id, 530 u64 entry_id, u16 vsi, enum ice_flow_priority prio, 531 void *data, struct ice_flow_action *acts, u8 acts_cnt, 532 u64 *entry_h); 533 enum ice_status 534 ice_flow_rem_entry(struct ice_hw *hw, enum ice_block blk, u64 entry_h); 535 void 536 ice_flow_set_fld(struct ice_flow_seg_info *seg, enum ice_flow_field fld, 537 u16 val_loc, u16 mask_loc, u16 last_loc, bool range); 538 void 539 ice_flow_set_fld_prefix(struct ice_flow_seg_info *seg, enum ice_flow_field fld, 540 u16 val_loc, u16 prefix_loc, u8 prefix_sz); 541 void 542 ice_flow_add_fld_raw(struct ice_flow_seg_info *seg, u16 off, u8 len, 543 u16 val_loc, u16 mask_loc); 544 void ice_rem_vsi_rss_list(struct ice_hw *hw, u16 vsi_handle); 545 enum ice_status ice_replay_rss_cfg(struct ice_hw *hw, u16 vsi_handle); 546 enum ice_status 547 ice_add_avf_rss_cfg(struct ice_hw *hw, u16 vsi_handle, u64 hashed_flds); 548 enum ice_status ice_rem_vsi_rss_cfg(struct ice_hw *hw, u16 vsi_handle); 549 enum ice_status 550 ice_add_rss_cfg(struct ice_hw *hw, u16 vsi_handle, 551 const struct ice_rss_hash_cfg *cfg); 552 enum ice_status 553 ice_rem_rss_cfg(struct ice_hw *hw, u16 vsi_handle, 554 const struct ice_rss_hash_cfg *cfg); 555 u64 ice_get_rss_cfg(struct ice_hw *hw, u16 vsi_handle, u32 hdrs); 556 #endif /* _ICE_FLOW_H_ */ 557