docs/how-to-build.md: use proper markup for directory names
[unleashed/tickless.git] / include / sys / ib / clients / daplt / daplt_if.h
blob700772f42d2e4a40b7e6788079ec0c6020d3e1ae
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _DAPL_IF_H_
28 #define _DAPL_IF_H_
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
34 /* change this "version" everytime the interface changes */
35 #define DAPL_IF_VERSION (0x05302007)
37 #define DAPL_IOC (0x0da9 << 16)
38 #define DAPL_TYPE_IA (DAPL_IOC | 0x11 << 8)
39 #define DAPL_TYPE_EVD (DAPL_IOC | 0x12 << 8)
40 #define DAPL_TYPE_EP (DAPL_IOC | 0x13 << 8)
41 #define DAPL_TYPE_MR (DAPL_IOC | 0x14 << 8)
42 #define DAPL_TYPE_PD (DAPL_IOC | 0x15 << 8)
43 #define DAPL_TYPE_SP (DAPL_IOC | 0x16 << 8)
44 #define DAPL_TYPE_CNO (DAPL_IOC | 0x17 << 8)
45 #define DAPL_TYPE_MW (DAPL_IOC | 0x18 << 8)
46 #define DAPL_TYPE_MISC (DAPL_IOC | 0x19 << 8)
47 #define DAPL_TYPE_SRQ (DAPL_IOC | 0x1a << 8)
48 #define DAPL_TYPE_NONE (DAPL_IOC | 0x1f << 8)
49 #define DAPL_TYPE_MASK (0xffffff00)
51 /* NONE */
52 #define DAPL_IA_CREATE (DAPL_TYPE_NONE | 0x01)
54 /* MISC */
55 #define DAPL_CR_ACCEPT (DAPL_TYPE_MISC | 0x01)
56 #define DAPL_CR_REJECT (DAPL_TYPE_MISC | 0x02)
57 #define DAPL_IA_QUERY (DAPL_TYPE_MISC | 0x03)
58 #define DAPL_CR_HANDOFF (DAPL_TYPE_MISC | 0x04)
60 /* EP */
61 #define DAPL_EP_CREATE (DAPL_TYPE_EP | 0x01)
62 #define DAPL_EP_FREE (DAPL_TYPE_EP | 0x02)
63 #define DAPL_EP_CONNECT (DAPL_TYPE_EP | 0x03)
64 #define DAPL_EP_MODIFY (DAPL_TYPE_EP | 0x04)
65 #define DAPL_EP_DISCONNECT (DAPL_TYPE_EP | 0x05)
66 #define DAPL_EP_REINIT (DAPL_TYPE_EP | 0x06)
68 /* EVD */
69 #define DAPL_EVD_CREATE (DAPL_TYPE_EVD | 0x01)
70 #define DAPL_CQ_RESIZE (DAPL_TYPE_EVD | 0x02)
71 #define DAPL_EVD_FREE (DAPL_TYPE_EVD | 0x03)
72 #define DAPL_EVENT_POLL (DAPL_TYPE_EVD | 0x04)
73 #define DAPL_EVENT_WAKEUP (DAPL_TYPE_EVD | 0x05)
74 #define DAPL_EVD_MODIFY_CNO (DAPL_TYPE_EVD | 0x06)
76 /* MR */
77 #define DAPL_MR_REGISTER (DAPL_TYPE_MR | 0x01)
78 #define DAPL_MR_REGISTER_LMR (DAPL_TYPE_MR | 0x02)
79 #define DAPL_MR_REGISTER_SHARED (DAPL_TYPE_MR | 0x03)
80 #define DAPL_MR_DEREGISTER (DAPL_TYPE_MR | 0x04)
81 #define DAPL_MR_SYNC (DAPL_TYPE_MR | 0x05)
83 /* MW */
84 #define DAPL_MW_ALLOC (DAPL_TYPE_MW | 0x01)
85 #define DAPL_MW_FREE (DAPL_TYPE_MW | 0x02)
87 /* CNO */
88 #define DAPL_CNO_ALLOC (DAPL_TYPE_CNO | 0x01)
89 #define DAPL_CNO_FREE (DAPL_TYPE_CNO | 0x02)
90 #define DAPL_CNO_WAIT (DAPL_TYPE_CNO | 0x03)
92 /* PD */
93 #define DAPL_PD_ALLOC (DAPL_TYPE_PD | 0x01)
94 #define DAPL_PD_FREE (DAPL_TYPE_PD | 0x02)
96 /* SP */
97 #define DAPL_SERVICE_REGISTER (DAPL_TYPE_SP | 0x01)
98 #define DAPL_SERVICE_DEREGISTER (DAPL_TYPE_SP | 0x02)
100 /* SRQ */
101 #define DAPL_SRQ_CREATE (DAPL_TYPE_SRQ | 0x01)
102 #define DAPL_SRQ_FREE (DAPL_TYPE_SRQ | 0x02)
103 #define DAPL_SRQ_RESIZE (DAPL_TYPE_SRQ | 0x03)
106 * Drivers name and minor name.
108 #define DAPLKA_DRV_NAME "daplt"
109 #define DAPLKA_MINOR_NAME "daplt"
110 #define DAPLKA_DEFAULT_PATH "/devices/ib/daplt@0:daplt"
111 #define DAPLKA_DRIVER_MINOR 0
114 * Upper limit on number of events that can be polled per event_poll ioctl
115 * Since we allocate memory in kernel there needs to be an upper bound.
117 #define DAPL_EVD_MAX_EVENTS 16384
119 * Number of events that we generally poll for in event_poll.
121 #define NUM_EVENTS_PER_POLL 16
123 /* duplicated from dat.h */
124 #ifndef _DAT_H_
125 typedef enum dat_evd_flags {
126 DAT_EVD_SOFTWARE_FLAG = 0x01,
127 DAT_EVD_CR_FLAG = 0x10,
128 DAT_EVD_DTO_FLAG = 0x20,
129 DAT_EVD_CONNECTION_FLAG = 0x40,
130 DAT_EVD_RMR_BIND_FLAG = 0x80,
131 DAT_EVD_ASYNC_FLAG = 0x100,
132 /* DAT events only, no software events */
133 DAT_EVD_DEFAULT_FLAG = 0x1F0
134 } DAT_EVD_FLAGS;
135 #endif /* _DAT_H_ */
137 #define DAPL_MAX_PRIVATE_DATA_SIZE IBT_MAX_PRIV_DATA_SZ
138 #define DAPL_ATS_NBYTES 16 /* SA record data length */
141 * All structures defined herein are used for ioctls. On amd64,
142 * use pack(4) to make structures match the x86 alignment rules.
145 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
146 #pragma pack(4)
147 #endif
150 * Byte Offset
151 * uDAPL client's private data 64 00
152 * Base Sockets Direct Header (BSDH) 4 64
153 * Extended Header 68
154 * Hello Message (HH) 24
156 * bits 32-24 23-16 15-8 7-0
157 * bytes
158 * 00-63 uDAPL client's private data
159 * 64-67 MID client_msg_len checksum
160 * 68-72 MajV MinV IPV rsvd1
161 * 73-75 rsvd2 LocalPort
162 * 76-79 SrcIP(127-96)
163 * 80-83 SrcIP(95-64)
164 * 84-87 SrcIP(63-32)
165 * 88-92 SrcIP(31-00)
168 typedef union dapl_ia_addr_s {
169 struct {
170 uint32_t iad_pad[3];
171 struct in_addr iad_v4data;
172 } iad_v4_s; /* IPv4 format */
173 in6_addr_t iad_v6data; /* IPv6 format */
174 uint8_t iad_sadata[DAPL_ATS_NBYTES]; /* SA format */
175 uint32_t iad_src; /* alignment */
176 } dapl_ia_addr_t;
177 #define iad_v4 iad_v4_s.iad_v4data
178 #define iad_v4pad iad_v4_s.iad_pad
179 #define iad_v6 iad_v6data
180 #define iad_sa iad_sadata
182 typedef struct dapl_hello_msg {
183 uint16_t hi_checksum; /* checksum */
184 uint8_t hi_clen; /* client private data len */
185 uint8_t hi_mid; /* command - not use */
186 uint16_t hi_rsvd1;
187 uint8_t hi_ipv; /* IP family ipv4 or ipv6 */
188 uint8_t hi_vers; /* hello message version number */
189 in_port_t hi_port; /* IP port number */
190 uint16_t hi_rsvd2;
191 dapl_ia_addr_t _hi_ipaddr; /* IP address */
192 } DAPL_HELLO_MSG;
193 /* different views of the address field */
194 #define hi_v4ipaddr _hi_ipaddr.iad_v4 /* IPv4 */
195 #define hi_v4pad _hi_ipaddr.iad_v4pad
196 #define hi_v6ipaddr _hi_ipaddr.iad_v6 /* IPv6 */
197 #define hi_saaddr _hi_ipaddr.iad_sa /* 16 bytes SA record */
199 #define DAPL_CHECKSUM 0xbeef /* use as magic number */
200 #define DAPL_HELLO_MSG_VERS 0x10 /* major 1 minor 0 */
201 /* DAPL_PRIVATE used to pass private data in a connection */
202 #define DAPL_CONSUMER_MAX_PRIVATE_DATA_SIZE 64
203 typedef struct dapl_private {
204 unsigned char private_data[DAPL_CONSUMER_MAX_PRIVATE_DATA_SIZE];
205 DAPL_HELLO_MSG hello_msg;
206 } DAPL_PRIVATE;
208 /* EP ioctl interfaces */
211 * Definitions used by DAPL for HCA specific "data out" information. This
212 * data is opaque to daplt, and is consumed by HCA specific code in the
213 * userland library.
215 * The sizes (in units of uint64_t) need to be big enough for all HCAs
216 * supported. Although 16 is large enough, since we never want to have
217 * to change our interface version just because we undersized this, we
218 * have chosen 24.
220 #define DAPL_CQ_DATA_OUT_SIZE 24
221 #define DAPL_QP_DATA_OUT_SIZE 24
222 #define DAPL_SRQ_DATA_OUT_SIZE 24
224 typedef uint64_t dapl_cq_data_out_t[DAPL_QP_DATA_OUT_SIZE];
225 typedef uint64_t dapl_qp_data_out_t[DAPL_CQ_DATA_OUT_SIZE];
226 typedef uint64_t dapl_srq_data_out_t[DAPL_SRQ_DATA_OUT_SIZE];
229 * Channel sizes struct, copy of ibt_chan_sizes_t so that it can work
230 * fine for both 32/64 bit library
232 typedef struct dapl_chan_sizes_s {
233 uint_t dcs_sq; /* SendQ size. */
234 uint_t dcs_rq; /* ReceiveQ size. */
235 uint_t dcs_sq_sgl; /* Max SGL elements in a SQ WR. */
236 uint_t dcs_rq_sgl; /* Max SGL elements in a RQ Wr. */
237 } dapl_chan_sizes_t;
240 * EP create ioctl message structure
242 typedef struct dapl_ep_create_s {
243 uint64_t ep_hkey; /* hash key of the EP */
244 uint64_t ep_pd_hkey; /* PD hash key */
245 uint64_t ep_rcv_evd_hkey; /* Recv evd hash key */
246 uint64_t ep_snd_evd_hkey; /* Send evd hash key */
247 uint64_t ep_conn_evd_hkey; /* Conn evd hash key */
248 uint64_t ep_srq_hkey; /* SRQ hash key */
249 uint32_t ep_srq_attached; /* EP with SRQ - 1 or 0 */
250 uint64_t ep_cookie; /* Userland EP pointer */
251 dapl_chan_sizes_t ep_ch_sizes; /* Requested RC params */
252 dapl_chan_sizes_t ep_ch_real_sizes; /* Allocated RC params */
253 dapl_qp_data_out_t ep_qp_data_out;
254 } dapl_ep_create_t;
257 * Modify is not yet completely implemented
259 typedef struct dapl_ep_modify_s {
260 uint64_t epm_hkey;
261 ibt_cep_modify_flags_t epm_flags;
262 uint8_t epm_rdma_ra_out;
263 uint8_t epm_rdma_ra_in;
264 } dapl_ep_modify_t;
267 * EP Connect ioctl message
269 typedef struct dapl_ep_connect_s {
270 uint64_t epc_hkey; /* EP hash key */
271 ib_gid_t epc_dgid; /* destination gid */
272 uint64_t epc_sid; /* service id */
273 uint64_t epc_timeout; /* timeout */
274 uint32_t epc_priv_sz; /* private data size */
275 dapl_ia_addr_t epc_raddr_sadata; /* remote addr in SA format */
276 uchar_t epc_priv[DAPL_MAX_PRIVATE_DATA_SIZE];
277 } dapl_ep_connect_t;
279 typedef struct dapl_ep_disconnect_s {
280 uint64_t epd_hkey; /* EP hash key */
281 } dapl_ep_disconnect_t;
284 * EP reinit ioctl called to recycle the RC
286 typedef struct dapl_ep_reinit_s {
287 uint64_t epri_hkey; /* EP hash key */
288 uint64_t epri_map_offset; /* Mapping offset of new QP */
289 uint64_t epri_map_len; /* Map len of new QP */
290 uint32_t epri_qpnum; /* QPnum of the new QP */
291 uint32_t epri_rq_offset; /* New RecvQ offset in buf */
292 uint32_t epri_rq_desc_addr; /* New RecvQ kernel addr */
293 uint32_t epri_rq_numwqe;
294 uint32_t epri_rq_wqesz;
295 uint32_t epri_sq_offset; /* New SendQ offset in buf */
296 uint32_t epri_sq_desc_addr; /* New SendQ kernel addr */
297 uint32_t epri_sq_numwqe;
298 uint32_t epri_sq_wqesz;
299 } dapl_ep_reinit_t;
301 typedef struct dapl_ep_free_s {
302 uint64_t epf_hkey; /* EP hash key */
303 } dapl_ep_free_t;
305 /* EVD ioctl interfaces */
308 * EVD create ioctl
310 typedef struct dapl_evd_create_s {
311 uint64_t evd_hkey; /* EVD hash key */
312 DAT_EVD_FLAGS evd_flags; /* EVD streams flag */
313 uint64_t evd_cookie; /* userland EVD pointer */
314 uint64_t evd_cno_hkey; /* CNO hash key */
315 uint32_t evd_cq_size; /* Requested CQ Size */
316 uint32_t evd_cq_real_size; /* Allocated CQ size */
317 dapl_cq_data_out_t evd_cq_data_out;
318 } dapl_evd_create_t;
321 * If an EVD has a CQ this ioctl message is used to resize the CQ
323 typedef struct dapl_cq_resize_s {
324 uint64_t cqr_evd_hkey; /* EVD hash key */
325 uint32_t cqr_cq_new_size; /* New requested CQ size */
326 uint32_t cqr_cq_real_size; /* Allocated CQ size */
327 dapl_cq_data_out_t cqr_cq_data_out;
328 } dapl_cq_resize_t;
331 * Event type used while returning events from the kernel
333 typedef enum {
334 /* event family for the Async events */
335 DAPL_ASYNC_EVENTS = 0x01,
336 /* event family for events posted by the PASSIVE side cm_handler */
337 DAPL_CR_EVENTS = 0x02,
338 /* event family for events posted by the PASSIVE side cm_handler */
339 DAPL_PASSIVE_CONNECTION_EVENTS = 0x04,
340 /* event family for events posted by the ACTIVE side cm_handler */
341 DAPL_ACTIVE_CONNECTION_EVENTS = 0x08
342 } dapl_event_family_t;
345 * Async event structure
347 typedef struct dapl_ib_async_event_s {
348 ibt_async_code_t ibae_type;
349 ib_guid_t ibae_hca_guid; /* HCA node GUID */
350 uint64_t ibae_cookie; /* ep or cq pointer */
351 uint8_t ibae_port; /* HCA Port num unaffiliated evnt */
352 } dapl_ib_async_event_t;
355 * CM events definitions used to translate IBTF CM events to DAPL CM events
357 typedef enum {
358 /* IBT_CM_EVENT_CONN_EST */
359 DAPL_IB_CME_CONNECTED = 1,
360 /* IBT_CM_EVENT_CONN_CLOSED */
361 DAPL_IB_CME_DISCONNECTED,
362 /* IBT_CM_EVENT_REQ_RCV */
363 DAPL_IB_CME_CONNECTION_REQUEST_PENDING,
364 DAPL_IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,
365 /* IBT_CM_EVENT_FAILURE */
366 DAPL_IB_CME_DESTINATION_REJECT,
367 DAPL_IB_CME_DESTINATION_REJECT_PRIVATE_DATA,
368 /* Currently not mapped to IBTF CM events */
369 DAPL_IB_CME_DESTINATION_UNREACHABLE,
370 DAPL_IB_CME_TOO_MANY_CONNECTION_REQUESTS,
371 DAPL_IB_CME_LOCAL_FAILURE,
372 DAPL_IB_CME_TIMED_OUT,
373 DAPL_IB_CME_DISCONNECTED_ON_LINK_DOWN,
375 * Not really a CM event but library uses CM events as reject reasons
376 * so to avoid any overlaps, make it part of this enum
378 DAPL_IB_CM_REJ_REASON_CONSUMER_REJ
379 } dapl_ib_cm_event_type_t;
382 * CM event structure
384 typedef struct dapl_ib_cm_event_s {
385 dapl_ib_cm_event_type_t ibce_event;
386 /* Userland PSP ptr for CR, EP ptr for CONNECTION */
387 uint64_t ibce_cookie;
388 /* Unique CR cookie: tmstamp + Index in the connection pending table */
389 uint64_t ibce_psep_cookie;
390 uint32_t ibce_priv_data_size;
391 uchar_t ibce_priv_data_ptr[DAPL_MAX_PRIVATE_DATA_SIZE];
392 } dapl_ib_cm_event_t;
395 * Kernel Events structure used for returning CM or Async events
397 typedef struct dapl_ib_event_s {
398 dapl_event_family_t ibe_ev_family;
399 union {
400 dapl_ib_async_event_t ibe_async; /* Async event */
401 dapl_ib_cm_event_t ibe_ce; /* CM event */
402 } ev_data;
403 #define ibe_async ev_data.ibe_async
404 #define ibe_ce ev_data.ibe_ce
405 } dapl_ib_event_t;
408 * Event poll ioctl message
410 typedef struct dapl_event_poll_s {
411 uint64_t evp_evd_hkey; /* EVD hash key */
412 uint64_t evp_timeout; /* Timeout value */
413 uint_t evp_threshold; /* Threshold passed in */
414 dapl_ib_event_t *evp_ep; /* array of events to be filled */
415 uint_t evp_num_ev; /* array sz, possbly > threshold */
416 uint_t evp_num_polled; /* number of elements filled */
417 } dapl_event_poll_t;
420 * Event poll ioctl message
422 typedef struct dapl_event_poll32_s {
423 uint64_t evp_evd_hkey; /* EVD hash key */
424 uint64_t evp_timeout; /* Timeout value */
425 uint_t evp_threshold; /* Threshold passed in */
426 caddr32_t evp_ep; /* array of events to be filled */
427 uint_t evp_num_ev; /* array sz, possbly > threshold */
428 uint_t evp_num_polled; /* number of elements filled */
429 } dapl_event_poll32_t;
432 * EVD hash key to wakeup
434 typedef struct dapl_event_wakeup_s {
435 uint64_t evw_hkey; /* EVD hash key */
436 } dapl_event_wakeup_t;
439 * modify EVD to CNO association
441 typedef struct dapl_evd_modify_cno_s {
442 uint64_t evmc_hkey; /* EVD hash key */
443 uint64_t evmc_cno_hkey; /* new CNO hash key */
444 } dapl_evd_modify_cno_t;
448 * EVD hash key to free
450 typedef struct dapl_evd_free_s {
451 uint64_t evf_hkey; /* EVD hash key */
452 } dapl_evd_free_t;
454 /* MR ioctl interfaces */
457 * MR register ioctl message
459 typedef struct dapl_mr_register_s {
460 uint64_t mr_hkey; /* MR hash key */
461 uint64_t mr_pd_hkey; /* PD hash key */
462 ib_vaddr_t mr_vaddr; /* Virtual address to register */
463 ib_memlen_t mr_len; /* Length of region to register */
464 ibt_mr_flags_t mr_flags;
465 ibt_lkey_t mr_lkey; /* Lkey returned from mr_register */
466 ibt_rkey_t mr_rkey; /* Rkey returned from mr_register */
467 } dapl_mr_register_t;
470 * Shared MR cookie
472 typedef union dapl_mr_cookie_u {
473 uint64_t mc_uint_arr[5];
474 uchar_t mc_byte_arr[40];
475 } dapl_mr_cookie_t;
478 * Shared MR register ioctl message
480 typedef struct dapl_mr_register_shared_s {
481 uint64_t mrs_hkey; /* MR hash key */
482 uint64_t mrs_pd_hkey; /* PD hash key */
483 ib_vaddr_t mrs_vaddr; /* Virtual address to register */
484 ib_memlen_t mrs_len; /* Length of region to register */
485 ibt_mr_flags_t mrs_flags;
486 ibt_lkey_t mrs_lkey; /* Lkey returned from mr_register */
487 ibt_rkey_t mrs_rkey; /* Rkey returned from mr_register */
488 dapl_mr_cookie_t mrs_shm_cookie; /* shared mem cookie */
489 } dapl_mr_register_shared_t;
492 * MR based MR register ioctl message
494 typedef struct dapl_mr_register_lmr_s {
495 uint64_t mrl_hkey; /* MR hash key */
496 uint64_t mrl_orig_hkey; /* hash key of Original MR */
497 ibt_mr_flags_t mrl_flags;
498 ibt_lkey_t mrl_lkey; /* Lkey returned from mr_register */
499 ibt_rkey_t mrl_rkey; /* Rkey returned from mr_register */
500 } dapl_mr_register_lmr_t;
503 * MR deregister ioctl message
505 typedef struct dapl_mr_deregister_s {
506 uint64_t mrd_hkey; /* MR hash key */
507 } dapl_mr_deregister_t;
510 * MR RDMA sync ioctl message
513 #define DAPL_MR_PER_SYNC 16
514 #define DAPL_MR_SYNC_RDMA_RD 0
515 #define DAPL_MR_SYNC_RDMA_WR 1
517 typedef struct dapl_mr_sync_vec_s {
518 uint64_t mrsv_hkey; /* MR hash key */
519 uint64_t mrsv_va; /* MR sync virtual addr */
520 uint64_t mrsv_len; /* MR sync length */
521 } dapl_mr_sync_vec_t;
523 typedef struct dapl_mr_sync_s {
524 uint32_t mrs_flags; /* MR sync direction */
525 uint64_t mrs_numseg; /* number of MR's */
526 dapl_mr_sync_vec_t mrs_vec[DAPL_MR_PER_SYNC]; /* sync elements */
527 } dapl_mr_sync_t;
529 /* IA ioctl interfaces */
532 * IA create ioctl message
534 typedef struct dapl_ia_create_s {
535 uint32_t ia_version; /* ioctl interface version */
536 ib_guid_t ia_guid; /* HCA guid */
537 uint32_t ia_port; /* port number */
538 uint32_t ia_pkey; /* pkey of the ibd instance */
539 uint32_t ia_resnum; /* resource num in resrc table */
540 uint8_t ia_sadata[DAPL_ATS_NBYTES]; /* SA data record */
541 } dapl_ia_create_t;
544 * This structure is pretty much a copy of ibt_hca_attr_t but only
545 * relevant fields are present and the data types are such that
546 * its safe to use it in both in 32 and 64 bit libraries
547 * For detailed description refer to ibt_hca_attr_t in ibtl_types.h
549 typedef struct dapl_hca_attr_s {
550 uint32_t dhca_vendor_id:24;
551 uint16_t dhca_device_id;
552 uint32_t dhca_version_id;
553 uint_t dhca_max_chans;
554 uint_t dhca_max_chan_sz;
555 uint_t dhca_max_sgl;
556 uint_t dhca_max_cq;
557 uint_t dhca_max_cq_sz;
558 uint_t dhca_max_memr;
559 ib_memlen_t dhca_max_memr_len;
560 uint_t dhca_max_mem_win;
561 uint8_t dhca_max_rdma_in_chan;
562 uint8_t dhca_max_rdma_out_chan;
563 uint16_t dhca_max_partitions;
564 uint8_t dhca_nports;
565 ib_guid_t dhca_node_guid;
566 uint_t dhca_max_pd;
567 uint_t dhca_max_srqs;
568 uint_t dhca_max_srqs_sz;
569 uint_t dhca_max_srq_sgl;
570 } dapl_hca_attr_t;
573 * IA query ioctl message
575 typedef struct dapl_ia_query_s {
576 dapl_hca_attr_t hca_attr;
577 } dapl_ia_query_t;
579 #define DAPL_MAX_IA 64
581 * IA enum ioctl message
583 typedef struct dapl_ia_enum_s {
584 uint32_t ia_count; /* number of IAs */
585 uint16_t ia_devnum[DAPL_MAX_IA]; /* devnum of IAs */
586 } dapl_ia_enum_t;
588 /* PD ioctl interfaces */
590 typedef struct dapl_pd_alloc_s {
591 uint64_t pda_hkey;
592 } dapl_pd_alloc_t;
594 typedef struct dapl_pd_free_s {
595 uint64_t pdf_hkey;
596 } dapl_pd_free_t;
598 /* MW ioctl interfaces */
600 typedef struct dapl_mw_alloc_s {
601 uint64_t mw_pd_hkey;
602 uint64_t mw_hkey;
603 ibt_rkey_t mw_rkey;
604 } dapl_mw_alloc_t;
606 typedef struct dapl_mw_free_s {
607 uint64_t mw_hkey;
608 } dapl_mw_free_t;
610 /* Passive Side ioctl interfaces */
613 * Service register ioctl message
615 typedef struct dapl_service_register_s {
616 ib_svc_id_t sr_sid; /* Requested service id */
617 uint64_t sr_evd_hkey; /* CR EVD hash key */
618 uint64_t sr_sp_hkey; /* SP hash key */
619 uint64_t sr_sp_cookie; /* Userland xSP ptr */
620 ib_svc_id_t sr_retsid; /* Returned service id */
621 } dapl_service_register_t;
624 * Service deregister ioctl message
626 typedef struct dapl_service_deregister_s {
627 uint64_t sdr_sp_hkey;
628 } dapl_service_deregister_t;
631 * Connection request accept ioctl message
633 typedef struct dapl_cr_accept_s {
634 uint64_t cra_sp_hkey; /* xSP hash key */
635 uint64_t cra_ep_hkey; /* EP hash key */
636 uint64_t cra_bkl_cookie; /* CR timestamp + SP backlog index */
637 uint32_t cra_priv_sz; /* private data and size */
638 uchar_t cra_priv[DAPL_MAX_PRIVATE_DATA_SIZE];
639 } dapl_cr_accept_t;
642 * Connection request reject ioctl message
644 typedef struct dapl_cr_reject_s {
645 uint64_t crr_sp_hkey; /* xSP hash key */
646 uint64_t crr_bkl_cookie; /* CR timestamp + SP backlog index */
647 int crr_reason; /* Reason for rejecting the CR */
648 } dapl_cr_reject_t;
651 * Connection request handoff ioctl message
653 typedef struct dapl_cr_handoff_s {
654 uint64_t crh_sp_hkey; /* xSP hash key */
655 uint64_t crh_bkl_cookie; /* CR timestamp + SP backlog index */
656 ib_svc_id_t crh_conn_qual; /* Service id of destination SP */
657 } dapl_cr_handoff_t;
659 /* CNO ioctl interfaces */
662 * CNO alloc ioctl message
664 typedef struct dapl_cno_alloc_s {
665 uint64_t cno_hkey; /* CNO hash key */
666 } dapl_cno_alloc_t;
669 * CNO free ioctl message
671 typedef struct dapl_cno_free_s {
672 uint64_t cnf_hkey; /* CNO hash key */
673 } dapl_cno_free_t;
676 * CNO wait ioctl message
678 typedef struct dapl_cno_wait_s {
679 uint64_t cnw_hkey; /* CNO hash key */
680 uint64_t cnw_timeout; /* CNO timeout */
681 uint64_t cnw_evd_cookie;
682 } dapl_cno_wait_t;
685 * SRQ related structures
687 typedef struct dapl_srq_sizes_s {
688 uint_t srqs_sz;
689 uint_t srqs_sgl;
690 } dapl_srq_sizes_t;
693 * SRQ create ioctl message
695 typedef struct dapl_srq_create_s {
696 uint64_t srqc_pd_hkey; /* hash key of the assoc PD */
697 dapl_srq_sizes_t srqc_sizes; /* Requested SRQ params */
698 uint64_t srqc_hkey; /* hash key of allocated SRQ */
699 dapl_srq_sizes_t srqc_real_sizes; /* Allocated SRQ params */
700 dapl_srq_data_out_t srqc_data_out;
701 } dapl_srq_create_t;
704 * SRQ resize ioctl message
706 typedef struct dapl_srq_resize_s {
707 uint64_t srqr_hkey; /* hash key of the SRQ */
708 uint32_t srqr_new_size; /* New SRQ size */
709 uint32_t srqr_real_size; /* Actual SRQ size */
710 dapl_srq_data_out_t srqr_data_out;
711 } dapl_srq_resize_t;
714 * SRQ free ioctl message
716 typedef struct dapl_srq_free_s {
717 uint64_t srqf_hkey; /* hash key of the SRQ being freed */
718 } dapl_srq_free_t;
720 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
721 #pragma pack()
722 #endif
724 #ifdef __cplusplus
726 #endif
728 #endif /* _DAPL_IF_H_ */