162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB */
262306a36Sopenharmony_ci/* Copyright (c) 2015 - 2021 Intel Corporation */
362306a36Sopenharmony_ci#ifndef IRDMA_CM_H
462306a36Sopenharmony_ci#define IRDMA_CM_H
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#define IRDMA_MPA_REQUEST_ACCEPT	1
762306a36Sopenharmony_ci#define IRDMA_MPA_REQUEST_REJECT	2
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/* IETF MPA -- defines */
1062306a36Sopenharmony_ci#define IEFT_MPA_KEY_REQ	"MPA ID Req Frame"
1162306a36Sopenharmony_ci#define IEFT_MPA_KEY_REP	"MPA ID Rep Frame"
1262306a36Sopenharmony_ci#define IETF_MPA_KEY_SIZE	16
1362306a36Sopenharmony_ci#define IETF_MPA_VER		1
1462306a36Sopenharmony_ci#define IETF_MAX_PRIV_DATA_LEN	512
1562306a36Sopenharmony_ci#define IETF_MPA_FRAME_SIZE	20
1662306a36Sopenharmony_ci#define IETF_RTR_MSG_SIZE	4
1762306a36Sopenharmony_ci#define IETF_MPA_V2_FLAG	0x10
1862306a36Sopenharmony_ci#define SNDMARKER_SEQNMASK	0x000001ff
1962306a36Sopenharmony_ci#define IRDMA_MAX_IETF_SIZE	32
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* IETF RTR MSG Fields */
2262306a36Sopenharmony_ci#define IETF_PEER_TO_PEER	0x8000
2362306a36Sopenharmony_ci#define IETF_FLPDU_ZERO_LEN	0x4000
2462306a36Sopenharmony_ci#define IETF_RDMA0_WRITE	0x8000
2562306a36Sopenharmony_ci#define IETF_RDMA0_READ		0x4000
2662306a36Sopenharmony_ci#define IETF_NO_IRD_ORD		0x3fff
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define MAX_PORTS	65536
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define IRDMA_PASSIVE_STATE_INDICATED	0
3162306a36Sopenharmony_ci#define IRDMA_DO_NOT_SEND_RESET_EVENT	1
3262306a36Sopenharmony_ci#define IRDMA_SEND_RESET_EVENT		2
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define MAX_IRDMA_IFS	4
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define SET_ACK		1
3762306a36Sopenharmony_ci#define SET_SYN		2
3862306a36Sopenharmony_ci#define SET_FIN		4
3962306a36Sopenharmony_ci#define SET_RST		8
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define TCP_OPTIONS_PADDING	3
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define IRDMA_DEFAULT_RETRYS	64
4462306a36Sopenharmony_ci#define IRDMA_DEFAULT_RETRANS	32
4562306a36Sopenharmony_ci#define IRDMA_DEFAULT_TTL		0x40
4662306a36Sopenharmony_ci#define IRDMA_DEFAULT_RTT_VAR		6
4762306a36Sopenharmony_ci#define IRDMA_DEFAULT_SS_THRESH		0x3fffffff
4862306a36Sopenharmony_ci#define IRDMA_DEFAULT_REXMIT_THRESH	8
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define IRDMA_RETRY_TIMEOUT	HZ
5162306a36Sopenharmony_ci#define IRDMA_SHORT_TIME	10
5262306a36Sopenharmony_ci#define IRDMA_LONG_TIME		(2 * HZ)
5362306a36Sopenharmony_ci#define IRDMA_MAX_TIMEOUT	((unsigned long)(12 * HZ))
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define IRDMA_CM_HASHTABLE_SIZE		1024
5662306a36Sopenharmony_ci#define IRDMA_CM_TCP_TIMER_INTERVAL	3000
5762306a36Sopenharmony_ci#define IRDMA_CM_DEFAULT_MTU		1540
5862306a36Sopenharmony_ci#define IRDMA_CM_DEFAULT_FRAME_CNT	10
5962306a36Sopenharmony_ci#define IRDMA_CM_THREAD_STACK_SIZE	256
6062306a36Sopenharmony_ci#define IRDMA_CM_DEFAULT_RCV_WND	64240
6162306a36Sopenharmony_ci#define IRDMA_CM_DEFAULT_RCV_WND_SCALED	0x3FFFC
6262306a36Sopenharmony_ci#define IRDMA_CM_DEFAULT_RCV_WND_SCALE	2
6362306a36Sopenharmony_ci#define IRDMA_CM_DEFAULT_FREE_PKTS	10
6462306a36Sopenharmony_ci#define IRDMA_CM_FREE_PKT_LO_WATERMARK	2
6562306a36Sopenharmony_ci#define IRDMA_CM_DEFAULT_MSS		536
6662306a36Sopenharmony_ci#define IRDMA_CM_DEFAULT_MPA_VER	2
6762306a36Sopenharmony_ci#define IRDMA_CM_DEFAULT_SEQ		0x159bf75f
6862306a36Sopenharmony_ci#define IRDMA_CM_DEFAULT_LOCAL_ID	0x3b47
6962306a36Sopenharmony_ci#define IRDMA_CM_DEFAULT_SEQ2		0x18ed5740
7062306a36Sopenharmony_ci#define IRDMA_CM_DEFAULT_LOCAL_ID2	0xb807
7162306a36Sopenharmony_ci#define IRDMA_MAX_CM_BUF		(IRDMA_MAX_IETF_SIZE + IETF_MAX_PRIV_DATA_LEN)
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cienum ietf_mpa_flags {
7462306a36Sopenharmony_ci	IETF_MPA_FLAGS_REJECT  = 0x20,
7562306a36Sopenharmony_ci	IETF_MPA_FLAGS_CRC     = 0x40,
7662306a36Sopenharmony_ci	IETF_MPA_FLAGS_MARKERS = 0x80,
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cienum irdma_timer_type {
8062306a36Sopenharmony_ci	IRDMA_TIMER_TYPE_SEND,
8162306a36Sopenharmony_ci	IRDMA_TIMER_TYPE_CLOSE,
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cienum option_nums {
8562306a36Sopenharmony_ci	OPTION_NUM_EOL,
8662306a36Sopenharmony_ci	OPTION_NUM_NONE,
8762306a36Sopenharmony_ci	OPTION_NUM_MSS,
8862306a36Sopenharmony_ci	OPTION_NUM_WINDOW_SCALE,
8962306a36Sopenharmony_ci	OPTION_NUM_SACK_PERM,
9062306a36Sopenharmony_ci	OPTION_NUM_SACK,
9162306a36Sopenharmony_ci	OPTION_NUM_WRITE0 = 0xbc,
9262306a36Sopenharmony_ci};
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* cm node transition states */
9562306a36Sopenharmony_cienum irdma_cm_node_state {
9662306a36Sopenharmony_ci	IRDMA_CM_STATE_UNKNOWN,
9762306a36Sopenharmony_ci	IRDMA_CM_STATE_INITED,
9862306a36Sopenharmony_ci	IRDMA_CM_STATE_LISTENING,
9962306a36Sopenharmony_ci	IRDMA_CM_STATE_SYN_RCVD,
10062306a36Sopenharmony_ci	IRDMA_CM_STATE_SYN_SENT,
10162306a36Sopenharmony_ci	IRDMA_CM_STATE_ONE_SIDE_ESTABLISHED,
10262306a36Sopenharmony_ci	IRDMA_CM_STATE_ESTABLISHED,
10362306a36Sopenharmony_ci	IRDMA_CM_STATE_ACCEPTING,
10462306a36Sopenharmony_ci	IRDMA_CM_STATE_MPAREQ_SENT,
10562306a36Sopenharmony_ci	IRDMA_CM_STATE_MPAREQ_RCVD,
10662306a36Sopenharmony_ci	IRDMA_CM_STATE_MPAREJ_RCVD,
10762306a36Sopenharmony_ci	IRDMA_CM_STATE_OFFLOADED,
10862306a36Sopenharmony_ci	IRDMA_CM_STATE_FIN_WAIT1,
10962306a36Sopenharmony_ci	IRDMA_CM_STATE_FIN_WAIT2,
11062306a36Sopenharmony_ci	IRDMA_CM_STATE_CLOSE_WAIT,
11162306a36Sopenharmony_ci	IRDMA_CM_STATE_TIME_WAIT,
11262306a36Sopenharmony_ci	IRDMA_CM_STATE_LAST_ACK,
11362306a36Sopenharmony_ci	IRDMA_CM_STATE_CLOSING,
11462306a36Sopenharmony_ci	IRDMA_CM_STATE_LISTENER_DESTROYED,
11562306a36Sopenharmony_ci	IRDMA_CM_STATE_CLOSED,
11662306a36Sopenharmony_ci};
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_cienum mpa_frame_ver {
11962306a36Sopenharmony_ci	IETF_MPA_V1 = 1,
12062306a36Sopenharmony_ci	IETF_MPA_V2 = 2,
12162306a36Sopenharmony_ci};
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cienum mpa_frame_key {
12462306a36Sopenharmony_ci	MPA_KEY_REQUEST,
12562306a36Sopenharmony_ci	MPA_KEY_REPLY,
12662306a36Sopenharmony_ci};
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_cienum send_rdma0 {
12962306a36Sopenharmony_ci	SEND_RDMA_READ_ZERO  = 1,
13062306a36Sopenharmony_ci	SEND_RDMA_WRITE_ZERO = 2,
13162306a36Sopenharmony_ci};
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_cienum irdma_tcpip_pkt_type {
13462306a36Sopenharmony_ci	IRDMA_PKT_TYPE_UNKNOWN,
13562306a36Sopenharmony_ci	IRDMA_PKT_TYPE_SYN,
13662306a36Sopenharmony_ci	IRDMA_PKT_TYPE_SYNACK,
13762306a36Sopenharmony_ci	IRDMA_PKT_TYPE_ACK,
13862306a36Sopenharmony_ci	IRDMA_PKT_TYPE_FIN,
13962306a36Sopenharmony_ci	IRDMA_PKT_TYPE_RST,
14062306a36Sopenharmony_ci};
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_cienum irdma_cm_listener_state {
14362306a36Sopenharmony_ci	IRDMA_CM_LISTENER_PASSIVE_STATE = 1,
14462306a36Sopenharmony_ci	IRDMA_CM_LISTENER_ACTIVE_STATE  = 2,
14562306a36Sopenharmony_ci	IRDMA_CM_LISTENER_EITHER_STATE  = 3,
14662306a36Sopenharmony_ci};
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci/* CM event codes */
14962306a36Sopenharmony_cienum irdma_cm_event_type {
15062306a36Sopenharmony_ci	IRDMA_CM_EVENT_UNKNOWN,
15162306a36Sopenharmony_ci	IRDMA_CM_EVENT_ESTABLISHED,
15262306a36Sopenharmony_ci	IRDMA_CM_EVENT_MPA_REQ,
15362306a36Sopenharmony_ci	IRDMA_CM_EVENT_MPA_CONNECT,
15462306a36Sopenharmony_ci	IRDMA_CM_EVENT_MPA_ACCEPT,
15562306a36Sopenharmony_ci	IRDMA_CM_EVENT_MPA_REJECT,
15662306a36Sopenharmony_ci	IRDMA_CM_EVENT_MPA_ESTABLISHED,
15762306a36Sopenharmony_ci	IRDMA_CM_EVENT_CONNECTED,
15862306a36Sopenharmony_ci	IRDMA_CM_EVENT_RESET,
15962306a36Sopenharmony_ci	IRDMA_CM_EVENT_ABORTED,
16062306a36Sopenharmony_ci};
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_cistruct ietf_mpa_v1 {
16362306a36Sopenharmony_ci	u8 key[IETF_MPA_KEY_SIZE];
16462306a36Sopenharmony_ci	u8 flags;
16562306a36Sopenharmony_ci	u8 rev;
16662306a36Sopenharmony_ci	__be16 priv_data_len;
16762306a36Sopenharmony_ci	u8 priv_data[];
16862306a36Sopenharmony_ci};
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_cistruct ietf_rtr_msg {
17162306a36Sopenharmony_ci	__be16 ctrl_ird;
17262306a36Sopenharmony_ci	__be16 ctrl_ord;
17362306a36Sopenharmony_ci};
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_cistruct ietf_mpa_v2 {
17662306a36Sopenharmony_ci	u8 key[IETF_MPA_KEY_SIZE];
17762306a36Sopenharmony_ci	u8 flags;
17862306a36Sopenharmony_ci	u8 rev;
17962306a36Sopenharmony_ci	__be16 priv_data_len;
18062306a36Sopenharmony_ci	struct ietf_rtr_msg rtr_msg;
18162306a36Sopenharmony_ci	u8 priv_data[];
18262306a36Sopenharmony_ci};
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_cistruct option_base {
18562306a36Sopenharmony_ci	u8 optionnum;
18662306a36Sopenharmony_ci	u8 len;
18762306a36Sopenharmony_ci};
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cistruct option_mss {
19062306a36Sopenharmony_ci	u8 optionnum;
19162306a36Sopenharmony_ci	u8 len;
19262306a36Sopenharmony_ci	__be16 mss;
19362306a36Sopenharmony_ci};
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_cistruct option_windowscale {
19662306a36Sopenharmony_ci	u8 optionnum;
19762306a36Sopenharmony_ci	u8 len;
19862306a36Sopenharmony_ci	u8 shiftcount;
19962306a36Sopenharmony_ci};
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ciunion all_known_options {
20262306a36Sopenharmony_ci	char eol;
20362306a36Sopenharmony_ci	struct option_base base;
20462306a36Sopenharmony_ci	struct option_mss mss;
20562306a36Sopenharmony_ci	struct option_windowscale windowscale;
20662306a36Sopenharmony_ci};
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_cistruct irdma_timer_entry {
20962306a36Sopenharmony_ci	struct list_head list;
21062306a36Sopenharmony_ci	unsigned long timetosend; /* jiffies */
21162306a36Sopenharmony_ci	struct irdma_puda_buf *sqbuf;
21262306a36Sopenharmony_ci	u32 type;
21362306a36Sopenharmony_ci	u32 retrycount;
21462306a36Sopenharmony_ci	u32 retranscount;
21562306a36Sopenharmony_ci	u32 context;
21662306a36Sopenharmony_ci	u32 send_retrans;
21762306a36Sopenharmony_ci	int close_when_complete;
21862306a36Sopenharmony_ci};
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci/* CM context params */
22162306a36Sopenharmony_cistruct irdma_cm_tcp_context {
22262306a36Sopenharmony_ci	u8 client;
22362306a36Sopenharmony_ci	u32 loc_seq_num;
22462306a36Sopenharmony_ci	u32 loc_ack_num;
22562306a36Sopenharmony_ci	u32 rem_ack_num;
22662306a36Sopenharmony_ci	u32 rcv_nxt;
22762306a36Sopenharmony_ci	u32 loc_id;
22862306a36Sopenharmony_ci	u32 rem_id;
22962306a36Sopenharmony_ci	u32 snd_wnd;
23062306a36Sopenharmony_ci	u32 max_snd_wnd;
23162306a36Sopenharmony_ci	u32 rcv_wnd;
23262306a36Sopenharmony_ci	u32 mss;
23362306a36Sopenharmony_ci	u8 snd_wscale;
23462306a36Sopenharmony_ci	u8 rcv_wscale;
23562306a36Sopenharmony_ci};
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_cistruct irdma_apbvt_entry {
23862306a36Sopenharmony_ci	struct hlist_node hlist;
23962306a36Sopenharmony_ci	u32 use_cnt;
24062306a36Sopenharmony_ci	u16 port;
24162306a36Sopenharmony_ci};
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_cistruct irdma_cm_listener {
24462306a36Sopenharmony_ci	struct list_head list;
24562306a36Sopenharmony_ci	struct iw_cm_id *cm_id;
24662306a36Sopenharmony_ci	struct irdma_cm_core *cm_core;
24762306a36Sopenharmony_ci	struct irdma_device *iwdev;
24862306a36Sopenharmony_ci	struct list_head child_listen_list;
24962306a36Sopenharmony_ci	struct irdma_apbvt_entry *apbvt_entry;
25062306a36Sopenharmony_ci	enum irdma_cm_listener_state listener_state;
25162306a36Sopenharmony_ci	refcount_t refcnt;
25262306a36Sopenharmony_ci	atomic_t pend_accepts_cnt;
25362306a36Sopenharmony_ci	u32 loc_addr[4];
25462306a36Sopenharmony_ci	u32 reused_node;
25562306a36Sopenharmony_ci	int backlog;
25662306a36Sopenharmony_ci	u16 loc_port;
25762306a36Sopenharmony_ci	u16 vlan_id;
25862306a36Sopenharmony_ci	u8 loc_mac[ETH_ALEN];
25962306a36Sopenharmony_ci	u8 user_pri;
26062306a36Sopenharmony_ci	u8 tos;
26162306a36Sopenharmony_ci	bool qhash_set:1;
26262306a36Sopenharmony_ci	bool ipv4:1;
26362306a36Sopenharmony_ci};
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_cistruct irdma_kmem_info {
26662306a36Sopenharmony_ci	void *addr;
26762306a36Sopenharmony_ci	u32 size;
26862306a36Sopenharmony_ci};
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_cistruct irdma_mpa_priv_info {
27162306a36Sopenharmony_ci	const void *addr;
27262306a36Sopenharmony_ci	u32 size;
27362306a36Sopenharmony_ci};
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_cistruct irdma_cm_node {
27662306a36Sopenharmony_ci	struct irdma_qp *iwqp;
27762306a36Sopenharmony_ci	struct irdma_device *iwdev;
27862306a36Sopenharmony_ci	struct irdma_sc_dev *dev;
27962306a36Sopenharmony_ci	struct irdma_cm_tcp_context tcp_cntxt;
28062306a36Sopenharmony_ci	struct irdma_cm_core *cm_core;
28162306a36Sopenharmony_ci	struct irdma_timer_entry *send_entry;
28262306a36Sopenharmony_ci	struct irdma_timer_entry *close_entry;
28362306a36Sopenharmony_ci	struct irdma_cm_listener *listener;
28462306a36Sopenharmony_ci	struct list_head timer_entry;
28562306a36Sopenharmony_ci	struct list_head reset_entry;
28662306a36Sopenharmony_ci	struct list_head teardown_entry;
28762306a36Sopenharmony_ci	struct irdma_apbvt_entry *apbvt_entry;
28862306a36Sopenharmony_ci	struct rcu_head rcu_head;
28962306a36Sopenharmony_ci	struct irdma_mpa_priv_info pdata;
29062306a36Sopenharmony_ci	struct irdma_sc_ah *ah;
29162306a36Sopenharmony_ci	union {
29262306a36Sopenharmony_ci		struct ietf_mpa_v1 mpa_frame;
29362306a36Sopenharmony_ci		struct ietf_mpa_v2 mpa_v2_frame;
29462306a36Sopenharmony_ci	};
29562306a36Sopenharmony_ci	struct irdma_kmem_info mpa_hdr;
29662306a36Sopenharmony_ci	struct iw_cm_id *cm_id;
29762306a36Sopenharmony_ci	struct hlist_node list;
29862306a36Sopenharmony_ci	struct completion establish_comp;
29962306a36Sopenharmony_ci	spinlock_t retrans_list_lock; /* protect CM node rexmit updates*/
30062306a36Sopenharmony_ci	atomic_t passive_state;
30162306a36Sopenharmony_ci	refcount_t refcnt;
30262306a36Sopenharmony_ci	enum irdma_cm_node_state state;
30362306a36Sopenharmony_ci	enum send_rdma0 send_rdma0_op;
30462306a36Sopenharmony_ci	enum mpa_frame_ver mpa_frame_rev;
30562306a36Sopenharmony_ci	u32 loc_addr[4], rem_addr[4];
30662306a36Sopenharmony_ci	u16 loc_port, rem_port;
30762306a36Sopenharmony_ci	int apbvt_set;
30862306a36Sopenharmony_ci	int accept_pend;
30962306a36Sopenharmony_ci	u16 vlan_id;
31062306a36Sopenharmony_ci	u16 ird_size;
31162306a36Sopenharmony_ci	u16 ord_size;
31262306a36Sopenharmony_ci	u16 mpav2_ird_ord;
31362306a36Sopenharmony_ci	u16 lsmm_size;
31462306a36Sopenharmony_ci	u8 pdata_buf[IETF_MAX_PRIV_DATA_LEN];
31562306a36Sopenharmony_ci	u8 loc_mac[ETH_ALEN];
31662306a36Sopenharmony_ci	u8 rem_mac[ETH_ALEN];
31762306a36Sopenharmony_ci	u8 user_pri;
31862306a36Sopenharmony_ci	u8 tos;
31962306a36Sopenharmony_ci	bool ack_rcvd:1;
32062306a36Sopenharmony_ci	bool qhash_set:1;
32162306a36Sopenharmony_ci	bool ipv4:1;
32262306a36Sopenharmony_ci	bool snd_mark_en:1;
32362306a36Sopenharmony_ci	bool rcv_mark_en:1;
32462306a36Sopenharmony_ci	bool do_lpb:1;
32562306a36Sopenharmony_ci	bool accelerated:1;
32662306a36Sopenharmony_ci};
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci/* Used by internal CM APIs to pass CM information*/
32962306a36Sopenharmony_cistruct irdma_cm_info {
33062306a36Sopenharmony_ci	struct iw_cm_id *cm_id;
33162306a36Sopenharmony_ci	u16 loc_port;
33262306a36Sopenharmony_ci	u16 rem_port;
33362306a36Sopenharmony_ci	u32 loc_addr[4];
33462306a36Sopenharmony_ci	u32 rem_addr[4];
33562306a36Sopenharmony_ci	u32 qh_qpid;
33662306a36Sopenharmony_ci	u16 vlan_id;
33762306a36Sopenharmony_ci	int backlog;
33862306a36Sopenharmony_ci	u8 user_pri;
33962306a36Sopenharmony_ci	u8 tos;
34062306a36Sopenharmony_ci	bool ipv4;
34162306a36Sopenharmony_ci};
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_cistruct irdma_cm_event {
34462306a36Sopenharmony_ci	enum irdma_cm_event_type type;
34562306a36Sopenharmony_ci	struct irdma_cm_info cm_info;
34662306a36Sopenharmony_ci	struct work_struct event_work;
34762306a36Sopenharmony_ci	struct irdma_cm_node *cm_node;
34862306a36Sopenharmony_ci};
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_cistruct irdma_cm_core {
35162306a36Sopenharmony_ci	struct irdma_device *iwdev;
35262306a36Sopenharmony_ci	struct irdma_sc_dev *dev;
35362306a36Sopenharmony_ci	struct list_head listen_list;
35462306a36Sopenharmony_ci	DECLARE_HASHTABLE(cm_hash_tbl, 8);
35562306a36Sopenharmony_ci	DECLARE_HASHTABLE(apbvt_hash_tbl, 8);
35662306a36Sopenharmony_ci	struct timer_list tcp_timer;
35762306a36Sopenharmony_ci	struct workqueue_struct *event_wq;
35862306a36Sopenharmony_ci	spinlock_t ht_lock; /* protect CM node (active side) list */
35962306a36Sopenharmony_ci	spinlock_t listen_list_lock; /* protect listener list */
36062306a36Sopenharmony_ci	spinlock_t apbvt_lock; /*serialize apbvt add/del entries*/
36162306a36Sopenharmony_ci	u64 stats_nodes_created;
36262306a36Sopenharmony_ci	u64 stats_nodes_destroyed;
36362306a36Sopenharmony_ci	u64 stats_listen_created;
36462306a36Sopenharmony_ci	u64 stats_listen_destroyed;
36562306a36Sopenharmony_ci	u64 stats_listen_nodes_created;
36662306a36Sopenharmony_ci	u64 stats_listen_nodes_destroyed;
36762306a36Sopenharmony_ci	u64 stats_lpbs;
36862306a36Sopenharmony_ci	u64 stats_accepts;
36962306a36Sopenharmony_ci	u64 stats_rejects;
37062306a36Sopenharmony_ci	u64 stats_connect_errs;
37162306a36Sopenharmony_ci	u64 stats_passive_errs;
37262306a36Sopenharmony_ci	u64 stats_pkt_retrans;
37362306a36Sopenharmony_ci	u64 stats_backlog_drops;
37462306a36Sopenharmony_ci	struct irdma_puda_buf *(*form_cm_frame)(struct irdma_cm_node *cm_node,
37562306a36Sopenharmony_ci						struct irdma_kmem_info *options,
37662306a36Sopenharmony_ci						struct irdma_kmem_info *hdr,
37762306a36Sopenharmony_ci						struct irdma_mpa_priv_info *pdata,
37862306a36Sopenharmony_ci						u8 flags);
37962306a36Sopenharmony_ci	int (*cm_create_ah)(struct irdma_cm_node *cm_node, bool wait);
38062306a36Sopenharmony_ci	void (*cm_free_ah)(struct irdma_cm_node *cm_node);
38162306a36Sopenharmony_ci};
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ciint irdma_schedule_cm_timer(struct irdma_cm_node *cm_node,
38462306a36Sopenharmony_ci			    struct irdma_puda_buf *sqbuf,
38562306a36Sopenharmony_ci			    enum irdma_timer_type type, int send_retrans,
38662306a36Sopenharmony_ci			    int close_when_complete);
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_cistatic inline u8 irdma_tos2dscp(u8 tos)
38962306a36Sopenharmony_ci{
39062306a36Sopenharmony_ci#define IRDMA_DSCP_VAL GENMASK(7, 2)
39162306a36Sopenharmony_ci	return (u8)FIELD_GET(IRDMA_DSCP_VAL, tos);
39262306a36Sopenharmony_ci}
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ciint irdma_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);
39562306a36Sopenharmony_ciint irdma_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len);
39662306a36Sopenharmony_ciint irdma_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);
39762306a36Sopenharmony_ciint irdma_create_listen(struct iw_cm_id *cm_id, int backlog);
39862306a36Sopenharmony_ciint irdma_destroy_listen(struct iw_cm_id *cm_id);
39962306a36Sopenharmony_ciint irdma_add_arp(struct irdma_pci_f *rf, u32 *ip, bool ipv4, const u8 *mac);
40062306a36Sopenharmony_civoid irdma_cm_teardown_connections(struct irdma_device *iwdev, u32 *ipaddr,
40162306a36Sopenharmony_ci				   struct irdma_cm_info *nfo,
40262306a36Sopenharmony_ci				   bool disconnect_all);
40362306a36Sopenharmony_ciint irdma_cm_start(struct irdma_device *dev);
40462306a36Sopenharmony_ciint irdma_cm_stop(struct irdma_device *dev);
40562306a36Sopenharmony_cibool irdma_ipv4_is_lpb(u32 loc_addr, u32 rem_addr);
40662306a36Sopenharmony_cibool irdma_ipv6_is_lpb(u32 *loc_addr, u32 *rem_addr);
40762306a36Sopenharmony_ciint irdma_arp_table(struct irdma_pci_f *rf, u32 *ip_addr, bool ipv4,
40862306a36Sopenharmony_ci		    const u8 *mac_addr, u32 action);
40962306a36Sopenharmony_civoid irdma_if_notify(struct irdma_device *iwdev, struct net_device *netdev,
41062306a36Sopenharmony_ci		     u32 *ipaddr, bool ipv4, bool ifup);
41162306a36Sopenharmony_cibool irdma_port_in_use(struct irdma_cm_core *cm_core, u16 port);
41262306a36Sopenharmony_civoid irdma_send_ack(struct irdma_cm_node *cm_node);
41362306a36Sopenharmony_civoid irdma_lpb_nop(struct irdma_sc_qp *qp);
41462306a36Sopenharmony_civoid irdma_rem_ref_cm_node(struct irdma_cm_node *cm_node);
41562306a36Sopenharmony_civoid irdma_add_conn_est_qh(struct irdma_cm_node *cm_node);
41662306a36Sopenharmony_ci#endif /* IRDMA_CM_H */
417