1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2001-2021 Intel Corporation 3 */ 4 5 #ifndef _ICE_FDIR_H_ 6 #define _ICE_FDIR_H_ 7 8 #include "ice_common.h" 9 10 #define ICE_FDIR_IP_PROTOCOLS 11 #define ICE_IP_PROTO_TCP 6 12 #define ICE_IP_PROTO_UDP 17 13 #define ICE_IP_PROTO_SCTP 132 14 #define ICE_IP_PROTO_IP 0 15 #define ICE_IP_PROTO_ESP 50 16 17 #define ICE_FDIR_GTPU_IP_INNER_PKT_OFF 50 18 #define ICE_FDIR_GTPU_EH_INNER_PKT_OFF 58 19 #define ICE_FDIR_IPV4_GRE_INNER_PKT_OFF 38 20 #define ICE_FDIR_IPV6_GRE_INNER_PKT_OFF 58 21 #define ICE_FDIR_V4_V4_GTPOGRE_PKT_OFF 74 22 #define ICE_FDIR_V4_V6_GTPOGRE_PKT_OFF 94 23 #define ICE_FDIR_V6_V4_GTPOGRE_PKT_OFF 94 24 #define ICE_FDIR_V6_V6_GTPOGRE_PKT_OFF 114 25 #define ICE_FDIR_V4_V4_GTPOGRE_EH_PKT_OFF 82 26 #define ICE_FDIR_V4_V6_GTPOGRE_EH_PKT_OFF 102 27 #define ICE_FDIR_V6_V4_GTPOGRE_EH_PKT_OFF 102 28 #define ICE_FDIR_V6_V6_GTPOGRE_EH_PKT_OFF 122 29 30 #define ICE_FDIR_TUN_PKT_OFF 50 31 #define ICE_FDIR_MAX_RAW_PKT_SIZE (512 + ICE_FDIR_TUN_PKT_OFF) 32 #define ICE_FDIR_BUF_FULL_MARGIN 10 33 34 /* macros for offsets into packets for flow director programming */ 35 #define ICE_IPV4_SRC_ADDR_OFFSET 26 36 #define ICE_IPV4_DST_ADDR_OFFSET 30 37 #define ICE_IPV4_TCP_SRC_PORT_OFFSET 34 38 #define ICE_IPV4_TCP_DST_PORT_OFFSET 36 39 #define ICE_IPV4_UDP_SRC_PORT_OFFSET 34 40 #define ICE_IPV4_UDP_DST_PORT_OFFSET 36 41 #define ICE_IPV4_SCTP_SRC_PORT_OFFSET 34 42 #define ICE_IPV4_SCTP_DST_PORT_OFFSET 36 43 #define ICE_IPV4_PROTO_OFFSET 23 44 #define ICE_IPV6_SRC_ADDR_OFFSET 22 45 #define ICE_IPV6_DST_ADDR_OFFSET 38 46 #define ICE_IPV6_TCP_SRC_PORT_OFFSET 54 47 #define ICE_IPV6_TCP_DST_PORT_OFFSET 56 48 #define ICE_IPV6_UDP_SRC_PORT_OFFSET 54 49 #define ICE_IPV6_UDP_DST_PORT_OFFSET 56 50 #define ICE_IPV6_SCTP_SRC_PORT_OFFSET 54 51 #define ICE_IPV6_SCTP_DST_PORT_OFFSET 56 52 53 #define ICE_MAC_ETHTYPE_OFFSET 12 54 #define ICE_IPV4_TOS_OFFSET 15 55 #define ICE_IPV4_ID_OFFSET 18 56 #define ICE_IPV4_TTL_OFFSET 22 57 #define ICE_IPV6_TC_OFFSET 14 58 #define ICE_IPV6_HLIM_OFFSET 21 59 #define ICE_IPV6_PROTO_OFFSET 20 60 #define ICE_IPV6_ID_OFFSET 58 61 /* For TUN inner (without inner MAC) */ 62 #define ICE_IPV4_NO_MAC_TOS_OFFSET 1 63 #define ICE_IPV4_NO_MAC_TTL_OFFSET 8 64 #define ICE_IPV4_NO_MAC_PROTO_OFFSET 9 65 #define ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET 12 66 #define ICE_IPV4_NO_MAC_DST_ADDR_OFFSET 16 67 #define ICE_TCP4_NO_MAC_SRC_PORT_OFFSET 20 68 #define ICE_TCP4_NO_MAC_DST_PORT_OFFSET 22 69 #define ICE_UDP4_NO_MAC_SRC_PORT_OFFSET 20 70 #define ICE_UDP4_NO_MAC_DST_PORT_OFFSET 22 71 #define ICE_IPV6_NO_MAC_TC_OFFSET 0 72 #define ICE_IPV6_NO_MAC_HLIM_OFFSET 7 73 #define ICE_IPV6_NO_MAC_PROTO_OFFSET 6 74 #define ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET 8 75 #define ICE_IPV6_NO_MAC_DST_ADDR_OFFSET 24 76 #define ICE_TCP6_NO_MAC_SRC_PORT_OFFSET 40 77 #define ICE_TCP6_NO_MAC_DST_PORT_OFFSET 42 78 #define ICE_UDP6_NO_MAC_SRC_PORT_OFFSET 40 79 #define ICE_UDP6_NO_MAC_DST_PORT_OFFSET 42 80 #define ICE_IPV4_GTPU_TEID_OFFSET 46 81 #define ICE_IPV4_GTPU_QFI_OFFSET 56 82 #define ICE_IPV6_GTPU_TEID_OFFSET 66 83 #define ICE_IPV6_GTPU_QFI_OFFSET 76 84 #define ICE_IPV4_GTPOGRE_TEID_OFFSET 70 85 #define ICE_IPV4_GTPOGRE_QFI_OFFSET 80 86 #define ICE_IPV6_GTPOGRE_TEID_OFFSET 90 87 #define ICE_IPV6_GTPOGRE_QFI_OFFSET 100 88 #define ICE_IPV4_L2TPV3_SESS_ID_OFFSET 34 89 #define ICE_IPV6_L2TPV3_SESS_ID_OFFSET 54 90 #define ICE_IPV4_ESP_SPI_OFFSET 34 91 #define ICE_IPV6_ESP_SPI_OFFSET 54 92 #define ICE_IPV4_AH_SPI_OFFSET 38 93 #define ICE_IPV6_AH_SPI_OFFSET 58 94 #define ICE_IPV4_NAT_T_ESP_SPI_OFFSET 42 95 #define ICE_IPV6_NAT_T_ESP_SPI_OFFSET 62 96 #define ICE_IPV4_VXLAN_VNI_OFFSET 46 97 #define ICE_ECPRI_TP0_PC_ID_OFFSET 18 98 #define ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET 46 99 100 #define ICE_FDIR_MAX_FLTRS 16384 101 102 /* IPv4 has 2 flag bits that enable fragment processing: DF and MF. DF 103 * requests that the packet not be fragmented. MF indicates that a packet has 104 * been fragmented, except that for the last fragment has a non-zero 105 * Fragment Offset field with zero MF. 106 */ 107 #define ICE_FDIR_IPV4_PKT_FLAG_MF 0x20 108 #define ICE_FDIR_IPV4_PKT_FLAG_MF_SHIFT 8 109 #define ICE_FDIR_IPV4_PKT_FLAG_DF 0x40 110 111 /* For IPv6 fragmented packets, all fragments except the last have 112 * the MF flag set. 113 */ 114 #define ICE_FDIR_IPV6_PKT_FLAG_MF 0x100 115 #define ICE_FDIR_IPV6_PKT_FLAG_MF_SHIFT 8 116 117 enum ice_fltr_prgm_desc_dest { 118 ICE_FLTR_PRGM_DESC_DEST_DROP_PKT, 119 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX, 120 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP, 121 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER, 122 }; 123 124 enum ice_fltr_prgm_desc_fd_status { 125 ICE_FLTR_PRGM_DESC_FD_STATUS_NONE, 126 ICE_FLTR_PRGM_DESC_FD_STATUS_FD_ID, 127 ICE_FLTR_PRGM_DESC_FD_STATUS_FD_ID_4FLEX_BYTES, 128 ICE_FLTR_PRGM_DESC_FD_STATUS_8FLEX_BYTES, 129 }; 130 131 /* Flow Director (FD) Filter Programming descriptor */ 132 struct ice_fd_fltr_desc_ctx { 133 u32 fdid; 134 u16 qindex; 135 u16 cnt_index; 136 u16 fd_vsi; 137 u16 flex_val; 138 u8 comp_q; 139 u8 comp_report; 140 u8 fd_space; 141 u8 cnt_ena; 142 u8 evict_ena; 143 u8 toq; 144 u8 toq_prio; 145 u8 dpu_recipe; 146 u8 drop; 147 u8 flex_prio; 148 u8 flex_mdid; 149 u8 dtype; 150 u8 pcmd; 151 u8 desc_prof_prio; 152 u8 desc_prof; 153 u8 swap; 154 u8 fdid_prio; 155 u8 fdid_mdid; 156 }; 157 158 #define ICE_FLTR_PRGM_FLEX_WORD_SIZE sizeof(__be16) 159 160 struct ice_rx_flow_userdef { 161 u16 flex_word; 162 u16 flex_offset; 163 u16 flex_fltr; 164 }; 165 166 struct ice_fdir_v4 { 167 __be32 dst_ip; 168 __be32 src_ip; 169 __be16 dst_port; 170 __be16 src_port; 171 __be32 l4_header; 172 __be32 sec_parm_idx; /* security parameter index */ 173 u8 tos; 174 u8 ip_ver; 175 u8 proto; 176 u8 ttl; 177 __be16 packet_id; 178 }; 179 180 #define ICE_IPV6_ADDR_LEN_AS_U32 4 181 182 struct ice_fdir_v6 { 183 __be32 dst_ip[ICE_IPV6_ADDR_LEN_AS_U32]; 184 __be32 src_ip[ICE_IPV6_ADDR_LEN_AS_U32]; 185 __be16 dst_port; 186 __be16 src_port; 187 __be32 l4_header; /* next header */ 188 __be32 sec_parm_idx; /* security parameter index */ 189 u8 tc; 190 u8 proto; 191 u8 hlim; 192 __be32 packet_id; 193 }; 194 195 struct ice_fdir_udp_gtp { 196 u8 flags; 197 u8 msg_type; 198 __be16 rsrvd_len; 199 __be32 teid; 200 __be16 rsrvd_seq_nbr; 201 u8 rsrvd_n_pdu_nbr; 202 u8 rsrvd_next_ext_type; 203 u8 rsvrd_ext_len; 204 u8 pdu_type:4, 205 spare:4; 206 u8 ppp:1, 207 rqi:1, 208 qfi:6; 209 u32 rsvrd; 210 u8 next_ext; 211 }; 212 213 struct ice_fdir_l2tpv3 { 214 __be32 session_id; 215 }; 216 217 struct ice_fdir_udp_vxlan { 218 __be32 vni; /* 8 bits reserved, always be zero */ 219 }; 220 221 struct ice_fdir_ecpri { 222 __be16 pc_id; 223 }; 224 225 struct ice_fdir_extra { 226 u8 dst_mac[ETH_ALEN]; /* dest MAC address */ 227 u8 src_mac[ETH_ALEN]; /* src MAC address */ 228 __be16 ether_type; /* for NON_IP_L2 */ 229 u32 usr_def[2]; /* user data */ 230 __be16 vlan_type; /* VLAN ethertype */ 231 __be16 vlan_tag; /* VLAN tag info */ 232 }; 233 234 struct ice_fdir_fltr { 235 struct LIST_ENTRY_TYPE fltr_node; 236 enum ice_fltr_ptype flow_type; 237 238 union { 239 struct ice_fdir_v4 v4; 240 struct ice_fdir_v6 v6; 241 } ip, mask; 242 243 /* for tunnel outer part */ 244 union { 245 struct ice_fdir_v4 v4; 246 struct ice_fdir_v6 v6; 247 } ip_outer, mask_outer; 248 249 struct ice_fdir_extra ext_data_outer; 250 struct ice_fdir_extra ext_mask_outer; 251 252 struct ice_fdir_udp_vxlan vxlan_data; 253 struct ice_fdir_udp_vxlan vxlan_mask; 254 255 struct ice_fdir_udp_gtp gtpu_data; 256 struct ice_fdir_udp_gtp gtpu_mask; 257 258 struct ice_fdir_l2tpv3 l2tpv3_data; 259 struct ice_fdir_l2tpv3 l2tpv3_mask; 260 261 struct ice_fdir_ecpri ecpri_data; 262 struct ice_fdir_ecpri ecpri_mask; 263 264 struct ice_fdir_extra ext_data; 265 struct ice_fdir_extra ext_mask; 266 267 /* flex byte filter data */ 268 __be16 flex_word; 269 /* queue region size (=2^q_region) */ 270 u8 q_region; 271 u16 flex_offset; 272 u16 flex_fltr; 273 274 /* filter control */ 275 u16 q_index; 276 u16 dest_vsi; 277 u8 dest_ctl; 278 u8 cnt_ena; 279 u8 fltr_status; 280 u16 cnt_index; 281 u32 fltr_id; 282 u8 fdid_prio; 283 u8 comp_report; 284 /* Set to true for an ACL filter */ 285 bool acl_fltr; 286 }; 287 288 /* Dummy packet filter definition structure */ 289 struct ice_fdir_base_pkt { 290 enum ice_fltr_ptype flow; 291 u16 pkt_len; 292 const u8 *pkt; 293 u16 tun_pkt_len; 294 const u8 *tun_pkt; 295 }; 296 297 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id); 298 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id); 299 enum ice_status 300 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr); 301 enum ice_status 302 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr); 303 enum ice_status 304 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr); 305 enum ice_status 306 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr); 307 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw); 308 void 309 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input, 310 struct ice_fltr_desc *fdesc, bool add); 311 enum ice_status 312 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input, 313 u8 *pkt, bool frag, bool tun); 314 enum ice_status 315 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag); 316 int ice_get_fdir_cnt_all(struct ice_hw *hw); 317 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input); 318 bool ice_fdir_has_frag(enum ice_fltr_ptype flow); 319 struct ice_fdir_fltr * 320 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx); 321 void 322 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, 323 bool acl_fltr, bool add); 324 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input); 325 #endif /* _ICE_FDIR_H_ */ 326