0001
0002
0003
0004 #ifndef _ICE_FDIR_H_
0005 #define _ICE_FDIR_H_
0006
0007 #define ICE_FDIR_TUN_PKT_OFF 50
0008 #define ICE_FDIR_MAX_RAW_PKT_SIZE (512 + ICE_FDIR_TUN_PKT_OFF)
0009
0010
0011 #define ICE_IPV4_SRC_ADDR_OFFSET 26
0012 #define ICE_IPV4_DST_ADDR_OFFSET 30
0013 #define ICE_IPV4_TCP_SRC_PORT_OFFSET 34
0014 #define ICE_IPV4_TCP_DST_PORT_OFFSET 36
0015 #define ICE_IPV4_UDP_SRC_PORT_OFFSET 34
0016 #define ICE_IPV4_UDP_DST_PORT_OFFSET 36
0017 #define ICE_IPV4_SCTP_SRC_PORT_OFFSET 34
0018 #define ICE_IPV4_SCTP_DST_PORT_OFFSET 36
0019 #define ICE_IPV4_PROTO_OFFSET 23
0020 #define ICE_IPV6_SRC_ADDR_OFFSET 22
0021 #define ICE_IPV6_DST_ADDR_OFFSET 38
0022 #define ICE_IPV6_TCP_SRC_PORT_OFFSET 54
0023 #define ICE_IPV6_TCP_DST_PORT_OFFSET 56
0024 #define ICE_IPV6_UDP_SRC_PORT_OFFSET 54
0025 #define ICE_IPV6_UDP_DST_PORT_OFFSET 56
0026 #define ICE_IPV6_SCTP_SRC_PORT_OFFSET 54
0027 #define ICE_IPV6_SCTP_DST_PORT_OFFSET 56
0028 #define ICE_MAC_ETHTYPE_OFFSET 12
0029 #define ICE_IPV4_TOS_OFFSET 15
0030 #define ICE_IPV4_TTL_OFFSET 22
0031 #define ICE_IPV6_TC_OFFSET 14
0032 #define ICE_IPV6_HLIM_OFFSET 21
0033 #define ICE_IPV6_PROTO_OFFSET 20
0034 #define ICE_IPV4_GTPU_TEID_OFFSET 46
0035 #define ICE_IPV4_GTPU_QFI_OFFSET 56
0036 #define ICE_IPV4_L2TPV3_SESS_ID_OFFSET 34
0037 #define ICE_IPV6_L2TPV3_SESS_ID_OFFSET 54
0038 #define ICE_IPV4_ESP_SPI_OFFSET 34
0039 #define ICE_IPV6_ESP_SPI_OFFSET 54
0040 #define ICE_IPV4_AH_SPI_OFFSET 38
0041 #define ICE_IPV6_AH_SPI_OFFSET 58
0042 #define ICE_IPV4_NAT_T_ESP_SPI_OFFSET 42
0043 #define ICE_IPV6_NAT_T_ESP_SPI_OFFSET 62
0044
0045 #define ICE_FDIR_MAX_FLTRS 16384
0046
0047
0048
0049
0050
0051 #define ICE_FDIR_IPV4_PKT_FLAG_MF 0x20
0052
0053 enum ice_fltr_prgm_desc_dest {
0054 ICE_FLTR_PRGM_DESC_DEST_DROP_PKT,
0055 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX,
0056 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP,
0057 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER,
0058 };
0059
0060 enum ice_fltr_prgm_desc_fd_status {
0061 ICE_FLTR_PRGM_DESC_FD_STATUS_NONE,
0062 ICE_FLTR_PRGM_DESC_FD_STATUS_FD_ID,
0063 };
0064
0065
0066 struct ice_fd_fltr_desc_ctx {
0067 u32 fdid;
0068 u16 qindex;
0069 u16 cnt_index;
0070 u16 fd_vsi;
0071 u16 flex_val;
0072 u8 comp_q;
0073 u8 comp_report;
0074 u8 fd_space;
0075 u8 cnt_ena;
0076 u8 evict_ena;
0077 u8 toq;
0078 u8 toq_prio;
0079 u8 dpu_recipe;
0080 u8 drop;
0081 u8 flex_prio;
0082 u8 flex_mdid;
0083 u8 dtype;
0084 u8 pcmd;
0085 u8 desc_prof_prio;
0086 u8 desc_prof;
0087 u8 swap;
0088 u8 fdid_prio;
0089 u8 fdid_mdid;
0090 };
0091
0092 #define ICE_FLTR_PRGM_FLEX_WORD_SIZE sizeof(__be16)
0093
0094 struct ice_rx_flow_userdef {
0095 u16 flex_word;
0096 u16 flex_offset;
0097 u16 flex_fltr;
0098 };
0099
0100 struct ice_fdir_v4 {
0101 __be32 dst_ip;
0102 __be32 src_ip;
0103 __be16 dst_port;
0104 __be16 src_port;
0105 __be32 l4_header;
0106 __be32 sec_parm_idx;
0107 u8 tos;
0108 u8 ip_ver;
0109 u8 proto;
0110 u8 ttl;
0111 };
0112
0113 #define ICE_IPV6_ADDR_LEN_AS_U32 4
0114
0115 struct ice_fdir_v6 {
0116 __be32 dst_ip[ICE_IPV6_ADDR_LEN_AS_U32];
0117 __be32 src_ip[ICE_IPV6_ADDR_LEN_AS_U32];
0118 __be16 dst_port;
0119 __be16 src_port;
0120 __be32 l4_header;
0121 __be32 sec_parm_idx;
0122 u8 tc;
0123 u8 proto;
0124 u8 hlim;
0125 };
0126
0127 struct ice_fdir_udp_gtp {
0128 u8 flags;
0129 u8 msg_type;
0130 __be16 rsrvd_len;
0131 __be32 teid;
0132 __be16 rsrvd_seq_nbr;
0133 u8 rsrvd_n_pdu_nbr;
0134 u8 rsrvd_next_ext_type;
0135 u8 rsvrd_ext_len;
0136 u8 pdu_type:4,
0137 spare:4;
0138 u8 ppp:1,
0139 rqi:1,
0140 qfi:6;
0141 u32 rsvrd;
0142 u8 next_ext;
0143 };
0144
0145 struct ice_fdir_l2tpv3 {
0146 __be32 session_id;
0147 };
0148
0149 struct ice_fdir_extra {
0150 u8 dst_mac[ETH_ALEN];
0151 u8 src_mac[ETH_ALEN];
0152 __be16 ether_type;
0153 u32 usr_def[2];
0154 __be16 vlan_type;
0155 __be16 vlan_tag;
0156 };
0157
0158 struct ice_fdir_fltr {
0159 struct list_head fltr_node;
0160 enum ice_fltr_ptype flow_type;
0161
0162 union {
0163 struct ice_fdir_v4 v4;
0164 struct ice_fdir_v6 v6;
0165 } ip, mask;
0166
0167 struct ice_fdir_udp_gtp gtpu_data;
0168 struct ice_fdir_udp_gtp gtpu_mask;
0169
0170 struct ice_fdir_l2tpv3 l2tpv3_data;
0171 struct ice_fdir_l2tpv3 l2tpv3_mask;
0172
0173 struct ice_fdir_extra ext_data;
0174 struct ice_fdir_extra ext_mask;
0175
0176
0177 __be16 flex_word;
0178
0179 u8 q_region;
0180 u16 flex_offset;
0181 u16 flex_fltr;
0182
0183
0184 u16 q_index;
0185 u16 orig_q_index;
0186 u16 dest_vsi;
0187 u8 dest_ctl;
0188 u8 cnt_ena;
0189 u8 fltr_status;
0190 u16 cnt_index;
0191 u32 fltr_id;
0192 u8 fdid_prio;
0193 u8 comp_report;
0194 };
0195
0196
0197 struct ice_fdir_base_pkt {
0198 enum ice_fltr_ptype flow;
0199 u16 pkt_len;
0200 const u8 *pkt;
0201 u16 tun_pkt_len;
0202 const u8 *tun_pkt;
0203 };
0204
0205 int ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id);
0206 int ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id);
0207 int ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr);
0208 int ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr);
0209 void
0210 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
0211 struct ice_fltr_desc *fdesc, bool add);
0212 int
0213 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
0214 u8 *pkt, bool frag, bool tun);
0215 int ice_get_fdir_cnt_all(struct ice_hw *hw);
0216 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input);
0217 bool ice_fdir_has_frag(enum ice_fltr_ptype flow);
0218 struct ice_fdir_fltr *
0219 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx);
0220 void
0221 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add);
0222 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input);
0223 #endif