xref: /illumos-gate/usr/src/uts/common/rpc/rpc_rdma.h (revision 7c478bd9)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24*7c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
25*7c478bd9Sstevel@tonic-gate  */
26*7c478bd9Sstevel@tonic-gate 
27*7c478bd9Sstevel@tonic-gate #ifndef	_RPC_RPC_RDMA_H
28*7c478bd9Sstevel@tonic-gate #define	_RPC_RPC_RDMA_H
29*7c478bd9Sstevel@tonic-gate 
30*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*7c478bd9Sstevel@tonic-gate 
32*7c478bd9Sstevel@tonic-gate #include <rpc/rpc.h>
33*7c478bd9Sstevel@tonic-gate #include <rpc/rpc_sztypes.h>
34*7c478bd9Sstevel@tonic-gate #include <sys/sunddi.h>
35*7c478bd9Sstevel@tonic-gate #include <sys/sunldi.h>
36*7c478bd9Sstevel@tonic-gate 
37*7c478bd9Sstevel@tonic-gate #ifdef __cplusplus
38*7c478bd9Sstevel@tonic-gate extern "C" {
39*7c478bd9Sstevel@tonic-gate #endif
40*7c478bd9Sstevel@tonic-gate 
41*7c478bd9Sstevel@tonic-gate #define	RPCRDMA_VERS	0	/* Version of the RPC over RDMA protocol */
42*7c478bd9Sstevel@tonic-gate #define	RDMATF_VERS	1	/* Version of the API used by RPC for RDMA */
43*7c478bd9Sstevel@tonic-gate #define	RDMATF_VERS_1	1	/* Current version of RDMATF */
44*7c478bd9Sstevel@tonic-gate 
45*7c478bd9Sstevel@tonic-gate /*
46*7c478bd9Sstevel@tonic-gate  * The size of an RPC call or reply message
47*7c478bd9Sstevel@tonic-gate  */
48*7c478bd9Sstevel@tonic-gate #define	RPC_MSG_SZ  1024
49*7c478bd9Sstevel@tonic-gate 
50*7c478bd9Sstevel@tonic-gate /*
51*7c478bd9Sstevel@tonic-gate  * Storage for a chunk list
52*7c478bd9Sstevel@tonic-gate  */
53*7c478bd9Sstevel@tonic-gate #define	RPC_CL_SZ  1024
54*7c478bd9Sstevel@tonic-gate 
55*7c478bd9Sstevel@tonic-gate /*
56*7c478bd9Sstevel@tonic-gate  * Chunk size
57*7c478bd9Sstevel@tonic-gate  */
58*7c478bd9Sstevel@tonic-gate #define	MINCHUNK  1024
59*7c478bd9Sstevel@tonic-gate 
60*7c478bd9Sstevel@tonic-gate /*
61*7c478bd9Sstevel@tonic-gate  * Size of receive buffer
62*7c478bd9Sstevel@tonic-gate  */
63*7c478bd9Sstevel@tonic-gate #define	RPC_BUF_SIZE	2048
64*7c478bd9Sstevel@tonic-gate 
65*7c478bd9Sstevel@tonic-gate #define	NOWAIT	0	/* don't wait for operation of complete */
66*7c478bd9Sstevel@tonic-gate #define	WAIT	1	/* wait and ensure that operation is complete */
67*7c478bd9Sstevel@tonic-gate 
68*7c478bd9Sstevel@tonic-gate /*
69*7c478bd9Sstevel@tonic-gate  * RDMA xdr buffer control and other control flags. Add new flags here,
70*7c478bd9Sstevel@tonic-gate  * set them in private structure for xdr over RDMA in xdr_rdma.c
71*7c478bd9Sstevel@tonic-gate  */
72*7c478bd9Sstevel@tonic-gate #define	RDMA_NOCHUNK		0x1
73*7c478bd9Sstevel@tonic-gate 
74*7c478bd9Sstevel@tonic-gate /*
75*7c478bd9Sstevel@tonic-gate  * Return codes from RDMA operations
76*7c478bd9Sstevel@tonic-gate  */
77*7c478bd9Sstevel@tonic-gate typedef enum {
78*7c478bd9Sstevel@tonic-gate 
79*7c478bd9Sstevel@tonic-gate 	RDMA_SUCCESS = 0,	/* successful operation */
80*7c478bd9Sstevel@tonic-gate 
81*7c478bd9Sstevel@tonic-gate 	RDMA_INVAL = 1,		/* invalid parameter */
82*7c478bd9Sstevel@tonic-gate 	RDMA_TIMEDOUT = 2,	/* operation timed out */
83*7c478bd9Sstevel@tonic-gate 	RDMA_INTR = 3,		/* operation interrupted */
84*7c478bd9Sstevel@tonic-gate 	RDMA_NORESOURCE = 4,	/* insufficient resource */
85*7c478bd9Sstevel@tonic-gate 	/*
86*7c478bd9Sstevel@tonic-gate 	 * connection errors
87*7c478bd9Sstevel@tonic-gate 	 */
88*7c478bd9Sstevel@tonic-gate 	RDMA_REJECT = 5,	/* connection req rejected */
89*7c478bd9Sstevel@tonic-gate 	RDMA_NOLISTENER = 6,	/* no listener on server */
90*7c478bd9Sstevel@tonic-gate 	RDMA_UNREACHABLE = 7,	/* host unreachable */
91*7c478bd9Sstevel@tonic-gate 	RDMA_CONNLOST = 8,	/* connection lost */
92*7c478bd9Sstevel@tonic-gate 
93*7c478bd9Sstevel@tonic-gate 	RDMA_XPRTFAILED = 9,	/* RDMA transport failed */
94*7c478bd9Sstevel@tonic-gate 	RDMA_PROTECTERR = 10,	/* memory protection error */
95*7c478bd9Sstevel@tonic-gate 	RDMA_OVERRUN = 11,	/* transport overrun */
96*7c478bd9Sstevel@tonic-gate 	RDMA_RECVQEMPTY = 12,	/* incoming pkt dropped, recv q empty */
97*7c478bd9Sstevel@tonic-gate 	RDMA_PROTFAILED = 13,	/* RDMA protocol failed */
98*7c478bd9Sstevel@tonic-gate 	RDMA_NOTSUPP = 14,	/* requested feature not supported */
99*7c478bd9Sstevel@tonic-gate 	RDMA_REMOTERR = 15,	/* error at remote end */
100*7c478bd9Sstevel@tonic-gate 	/*
101*7c478bd9Sstevel@tonic-gate 	 * RDMATF errors
102*7c478bd9Sstevel@tonic-gate 	 */
103*7c478bd9Sstevel@tonic-gate 	RDMA_BADVERS = 16,	/* mismatch RDMATF versions */
104*7c478bd9Sstevel@tonic-gate 	RDMA_REG_EXIST = 17,	/* RDMATF registration already exists */
105*7c478bd9Sstevel@tonic-gate 
106*7c478bd9Sstevel@tonic-gate 	/*
107*7c478bd9Sstevel@tonic-gate 	 * fallback error
108*7c478bd9Sstevel@tonic-gate 	 */
109*7c478bd9Sstevel@tonic-gate 	RDMA_FAILED = 18	/* generic error */
110*7c478bd9Sstevel@tonic-gate } rdma_stat;
111*7c478bd9Sstevel@tonic-gate 
112*7c478bd9Sstevel@tonic-gate /*
113*7c478bd9Sstevel@tonic-gate  * Memory region context. This is an RDMA provider generated
114*7c478bd9Sstevel@tonic-gate  * handle for a registered arbitrary size contiguous virtual
115*7c478bd9Sstevel@tonic-gate  * memory. The RDMA Interface Adapter needs this for local or
116*7c478bd9Sstevel@tonic-gate  * remote memory access.
117*7c478bd9Sstevel@tonic-gate  *
118*7c478bd9Sstevel@tonic-gate  * The mrc_rmr field holds the remote memory region context
119*7c478bd9Sstevel@tonic-gate  * which is sent over-the-wire to provide the remote host
120*7c478bd9Sstevel@tonic-gate  * with RDMA access to the memory region.
121*7c478bd9Sstevel@tonic-gate  */
122*7c478bd9Sstevel@tonic-gate struct mrc {
123*7c478bd9Sstevel@tonic-gate 	uint32_t	mrc_rmr;	/* Remote MR context, sent OTW */
124*7c478bd9Sstevel@tonic-gate 	union {
125*7c478bd9Sstevel@tonic-gate 		struct mr {
126*7c478bd9Sstevel@tonic-gate 			uint32_t	lmr; 	/* Local MR context */
127*7c478bd9Sstevel@tonic-gate 			uint64_t	linfo;	/* Local memory info */
128*7c478bd9Sstevel@tonic-gate 		} mr;
129*7c478bd9Sstevel@tonic-gate 	} lhdl;
130*7c478bd9Sstevel@tonic-gate };
131*7c478bd9Sstevel@tonic-gate 
132*7c478bd9Sstevel@tonic-gate #define	mrc_lmr		lhdl.mr.lmr
133*7c478bd9Sstevel@tonic-gate #define	mrc_linfo	lhdl.mr.linfo
134*7c478bd9Sstevel@tonic-gate 
135*7c478bd9Sstevel@tonic-gate /*
136*7c478bd9Sstevel@tonic-gate  * The XDR offset value is used by the XDR
137*7c478bd9Sstevel@tonic-gate  * routine to identify the position in the
138*7c478bd9Sstevel@tonic-gate  * RPC message where the opaque object would
139*7c478bd9Sstevel@tonic-gate  * normally occur. Neither the data content
140*7c478bd9Sstevel@tonic-gate  * of the chunk, nor its size field are included
141*7c478bd9Sstevel@tonic-gate  * in the RPC message.  The XDR offset is calculated
142*7c478bd9Sstevel@tonic-gate  * as if the chunks were present.
143*7c478bd9Sstevel@tonic-gate  *
144*7c478bd9Sstevel@tonic-gate  * The remaining fields identify the chunk of data
145*7c478bd9Sstevel@tonic-gate  * on the sender.  The c_memhandle identifies a
146*7c478bd9Sstevel@tonic-gate  * registered RDMA memory region and the c_addr
147*7c478bd9Sstevel@tonic-gate  * and c_len fields identify the chunk within it.
148*7c478bd9Sstevel@tonic-gate  */
149*7c478bd9Sstevel@tonic-gate struct clist {
150*7c478bd9Sstevel@tonic-gate 	uint32		c_xdroff;	/* XDR offset */
151*7c478bd9Sstevel@tonic-gate 	uint32		c_len;		/* Length */
152*7c478bd9Sstevel@tonic-gate 	struct mrc	c_smemhandle;	/* src memory handle */
153*7c478bd9Sstevel@tonic-gate 	uint64 		c_ssynchandle;	/* src sync handle */
154*7c478bd9Sstevel@tonic-gate 	uint64		c_saddr;	/* src address */
155*7c478bd9Sstevel@tonic-gate 	struct mrc	c_dmemhandle;	/* dst memory handle */
156*7c478bd9Sstevel@tonic-gate 	uint64		c_dsynchandle;	/* dst sync handle */
157*7c478bd9Sstevel@tonic-gate 	uint64		c_daddr;	/* dst address */
158*7c478bd9Sstevel@tonic-gate 	struct clist	*c_next;	/* Next chunk */
159*7c478bd9Sstevel@tonic-gate };
160*7c478bd9Sstevel@tonic-gate 
161*7c478bd9Sstevel@tonic-gate typedef struct clist clist;
162*7c478bd9Sstevel@tonic-gate 
163*7c478bd9Sstevel@tonic-gate enum rdma_proc {
164*7c478bd9Sstevel@tonic-gate 	RDMA_MSG	= 0,	/* chunk list and RPC msg follow */
165*7c478bd9Sstevel@tonic-gate 	RDMA_NOMSG	= 1,	/* only chunk list follows */
166*7c478bd9Sstevel@tonic-gate 	RDMA_MSGP	= 2,	/* chunk list and RPC msg with padding follow */
167*7c478bd9Sstevel@tonic-gate 	RDMA_DONE	= 3	/* signal completion of chunk transfer */
168*7c478bd9Sstevel@tonic-gate };
169*7c478bd9Sstevel@tonic-gate 
170*7c478bd9Sstevel@tonic-gate /*
171*7c478bd9Sstevel@tonic-gate  * Listener information for a service
172*7c478bd9Sstevel@tonic-gate  */
173*7c478bd9Sstevel@tonic-gate struct rdma_svc_data {
174*7c478bd9Sstevel@tonic-gate 	queue_t		q;	/* queue_t to place incoming pkts */
175*7c478bd9Sstevel@tonic-gate 	int		active;	/* If active, after registeration startup */
176*7c478bd9Sstevel@tonic-gate 	rdma_stat	err_code;	/* Error code from plugin layer */
177*7c478bd9Sstevel@tonic-gate 	int32_t		svcid;		/* RDMA based service identifier */
178*7c478bd9Sstevel@tonic-gate };
179*7c478bd9Sstevel@tonic-gate 
180*7c478bd9Sstevel@tonic-gate /*
181*7c478bd9Sstevel@tonic-gate  * Per RDMA plugin module information.
182*7c478bd9Sstevel@tonic-gate  * Will be populated by each plugin
183*7c478bd9Sstevel@tonic-gate  * module during its initialization.
184*7c478bd9Sstevel@tonic-gate  */
185*7c478bd9Sstevel@tonic-gate typedef struct rdma_mod {
186*7c478bd9Sstevel@tonic-gate 	char 		*rdma_api;		/* "kvipl", "ibtf", etc */
187*7c478bd9Sstevel@tonic-gate 	uint_t 		rdma_version;		/* RDMATF API version */
188*7c478bd9Sstevel@tonic-gate 	int		rdma_count;		/* # of devices */
189*7c478bd9Sstevel@tonic-gate 	struct rdmaops 	*rdma_ops;		/* rdma op vector for api */
190*7c478bd9Sstevel@tonic-gate } rdma_mod_t;
191*7c478bd9Sstevel@tonic-gate 
192*7c478bd9Sstevel@tonic-gate /*
193*7c478bd9Sstevel@tonic-gate  * Registry of RDMA plugins
194*7c478bd9Sstevel@tonic-gate  */
195*7c478bd9Sstevel@tonic-gate typedef struct rdma_registry {
196*7c478bd9Sstevel@tonic-gate 	rdma_mod_t	*r_mod;		/* plugin mod info */
197*7c478bd9Sstevel@tonic-gate 	struct rdma_registry *r_next;	/* next registered RDMA plugin */
198*7c478bd9Sstevel@tonic-gate } rdma_registry_t;
199*7c478bd9Sstevel@tonic-gate 
200*7c478bd9Sstevel@tonic-gate /*
201*7c478bd9Sstevel@tonic-gate  * RDMA transport information
202*7c478bd9Sstevel@tonic-gate  */
203*7c478bd9Sstevel@tonic-gate typedef struct rdma_info {
204*7c478bd9Sstevel@tonic-gate 	uint_t	addrlen;	/* address length */
205*7c478bd9Sstevel@tonic-gate 	uint_t  mts;		/* max transfer size */
206*7c478bd9Sstevel@tonic-gate 	uint_t  mtu;		/* native mtu size of unlerlying network */
207*7c478bd9Sstevel@tonic-gate } rdma_info_t;
208*7c478bd9Sstevel@tonic-gate 
209*7c478bd9Sstevel@tonic-gate /*
210*7c478bd9Sstevel@tonic-gate  * RDMA Connection information
211*7c478bd9Sstevel@tonic-gate  */
212*7c478bd9Sstevel@tonic-gate typedef struct conn {
213*7c478bd9Sstevel@tonic-gate 	rdma_mod_t	*c_rdmamod;	/* RDMA transport info for conn */
214*7c478bd9Sstevel@tonic-gate 	struct netbuf	c_raddr;	/* remote address */
215*7c478bd9Sstevel@tonic-gate 	struct netbuf	c_laddr;	/* local address */
216*7c478bd9Sstevel@tonic-gate 	int		c_ref;		/* no. of clients of connection */
217*7c478bd9Sstevel@tonic-gate 	struct conn	*c_next;	/* next in list of connections */
218*7c478bd9Sstevel@tonic-gate 	struct conn	*c_prev;	/* prev in list of connections */
219*7c478bd9Sstevel@tonic-gate 	caddr_t		c_private;	/* transport specific stuff */
220*7c478bd9Sstevel@tonic-gate 
221*7c478bd9Sstevel@tonic-gate #define	C_IDLE		0x80000000
222*7c478bd9Sstevel@tonic-gate #define	C_CONN_PEND	0x40000000
223*7c478bd9Sstevel@tonic-gate #define	C_CONNECTED	0x20000000
224*7c478bd9Sstevel@tonic-gate #define	C_ERROR		0x10000000
225*7c478bd9Sstevel@tonic-gate #define	C_DISCONN_PEND	0x08000000
226*7c478bd9Sstevel@tonic-gate #define	C_REMOTE_DOWN	0x04000000
227*7c478bd9Sstevel@tonic-gate 
228*7c478bd9Sstevel@tonic-gate 	uint_t		c_state;	/* state of connection */
229*7c478bd9Sstevel@tonic-gate 	kmutex_t	c_lock;		/* protect c_state and c_ref fields */
230*7c478bd9Sstevel@tonic-gate 	kcondvar_t	c_cv;		/* to signal when pending is done */
231*7c478bd9Sstevel@tonic-gate } CONN;
232*7c478bd9Sstevel@tonic-gate 
233*7c478bd9Sstevel@tonic-gate 
234*7c478bd9Sstevel@tonic-gate /*
235*7c478bd9Sstevel@tonic-gate  * Memory management for the RDMA buffers
236*7c478bd9Sstevel@tonic-gate  */
237*7c478bd9Sstevel@tonic-gate /*
238*7c478bd9Sstevel@tonic-gate  * RDMA buffer types
239*7c478bd9Sstevel@tonic-gate  */
240*7c478bd9Sstevel@tonic-gate typedef enum {
241*7c478bd9Sstevel@tonic-gate 	SEND_BUFFER,	/* buf for send msg */
242*7c478bd9Sstevel@tonic-gate 	SEND_DESCRIPTOR, /* buf used for send msg descriptor in plugins only */
243*7c478bd9Sstevel@tonic-gate 	RECV_BUFFER,	/* buf for recv msg */
244*7c478bd9Sstevel@tonic-gate 	RECV_DESCRIPTOR, /* buf used for recv msg descriptor in plugins only */
245*7c478bd9Sstevel@tonic-gate 	CHUNK_BUFFER	/* chunk buf used in RDMATF only and not in plugins */
246*7c478bd9Sstevel@tonic-gate } rdma_btype;
247*7c478bd9Sstevel@tonic-gate 
248*7c478bd9Sstevel@tonic-gate /*
249*7c478bd9Sstevel@tonic-gate  * RDMA buffer information
250*7c478bd9Sstevel@tonic-gate  */
251*7c478bd9Sstevel@tonic-gate typedef struct rdma_buf {
252*7c478bd9Sstevel@tonic-gate 	rdma_btype	type;	/* buffer type */
253*7c478bd9Sstevel@tonic-gate 	int		len;	/* length of buffer */
254*7c478bd9Sstevel@tonic-gate 	caddr_t		addr;	/* buffer address */
255*7c478bd9Sstevel@tonic-gate 	struct mrc	handle;	/* buffer registration handle */
256*7c478bd9Sstevel@tonic-gate } rdma_buf_t;
257*7c478bd9Sstevel@tonic-gate 
258*7c478bd9Sstevel@tonic-gate /*
259*7c478bd9Sstevel@tonic-gate  * Data transferred from plugin interrupt to svc_queuereq()
260*7c478bd9Sstevel@tonic-gate  */
261*7c478bd9Sstevel@tonic-gate struct recv_data {
262*7c478bd9Sstevel@tonic-gate 	CONN		*conn;
263*7c478bd9Sstevel@tonic-gate 	int		status;
264*7c478bd9Sstevel@tonic-gate 	rdma_buf_t	rpcmsg;
265*7c478bd9Sstevel@tonic-gate };
266*7c478bd9Sstevel@tonic-gate 
267*7c478bd9Sstevel@tonic-gate /*
268*7c478bd9Sstevel@tonic-gate  * Operations vector for RDMA transports.
269*7c478bd9Sstevel@tonic-gate  */
270*7c478bd9Sstevel@tonic-gate typedef struct rdmaops {
271*7c478bd9Sstevel@tonic-gate 	/* Network */
272*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_reachable)(int addr_type, struct netbuf *,
273*7c478bd9Sstevel@tonic-gate 						void **handle);
274*7c478bd9Sstevel@tonic-gate 	/* Connection */
275*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_get_conn)(struct netbuf *, int addr_type,
276*7c478bd9Sstevel@tonic-gate 						void *, CONN **);
277*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_rel_conn)(CONN *);
278*7c478bd9Sstevel@tonic-gate 	/* Server side listner start and stop routines */
279*7c478bd9Sstevel@tonic-gate 	void		(*rdma_svc_listen)(struct rdma_svc_data *);
280*7c478bd9Sstevel@tonic-gate 	void		(*rdma_svc_stop)(struct rdma_svc_data *);
281*7c478bd9Sstevel@tonic-gate 	/* Memory */
282*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_regmem)(CONN *, caddr_t, uint_t, struct mrc *);
283*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_deregmem)(CONN *, caddr_t, struct mrc);
284*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_regmemsync)(CONN *, caddr_t, uint_t,
285*7c478bd9Sstevel@tonic-gate 				struct mrc *, void **);
286*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_deregmemsync)(CONN *, caddr_t, struct mrc,
287*7c478bd9Sstevel@tonic-gate 				void *);
288*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_syncmem)(CONN *, void *, caddr_t, int, int);
289*7c478bd9Sstevel@tonic-gate 	/* Buffer */
290*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_buf_alloc)(CONN *, rdma_buf_t *);
291*7c478bd9Sstevel@tonic-gate 	void		(*rdma_buf_free)(CONN *, rdma_buf_t *);
292*7c478bd9Sstevel@tonic-gate 	/* Transfer */
293*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_send)(CONN *, clist *, uint32_t);
294*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_send_resp)(CONN *, clist *, uint32_t);
295*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_clnt_recvbuf)(CONN *, clist *, uint32_t);
296*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_svc_recvbuf)(CONN *, clist *);
297*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_recv)(CONN *, clist **, uint32_t);
298*7c478bd9Sstevel@tonic-gate 	/* RDMA */
299*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_read)(CONN *, clist *, int);
300*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_write)(CONN *, clist *, int);
301*7c478bd9Sstevel@tonic-gate 	/* INFO */
302*7c478bd9Sstevel@tonic-gate 	rdma_stat	(*rdma_getinfo)(rdma_info_t *info);
303*7c478bd9Sstevel@tonic-gate 
304*7c478bd9Sstevel@tonic-gate } rdmaops_t;
305*7c478bd9Sstevel@tonic-gate 
306*7c478bd9Sstevel@tonic-gate /*
307*7c478bd9Sstevel@tonic-gate  * RDMA operations.
308*7c478bd9Sstevel@tonic-gate  */
309*7c478bd9Sstevel@tonic-gate #define	RDMA_REACHABLE(rdma_ops, addr_type, addr, handle)	\
310*7c478bd9Sstevel@tonic-gate 	(*(rdma_ops)->rdma_reachable)(addr_type, addr, handle)
311*7c478bd9Sstevel@tonic-gate 
312*7c478bd9Sstevel@tonic-gate #define	RDMA_GET_CONN(rdma_ops, addr, addr_type, handle, conn)	\
313*7c478bd9Sstevel@tonic-gate 	(*(rdma_ops)->rdma_get_conn)(addr, addr_type, handle, conn)
314*7c478bd9Sstevel@tonic-gate 
315*7c478bd9Sstevel@tonic-gate #define	RDMA_REL_CONN(conn)	\
316*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_rel_conn)(conn)
317*7c478bd9Sstevel@tonic-gate 
318*7c478bd9Sstevel@tonic-gate #define	RDMA_REGMEM(conn, buff, len, handle)	\
319*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_regmem)(conn, buff, len, handle)
320*7c478bd9Sstevel@tonic-gate 
321*7c478bd9Sstevel@tonic-gate #define	RDMA_DEREGMEM(conn, buff, handle)	\
322*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_deregmem)(conn, buff, handle)
323*7c478bd9Sstevel@tonic-gate 
324*7c478bd9Sstevel@tonic-gate #define	RDMA_REGMEMSYNC(conn, buff, len, handle, synchandle)	\
325*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_regmemsync)(conn, buff, \
326*7c478bd9Sstevel@tonic-gate 	    len, handle, synchandle)
327*7c478bd9Sstevel@tonic-gate 
328*7c478bd9Sstevel@tonic-gate #define	RDMA_DEREGMEMSYNC(conn, buff, handle, synchandle)	\
329*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_deregmemsync)(conn, buff, \
330*7c478bd9Sstevel@tonic-gate 	    handle, synchandle)
331*7c478bd9Sstevel@tonic-gate 
332*7c478bd9Sstevel@tonic-gate #define	RDMA_SYNCMEM(conn, handle, buff, len, direction)	\
333*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_syncmem)(conn, handle, \
334*7c478bd9Sstevel@tonic-gate 	    buff, len, direction)
335*7c478bd9Sstevel@tonic-gate 
336*7c478bd9Sstevel@tonic-gate #define	RDMA_BUF_ALLOC(conn, rbuf)	\
337*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_buf_alloc)(conn, rbuf)
338*7c478bd9Sstevel@tonic-gate 
339*7c478bd9Sstevel@tonic-gate #define	RDMA_BUF_FREE(conn, rbuf)	\
340*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_buf_free)(conn, rbuf)
341*7c478bd9Sstevel@tonic-gate 
342*7c478bd9Sstevel@tonic-gate #define	RDMA_SEND(conn, sendlist, xid)	\
343*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_send)(conn, sendlist, xid)
344*7c478bd9Sstevel@tonic-gate 
345*7c478bd9Sstevel@tonic-gate #define	RDMA_SEND_RESP(conn, sendlist, xid)	\
346*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_send_resp)(conn, sendlist, xid)
347*7c478bd9Sstevel@tonic-gate 
348*7c478bd9Sstevel@tonic-gate #define	RDMA_CLNT_RECVBUF(conn, cl, xid)	\
349*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_clnt_recvbuf)(conn, cl, xid)
350*7c478bd9Sstevel@tonic-gate 
351*7c478bd9Sstevel@tonic-gate #define	RDMA_SVC_RECVBUF(conn, cl)	\
352*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_svc_recvbuf)(conn, cl)
353*7c478bd9Sstevel@tonic-gate 
354*7c478bd9Sstevel@tonic-gate #define	RDMA_RECV(conn, recvlist, xid)	\
355*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_recv)(conn, recvlist, xid)
356*7c478bd9Sstevel@tonic-gate 
357*7c478bd9Sstevel@tonic-gate #define	RDMA_READ(conn, cl, wait)	\
358*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_read)(conn, cl, wait)
359*7c478bd9Sstevel@tonic-gate 
360*7c478bd9Sstevel@tonic-gate #define	RDMA_WRITE(conn, cl, wait)	\
361*7c478bd9Sstevel@tonic-gate 	(*(conn)->c_rdmamod->rdma_ops->rdma_write)(conn, cl, wait)
362*7c478bd9Sstevel@tonic-gate 
363*7c478bd9Sstevel@tonic-gate #define	RDMA_GETINFO(rdma_mod, info)	\
364*7c478bd9Sstevel@tonic-gate 	(*(rdma_mod)->rdma_ops->rdma_getinfo)(info)
365*7c478bd9Sstevel@tonic-gate 
366*7c478bd9Sstevel@tonic-gate #ifdef _KERNEL
367*7c478bd9Sstevel@tonic-gate extern rdma_registry_t	*rdma_mod_head;
368*7c478bd9Sstevel@tonic-gate extern krwlock_t rdma_lock;		/* protects rdma_mod_head list */
369*7c478bd9Sstevel@tonic-gate extern int rdma_modloaded;		/* flag for loading RDMA plugins */
370*7c478bd9Sstevel@tonic-gate extern int rdma_dev_available;		/* rdma device is loaded or not */
371*7c478bd9Sstevel@tonic-gate extern kmutex_t rdma_modload_lock;	/* protects rdma_modloaded flag */
372*7c478bd9Sstevel@tonic-gate extern uint_t rdma_minchunk;
373*7c478bd9Sstevel@tonic-gate extern ldi_ident_t rpcmod_li; 		/* needed by layed driver framework */
374*7c478bd9Sstevel@tonic-gate 
375*7c478bd9Sstevel@tonic-gate /*
376*7c478bd9Sstevel@tonic-gate  * General RDMA routines
377*7c478bd9Sstevel@tonic-gate  */
378*7c478bd9Sstevel@tonic-gate extern void clist_add(struct clist **clp, uint32_t xdroff, int len,
379*7c478bd9Sstevel@tonic-gate 	struct mrc *shandle, caddr_t saddr,
380*7c478bd9Sstevel@tonic-gate 	struct mrc *dhandle, caddr_t daddr);
381*7c478bd9Sstevel@tonic-gate extern void clist_free(struct clist *cl);
382*7c478bd9Sstevel@tonic-gate extern int clist_register(CONN *conn, struct clist *cl, bool_t src);
383*7c478bd9Sstevel@tonic-gate extern int clist_deregister(CONN *conn, struct clist *cl, bool_t src);
384*7c478bd9Sstevel@tonic-gate rdma_stat rdma_clnt_postrecv(CONN *conn, uint32_t xid);
385*7c478bd9Sstevel@tonic-gate rdma_stat rdma_svc_postrecv(CONN *conn);
386*7c478bd9Sstevel@tonic-gate extern rdma_stat clist_syncmem(CONN *conn, struct clist *cl, bool_t src);
387*7c478bd9Sstevel@tonic-gate extern rdma_stat rdma_register_mod(rdma_mod_t *mod);
388*7c478bd9Sstevel@tonic-gate extern rdma_stat rdma_unregister_mod(rdma_mod_t *mod);
389*7c478bd9Sstevel@tonic-gate extern void rdma_buf_free(CONN *conn, rdma_buf_t *rbuf);
390*7c478bd9Sstevel@tonic-gate extern int rdma_modload();
391*7c478bd9Sstevel@tonic-gate 
392*7c478bd9Sstevel@tonic-gate /*
393*7c478bd9Sstevel@tonic-gate  * RDMA XDR
394*7c478bd9Sstevel@tonic-gate  */
395*7c478bd9Sstevel@tonic-gate extern void xdrrdma_create(XDR *, caddr_t, uint_t, int, struct clist *,
396*7c478bd9Sstevel@tonic-gate 	enum xdr_op, CONN *);
397*7c478bd9Sstevel@tonic-gate extern void xdrrdma_destroy(XDR *);
398*7c478bd9Sstevel@tonic-gate extern struct clist *xdrrdma_clist(XDR *);
399*7c478bd9Sstevel@tonic-gate extern uint_t xdrrdma_getpos(XDR *);
400*7c478bd9Sstevel@tonic-gate extern bool_t xdrrdma_setpos(XDR *, uint_t);
401*7c478bd9Sstevel@tonic-gate extern bool_t xdr_clist(XDR *, clist *);
402*7c478bd9Sstevel@tonic-gate extern bool_t xdr_do_clist(XDR *, clist **);
403*7c478bd9Sstevel@tonic-gate extern uint_t xdr_getbufsize(XDR *);
404*7c478bd9Sstevel@tonic-gate unsigned int xdrrdma_sizeof(xdrproc_t func, void *data, int min_chunk);
405*7c478bd9Sstevel@tonic-gate unsigned int xdrrdma_authsize(AUTH *auth, struct cred *cred, int min_chunk);
406*7c478bd9Sstevel@tonic-gate #endif /* _KERNEL */
407*7c478bd9Sstevel@tonic-gate 
408*7c478bd9Sstevel@tonic-gate #ifdef __cplusplus
409*7c478bd9Sstevel@tonic-gate }
410*7c478bd9Sstevel@tonic-gate #endif
411*7c478bd9Sstevel@tonic-gate 
412*7c478bd9Sstevel@tonic-gate #endif	/* _RPC_RPC_RDMA_H */
413