xref: /onnv-gate/usr/src/uts/common/sys/rds.h (revision 12863:5783b6fe7ed5)
112198SEiji.Ota@Sun.COM /*
212763SGiri.Adari@Sun.COM  * This file contains definitions used in OFED defined user/kernel
312763SGiri.Adari@Sun.COM  * interfaces. These are imported from the OFED header <linux/rds.h>. Oracle
412763SGiri.Adari@Sun.COM  * elects to have and use the contents of <linux/rds.h> under and governed
512763SGiri.Adari@Sun.COM  * by the OpenIB.org BSD license (see below for full license text). However,
612763SGiri.Adari@Sun.COM  * the following notice accompanied the original version of this file:
712763SGiri.Adari@Sun.COM  */
812763SGiri.Adari@Sun.COM /*
912198SEiji.Ota@Sun.COM  * Copyright (c) 2008 Oracle.  All rights reserved.
1012198SEiji.Ota@Sun.COM  *
1112198SEiji.Ota@Sun.COM  * This software is available to you under a choice of one of two
1212198SEiji.Ota@Sun.COM  * licenses.  You may choose to be licensed under the terms of the GNU
1312198SEiji.Ota@Sun.COM  * General Public License (GPL) Version 2, available from the file
1412198SEiji.Ota@Sun.COM  * COPYING in the main directory of this source tree, or the
1512198SEiji.Ota@Sun.COM  * OpenIB.org BSD license below:
1612198SEiji.Ota@Sun.COM  *
1712198SEiji.Ota@Sun.COM  *     Redistribution and use in source and binary forms, with or
1812198SEiji.Ota@Sun.COM  *     without modification, are permitted provided that the following
1912198SEiji.Ota@Sun.COM  *     conditions are met:
2012198SEiji.Ota@Sun.COM  *
2112198SEiji.Ota@Sun.COM  *      - Redistributions of source code must retain the above
2212198SEiji.Ota@Sun.COM  *        copyright notice, this list of conditions and the following
2312198SEiji.Ota@Sun.COM  *        disclaimer.
2412198SEiji.Ota@Sun.COM  *
2512198SEiji.Ota@Sun.COM  *      - Redistributions in binary form must reproduce the above
2612198SEiji.Ota@Sun.COM  *        copyright notice, this list of conditions and the following
2712198SEiji.Ota@Sun.COM  *        disclaimer in the documentation and/or other materials
2812198SEiji.Ota@Sun.COM  *        provided with the distribution.
2912198SEiji.Ota@Sun.COM  *
3012198SEiji.Ota@Sun.COM  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
3112198SEiji.Ota@Sun.COM  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
3212198SEiji.Ota@Sun.COM  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
3312198SEiji.Ota@Sun.COM  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
3412198SEiji.Ota@Sun.COM  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
3512198SEiji.Ota@Sun.COM  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
3612198SEiji.Ota@Sun.COM  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3712198SEiji.Ota@Sun.COM  * SOFTWARE.
3812198SEiji.Ota@Sun.COM  *
3912198SEiji.Ota@Sun.COM  */
40*12863SEiji.Ota@Sun.COM #ifndef _SYS_RDS_H
41*12863SEiji.Ota@Sun.COM #define	_SYS_RDS_H
4212198SEiji.Ota@Sun.COM 
4312198SEiji.Ota@Sun.COM #ifdef __cplusplus
4412198SEiji.Ota@Sun.COM extern "C" {
4512198SEiji.Ota@Sun.COM #endif
4612198SEiji.Ota@Sun.COM 
47*12863SEiji.Ota@Sun.COM #if !(defined(__SVR4) && defined(__sun))
48*12863SEiji.Ota@Sun.COM #include <linux/types.h>
49*12863SEiji.Ota@Sun.COM #else
50*12863SEiji.Ota@Sun.COM #include <sys/types.h>
51*12863SEiji.Ota@Sun.COM #include <sys/socket.h>
52*12863SEiji.Ota@Sun.COM #endif
53*12863SEiji.Ota@Sun.COM 
54*12863SEiji.Ota@Sun.COM /*
55*12863SEiji.Ota@Sun.COM  * These sparse annotated types shouldn't be in any user
56*12863SEiji.Ota@Sun.COM  * visible header file. We should clean this up rather
57*12863SEiji.Ota@Sun.COM  * than kludging around them.
58*12863SEiji.Ota@Sun.COM  */
59*12863SEiji.Ota@Sun.COM #if !(defined(__SVR4) && defined(__sun))
60*12863SEiji.Ota@Sun.COM #ifndef __KERNEL__
61*12863SEiji.Ota@Sun.COM #define	__be16	u_int16_t
62*12863SEiji.Ota@Sun.COM #define	__be32	u_int32_t
63*12863SEiji.Ota@Sun.COM #define	__be64	u_int64_t
64*12863SEiji.Ota@Sun.COM #endif
65*12863SEiji.Ota@Sun.COM #else
66*12863SEiji.Ota@Sun.COM #define	u_int8_t	uint8_t
67*12863SEiji.Ota@Sun.COM #define	u_int16_t	uint16_t
68*12863SEiji.Ota@Sun.COM #define	u_int32_t	uint32_t
69*12863SEiji.Ota@Sun.COM #define	u_int64_t	uint64_t
70*12863SEiji.Ota@Sun.COM #endif
71*12863SEiji.Ota@Sun.COM 
7212198SEiji.Ota@Sun.COM #define	RDS_IB_ABI_VERSION		0x301
7312198SEiji.Ota@Sun.COM 
74*12863SEiji.Ota@Sun.COM #define	AF_RDS	AF_INET_OFFLOAD
75*12863SEiji.Ota@Sun.COM #define	PF_RDS	AF_INET_OFFLOAD
76*12863SEiji.Ota@Sun.COM #define	SOL_RDS	272
7712198SEiji.Ota@Sun.COM 
7812198SEiji.Ota@Sun.COM /*
7912198SEiji.Ota@Sun.COM  * setsockopt/getsockopt for SOL_RDS
8012198SEiji.Ota@Sun.COM  */
81*12863SEiji.Ota@Sun.COM #define	RDS_CANCEL_SENT_TO	1
82*12863SEiji.Ota@Sun.COM #define	RDS_GET_MR			2
83*12863SEiji.Ota@Sun.COM #define	RDS_FREE_MR			3
8412198SEiji.Ota@Sun.COM /* deprecated: RDS_BARRIER 4 */
85*12863SEiji.Ota@Sun.COM #define	RDS_RECVERR			5
86*12863SEiji.Ota@Sun.COM #define	RDS_CONG_MONITOR		6
87*12863SEiji.Ota@Sun.COM #define	RDS_GET_MR_FOR_DEST		7
88*12863SEiji.Ota@Sun.COM 
8912198SEiji.Ota@Sun.COM 
9012198SEiji.Ota@Sun.COM /*
9112198SEiji.Ota@Sun.COM  * Control message types for SOL_RDS.
9212198SEiji.Ota@Sun.COM  *
93*12863SEiji.Ota@Sun.COM  * CMSG_RDMA_ARGS (sendmsg)
9412198SEiji.Ota@Sun.COM  *	Request a RDMA transfer to/from the specified
9512198SEiji.Ota@Sun.COM  *	memory ranges.
96*12863SEiji.Ota@Sun.COM  *	The cmsg_data is a struct rds_rdma_args.
9712198SEiji.Ota@Sun.COM  * RDS_CMSG_RDMA_DEST (recvmsg, sendmsg)
9812198SEiji.Ota@Sun.COM  *	Kernel informs application about intended
9912198SEiji.Ota@Sun.COM  *	source/destination of a RDMA transfer
10012198SEiji.Ota@Sun.COM  * RDS_CMSG_RDMA_MAP (sendmsg)
10112198SEiji.Ota@Sun.COM  *	Application asks kernel to map the given
10212198SEiji.Ota@Sun.COM  *	memory range into a IB MR, and send the
10312198SEiji.Ota@Sun.COM  *	R_Key along in an RDS extension header.
104*12863SEiji.Ota@Sun.COM  *	The cmsg_data is a struct rds_get_mr_args,
10512198SEiji.Ota@Sun.COM  *	the same as for the GET_MR setsockopt.
10612198SEiji.Ota@Sun.COM  * RDS_CMSG_RDMA_STATUS (recvmsg)
10712198SEiji.Ota@Sun.COM  *	Returns the status of a completed RDMA operation.
10812198SEiji.Ota@Sun.COM  */
109*12863SEiji.Ota@Sun.COM #define	RDS_CMSG_RDMA_ARGS		1
110*12863SEiji.Ota@Sun.COM #define	RDS_CMSG_RDMA_DEST		2
111*12863SEiji.Ota@Sun.COM #define	RDS_CMSG_RDMA_MAP		3
112*12863SEiji.Ota@Sun.COM #define	RDS_CMSG_RDMA_STATUS		4
113*12863SEiji.Ota@Sun.COM #define	RDS_CMSG_CONG_UPDATE		5
11412198SEiji.Ota@Sun.COM 
115*12863SEiji.Ota@Sun.COM #define	RDS_INFO_FIRST			10000
116*12863SEiji.Ota@Sun.COM #define	RDS_INFO_COUNTERS		10000
117*12863SEiji.Ota@Sun.COM #define	RDS_INFO_CONNECTIONS		10001
11812198SEiji.Ota@Sun.COM /* 10002 aka RDS_INFO_FLOWS is deprecated */
119*12863SEiji.Ota@Sun.COM #define	RDS_INFO_SEND_MESSAGES		10003
120*12863SEiji.Ota@Sun.COM #define	RDS_INFO_RETRANS_MESSAGES	10004
121*12863SEiji.Ota@Sun.COM #define	RDS_INFO_RECV_MESSAGES		10005
122*12863SEiji.Ota@Sun.COM #define	RDS_INFO_SOCKETS		10006
123*12863SEiji.Ota@Sun.COM #define	RDS_INFO_TCP_SOCKETS		10007
124*12863SEiji.Ota@Sun.COM #define	RDS_INFO_IB_CONNECTIONS		10008
125*12863SEiji.Ota@Sun.COM #define	RDS_INFO_CONNECTION_STATS	10009
126*12863SEiji.Ota@Sun.COM #define	RDS_INFO_IWARP_CONNECTIONS	10010
127*12863SEiji.Ota@Sun.COM #define	RDS_INFO_LAST			10010
12812198SEiji.Ota@Sun.COM 
129*12863SEiji.Ota@Sun.COM #if defined(__SVR4) && defined(__sun)
13012580SGiri.Adari@Sun.COM struct rds_info_arg {
13112580SGiri.Adari@Sun.COM 	uint64_t	lenp;
13212580SGiri.Adari@Sun.COM 	uint64_t	datap;
13312580SGiri.Adari@Sun.COM };
134*12863SEiji.Ota@Sun.COM #endif
13512580SGiri.Adari@Sun.COM 
13612198SEiji.Ota@Sun.COM #ifndef __lock_lint
13712198SEiji.Ota@Sun.COM #pragma pack(1)
138*12863SEiji.Ota@Sun.COM struct rds_info_counter {
139*12863SEiji.Ota@Sun.COM 	u_int8_t	name[32];
140*12863SEiji.Ota@Sun.COM 	u_int64_t	value;
14112198SEiji.Ota@Sun.COM } __attribute__((packed));
14212198SEiji.Ota@Sun.COM #pragma pack()
14312198SEiji.Ota@Sun.COM #else
144*12863SEiji.Ota@Sun.COM struct rds_info_counter {
145*12863SEiji.Ota@Sun.COM 	u_int8_t	name[32];
146*12863SEiji.Ota@Sun.COM 	u_int64_t	value;
14712198SEiji.Ota@Sun.COM };
14812198SEiji.Ota@Sun.COM #endif
14912198SEiji.Ota@Sun.COM 
150*12863SEiji.Ota@Sun.COM #define	RDS_INFO_CONNECTION_FLAG_SENDING	0x01
151*12863SEiji.Ota@Sun.COM #define	RDS_INFO_CONNECTION_FLAG_CONNECTING	0x02
152*12863SEiji.Ota@Sun.COM #define	RDS_INFO_CONNECTION_FLAG_CONNECTED	0x04
15312198SEiji.Ota@Sun.COM 
15412414SEiji.Ota@Sun.COM #define	TRANSNAMSIZ	16
15512414SEiji.Ota@Sun.COM 
15612198SEiji.Ota@Sun.COM #ifndef __lock_lint
15712198SEiji.Ota@Sun.COM #pragma pack(1)
158*12863SEiji.Ota@Sun.COM struct rds_info_connection {
159*12863SEiji.Ota@Sun.COM 	u_int64_t	next_tx_seq;
160*12863SEiji.Ota@Sun.COM 	u_int64_t	next_rx_seq;
161*12863SEiji.Ota@Sun.COM 	u_int32_t	laddr;
162*12863SEiji.Ota@Sun.COM 	u_int32_t	faddr;
163*12863SEiji.Ota@Sun.COM 	u_int8_t	transport[TRANSNAMSIZ];		/* null term ascii */
164*12863SEiji.Ota@Sun.COM 	u_int8_t	flags;
16512198SEiji.Ota@Sun.COM } __attribute__((packed));
16612198SEiji.Ota@Sun.COM #pragma pack()
16712198SEiji.Ota@Sun.COM #else
168*12863SEiji.Ota@Sun.COM struct rds_info_connection {
169*12863SEiji.Ota@Sun.COM 	u_int64_t	next_tx_seq;
170*12863SEiji.Ota@Sun.COM 	u_int64_t	next_rx_seq;
171*12863SEiji.Ota@Sun.COM 	u_int32_t	laddr;
172*12863SEiji.Ota@Sun.COM 	u_int32_t	faddr;
173*12863SEiji.Ota@Sun.COM 	u_int8_t	transport[TRANSNAMSIZ];		/* null term ascii */
174*12863SEiji.Ota@Sun.COM 	u_int8_t	flags;
17512198SEiji.Ota@Sun.COM };
17612198SEiji.Ota@Sun.COM #endif
17712198SEiji.Ota@Sun.COM 
17812198SEiji.Ota@Sun.COM #ifndef __lock_lint
17912198SEiji.Ota@Sun.COM #pragma pack(1)
180*12863SEiji.Ota@Sun.COM struct rds_info_flow {
181*12863SEiji.Ota@Sun.COM 	u_int32_t	laddr;
182*12863SEiji.Ota@Sun.COM 	u_int32_t	faddr;
183*12863SEiji.Ota@Sun.COM 	u_int32_t	bytes;
184*12863SEiji.Ota@Sun.COM 	u_int16_t	lport;
185*12863SEiji.Ota@Sun.COM 	u_int16_t	fport;
18612198SEiji.Ota@Sun.COM } __attribute__((packed));
18712198SEiji.Ota@Sun.COM #pragma pack()
18812198SEiji.Ota@Sun.COM #else
189*12863SEiji.Ota@Sun.COM struct rds_info_flow {
190*12863SEiji.Ota@Sun.COM 	u_int32_t	laddr;
191*12863SEiji.Ota@Sun.COM 	u_int32_t	faddr;
192*12863SEiji.Ota@Sun.COM 	u_int32_t	bytes;
193*12863SEiji.Ota@Sun.COM 	u_int16_t	lport;
194*12863SEiji.Ota@Sun.COM 	u_int16_t	fport;
19512198SEiji.Ota@Sun.COM };
19612198SEiji.Ota@Sun.COM #endif
19712198SEiji.Ota@Sun.COM 
198*12863SEiji.Ota@Sun.COM #define	RDS_INFO_MESSAGE_FLAG_ACK		0x01
199*12863SEiji.Ota@Sun.COM #define	RDS_INFO_MESSAGE_FLAG_FAST_ACK		0x02
20012198SEiji.Ota@Sun.COM 
20112198SEiji.Ota@Sun.COM #ifndef __lock_lint
20212198SEiji.Ota@Sun.COM #pragma pack(1)
203*12863SEiji.Ota@Sun.COM struct rds_info_message {
204*12863SEiji.Ota@Sun.COM 	u_int64_t	seq;
205*12863SEiji.Ota@Sun.COM 	u_int32_t	len;
206*12863SEiji.Ota@Sun.COM 	u_int32_t	laddr;
207*12863SEiji.Ota@Sun.COM 	u_int32_t	faddr;
208*12863SEiji.Ota@Sun.COM 	u_int16_t	lport;
209*12863SEiji.Ota@Sun.COM 	u_int16_t	fport;
210*12863SEiji.Ota@Sun.COM 	u_int8_t	flags;
21112198SEiji.Ota@Sun.COM } __attribute__((packed));
21212198SEiji.Ota@Sun.COM #pragma pack()
21312198SEiji.Ota@Sun.COM #else
214*12863SEiji.Ota@Sun.COM struct rds_info_message {
215*12863SEiji.Ota@Sun.COM 	u_int64_t	seq;
216*12863SEiji.Ota@Sun.COM 	u_int32_t	len;
217*12863SEiji.Ota@Sun.COM 	u_int32_t	laddr;
218*12863SEiji.Ota@Sun.COM 	u_int32_t	faddr;
219*12863SEiji.Ota@Sun.COM 	u_int16_t	lport;
220*12863SEiji.Ota@Sun.COM 	u_int16_t	fport;
221*12863SEiji.Ota@Sun.COM 	u_int8_t	flags;
22212198SEiji.Ota@Sun.COM };
22312198SEiji.Ota@Sun.COM #endif
22412198SEiji.Ota@Sun.COM 
22512198SEiji.Ota@Sun.COM #ifndef __lock_lint
22612198SEiji.Ota@Sun.COM #pragma pack(1)
227*12863SEiji.Ota@Sun.COM struct rds_info_socket {
228*12863SEiji.Ota@Sun.COM 	u_int32_t	sndbuf;
229*12863SEiji.Ota@Sun.COM 	u_int32_t	bound_addr;
230*12863SEiji.Ota@Sun.COM 	u_int32_t	connected_addr;
231*12863SEiji.Ota@Sun.COM 	u_int16_t	bound_port;
232*12863SEiji.Ota@Sun.COM 	u_int16_t	connected_port;
233*12863SEiji.Ota@Sun.COM 	u_int32_t	rcvbuf;
234*12863SEiji.Ota@Sun.COM 	u_int64_t	inum;
23512198SEiji.Ota@Sun.COM } __attribute__((packed));
23612198SEiji.Ota@Sun.COM #pragma pack()
23712198SEiji.Ota@Sun.COM #else
238*12863SEiji.Ota@Sun.COM struct rds_info_socket {
239*12863SEiji.Ota@Sun.COM 	u_int32_t	sndbuf;
240*12863SEiji.Ota@Sun.COM 	u_int32_t	bound_addr;
241*12863SEiji.Ota@Sun.COM 	u_int32_t	connected_addr;
242*12863SEiji.Ota@Sun.COM 	u_int16_t	bound_port;
243*12863SEiji.Ota@Sun.COM 	u_int16_t	connected_port;
244*12863SEiji.Ota@Sun.COM 	u_int32_t	rcvbuf;
245*12863SEiji.Ota@Sun.COM 	u_int64_t	inum;
24612198SEiji.Ota@Sun.COM };
24712198SEiji.Ota@Sun.COM #endif
24812198SEiji.Ota@Sun.COM 
24912198SEiji.Ota@Sun.COM #ifndef __lock_lint
25012198SEiji.Ota@Sun.COM #pragma pack(1)
251*12863SEiji.Ota@Sun.COM struct rds_info_tcp_socket {
252*12863SEiji.Ota@Sun.COM 	u_int32_t	local_addr;
253*12863SEiji.Ota@Sun.COM 	u_int16_t	local_port;
254*12863SEiji.Ota@Sun.COM 	u_int32_t	peer_addr;
255*12863SEiji.Ota@Sun.COM 	u_int16_t	peer_port;
256*12863SEiji.Ota@Sun.COM 	u_int64_t	hdr_rem;
257*12863SEiji.Ota@Sun.COM 	u_int64_t	data_rem;
258*12863SEiji.Ota@Sun.COM 	u_int32_t	last_sent_nxt;
259*12863SEiji.Ota@Sun.COM 	u_int32_t	last_expected_una;
260*12863SEiji.Ota@Sun.COM 	u_int32_t	last_seen_una;
26112198SEiji.Ota@Sun.COM } __attribute__((packed));
26212198SEiji.Ota@Sun.COM #pragma pack()
26312198SEiji.Ota@Sun.COM #else
264*12863SEiji.Ota@Sun.COM struct rds_info_tcp_socket {
265*12863SEiji.Ota@Sun.COM 	u_int32_t	local_addr;
266*12863SEiji.Ota@Sun.COM 	u_int16_t	local_port;
267*12863SEiji.Ota@Sun.COM 	u_int32_t	peer_addr;
268*12863SEiji.Ota@Sun.COM 	u_int16_t	peer_port;
269*12863SEiji.Ota@Sun.COM 	u_int64_t	hdr_rem;
270*12863SEiji.Ota@Sun.COM 	u_int64_t	data_rem;
271*12863SEiji.Ota@Sun.COM 	u_int32_t	last_sent_nxt;
272*12863SEiji.Ota@Sun.COM 	u_int32_t	last_expected_una;
273*12863SEiji.Ota@Sun.COM 	u_int32_t	last_seen_una;
274*12863SEiji.Ota@Sun.COM } __attribute__((packed));
27512198SEiji.Ota@Sun.COM };
27612198SEiji.Ota@Sun.COM #endif
27712198SEiji.Ota@Sun.COM 
27812198SEiji.Ota@Sun.COM #define	RDS_IB_GID_LEN	16
279*12863SEiji.Ota@Sun.COM struct rds_info_rdma_connection {
280*12863SEiji.Ota@Sun.COM 	u_int32_t	src_addr;
281*12863SEiji.Ota@Sun.COM 	u_int32_t	dst_addr;
28212198SEiji.Ota@Sun.COM 	uint8_t		src_gid[RDS_IB_GID_LEN];
28312198SEiji.Ota@Sun.COM 	uint8_t		dst_gid[RDS_IB_GID_LEN];
28412198SEiji.Ota@Sun.COM 
28512198SEiji.Ota@Sun.COM 	uint32_t	max_send_wr;
28612198SEiji.Ota@Sun.COM 	uint32_t	max_recv_wr;
28712198SEiji.Ota@Sun.COM 	uint32_t	max_send_sge;
28812198SEiji.Ota@Sun.COM 	uint32_t	rdma_mr_max;
28912198SEiji.Ota@Sun.COM 	uint32_t	rdma_mr_size;
29012198SEiji.Ota@Sun.COM };
29112198SEiji.Ota@Sun.COM 
29212414SEiji.Ota@Sun.COM /*
29312414SEiji.Ota@Sun.COM  * Congestion monitoring.
29412414SEiji.Ota@Sun.COM  * Congestion control in RDS happens at the host connection
29512414SEiji.Ota@Sun.COM  * level by exchanging a bitmap marking congested ports.
29612414SEiji.Ota@Sun.COM  * By default, a process sleeping in poll() is always woken
29712414SEiji.Ota@Sun.COM  * up when the congestion map is updated.
29812414SEiji.Ota@Sun.COM  * With explicit monitoring, an application can have more
29912414SEiji.Ota@Sun.COM  * fine-grained control.
30012414SEiji.Ota@Sun.COM  * The application installs a 64bit mask value in the socket,
30112414SEiji.Ota@Sun.COM  * where each bit corresponds to a group of ports.
30212414SEiji.Ota@Sun.COM  * When a congestion update arrives, RDS checks the set of
30312414SEiji.Ota@Sun.COM  * ports that are now uncongested against the list bit mask
30412414SEiji.Ota@Sun.COM  * installed in the socket, and if they overlap, we queue a
30512414SEiji.Ota@Sun.COM  * cong_notification on the socket.
30612414SEiji.Ota@Sun.COM  *
30712414SEiji.Ota@Sun.COM  * To install the congestion monitor bitmask, use RDS_CONG_MONITOR
30812414SEiji.Ota@Sun.COM  * with the 64bit mask.
30912414SEiji.Ota@Sun.COM  * Congestion updates are received via RDS_CMSG_CONG_UPDATE
31012414SEiji.Ota@Sun.COM  * control messages.
31112414SEiji.Ota@Sun.COM  *
31212414SEiji.Ota@Sun.COM  * The correspondence between bits and ports is
31312414SEiji.Ota@Sun.COM  *	1 << (portnum % 64)
31412414SEiji.Ota@Sun.COM  */
315*12863SEiji.Ota@Sun.COM #define	RDS_CONG_MONITOR_SIZE	64
316*12863SEiji.Ota@Sun.COM #define	RDS_CONG_MONITOR_BIT(port)  \
317*12863SEiji.Ota@Sun.COM 	(((unsigned int) port) % RDS_CONG_MONITOR_SIZE)
318*12863SEiji.Ota@Sun.COM #define	RDS_CONG_MONITOR_MASK(port) (1ULL << RDS_CONG_MONITOR_BIT(port))
31912414SEiji.Ota@Sun.COM 
32012414SEiji.Ota@Sun.COM /*
32112414SEiji.Ota@Sun.COM  * RDMA related types
32212414SEiji.Ota@Sun.COM  */
32312414SEiji.Ota@Sun.COM 
32412414SEiji.Ota@Sun.COM /*
32512414SEiji.Ota@Sun.COM  * This encapsulates a remote memory location.
32612414SEiji.Ota@Sun.COM  * In the current implementation, it contains the R_Key
32712414SEiji.Ota@Sun.COM  * of the remote memory region, and the offset into it
32812414SEiji.Ota@Sun.COM  * (so that the application does not have to worry about
32912414SEiji.Ota@Sun.COM  * alignment).
33012414SEiji.Ota@Sun.COM  */
331*12863SEiji.Ota@Sun.COM typedef u_int64_t	rds_rdma_cookie_t;
33212414SEiji.Ota@Sun.COM 
333*12863SEiji.Ota@Sun.COM struct rds_iovec {
334*12863SEiji.Ota@Sun.COM 	u_int64_t	addr;
335*12863SEiji.Ota@Sun.COM 	u_int64_t	bytes;
33612414SEiji.Ota@Sun.COM };
33712414SEiji.Ota@Sun.COM 
338*12863SEiji.Ota@Sun.COM struct rds_get_mr_args {
339*12863SEiji.Ota@Sun.COM 	struct rds_iovec vec;
340*12863SEiji.Ota@Sun.COM 	u_int64_t	cookie_addr;
34112414SEiji.Ota@Sun.COM 	uint64_t	flags;
34212414SEiji.Ota@Sun.COM };
34312414SEiji.Ota@Sun.COM 
344*12863SEiji.Ota@Sun.COM struct rds_get_mr_for_dest_args {
345*12863SEiji.Ota@Sun.COM 	struct sockaddr_storage dest_addr;
346*12863SEiji.Ota@Sun.COM 	struct rds_iovec	vec;
347*12863SEiji.Ota@Sun.COM 	u_int64_t		cookie_addr;
34812414SEiji.Ota@Sun.COM 	uint64_t		flags;
34912414SEiji.Ota@Sun.COM };
35012414SEiji.Ota@Sun.COM 
351*12863SEiji.Ota@Sun.COM 
352*12863SEiji.Ota@Sun.COM struct rds_free_mr_args {
353*12863SEiji.Ota@Sun.COM 	rds_rdma_cookie_t cookie;
354*12863SEiji.Ota@Sun.COM 	u_int64_t	flags;
35512414SEiji.Ota@Sun.COM };
35612414SEiji.Ota@Sun.COM 
357*12863SEiji.Ota@Sun.COM struct rds_rdma_args {
358*12863SEiji.Ota@Sun.COM 	rds_rdma_cookie_t cookie;
359*12863SEiji.Ota@Sun.COM 	struct rds_iovec remote_vec;
360*12863SEiji.Ota@Sun.COM 	u_int64_t	local_vec_addr;
361*12863SEiji.Ota@Sun.COM 	u_int64_t	nr_local;
362*12863SEiji.Ota@Sun.COM 	u_int64_t	flags;
363*12863SEiji.Ota@Sun.COM 	u_int64_t	user_token;
36412414SEiji.Ota@Sun.COM };
36512414SEiji.Ota@Sun.COM 
366*12863SEiji.Ota@Sun.COM struct rds_rdma_notify {
367*12863SEiji.Ota@Sun.COM 	u_int64_t	user_token;
36812414SEiji.Ota@Sun.COM 	int32_t		status;
36912414SEiji.Ota@Sun.COM };
37012414SEiji.Ota@Sun.COM 
371*12863SEiji.Ota@Sun.COM #define	RDS_RDMA_SUCCESS	0
372*12863SEiji.Ota@Sun.COM #define	RDS_RDMA_REMOTE_ERROR	1
373*12863SEiji.Ota@Sun.COM #define	RDS_RDMA_CANCELED	2
374*12863SEiji.Ota@Sun.COM #define	RDS_RDMA_DROPPED	3
375*12863SEiji.Ota@Sun.COM #define	RDS_RDMA_OTHER_ERROR	4
37612414SEiji.Ota@Sun.COM 
37712414SEiji.Ota@Sun.COM /*
37812414SEiji.Ota@Sun.COM  * Common set of flags for all RDMA related structs
37912414SEiji.Ota@Sun.COM  */
380*12863SEiji.Ota@Sun.COM #define	RDS_RDMA_READWRITE	0x0001
381*12863SEiji.Ota@Sun.COM #define	RDS_RDMA_FENCE		0x0002	/* use FENCE for immediate send */
382*12863SEiji.Ota@Sun.COM #define	RDS_RDMA_INVALIDATE	0x0004	/* invalidate R_Key after freeing MR */
383*12863SEiji.Ota@Sun.COM #define	RDS_RDMA_USE_ONCE	0x0008	/* free MR after use */
384*12863SEiji.Ota@Sun.COM #define	RDS_RDMA_DONTWAIT	0x0010	/* Don't wait in SET_BARRIER */
385*12863SEiji.Ota@Sun.COM #define	RDS_RDMA_NOTIFY_ME	0x0020	/* Notify when operation completes */
38612414SEiji.Ota@Sun.COM 
38712198SEiji.Ota@Sun.COM #ifdef	__cplusplus
38812198SEiji.Ota@Sun.COM }
38912198SEiji.Ota@Sun.COM #endif
39012198SEiji.Ota@Sun.COM 
391*12863SEiji.Ota@Sun.COM #endif /* _SYS_RDS_H */
392