xref: /freebsd/sys/dev/irdma/irdma_cm.h (revision 01fbb86991d524288a785b544c29d9c5ea1b61fb)
1cdcd52d4SBartosz Sobczak /*-
2cdcd52d4SBartosz Sobczak  * SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB
3cdcd52d4SBartosz Sobczak  *
4*01fbb869SBartosz Sobczak  * Copyright (c) 2015 - 2023 Intel Corporation
5cdcd52d4SBartosz Sobczak  *
6cdcd52d4SBartosz Sobczak  * This software is available to you under a choice of one of two
7cdcd52d4SBartosz Sobczak  * licenses.  You may choose to be licensed under the terms of the GNU
8cdcd52d4SBartosz Sobczak  * General Public License (GPL) Version 2, available from the file
9cdcd52d4SBartosz Sobczak  * COPYING in the main directory of this source tree, or the
10cdcd52d4SBartosz Sobczak  * OpenFabrics.org BSD license below:
11cdcd52d4SBartosz Sobczak  *
12cdcd52d4SBartosz Sobczak  *   Redistribution and use in source and binary forms, with or
13cdcd52d4SBartosz Sobczak  *   without modification, are permitted provided that the following
14cdcd52d4SBartosz Sobczak  *   conditions are met:
15cdcd52d4SBartosz Sobczak  *
16cdcd52d4SBartosz Sobczak  *    - Redistributions of source code must retain the above
17cdcd52d4SBartosz Sobczak  *	copyright notice, this list of conditions and the following
18cdcd52d4SBartosz Sobczak  *	disclaimer.
19cdcd52d4SBartosz Sobczak  *
20cdcd52d4SBartosz Sobczak  *    - Redistributions in binary form must reproduce the above
21cdcd52d4SBartosz Sobczak  *	copyright notice, this list of conditions and the following
22cdcd52d4SBartosz Sobczak  *	disclaimer in the documentation and/or other materials
23cdcd52d4SBartosz Sobczak  *	provided with the distribution.
24cdcd52d4SBartosz Sobczak  *
25cdcd52d4SBartosz Sobczak  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26cdcd52d4SBartosz Sobczak  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27cdcd52d4SBartosz Sobczak  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28cdcd52d4SBartosz Sobczak  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29cdcd52d4SBartosz Sobczak  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30cdcd52d4SBartosz Sobczak  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31cdcd52d4SBartosz Sobczak  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32cdcd52d4SBartosz Sobczak  * SOFTWARE.
33cdcd52d4SBartosz Sobczak  */
34cdcd52d4SBartosz Sobczak 
35cdcd52d4SBartosz Sobczak #ifndef IRDMA_CM_H
36cdcd52d4SBartosz Sobczak #define IRDMA_CM_H
37cdcd52d4SBartosz Sobczak 
38cdcd52d4SBartosz Sobczak #define IRDMA_MPA_REQUEST_ACCEPT	1
39cdcd52d4SBartosz Sobczak #define IRDMA_MPA_REQUEST_REJECT	2
40cdcd52d4SBartosz Sobczak 
41cdcd52d4SBartosz Sobczak /* IETF MPA -- defines */
42cdcd52d4SBartosz Sobczak #define IEFT_MPA_KEY_REQ	"MPA ID Req Frame"
43cdcd52d4SBartosz Sobczak #define IEFT_MPA_KEY_REP	"MPA ID Rep Frame"
44cdcd52d4SBartosz Sobczak #define IETF_MPA_KEY_SIZE	16
45cdcd52d4SBartosz Sobczak #define IETF_MPA_VER		1
46cdcd52d4SBartosz Sobczak #define IETF_MAX_PRIV_DATA_LEN	512
47cdcd52d4SBartosz Sobczak #define IETF_MPA_FRAME_SIZE	20
48cdcd52d4SBartosz Sobczak #define IETF_RTR_MSG_SIZE	4
49cdcd52d4SBartosz Sobczak #define IETF_MPA_V2_FLAG	0x10
50cdcd52d4SBartosz Sobczak #define SNDMARKER_SEQNMASK	0x000001ff
51cdcd52d4SBartosz Sobczak #define IRDMA_MAX_IETF_SIZE	32
52cdcd52d4SBartosz Sobczak 
53cdcd52d4SBartosz Sobczak /* IETF RTR MSG Fields */
54cdcd52d4SBartosz Sobczak #define IETF_PEER_TO_PEER	0x8000
55cdcd52d4SBartosz Sobczak #define IETF_FLPDU_ZERO_LEN	0x4000
56cdcd52d4SBartosz Sobczak #define IETF_RDMA0_WRITE	0x8000
57cdcd52d4SBartosz Sobczak #define IETF_RDMA0_READ		0x4000
58cdcd52d4SBartosz Sobczak #define IETF_NO_IRD_ORD		0x3fff
59cdcd52d4SBartosz Sobczak 
60cdcd52d4SBartosz Sobczak #define MAX_PORTS	65536
61cdcd52d4SBartosz Sobczak 
62cdcd52d4SBartosz Sobczak #define IRDMA_PASSIVE_STATE_INDICATED	0
63cdcd52d4SBartosz Sobczak #define IRDMA_DO_NOT_SEND_RESET_EVENT	1
64cdcd52d4SBartosz Sobczak #define IRDMA_SEND_RESET_EVENT		2
65cdcd52d4SBartosz Sobczak 
66cdcd52d4SBartosz Sobczak #define MAX_IRDMA_IFS	4
67cdcd52d4SBartosz Sobczak 
68cdcd52d4SBartosz Sobczak #define SET_ACK		1
69cdcd52d4SBartosz Sobczak #define SET_SYN		2
70cdcd52d4SBartosz Sobczak #define SET_FIN		4
71cdcd52d4SBartosz Sobczak #define SET_RST		8
72cdcd52d4SBartosz Sobczak 
73cdcd52d4SBartosz Sobczak #define TCP_OPTIONS_PADDING	3
74cdcd52d4SBartosz Sobczak 
75cdcd52d4SBartosz Sobczak #define IRDMA_DEFAULT_RETRYS	64
76777e472cSBartosz Sobczak #define IRDMA_DEFAULT_RETRANS	32
77cdcd52d4SBartosz Sobczak #define IRDMA_DEFAULT_TTL		0x40
78cdcd52d4SBartosz Sobczak #define IRDMA_DEFAULT_RTT_VAR		6
79cdcd52d4SBartosz Sobczak #define IRDMA_DEFAULT_SS_THRESH		0x3fffffff
80cdcd52d4SBartosz Sobczak #define IRDMA_DEFAULT_REXMIT_THRESH	8
81cdcd52d4SBartosz Sobczak 
82cdcd52d4SBartosz Sobczak #define IRDMA_RETRY_TIMEOUT	HZ
83cdcd52d4SBartosz Sobczak #define IRDMA_SHORT_TIME	10
84cdcd52d4SBartosz Sobczak #define IRDMA_LONG_TIME		(2 * HZ)
85cdcd52d4SBartosz Sobczak #define IRDMA_MAX_TIMEOUT	((unsigned long)(12 * HZ))
86cdcd52d4SBartosz Sobczak 
87cdcd52d4SBartosz Sobczak #define IRDMA_CM_HASHTABLE_SIZE		1024
88cdcd52d4SBartosz Sobczak #define IRDMA_CM_TCP_TIMER_INTERVAL	3000
89cdcd52d4SBartosz Sobczak #define IRDMA_CM_DEFAULT_MTU		1540
90cdcd52d4SBartosz Sobczak #define IRDMA_CM_DEFAULT_FRAME_CNT	10
91cdcd52d4SBartosz Sobczak #define IRDMA_CM_THREAD_STACK_SIZE	256
92cdcd52d4SBartosz Sobczak #define IRDMA_CM_DEFAULT_RCV_WND	64240
93cdcd52d4SBartosz Sobczak #define IRDMA_CM_DEFAULT_RCV_WND_SCALED	0x3FFFC
94cdcd52d4SBartosz Sobczak #define IRDMA_CM_DEFAULT_RCV_WND_SCALE	2
95cdcd52d4SBartosz Sobczak #define IRDMA_CM_DEFAULT_FREE_PKTS	10
96cdcd52d4SBartosz Sobczak #define IRDMA_CM_FREE_PKT_LO_WATERMARK	2
97cdcd52d4SBartosz Sobczak #define IRDMA_CM_DEFAULT_MSS		536
98cdcd52d4SBartosz Sobczak #define IRDMA_CM_DEFAULT_MPA_VER	2
99cdcd52d4SBartosz Sobczak #define IRDMA_CM_DEFAULT_SEQ		0x159bf75f
100cdcd52d4SBartosz Sobczak #define IRDMA_CM_DEFAULT_LOCAL_ID	0x3b47
101cdcd52d4SBartosz Sobczak #define IRDMA_CM_DEFAULT_SEQ2		0x18ed5740
102cdcd52d4SBartosz Sobczak #define IRDMA_CM_DEFAULT_LOCAL_ID2	0xb807
103cdcd52d4SBartosz Sobczak #define IRDMA_MAX_CM_BUF		(IRDMA_MAX_IETF_SIZE + IETF_MAX_PRIV_DATA_LEN)
104cdcd52d4SBartosz Sobczak 
105cdcd52d4SBartosz Sobczak enum ietf_mpa_flags {
106cdcd52d4SBartosz Sobczak 	IETF_MPA_FLAGS_REJECT  = 0x20,
107cdcd52d4SBartosz Sobczak 	IETF_MPA_FLAGS_CRC     = 0x40,
108cdcd52d4SBartosz Sobczak 	IETF_MPA_FLAGS_MARKERS = 0x80,
109cdcd52d4SBartosz Sobczak };
110cdcd52d4SBartosz Sobczak 
111cdcd52d4SBartosz Sobczak enum irdma_timer_type {
112cdcd52d4SBartosz Sobczak 	IRDMA_TIMER_TYPE_SEND,
113cdcd52d4SBartosz Sobczak 	IRDMA_TIMER_TYPE_CLOSE,
114cdcd52d4SBartosz Sobczak };
115cdcd52d4SBartosz Sobczak 
116cdcd52d4SBartosz Sobczak enum option_nums {
117cdcd52d4SBartosz Sobczak 	OPTION_NUM_EOL,
118cdcd52d4SBartosz Sobczak 	OPTION_NUM_NONE,
119cdcd52d4SBartosz Sobczak 	OPTION_NUM_MSS,
120cdcd52d4SBartosz Sobczak 	OPTION_NUM_WINDOW_SCALE,
121cdcd52d4SBartosz Sobczak 	OPTION_NUM_SACK_PERM,
122cdcd52d4SBartosz Sobczak 	OPTION_NUM_SACK,
123cdcd52d4SBartosz Sobczak 	OPTION_NUM_WRITE0 = 0xbc,
124cdcd52d4SBartosz Sobczak };
125cdcd52d4SBartosz Sobczak 
126cdcd52d4SBartosz Sobczak /* cm node transition states */
127cdcd52d4SBartosz Sobczak enum irdma_cm_node_state {
128cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_UNKNOWN,
129cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_INITED,
130cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_LISTENING,
131cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_SYN_RCVD,
132cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_SYN_SENT,
133cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_ONE_SIDE_ESTABLISHED,
134cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_ESTABLISHED,
135cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_ACCEPTING,
136cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_MPAREQ_SENT,
137cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_MPAREQ_RCVD,
138cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_MPAREJ_RCVD,
139cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_OFFLOADED,
140cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_FIN_WAIT1,
141cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_FIN_WAIT2,
142cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_CLOSE_WAIT,
143cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_TIME_WAIT,
144cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_LAST_ACK,
145cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_CLOSING,
146cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_LISTENER_DESTROYED,
147cdcd52d4SBartosz Sobczak 	IRDMA_CM_STATE_CLOSED,
148cdcd52d4SBartosz Sobczak };
149cdcd52d4SBartosz Sobczak 
150cdcd52d4SBartosz Sobczak enum mpa_frame_ver {
151cdcd52d4SBartosz Sobczak 	IETF_MPA_V1 = 1,
152cdcd52d4SBartosz Sobczak 	IETF_MPA_V2 = 2,
153cdcd52d4SBartosz Sobczak };
154cdcd52d4SBartosz Sobczak 
155cdcd52d4SBartosz Sobczak enum mpa_frame_key {
156cdcd52d4SBartosz Sobczak 	MPA_KEY_REQUEST,
157cdcd52d4SBartosz Sobczak 	MPA_KEY_REPLY,
158cdcd52d4SBartosz Sobczak };
159cdcd52d4SBartosz Sobczak 
160cdcd52d4SBartosz Sobczak enum send_rdma0 {
161cdcd52d4SBartosz Sobczak 	SEND_RDMA_READ_ZERO  = 1,
162cdcd52d4SBartosz Sobczak 	SEND_RDMA_WRITE_ZERO = 2,
163cdcd52d4SBartosz Sobczak };
164cdcd52d4SBartosz Sobczak 
165cdcd52d4SBartosz Sobczak enum irdma_tcpip_pkt_type {
166cdcd52d4SBartosz Sobczak 	IRDMA_PKT_TYPE_UNKNOWN,
167cdcd52d4SBartosz Sobczak 	IRDMA_PKT_TYPE_SYN,
168cdcd52d4SBartosz Sobczak 	IRDMA_PKT_TYPE_SYNACK,
169cdcd52d4SBartosz Sobczak 	IRDMA_PKT_TYPE_ACK,
170cdcd52d4SBartosz Sobczak 	IRDMA_PKT_TYPE_FIN,
171cdcd52d4SBartosz Sobczak 	IRDMA_PKT_TYPE_RST,
172cdcd52d4SBartosz Sobczak };
173cdcd52d4SBartosz Sobczak 
174cdcd52d4SBartosz Sobczak enum irdma_cm_listener_state {
175cdcd52d4SBartosz Sobczak 	IRDMA_CM_LISTENER_PASSIVE_STATE = 1,
176cdcd52d4SBartosz Sobczak 	IRDMA_CM_LISTENER_ACTIVE_STATE  = 2,
177cdcd52d4SBartosz Sobczak 	IRDMA_CM_LISTENER_EITHER_STATE  = 3,
178cdcd52d4SBartosz Sobczak };
179cdcd52d4SBartosz Sobczak 
180cdcd52d4SBartosz Sobczak /* CM event codes */
181cdcd52d4SBartosz Sobczak enum irdma_cm_event_type {
182cdcd52d4SBartosz Sobczak 	IRDMA_CM_EVENT_UNKNOWN,
183cdcd52d4SBartosz Sobczak 	IRDMA_CM_EVENT_ESTABLISHED,
184cdcd52d4SBartosz Sobczak 	IRDMA_CM_EVENT_MPA_REQ,
185cdcd52d4SBartosz Sobczak 	IRDMA_CM_EVENT_MPA_CONNECT,
186cdcd52d4SBartosz Sobczak 	IRDMA_CM_EVENT_MPA_ACCEPT,
187cdcd52d4SBartosz Sobczak 	IRDMA_CM_EVENT_MPA_REJECT,
188cdcd52d4SBartosz Sobczak 	IRDMA_CM_EVENT_MPA_ESTABLISHED,
189cdcd52d4SBartosz Sobczak 	IRDMA_CM_EVENT_CONNECTED,
190cdcd52d4SBartosz Sobczak 	IRDMA_CM_EVENT_RESET,
191cdcd52d4SBartosz Sobczak 	IRDMA_CM_EVENT_ABORTED,
192cdcd52d4SBartosz Sobczak };
193cdcd52d4SBartosz Sobczak 
194cdcd52d4SBartosz Sobczak struct ietf_mpa_v1 {
195cdcd52d4SBartosz Sobczak 	u8 key[IETF_MPA_KEY_SIZE];
196cdcd52d4SBartosz Sobczak 	u8 flags;
197cdcd52d4SBartosz Sobczak 	u8 rev;
198cdcd52d4SBartosz Sobczak 	__be16 priv_data_len;
199cdcd52d4SBartosz Sobczak 	u8 priv_data[];
200cdcd52d4SBartosz Sobczak };
201cdcd52d4SBartosz Sobczak 
202cdcd52d4SBartosz Sobczak struct ietf_rtr_msg {
203cdcd52d4SBartosz Sobczak 	__be16 ctrl_ird;
204cdcd52d4SBartosz Sobczak 	__be16 ctrl_ord;
205cdcd52d4SBartosz Sobczak };
206cdcd52d4SBartosz Sobczak 
207cdcd52d4SBartosz Sobczak struct ietf_mpa_v2 {
208cdcd52d4SBartosz Sobczak 	u8 key[IETF_MPA_KEY_SIZE];
209cdcd52d4SBartosz Sobczak 	u8 flags;
210cdcd52d4SBartosz Sobczak 	u8 rev;
211cdcd52d4SBartosz Sobczak 	__be16 priv_data_len;
212cdcd52d4SBartosz Sobczak 	struct ietf_rtr_msg rtr_msg;
213cdcd52d4SBartosz Sobczak 	u8 priv_data[];
214cdcd52d4SBartosz Sobczak };
215cdcd52d4SBartosz Sobczak 
216cdcd52d4SBartosz Sobczak struct option_base {
217cdcd52d4SBartosz Sobczak 	u8 optionnum;
218cdcd52d4SBartosz Sobczak 	u8 len;
219cdcd52d4SBartosz Sobczak };
220cdcd52d4SBartosz Sobczak 
221cdcd52d4SBartosz Sobczak struct option_mss {
222cdcd52d4SBartosz Sobczak 	u8 optionnum;
223cdcd52d4SBartosz Sobczak 	u8 len;
224cdcd52d4SBartosz Sobczak 	__be16 mss;
225cdcd52d4SBartosz Sobczak };
226cdcd52d4SBartosz Sobczak 
227cdcd52d4SBartosz Sobczak struct option_windowscale {
228cdcd52d4SBartosz Sobczak 	u8 optionnum;
229cdcd52d4SBartosz Sobczak 	u8 len;
230cdcd52d4SBartosz Sobczak 	u8 shiftcount;
231cdcd52d4SBartosz Sobczak };
232cdcd52d4SBartosz Sobczak 
233cdcd52d4SBartosz Sobczak union all_known_options {
234cdcd52d4SBartosz Sobczak 	char eol;
235cdcd52d4SBartosz Sobczak 	struct option_base base;
236cdcd52d4SBartosz Sobczak 	struct option_mss mss;
237cdcd52d4SBartosz Sobczak 	struct option_windowscale windowscale;
238cdcd52d4SBartosz Sobczak };
239cdcd52d4SBartosz Sobczak 
240cdcd52d4SBartosz Sobczak struct irdma_timer_entry {
241cdcd52d4SBartosz Sobczak 	struct list_head list;
242cdcd52d4SBartosz Sobczak 	unsigned long timetosend; /* jiffies */
243cdcd52d4SBartosz Sobczak 	struct irdma_puda_buf *sqbuf;
244cdcd52d4SBartosz Sobczak 	u32 type;
245cdcd52d4SBartosz Sobczak 	u32 retrycount;
246cdcd52d4SBartosz Sobczak 	u32 retranscount;
247cdcd52d4SBartosz Sobczak 	u32 context;
248cdcd52d4SBartosz Sobczak 	u32 send_retrans;
249cdcd52d4SBartosz Sobczak 	int close_when_complete;
250cdcd52d4SBartosz Sobczak };
251cdcd52d4SBartosz Sobczak 
252cdcd52d4SBartosz Sobczak /* CM context params */
253cdcd52d4SBartosz Sobczak struct irdma_cm_tcp_context {
254cdcd52d4SBartosz Sobczak 	u8 client;
255cdcd52d4SBartosz Sobczak 	u32 loc_seq_num;
256cdcd52d4SBartosz Sobczak 	u32 loc_ack_num;
257cdcd52d4SBartosz Sobczak 	u32 rem_ack_num;
258cdcd52d4SBartosz Sobczak 	u32 rcv_nxt;
259cdcd52d4SBartosz Sobczak 	u32 loc_id;
260cdcd52d4SBartosz Sobczak 	u32 rem_id;
261cdcd52d4SBartosz Sobczak 	u32 snd_wnd;
262cdcd52d4SBartosz Sobczak 	u32 max_snd_wnd;
263cdcd52d4SBartosz Sobczak 	u32 rcv_wnd;
264cdcd52d4SBartosz Sobczak 	u32 mss;
265cdcd52d4SBartosz Sobczak 	u8 snd_wscale;
266cdcd52d4SBartosz Sobczak 	u8 rcv_wscale;
267cdcd52d4SBartosz Sobczak };
268cdcd52d4SBartosz Sobczak 
269cdcd52d4SBartosz Sobczak struct irdma_apbvt_entry {
270cdcd52d4SBartosz Sobczak 	struct hlist_node hlist;
271cdcd52d4SBartosz Sobczak 	u32 use_cnt;
272cdcd52d4SBartosz Sobczak 	u16 port;
273cdcd52d4SBartosz Sobczak };
274cdcd52d4SBartosz Sobczak 
275cdcd52d4SBartosz Sobczak struct irdma_cm_listener {
276cdcd52d4SBartosz Sobczak 	struct list_head list;
277cdcd52d4SBartosz Sobczak 	struct iw_cm_id *cm_id;
278cdcd52d4SBartosz Sobczak 	struct irdma_cm_core *cm_core;
279cdcd52d4SBartosz Sobczak 	struct irdma_device *iwdev;
280cdcd52d4SBartosz Sobczak 	struct list_head child_listen_list;
281cdcd52d4SBartosz Sobczak 	struct irdma_apbvt_entry *apbvt_entry;
282cdcd52d4SBartosz Sobczak 	enum irdma_cm_listener_state listener_state;
283cdcd52d4SBartosz Sobczak 	atomic_t refcnt;
284cdcd52d4SBartosz Sobczak 	atomic_t pend_accepts_cnt;
285cdcd52d4SBartosz Sobczak 	u32 loc_addr[4];
286cdcd52d4SBartosz Sobczak 	u32 reused_node;
287cdcd52d4SBartosz Sobczak 	int backlog;
288cdcd52d4SBartosz Sobczak 	u16 loc_port;
289cdcd52d4SBartosz Sobczak 	u16 vlan_id;
290*01fbb869SBartosz Sobczak 	u8 loc_mac[ETHER_ADDR_LEN];
291cdcd52d4SBartosz Sobczak 	u8 user_pri;
292cdcd52d4SBartosz Sobczak 	u8 tos;
293cdcd52d4SBartosz Sobczak 	bool qhash_set:1;
294cdcd52d4SBartosz Sobczak 	bool ipv4:1;
295cdcd52d4SBartosz Sobczak };
296cdcd52d4SBartosz Sobczak 
297cdcd52d4SBartosz Sobczak struct irdma_kmem_info {
298cdcd52d4SBartosz Sobczak 	void *addr;
299cdcd52d4SBartosz Sobczak 	u32 size;
300cdcd52d4SBartosz Sobczak };
301cdcd52d4SBartosz Sobczak 
302cdcd52d4SBartosz Sobczak struct irdma_mpa_priv_info {
303cdcd52d4SBartosz Sobczak 	const void *addr;
304cdcd52d4SBartosz Sobczak 	u32 size;
305cdcd52d4SBartosz Sobczak };
306cdcd52d4SBartosz Sobczak 
307cdcd52d4SBartosz Sobczak struct irdma_cm_node {
308cdcd52d4SBartosz Sobczak 	struct irdma_qp *iwqp;
309cdcd52d4SBartosz Sobczak 	struct irdma_device *iwdev;
310cdcd52d4SBartosz Sobczak 	struct irdma_sc_dev *dev;
311cdcd52d4SBartosz Sobczak 	struct irdma_cm_tcp_context tcp_cntxt;
312cdcd52d4SBartosz Sobczak 	struct irdma_cm_core *cm_core;
313cdcd52d4SBartosz Sobczak 	struct irdma_timer_entry *send_entry;
314cdcd52d4SBartosz Sobczak 	struct irdma_timer_entry *close_entry;
315cdcd52d4SBartosz Sobczak 	struct irdma_cm_listener *listener;
316cdcd52d4SBartosz Sobczak 	struct list_head timer_entry;
317cdcd52d4SBartosz Sobczak 	struct list_head reset_entry;
318cdcd52d4SBartosz Sobczak 	struct list_head teardown_entry;
319cdcd52d4SBartosz Sobczak 	struct irdma_apbvt_entry *apbvt_entry;
320cdcd52d4SBartosz Sobczak 	struct rcu_head rcu_head;
321cdcd52d4SBartosz Sobczak 	struct irdma_mpa_priv_info pdata;
322cdcd52d4SBartosz Sobczak 	struct irdma_sc_ah *ah;
323cdcd52d4SBartosz Sobczak 	struct irdma_kmem_info mpa_hdr;
324cdcd52d4SBartosz Sobczak 	struct iw_cm_id *cm_id;
325cdcd52d4SBartosz Sobczak 	struct hlist_node list;
326cdcd52d4SBartosz Sobczak 	struct completion establish_comp;
327cdcd52d4SBartosz Sobczak 	spinlock_t retrans_list_lock; /* protect CM node rexmit updates*/
328cdcd52d4SBartosz Sobczak 	atomic_t passive_state;
329cdcd52d4SBartosz Sobczak 	atomic_t refcnt;
330cdcd52d4SBartosz Sobczak 	enum irdma_cm_node_state state;
331cdcd52d4SBartosz Sobczak 	enum send_rdma0 send_rdma0_op;
332cdcd52d4SBartosz Sobczak 	enum mpa_frame_ver mpa_frame_rev;
333cdcd52d4SBartosz Sobczak 	u32 loc_addr[4], rem_addr[4];
334cdcd52d4SBartosz Sobczak 	u16 loc_port, rem_port;
335cdcd52d4SBartosz Sobczak 	int apbvt_set;
336cdcd52d4SBartosz Sobczak 	int accept_pend;
337cdcd52d4SBartosz Sobczak 	u16 vlan_id;
338cdcd52d4SBartosz Sobczak 	u16 ird_size;
339cdcd52d4SBartosz Sobczak 	u16 ord_size;
340cdcd52d4SBartosz Sobczak 	u16 mpav2_ird_ord;
341cdcd52d4SBartosz Sobczak 	u16 lsmm_size;
342cdcd52d4SBartosz Sobczak 	u8 pdata_buf[IETF_MAX_PRIV_DATA_LEN];
343*01fbb869SBartosz Sobczak 	u8 loc_mac[ETHER_ADDR_LEN];
344*01fbb869SBartosz Sobczak 	u8 rem_mac[ETHER_ADDR_LEN];
345cdcd52d4SBartosz Sobczak 	u8 user_pri;
346cdcd52d4SBartosz Sobczak 	u8 tos;
347cdcd52d4SBartosz Sobczak 	bool ack_rcvd:1;
348cdcd52d4SBartosz Sobczak 	bool qhash_set:1;
349cdcd52d4SBartosz Sobczak 	bool ipv4:1;
350cdcd52d4SBartosz Sobczak 	bool snd_mark_en:1;
351cdcd52d4SBartosz Sobczak 	bool rcv_mark_en:1;
352cdcd52d4SBartosz Sobczak 	bool do_lpb:1;
353cdcd52d4SBartosz Sobczak 	bool accelerated:1;
354cdcd52d4SBartosz Sobczak 	struct ietf_mpa_v2 mpa_v2_frame;
355cdcd52d4SBartosz Sobczak };
356cdcd52d4SBartosz Sobczak 
357cdcd52d4SBartosz Sobczak /* Used by internal CM APIs to pass CM information*/
358cdcd52d4SBartosz Sobczak struct irdma_cm_info {
359cdcd52d4SBartosz Sobczak 	struct iw_cm_id *cm_id;
360*01fbb869SBartosz Sobczak 	struct irdma_cqp_request *cqp_request;
361cdcd52d4SBartosz Sobczak 	u16 loc_port;
362cdcd52d4SBartosz Sobczak 	u16 rem_port;
363cdcd52d4SBartosz Sobczak 	u32 loc_addr[4];
364cdcd52d4SBartosz Sobczak 	u32 rem_addr[4];
365cdcd52d4SBartosz Sobczak 	u32 qh_qpid;
366cdcd52d4SBartosz Sobczak 	u16 vlan_id;
367cdcd52d4SBartosz Sobczak 	int backlog;
368cdcd52d4SBartosz Sobczak 	u8 user_pri;
369cdcd52d4SBartosz Sobczak 	u8 tos;
370cdcd52d4SBartosz Sobczak 	bool ipv4;
371cdcd52d4SBartosz Sobczak };
372cdcd52d4SBartosz Sobczak 
373cdcd52d4SBartosz Sobczak struct irdma_cm_event {
374cdcd52d4SBartosz Sobczak 	enum irdma_cm_event_type type;
375cdcd52d4SBartosz Sobczak 	struct irdma_cm_info cm_info;
376cdcd52d4SBartosz Sobczak 	struct work_struct event_work;
377cdcd52d4SBartosz Sobczak 	struct irdma_cm_node *cm_node;
378cdcd52d4SBartosz Sobczak };
379cdcd52d4SBartosz Sobczak 
380cdcd52d4SBartosz Sobczak struct irdma_cm_core {
381cdcd52d4SBartosz Sobczak 	struct irdma_device *iwdev;
382cdcd52d4SBartosz Sobczak 	struct irdma_sc_dev *dev;
383cdcd52d4SBartosz Sobczak 	struct list_head listen_list;
384cdcd52d4SBartosz Sobczak 	DECLARE_HASHTABLE(cm_hash_tbl, 8);
385cdcd52d4SBartosz Sobczak 	DECLARE_HASHTABLE(apbvt_hash_tbl, 8);
386cdcd52d4SBartosz Sobczak 	struct timer_list tcp_timer;
387cdcd52d4SBartosz Sobczak 	struct workqueue_struct *event_wq;
388cdcd52d4SBartosz Sobczak 	spinlock_t ht_lock; /* protect CM node (active side) list */
389cdcd52d4SBartosz Sobczak 	spinlock_t listen_list_lock; /* protect listener list */
390cdcd52d4SBartosz Sobczak 	spinlock_t apbvt_lock; /*serialize apbvt add/del entries*/
391cdcd52d4SBartosz Sobczak 	u64 stats_nodes_created;
392cdcd52d4SBartosz Sobczak 	u64 stats_nodes_destroyed;
393cdcd52d4SBartosz Sobczak 	u64 stats_listen_created;
394cdcd52d4SBartosz Sobczak 	u64 stats_listen_destroyed;
395cdcd52d4SBartosz Sobczak 	u64 stats_listen_nodes_created;
396cdcd52d4SBartosz Sobczak 	u64 stats_listen_nodes_destroyed;
397cdcd52d4SBartosz Sobczak 	u64 stats_lpbs;
398cdcd52d4SBartosz Sobczak 	u64 stats_accepts;
399cdcd52d4SBartosz Sobczak 	u64 stats_rejects;
400cdcd52d4SBartosz Sobczak 	u64 stats_connect_errs;
401cdcd52d4SBartosz Sobczak 	u64 stats_passive_errs;
402cdcd52d4SBartosz Sobczak 	u64 stats_pkt_retrans;
403cdcd52d4SBartosz Sobczak 	u64 stats_backlog_drops;
404cdcd52d4SBartosz Sobczak 	struct irdma_puda_buf *(*form_cm_frame)(struct irdma_cm_node *cm_node,
405cdcd52d4SBartosz Sobczak 						struct irdma_kmem_info *options,
406cdcd52d4SBartosz Sobczak 						struct irdma_kmem_info *hdr,
407cdcd52d4SBartosz Sobczak 						struct irdma_mpa_priv_info *pdata,
408cdcd52d4SBartosz Sobczak 						u8 flags);
409cdcd52d4SBartosz Sobczak 	int (*cm_create_ah)(struct irdma_cm_node *cm_node, bool wait);
410cdcd52d4SBartosz Sobczak 	void (*cm_free_ah)(struct irdma_cm_node *cm_node);
411cdcd52d4SBartosz Sobczak };
412cdcd52d4SBartosz Sobczak 
413*01fbb869SBartosz Sobczak struct irdma_add_mqh_cbs {
414*01fbb869SBartosz Sobczak 	struct irdma_device *iwdev;
415*01fbb869SBartosz Sobczak 	struct irdma_cm_info *cm_info;
416*01fbb869SBartosz Sobczak 	struct irdma_cm_listener *cm_listen_node;
417*01fbb869SBartosz Sobczak };
418*01fbb869SBartosz Sobczak 
419cdcd52d4SBartosz Sobczak int irdma_schedule_cm_timer(struct irdma_cm_node *cm_node,
420cdcd52d4SBartosz Sobczak 			    struct irdma_puda_buf *sqbuf,
421cdcd52d4SBartosz Sobczak 			    enum irdma_timer_type type, int send_retrans,
422cdcd52d4SBartosz Sobczak 			    int close_when_complete);
423cdcd52d4SBartosz Sobczak 
irdma_tos2dscp(u8 tos)424cdcd52d4SBartosz Sobczak static inline u8 irdma_tos2dscp(u8 tos)
425cdcd52d4SBartosz Sobczak {
426cdcd52d4SBartosz Sobczak #define IRDMA_DSCP_S 2
427777e472cSBartosz Sobczak #define IRDMA_DSCP GENMASK(7, 2)
428777e472cSBartosz Sobczak 	return FIELD_GET(IRDMA_DSCP, tos);
429cdcd52d4SBartosz Sobczak }
430cdcd52d4SBartosz Sobczak 
431cdcd52d4SBartosz Sobczak int irdma_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);
432cdcd52d4SBartosz Sobczak int irdma_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len);
433cdcd52d4SBartosz Sobczak int irdma_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);
434cdcd52d4SBartosz Sobczak int irdma_create_listen(struct iw_cm_id *cm_id, int backlog);
435cdcd52d4SBartosz Sobczak int irdma_destroy_listen(struct iw_cm_id *cm_id);
436777e472cSBartosz Sobczak int irdma_add_arp(struct irdma_pci_f *rf, u32 *ip, const u8 *mac);
437cdcd52d4SBartosz Sobczak int irdma_cm_start(struct irdma_device *dev);
438cdcd52d4SBartosz Sobczak int irdma_cm_stop(struct irdma_device *dev);
439777e472cSBartosz Sobczak bool irdma_ipv4_is_lpb(u32 loc_addr, u32 rem_addr);
440cdcd52d4SBartosz Sobczak bool irdma_ipv6_is_lpb(u32 *loc_addr, u32 *rem_addr);
441cdcd52d4SBartosz Sobczak int irdma_arp_table(struct irdma_pci_f *rf, u32 *ip_addr,
442777e472cSBartosz Sobczak 		    const u8 *mac_addr, u32 action);
443cdcd52d4SBartosz Sobczak bool irdma_port_in_use(struct irdma_cm_core *cm_core, u16 port);
444cdcd52d4SBartosz Sobczak void irdma_send_ack(struct irdma_cm_node *cm_node);
445cdcd52d4SBartosz Sobczak void irdma_lpb_nop(struct irdma_sc_qp *qp);
446cdcd52d4SBartosz Sobczak void irdma_rem_ref_cm_node(struct irdma_cm_node *cm_node);
447cdcd52d4SBartosz Sobczak void irdma_add_conn_est_qh(struct irdma_cm_node *cm_node);
448cdcd52d4SBartosz Sobczak #endif /* IRDMA_CM_H */
449