162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright (C) 2018-2020, Intel Corporation. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _ICE_FDIR_H_
562306a36Sopenharmony_ci#define _ICE_FDIR_H_
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#define ICE_FDIR_TUN_PKT_OFF		50
862306a36Sopenharmony_ci#define ICE_FDIR_MAX_RAW_PKT_SIZE	(512 + ICE_FDIR_TUN_PKT_OFF)
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/* macros for offsets into packets for flow director programming */
1162306a36Sopenharmony_ci#define ICE_IPV4_SRC_ADDR_OFFSET	26
1262306a36Sopenharmony_ci#define ICE_IPV4_DST_ADDR_OFFSET	30
1362306a36Sopenharmony_ci#define ICE_IPV4_TCP_SRC_PORT_OFFSET	34
1462306a36Sopenharmony_ci#define ICE_IPV4_TCP_DST_PORT_OFFSET	36
1562306a36Sopenharmony_ci#define ICE_IPV4_UDP_SRC_PORT_OFFSET	34
1662306a36Sopenharmony_ci#define ICE_IPV4_UDP_DST_PORT_OFFSET	36
1762306a36Sopenharmony_ci#define ICE_IPV4_SCTP_SRC_PORT_OFFSET	34
1862306a36Sopenharmony_ci#define ICE_IPV4_SCTP_DST_PORT_OFFSET	36
1962306a36Sopenharmony_ci#define ICE_IPV4_PROTO_OFFSET		23
2062306a36Sopenharmony_ci#define ICE_IPV6_SRC_ADDR_OFFSET	22
2162306a36Sopenharmony_ci#define ICE_IPV6_DST_ADDR_OFFSET	38
2262306a36Sopenharmony_ci#define ICE_IPV6_TCP_SRC_PORT_OFFSET	54
2362306a36Sopenharmony_ci#define ICE_IPV6_TCP_DST_PORT_OFFSET	56
2462306a36Sopenharmony_ci#define ICE_IPV6_UDP_SRC_PORT_OFFSET	54
2562306a36Sopenharmony_ci#define ICE_IPV6_UDP_DST_PORT_OFFSET	56
2662306a36Sopenharmony_ci#define ICE_IPV6_SCTP_SRC_PORT_OFFSET	54
2762306a36Sopenharmony_ci#define ICE_IPV6_SCTP_DST_PORT_OFFSET	56
2862306a36Sopenharmony_ci#define ICE_MAC_ETHTYPE_OFFSET		12
2962306a36Sopenharmony_ci#define ICE_IPV4_TOS_OFFSET		15
3062306a36Sopenharmony_ci#define ICE_IPV4_TTL_OFFSET		22
3162306a36Sopenharmony_ci#define ICE_IPV6_TC_OFFSET		14
3262306a36Sopenharmony_ci#define ICE_IPV6_HLIM_OFFSET		21
3362306a36Sopenharmony_ci#define ICE_IPV6_PROTO_OFFSET		20
3462306a36Sopenharmony_ci#define ICE_IPV4_GTPU_TEID_OFFSET	46
3562306a36Sopenharmony_ci#define ICE_IPV4_GTPU_QFI_OFFSET	56
3662306a36Sopenharmony_ci#define ICE_IPV4_L2TPV3_SESS_ID_OFFSET	34
3762306a36Sopenharmony_ci#define ICE_IPV6_L2TPV3_SESS_ID_OFFSET	54
3862306a36Sopenharmony_ci#define ICE_IPV4_ESP_SPI_OFFSET		34
3962306a36Sopenharmony_ci#define ICE_IPV6_ESP_SPI_OFFSET		54
4062306a36Sopenharmony_ci#define ICE_IPV4_AH_SPI_OFFSET		38
4162306a36Sopenharmony_ci#define ICE_IPV6_AH_SPI_OFFSET		58
4262306a36Sopenharmony_ci#define ICE_IPV4_NAT_T_ESP_SPI_OFFSET	42
4362306a36Sopenharmony_ci#define ICE_IPV6_NAT_T_ESP_SPI_OFFSET	62
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#define ICE_FDIR_MAX_FLTRS		16384
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/* IP v4 has 2 flag bits that enable fragment processing: DF and MF. DF
4862306a36Sopenharmony_ci * requests that the packet not be fragmented. MF indicates that a packet has
4962306a36Sopenharmony_ci * been fragmented.
5062306a36Sopenharmony_ci */
5162306a36Sopenharmony_ci#define ICE_FDIR_IPV4_PKT_FLAG_MF		0x20
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cienum ice_fltr_prgm_desc_dest {
5462306a36Sopenharmony_ci	ICE_FLTR_PRGM_DESC_DEST_DROP_PKT,
5562306a36Sopenharmony_ci	ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX,
5662306a36Sopenharmony_ci	ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP,
5762306a36Sopenharmony_ci	ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER,
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cienum ice_fltr_prgm_desc_fd_status {
6162306a36Sopenharmony_ci	ICE_FLTR_PRGM_DESC_FD_STATUS_NONE,
6262306a36Sopenharmony_ci	ICE_FLTR_PRGM_DESC_FD_STATUS_FD_ID,
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci/* Flow Director (FD) Filter Programming descriptor */
6662306a36Sopenharmony_cistruct ice_fd_fltr_desc_ctx {
6762306a36Sopenharmony_ci	u32 fdid;
6862306a36Sopenharmony_ci	u16 qindex;
6962306a36Sopenharmony_ci	u16 cnt_index;
7062306a36Sopenharmony_ci	u16 fd_vsi;
7162306a36Sopenharmony_ci	u16 flex_val;
7262306a36Sopenharmony_ci	u8 comp_q;
7362306a36Sopenharmony_ci	u8 comp_report;
7462306a36Sopenharmony_ci	u8 fd_space;
7562306a36Sopenharmony_ci	u8 cnt_ena;
7662306a36Sopenharmony_ci	u8 evict_ena;
7762306a36Sopenharmony_ci	u8 toq;
7862306a36Sopenharmony_ci	u8 toq_prio;
7962306a36Sopenharmony_ci	u8 dpu_recipe;
8062306a36Sopenharmony_ci	u8 drop;
8162306a36Sopenharmony_ci	u8 flex_prio;
8262306a36Sopenharmony_ci	u8 flex_mdid;
8362306a36Sopenharmony_ci	u8 dtype;
8462306a36Sopenharmony_ci	u8 pcmd;
8562306a36Sopenharmony_ci	u8 desc_prof_prio;
8662306a36Sopenharmony_ci	u8 desc_prof;
8762306a36Sopenharmony_ci	u8 swap;
8862306a36Sopenharmony_ci	u8 fdid_prio;
8962306a36Sopenharmony_ci	u8 fdid_mdid;
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci#define ICE_FLTR_PRGM_FLEX_WORD_SIZE	sizeof(__be16)
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistruct ice_rx_flow_userdef {
9562306a36Sopenharmony_ci	u16 flex_word;
9662306a36Sopenharmony_ci	u16 flex_offset;
9762306a36Sopenharmony_ci	u16 flex_fltr;
9862306a36Sopenharmony_ci};
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cistruct ice_fdir_v4 {
10162306a36Sopenharmony_ci	__be32 dst_ip;
10262306a36Sopenharmony_ci	__be32 src_ip;
10362306a36Sopenharmony_ci	__be16 dst_port;
10462306a36Sopenharmony_ci	__be16 src_port;
10562306a36Sopenharmony_ci	__be32 l4_header;
10662306a36Sopenharmony_ci	__be32 sec_parm_idx;	/* security parameter index */
10762306a36Sopenharmony_ci	u8 tos;
10862306a36Sopenharmony_ci	u8 ip_ver;
10962306a36Sopenharmony_ci	u8 proto;
11062306a36Sopenharmony_ci	u8 ttl;
11162306a36Sopenharmony_ci};
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci#define ICE_IPV6_ADDR_LEN_AS_U32		4
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cistruct ice_fdir_v6 {
11662306a36Sopenharmony_ci	__be32 dst_ip[ICE_IPV6_ADDR_LEN_AS_U32];
11762306a36Sopenharmony_ci	__be32 src_ip[ICE_IPV6_ADDR_LEN_AS_U32];
11862306a36Sopenharmony_ci	__be16 dst_port;
11962306a36Sopenharmony_ci	__be16 src_port;
12062306a36Sopenharmony_ci	__be32 l4_header; /* next header */
12162306a36Sopenharmony_ci	__be32 sec_parm_idx; /* security parameter index */
12262306a36Sopenharmony_ci	u8 tc;
12362306a36Sopenharmony_ci	u8 proto;
12462306a36Sopenharmony_ci	u8 hlim;
12562306a36Sopenharmony_ci};
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_cistruct ice_fdir_udp_gtp {
12862306a36Sopenharmony_ci	u8 flags;
12962306a36Sopenharmony_ci	u8 msg_type;
13062306a36Sopenharmony_ci	__be16 rsrvd_len;
13162306a36Sopenharmony_ci	__be32 teid;
13262306a36Sopenharmony_ci	__be16 rsrvd_seq_nbr;
13362306a36Sopenharmony_ci	u8 rsrvd_n_pdu_nbr;
13462306a36Sopenharmony_ci	u8 rsrvd_next_ext_type;
13562306a36Sopenharmony_ci	u8 rsvrd_ext_len;
13662306a36Sopenharmony_ci	u8	pdu_type:4,
13762306a36Sopenharmony_ci		spare:4;
13862306a36Sopenharmony_ci	u8	ppp:1,
13962306a36Sopenharmony_ci		rqi:1,
14062306a36Sopenharmony_ci		qfi:6;
14162306a36Sopenharmony_ci	u32 rsvrd;
14262306a36Sopenharmony_ci	u8 next_ext;
14362306a36Sopenharmony_ci};
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_cistruct ice_fdir_l2tpv3 {
14662306a36Sopenharmony_ci	__be32 session_id;
14762306a36Sopenharmony_ci};
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_cistruct ice_fdir_extra {
15062306a36Sopenharmony_ci	u8 dst_mac[ETH_ALEN];	/* dest MAC address */
15162306a36Sopenharmony_ci	u8 src_mac[ETH_ALEN];	/* src MAC address */
15262306a36Sopenharmony_ci	__be16 ether_type;	/* for NON_IP_L2 */
15362306a36Sopenharmony_ci	u32 usr_def[2];		/* user data */
15462306a36Sopenharmony_ci	__be16 vlan_type;	/* VLAN ethertype */
15562306a36Sopenharmony_ci	__be16 vlan_tag;	/* VLAN tag info */
15662306a36Sopenharmony_ci};
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_cistruct ice_fdir_fltr {
15962306a36Sopenharmony_ci	struct list_head fltr_node;
16062306a36Sopenharmony_ci	enum ice_fltr_ptype flow_type;
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	union {
16362306a36Sopenharmony_ci		struct ice_fdir_v4 v4;
16462306a36Sopenharmony_ci		struct ice_fdir_v6 v6;
16562306a36Sopenharmony_ci	} ip, mask;
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci	struct ice_fdir_udp_gtp gtpu_data;
16862306a36Sopenharmony_ci	struct ice_fdir_udp_gtp gtpu_mask;
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci	struct ice_fdir_l2tpv3 l2tpv3_data;
17162306a36Sopenharmony_ci	struct ice_fdir_l2tpv3 l2tpv3_mask;
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	struct ice_fdir_extra ext_data;
17462306a36Sopenharmony_ci	struct ice_fdir_extra ext_mask;
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci	/* flex byte filter data */
17762306a36Sopenharmony_ci	__be16 flex_word;
17862306a36Sopenharmony_ci	/* queue region size (=2^q_region) */
17962306a36Sopenharmony_ci	u8 q_region;
18062306a36Sopenharmony_ci	u16 flex_offset;
18162306a36Sopenharmony_ci	u16 flex_fltr;
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci	/* filter control */
18462306a36Sopenharmony_ci	u16 q_index;
18562306a36Sopenharmony_ci	u16 orig_q_index;
18662306a36Sopenharmony_ci	u16 dest_vsi;
18762306a36Sopenharmony_ci	u8 dest_ctl;
18862306a36Sopenharmony_ci	u8 cnt_ena;
18962306a36Sopenharmony_ci	u8 fltr_status;
19062306a36Sopenharmony_ci	u16 cnt_index;
19162306a36Sopenharmony_ci	u32 fltr_id;
19262306a36Sopenharmony_ci	u8 fdid_prio;
19362306a36Sopenharmony_ci	u8 comp_report;
19462306a36Sopenharmony_ci};
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci/* Dummy packet filter definition structure */
19762306a36Sopenharmony_cistruct ice_fdir_base_pkt {
19862306a36Sopenharmony_ci	enum ice_fltr_ptype flow;
19962306a36Sopenharmony_ci	u16 pkt_len;
20062306a36Sopenharmony_ci	const u8 *pkt;
20162306a36Sopenharmony_ci	u16 tun_pkt_len;
20262306a36Sopenharmony_ci	const u8 *tun_pkt;
20362306a36Sopenharmony_ci};
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ciint ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id);
20662306a36Sopenharmony_ciint ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id);
20762306a36Sopenharmony_ciint ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr);
20862306a36Sopenharmony_ciint ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr);
20962306a36Sopenharmony_civoid
21062306a36Sopenharmony_ciice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
21162306a36Sopenharmony_ci		       struct ice_fltr_desc *fdesc, bool add);
21262306a36Sopenharmony_ciint
21362306a36Sopenharmony_ciice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
21462306a36Sopenharmony_ci			  u8 *pkt, bool frag, bool tun);
21562306a36Sopenharmony_ciint ice_get_fdir_cnt_all(struct ice_hw *hw);
21662306a36Sopenharmony_cibool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input);
21762306a36Sopenharmony_cibool ice_fdir_has_frag(enum ice_fltr_ptype flow);
21862306a36Sopenharmony_cistruct ice_fdir_fltr *
21962306a36Sopenharmony_ciice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx);
22062306a36Sopenharmony_civoid
22162306a36Sopenharmony_ciice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add);
22262306a36Sopenharmony_civoid ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input);
22362306a36Sopenharmony_ci#endif /* _ICE_FDIR_H_ */
224