[DAPL2] DAPL Counters & 2.0.3 extensions to support counter retrieval.
[mirror/winof/.git] / ulp / dapl2 / dapl / include / dapl.h
1 /*\r
2  * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.\r
3  *\r
4  * This Software is licensed under one of the following licenses:\r
5  *\r
6  * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
7  *    in the file LICENSE.txt in the root directory. The license is also\r
8  *    available from the Open Source Initiative, see\r
9  *    http://www.opensource.org/licenses/cpl.php.\r
10  *\r
11  * 2) under the terms of the "The BSD License" a copy of which is in the file\r
12  *    LICENSE2.txt in the root directory. The license is also available from\r
13  *    the Open Source Initiative, see\r
14  *    http://www.opensource.org/licenses/bsd-license.php.\r
15  *\r
16  * 3) under the terms of the "GNU General Public License (GPL) Version 2" a \r
17  *    copy of which is in the file LICENSE3.txt in the root directory. The \r
18  *    license is also available from the Open Source Initiative, see\r
19  *    http://www.opensource.org/licenses/gpl-license.php.\r
20  *\r
21  * Licensee has the right to choose one of the above licenses.\r
22  *\r
23  * Redistributions of source code must retain the above copyright\r
24  * notice and one of the license notices.\r
25  *\r
26  * Redistributions in binary form must reproduce both the above copyright\r
27  * notice, one of the license notices in the documentation\r
28  * and/or other materials provided with the distribution.\r
29  */\r
30 \r
31 /**********************************************************************\r
32  *\r
33  * MODULE: dapl.h\r
34  *\r
35  * PURPOSE: defines common data structures for the DAPL reference implemenation\r
36  *\r
37  * Description: This file describes the working data structures used within\r
38  *              DAPL RI.\r
39  *\r
40  *\r
41  * $Id: dapl.h 1317 2005-04-25 17:29:42Z jlentini $\r
42  **********************************************************************/\r
43 \r
44 #ifndef _DAPL_H_\r
45 #define _DAPL_H_\r
46 \r
47 #if defined(__KERNEL__)\r
48 #include <dat/kdat.h>\r
49 #else\r
50 #include <dat/udat.h>\r
51 #endif  /* defined(__KERNEL__) */\r
52 #include <dat/dat_registry.h>\r
53 #include "dapl_osd.h"\r
54 #include "dapl_debug.h"\r
55 \r
56 #ifdef  IBAPI\r
57 #include "dapl_ibapi_util.h"\r
58 #elif VAPI\r
59 #include "dapl_vapi_util.h"\r
60 #elif __OPENIB__\r
61 #include "dapl_openib_util.h"\r
62 #include "dapl_openib_cm.h"\r
63 #elif DUMMY\r
64 #include "dapl_dummy_util.h"\r
65 #elif OPENIB\r
66 #include "dapl_ib_util.h"\r
67 #else /* windows - IBAL and/or IBAL+Sock_CM */\r
68 #include "dapl_ibal_util.h"\r
69 #endif\r
70 \r
71 /*********************************************************************\r
72  *                                                                   *\r
73  * Enumerations                                                      *\r
74  *                                                                   *\r
75  *********************************************************************/\r
76 \r
77 typedef enum dapl_magic\r
78 {\r
79     /* magic number values for verification & debug */\r
80     DAPL_MAGIC_IA       = 0xCafeF00d,\r
81     DAPL_MAGIC_EVD      = 0xFeedFace,\r
82     DAPL_MAGIC_EP       = 0xDeadBabe,\r
83     DAPL_MAGIC_LMR      = 0xBeefCafe,\r
84     DAPL_MAGIC_RMR      = 0xABadCafe,\r
85     DAPL_MAGIC_PZ       = 0xDeafBeef,\r
86     DAPL_MAGIC_PSP      = 0xBeadeD0c,\r
87     DAPL_MAGIC_RSP      = 0xFab4Feed,\r
88     DAPL_MAGIC_SRQ      = 0xC001Babe,\r
89     DAPL_MAGIC_CR       = 0xBe12Cee1,\r
90     DAPL_MAGIC_CR_DESTROYED = 0xB12bDead,\r
91     DAPL_MAGIC_CNO      = 0xDeadF00d,\r
92     DAPL_MAGIC_INVALID  = 0xFFFFFFFF\r
93 } DAPL_MAGIC;\r
94 \r
95 typedef enum dapl_evd_state\r
96 {\r
97     DAPL_EVD_STATE_TERMINAL,\r
98     DAPL_EVD_STATE_INITIAL,\r
99     DAPL_EVD_STATE_OPEN,\r
100     DAPL_EVD_STATE_WAITED,\r
101     DAPL_EVD_STATE_DEAD = 0xDEAD\r
102 } DAPL_EVD_STATE;\r
103 \r
104 typedef enum dapl_evd_completion\r
105 {\r
106     DAPL_EVD_STATE_INIT,\r
107     DAPL_EVD_STATE_SOLICITED_WAIT,\r
108     DAPL_EVD_STATE_THRESHOLD,\r
109     DAPL_EVD_STATE_UNSIGNALLED\r
110 } DAPL_EVD_COMPLETION;\r
111 \r
112 typedef enum dapl_cno_state\r
113 {\r
114     DAPL_CNO_STATE_UNTRIGGERED,\r
115     DAPL_CNO_STATE_TRIGGERED,\r
116     DAPL_CNO_STATE_DEAD = 0xDeadFeed,\r
117 } DAPL_CNO_STATE;\r
118 \r
119 typedef enum dapl_qp_state\r
120 {\r
121     DAPL_QP_STATE_UNCONNECTED,\r
122     DAPL_QP_STATE_RESERVED,\r
123     DAPL_QP_STATE_PASSIVE_CONNECTION_PENDING,\r
124     DAPL_QP_STATE_ACTIVE_CONNECTION_PENDING,\r
125     DAPL_QP_STATE_TENTATIVE_CONNECTION_PENDING,\r
126     DAPL_QP_STATE_CONNECTED,\r
127     DAPL_QP_STATE_DISCONNECT_PENDING,\r
128     DAPL_QP_STATE_ERROR,\r
129     DAPL_QP_STATE_NOT_REUSABLE,\r
130     DAPL_QP_STATE_FREE\r
131 } DAPL_QP_STATE;\r
132 \r
133 \r
134 /*********************************************************************\r
135  *                                                                   *\r
136  * Constants                                                         *\r
137  *                                                                   *\r
138  *********************************************************************/\r
139 \r
140 /*\r
141  * number of HCAs allowed\r
142  */\r
143 #define DAPL_MAX_HCA_COUNT              4\r
144 \r
145 /*\r
146  * Configures the RMR bind evd restriction\r
147  */\r
148 \r
149 #define DAPL_RMR_BIND_EVD_RESTRICTION   DAT_RMR_EVD_SAME_AS_REQUEST_EVD\r
150 \r
151 /*\r
152  * special qp_state indicating the EP does not have a QP attached yet\r
153  */\r
154 #define DAPL_QP_STATE_UNATTACHED        0xFFF0\r
155 \r
156 #define DAPL_MAX_PRIVATE_DATA_SIZE      256\r
157 \r
158 /*********************************************************************\r
159  *                                                                   *\r
160  * Macros                                                            *\r
161  *                                                                   *\r
162  *********************************************************************/\r
163 \r
164 #if defined (sun) || defined(__sun) || defined(_sun_) || defined (__solaris__) \r
165 #define DAPL_BAD_PTR(a) ((unsigned long)(a) & 3)\r
166 #elif defined(__linux__)\r
167 #define DAPL_BAD_PTR(a) ((unsigned long)(a) & 3)\r
168 #elif defined(_WIN64)\r
169 #define DAPL_BAD_PTR(a) ((unsigned long)((DAT_UINT64)(a)) & 3)\r
170 #elif defined(_WIN32)\r
171 #define DAPL_BAD_PTR(a) ((unsigned long)((DAT_UINT64)(a)) & 3)\r
172 #endif\r
173 \r
174 /*\r
175  * Simple macro to verify a handle is bad. Conditions:\r
176  * - pointer is NULL\r
177  * - pointer is not word aligned\r
178  * - pointer's magic number is wrong\r
179  */\r
180 \r
181 #define DAPL_BAD_HANDLE(h, magicNum) (                          \\r
182             ((h) == NULL) ||                                    \\r
183             DAPL_BAD_PTR(h) ||                                  \\r
184             (((DAPL_HEADER *)(h))->magic != (magicNum)))\r
185 \r
186 #define DAPL_MIN(a, b)        ((a < b) ? (a) : (b))\r
187 #define DAPL_MAX(a, b)        ((a > b) ? (a) : (b))\r
188 \r
189 #if NDEBUG > 0\r
190 #define DEBUG_IS_BAD_HANDLE(h, magicNum) (DAPL_BAD_HANDLE(h, magicNum))\r
191 #else\r
192 #define DEBUG_IS_BAD_HANDLE(h, magicNum) (0)\r
193 #endif\r
194 \r
195 #define DAT_ERROR(Type, SubType) ((DAT_RETURN)(DAT_CLASS_ERROR | Type | SubType))\r
196 \r
197 /*********************************************************************\r
198  *                                                                   *\r
199  * Typedefs                                                          *\r
200  *                                                                   *\r
201  *********************************************************************/\r
202 \r
203 typedef struct dapl_llist_entry         DAPL_LLIST_ENTRY;\r
204 typedef DAPL_LLIST_ENTRY *              DAPL_LLIST_HEAD;\r
205 typedef struct dapl_ring_buffer         DAPL_RING_BUFFER;\r
206 typedef struct dapl_cookie_buffer       DAPL_COOKIE_BUFFER;\r
207 \r
208 typedef struct dapl_hash_table          DAPL_HASH_TABLE;\r
209 typedef struct dapl_hash_table *        DAPL_HASH_TABLEP;\r
210 typedef DAT_UINT64                      DAPL_HASH_KEY;\r
211 typedef void *                          DAPL_HASH_DATA;\r
212 \r
213 typedef struct dapl_hca                 DAPL_HCA;\r
214 \r
215 typedef struct dapl_header              DAPL_HEADER;\r
216 \r
217 typedef struct dapl_ia                  DAPL_IA;\r
218 typedef struct dapl_cno                 DAPL_CNO;\r
219 typedef struct dapl_evd                 DAPL_EVD;\r
220 typedef struct dapl_ep                  DAPL_EP;\r
221 typedef struct dapl_srq                 DAPL_SRQ;\r
222 typedef struct dapl_pz                  DAPL_PZ;\r
223 typedef struct dapl_lmr                 DAPL_LMR;\r
224 typedef struct dapl_rmr                 DAPL_RMR;\r
225 typedef struct dapl_sp                  DAPL_SP;\r
226 typedef struct dapl_cr                  DAPL_CR;\r
227 \r
228 typedef struct dapl_cookie              DAPL_COOKIE;\r
229 typedef struct dapl_dto_cookie          DAPL_DTO_COOKIE;\r
230 typedef struct dapl_rmr_cookie          DAPL_RMR_COOKIE;\r
231 \r
232 typedef struct dapl_private             DAPL_PRIVATE;\r
233 \r
234 typedef void (*DAPL_CONNECTION_STATE_HANDLER) (\r
235         IN      DAPL_EP *,\r
236         IN      ib_cm_events_t,\r
237         IN      const void *,\r
238         OUT     DAT_EVENT *);\r
239 \r
240 \r
241 /*********************************************************************\r
242  *                                                                   *\r
243  * Structures                                                        *\r
244  *                                                                   *\r
245  *********************************************************************/\r
246 \r
247 struct dapl_llist_entry\r
248 {\r
249     struct dapl_llist_entry     *flink;\r
250     struct dapl_llist_entry     *blink;\r
251     void                        *data;\r
252     DAPL_LLIST_HEAD             *list_head; /* for consistency checking */\r
253 };\r
254 \r
255 struct dapl_ring_buffer\r
256 {\r
257     void                **base;         /* base of element array */\r
258     DAT_COUNT           lim;            /* mask, number of entries - 1 */\r
259     DAPL_ATOMIC         head;           /* head pointer index */\r
260     DAPL_ATOMIC         tail;           /* tail pointer index */\r
261 };\r
262 \r
263 struct dapl_cookie_buffer\r
264 {\r
265     DAPL_COOKIE         *pool;\r
266     DAT_COUNT           pool_size;\r
267     DAPL_ATOMIC         head;\r
268     DAPL_ATOMIC         tail;\r
269 };\r
270 \r
271 struct dapl_hca\r
272 {\r
273     DAPL_OS_LOCK        lock;\r
274     DAPL_LLIST_HEAD     ia_list_head;      /* list of all open IAs */\r
275     DAPL_ATOMIC         handle_ref_count;  /* count of ia_opens on handle */\r
276     DAPL_EVD            *async_evd;\r
277     DAPL_EVD            *async_error_evd;\r
278     DAT_SOCK_ADDR6      hca_address;       /* local address of HCA*/\r
279     char                *name;             /* provider name */\r
280     ib_hca_handle_t     ib_hca_handle;\r
281     unsigned long       port_num;          /* physical port number */\r
282     ib_hca_transport_t  ib_trans;          /* Values specific transport API */\r
283     /* Memory Subsystem Support */\r
284     DAPL_HASH_TABLE     *lmr_hash_table;\r
285     /* Limits & useful HCA attributes */\r
286     DAT_IA_ATTR         ia_attr;\r
287 };\r
288 \r
289 /* DAPL Objects always have the following header */\r
290 struct dapl_header\r
291 {\r
292     DAT_PROVIDER        *provider;      /* required by DAT - must be first */\r
293     DAPL_MAGIC          magic;          /* magic number for verification */\r
294     DAT_HANDLE_TYPE     handle_type;    /* struct type */\r
295     DAPL_IA             *owner_ia;      /* ia which owns this stuct */\r
296     DAPL_LLIST_ENTRY    ia_list_entry;  /* link entry on ia struct */\r
297     DAT_CONTEXT         user_context;   /* user context - opaque to DAPL */\r
298     DAPL_OS_LOCK        lock;           /* lock - in header for easier macros */\r
299 };\r
300 \r
301 /* DAPL_IA maps to DAT_IA_HANDLE */\r
302 struct dapl_ia\r
303 {\r
304     DAPL_HEADER         header;\r
305     DAPL_HCA            *hca_ptr;\r
306     DAPL_EVD            *async_error_evd;\r
307     DAT_BOOLEAN         cleanup_async_error_evd;\r
308 \r
309     DAPL_LLIST_ENTRY    hca_ia_list_entry;      /* HCAs list of IAs */\r
310     DAPL_LLIST_HEAD     ep_list_head;           /* EP queue */\r
311     DAPL_LLIST_HEAD     lmr_list_head;          /* LMR queue */\r
312     DAPL_LLIST_HEAD     rmr_list_head;          /* RMR queue */\r
313     DAPL_LLIST_HEAD     pz_list_head;           /* PZ queue */\r
314     DAPL_LLIST_HEAD     evd_list_head;          /* EVD queue */\r
315     DAPL_LLIST_HEAD     cno_list_head;          /* CNO queue */\r
316     DAPL_LLIST_HEAD     psp_list_head;          /* PSP queue */\r
317     DAPL_LLIST_HEAD     rsp_list_head;          /* RSP queue */\r
318     DAPL_LLIST_HEAD     srq_list_head;          /* SRQ queue */\r
319 #ifdef DAPL_COUNTERS\r
320     void                *cntrs;\r
321 #endif\r
322 };\r
323 \r
324 /* DAPL_CNO maps to DAT_CNO_HANDLE */\r
325 struct dapl_cno\r
326 {\r
327     DAPL_HEADER header;\r
328 \r
329     /* A CNO cannot be freed while it is referenced elsewhere.  */\r
330     DAPL_ATOMIC                 cno_ref_count;\r
331     DAPL_CNO_STATE              cno_state;\r
332 \r
333     DAT_COUNT                   cno_waiters;\r
334     DAPL_EVD                    *cno_evd_triggered;\r
335 #if defined(__KERNEL__)\r
336     DAT_UPCALL_OBJECT           cno_upcall;\r
337     DAT_UPCALL_POLICY           cno_upcall_policy;\r
338 #else\r
339     DAT_OS_WAIT_PROXY_AGENT     cno_wait_agent;\r
340 #endif  /* defined(__KERNEL__) */\r
341 \r
342     DAPL_OS_WAIT_OBJECT         cno_wait_object;\r
343 };\r
344 \r
345 /* DAPL_EVD maps to DAT_EVD_HANDLE */\r
346 struct dapl_evd\r
347 {\r
348     DAPL_HEADER         header;\r
349 \r
350     DAPL_EVD_STATE      evd_state;\r
351     DAT_EVD_FLAGS       evd_flags;\r
352     DAT_BOOLEAN         evd_enabled; /* For attached CNO.  */\r
353     DAT_BOOLEAN         evd_waitable; /* EVD state.  */\r
354 \r
355     /* Derived from evd_flags; see dapls_evd_internal_create.  */\r
356     DAT_BOOLEAN         evd_producer_locking_needed;\r
357 \r
358     /* Every EVD has a CQ unless it is a SOFTWARE_EVENT only EVD */\r
359     ib_cq_handle_t      ib_cq_handle;\r
360 \r
361     /* Mellanox Specific completion handle for registration/de-registration */\r
362     ib_comp_handle_t    ib_comp_handle;\r
363 \r
364     /* An Event Dispatcher cannot be freed while\r
365      * it is referenced elsewhere.\r
366      */\r
367     DAPL_ATOMIC         evd_ref_count;\r
368 \r
369     /* Set if there has been a catastrophic overflow */\r
370     DAT_BOOLEAN         catastrophic_overflow;\r
371 \r
372     /* the actual events */\r
373     DAT_COUNT           qlen;\r
374     DAT_EVENT           *events;\r
375     DAPL_RING_BUFFER    free_event_queue;\r
376     DAPL_RING_BUFFER    pending_event_queue;\r
377 \r
378     /* CQ Completions are not placed into 'deferred_events'\r
379      ** rather they are simply left on the Completion Queue\r
380      ** and the fact that there was a notification is flagged.\r
381      */\r
382     DAT_BOOLEAN         cq_notified;\r
383     DAPL_OS_TICKS       cq_notified_when;\r
384 \r
385     DAT_COUNT           cno_active_count;\r
386     DAPL_CNO            *cno_ptr;\r
387 \r
388     DAPL_OS_WAIT_OBJECT wait_object;\r
389 \r
390 #ifdef CQ_WAIT_OBJECT\r
391     /* Some providers support a direct CQ wait object */\r
392     ib_wait_obj_handle_t        cq_wait_obj_handle;\r
393 #endif\r
394 \r
395     DAT_COUNT           threshold;\r
396     DAPL_EVD_COMPLETION completion_type;\r
397 \r
398 #ifdef DAPL_COUNTERS\r
399     void                *cntrs;\r
400 #endif\r
401 };\r
402 \r
403 /* DAPL_PRIVATE used to pass private data in a connection */\r
404 struct dapl_private\r
405 {\r
406 #ifdef IBHOSTS_NAMING\r
407     DAT_SOCK_ADDR6              hca_address;    /* local address of HCA*/\r
408 #endif /* IBHOSTS_NAMING */\r
409     unsigned char               private_data[DAPL_MAX_PRIVATE_DATA_SIZE];\r
410 };\r
411 \r
412 /* uDAPL timer entry, used to queue timeouts */\r
413 struct dapl_timer_entry\r
414 {\r
415     DAPL_LLIST_ENTRY            list_entry;     /* link entry on ia struct */\r
416     DAPL_OS_TIMEVAL             expires;\r
417     void                        (*function) (uintptr_t);\r
418     void                        *data;\r
419 };\r
420 \r
421 #ifdef DAPL_DBG_IO_TRC\r
422 \r
423 #define DBG_IO_TRC_QLEN   32            /* length of trace buffer        */\r
424 #define DBG_IO_TRC_IOV 3                /* iov elements we keep track of */\r
425 \r
426 struct io_buf_track\r
427 {\r
428     Ib_send_op_type             op_type;\r
429     DAPL_COOKIE                 *cookie;\r
430     DAT_LMR_TRIPLET             iov[DBG_IO_TRC_IOV];\r
431     DAT_RMR_TRIPLET             remote_iov;\r
432     unsigned int                done;   /* count to track completion ordering */\r
433     int                         status;\r
434     void                        *wqe;\r
435 };\r
436 \r
437 #endif /* DAPL_DBG_IO_TRC */\r
438 \r
439 /* DAPL_EP maps to DAT_EP_HANDLE */\r
440 struct dapl_ep\r
441 {\r
442     DAPL_HEADER                 header;\r
443     /* What the DAT Consumer asked for */\r
444     DAT_EP_PARAM                param;\r
445 \r
446     /* The RC Queue Pair (IBM OS API) */\r
447     ib_qp_handle_t              qp_handle;\r
448     unsigned int                qpn;    /* qp number */\r
449     ib_qp_state_t               qp_state;\r
450 \r
451     /* communications manager handle (IBM OS API) */\r
452     dp_ib_cm_handle_t           cm_handle;\r
453 \r
454     /* store the remote IA address here, reference from the param\r
455      * struct which only has a pointer, no storage\r
456      */\r
457     DAT_SOCK_ADDR6              remote_ia_address;\r
458 \r
459     /* For passive connections we maintain a back pointer to the CR */\r
460     void *                      cr_ptr;\r
461 \r
462     /* pointer to connection timer, if set */\r
463     struct dapl_timer_entry     *cxn_timer;\r
464 \r
465     /* private data container */\r
466     DAPL_PRIVATE                private;\r
467 \r
468     DAPL_COOKIE_BUFFER  req_buffer;\r
469     DAPL_COOKIE_BUFFER  recv_buffer;\r
470 \r
471 #ifdef DAPL_DBG_IO_TRC\r
472     int                 ibt_dumped;\r
473     struct io_buf_track *ibt_base;\r
474     DAPL_RING_BUFFER    ibt_queue;\r
475 #endif /* DAPL_DBG_IO_TRC */\r
476 #if defined(_WIN32) || defined(_WIN64)\r
477     DAT_BOOLEAN         recv_discreq;\r
478     DAT_BOOLEAN         sent_discreq;\r
479     dp_ib_cm_handle_t   ibal_cm_handle;\r
480 #endif\r
481 #ifdef DAPL_COUNTERS\r
482     void                *cntrs;\r
483 #endif\r
484 };\r
485 \r
486 /* DAPL_SRQ maps to DAT_SRQ_HANDLE */\r
487 struct dapl_srq\r
488 {\r
489     DAPL_HEADER         header;\r
490     DAT_SRQ_PARAM       param;\r
491     DAPL_ATOMIC         srq_ref_count;\r
492     DAPL_COOKIE_BUFFER  recv_buffer;\r
493     DAPL_ATOMIC         recv_count;\r
494 };\r
495 \r
496 /* DAPL_PZ maps to DAT_PZ_HANDLE */\r
497 struct dapl_pz\r
498 {\r
499     DAPL_HEADER         header;\r
500     ib_pd_handle_t      pd_handle;\r
501     DAPL_ATOMIC         pz_ref_count;\r
502 };\r
503 \r
504 /* DAPL_LMR maps to DAT_LMR_HANDLE */\r
505 struct dapl_lmr\r
506 {\r
507     DAPL_HEADER         header;\r
508     DAT_LMR_PARAM       param;\r
509     ib_mr_handle_t      mr_handle;\r
510     DAPL_ATOMIC         lmr_ref_count;\r
511 #if !defined(__KDAPL__)\r
512     char                shmid[DAT_LMR_COOKIE_SIZE]; /* shared memory ID */\r
513     ib_shm_transport_t  ib_trans;       /* provider specific data */\r
514 #endif /* !__KDAPL__ */\r
515 };\r
516 \r
517 /* DAPL_RMR maps to DAT_RMR_HANDLE */\r
518 struct dapl_rmr\r
519 {\r
520     DAPL_HEADER         header;\r
521     DAT_RMR_PARAM       param;\r
522     DAPL_EP             *ep;\r
523     DAPL_PZ             *pz;\r
524     DAPL_LMR            *lmr;\r
525     ib_mw_handle_t      mw_handle;\r
526 };\r
527 \r
528 /* SP types, indicating the state and queue */\r
529 typedef enum dapl_sp_state\r
530 {\r
531     DAPL_SP_STATE_FREE,\r
532     DAPL_SP_STATE_PSP_LISTENING,\r
533     DAPL_SP_STATE_PSP_PENDING,\r
534     DAPL_SP_STATE_RSP_LISTENING,\r
535     DAPL_SP_STATE_RSP_PENDING\r
536 } DAPL_SP_STATE;\r
537 \r
538 /* DAPL_SP maps to DAT_PSP_HANDLE and DAT_RSP_HANDLE */\r
539 struct dapl_sp\r
540 {\r
541     DAPL_HEADER         header;\r
542     DAPL_SP_STATE       state;          /* type and queue of the SP */\r
543 \r
544     /* PSP/RSP PARAM fields */\r
545     DAT_CONN_QUAL       conn_qual;\r
546     DAT_EVD_HANDLE      evd_handle;\r
547     DAT_PSP_FLAGS       psp_flags;\r
548     DAT_EP_HANDLE       ep_handle;\r
549 \r
550      /* maintenence fields */\r
551     DAT_BOOLEAN         listening;      /* PSP is registered & active */\r
552     ib_cm_srvc_handle_t cm_srvc_handle; /* Used by Mellanox CM */\r
553     DAPL_LLIST_HEAD     cr_list_head;   /* CR pending queue */\r
554     DAT_COUNT           cr_list_count;  /* count of CRs on queue */\r
555 #if _VENDOR_IBAL_\r
556     DAPL_OS_WAIT_OBJECT wait_object;    /* cancel & destroy. */\r
557 #endif\r
558 };\r
559 \r
560 /* DAPL_CR maps to DAT_CR_HANDLE */\r
561 struct dapl_cr\r
562 {\r
563     DAPL_HEADER         header;\r
564 \r
565     /* for convenience the data is kept as a DAT_CR_PARAM.\r
566      * however, the "local_endpoint" field is always NULL\r
567      * so this wastes a pointer. This is probably ok to\r
568      * simplify code, espedially dat_cr_query.\r
569      */\r
570     DAT_CR_PARAM        param;\r
571     /* IB specific fields */\r
572     dp_ib_cm_handle_t   ib_cm_handle;\r
573 \r
574     DAT_SOCK_ADDR6      remote_ia_address;\r
575     /* Assuming that the maximum private data size is small.\r
576      * If it gets large, use of a pointer may be appropriate.\r
577      */\r
578     unsigned char       private_data[DAPL_MAX_PRIVATE_DATA_SIZE];\r
579     /*\r
580      * Need to be able to associate the CR back to the PSP for\r
581      * dapl_cr_reject.\r
582      */\r
583     DAPL_SP             *sp_ptr;\r
584 };\r
585 \r
586 typedef enum dapl_dto_type\r
587 {\r
588     DAPL_DTO_TYPE_SEND,\r
589     DAPL_DTO_TYPE_RECV,\r
590     DAPL_DTO_TYPE_RDMA_WRITE,\r
591     DAPL_DTO_TYPE_RDMA_READ,\r
592 #ifdef DAT_EXTENSIONS\r
593     DAPL_DTO_TYPE_EXTENSION,\r
594 #endif\r
595 } DAPL_DTO_TYPE;\r
596 \r
597 typedef enum dapl_cookie_type\r
598 {\r
599     DAPL_COOKIE_TYPE_NULL,\r
600     DAPL_COOKIE_TYPE_DTO,\r
601     DAPL_COOKIE_TYPE_RMR,\r
602 } DAPL_COOKIE_TYPE;\r
603 \r
604 /* DAPL_DTO_COOKIE used as context for DTO WQEs */\r
605 struct dapl_dto_cookie\r
606 {\r
607     DAPL_DTO_TYPE               type;\r
608     DAT_DTO_COOKIE              cookie;\r
609     DAT_COUNT                   size;   /* used for SEND and RDMA write */\r
610 };\r
611 \r
612 /* DAPL_RMR_COOKIE used as context for bind WQEs */\r
613 struct dapl_rmr_cookie\r
614 {\r
615     DAPL_RMR                    *rmr;\r
616     DAT_RMR_COOKIE              cookie;\r
617 };\r
618 \r
619 /* DAPL_COOKIE used as context for WQEs */\r
620 struct dapl_cookie\r
621 {\r
622     DAPL_COOKIE_TYPE            type; /* Must be first, to define struct.  */\r
623     DAPL_EP                     *ep;\r
624     DAT_COUNT                   index;\r
625     union\r
626     {\r
627         DAPL_DTO_COOKIE         dto;\r
628         DAPL_RMR_COOKIE         rmr;\r
629     } val;\r
630 };\r
631 \r
632 /*\r
633  * Private Data operations. Used to obtain the size of the private\r
634  * data from the provider layer.\r
635  */\r
636 typedef enum dapl_private_data_op\r
637 {\r
638     DAPL_PDATA_CONN_REQ  = 0,           /* connect request    */\r
639     DAPL_PDATA_CONN_REP  = 1,           /* connect reply      */\r
640     DAPL_PDATA_CONN_REJ  = 2,           /* connect reject     */\r
641     DAPL_PDATA_CONN_DREQ = 3,           /* disconnect request */\r
642     DAPL_PDATA_CONN_DREP = 4,           /* disconnect reply   */\r
643 } DAPL_PDATA_OP;\r
644 \r
645 \r
646 /*\r
647  * Generic HCA name field\r
648  */\r
649 #define DAPL_HCA_NAME_MAX_LEN 260\r
650 typedef char DAPL_HCA_NAME[DAPL_HCA_NAME_MAX_LEN+1];\r
651 \r
652 #ifdef IBHOSTS_NAMING\r
653 \r
654 /*\r
655  * Simple mapping table to match IP addresses to GIDs. Loaded\r
656  * by dapl_init.\r
657  */\r
658 typedef struct _dapl_gid_map_table\r
659 {\r
660     uint32_t            ip_address;\r
661     ib_gid_t            gid;\r
662 } DAPL_GID_MAP;\r
663 \r
664 #endif /* IBHOSTS_NAMING */\r
665 \r
666 /*\r
667  * IBTA defined reason for reject message: See IBTA 1.1 specification,\r
668  * 12.6.7.2 REJECTION REASON section.\r
669  */\r
670 #define IB_CM_REJ_REASON_CONSUMER_REJ            0x001C\r
671 \r
672 \r
673 #if defined(DAPL_DBG_IO_TRC)\r
674 /*********************************************************************\r
675  *                                                                   *\r
676  * Debug I/O tracing support prototypes                              *\r
677  *                                                                   *\r
678  *********************************************************************/\r
679 /*\r
680  * I/O tracing support\r
681  */\r
682 void dapls_io_trc_alloc (\r
683     DAPL_EP                     *ep_ptr);\r
684 \r
685 void dapls_io_trc_update_completion (\r
686     DAPL_EP                     *ep_ptr,\r
687     DAPL_COOKIE                 *cookie,\r
688     ib_uint32_t                 ib_status );\r
689 \r
690 void dapls_io_trc_dump (\r
691     DAPL_EP                     *ep_ptr,\r
692     ib_work_completion_t        *cqe_ptr,\r
693     ib_uint32_t                 ib_status);\r
694 \r
695 #else /* DAPL_DBG_IO_TRC */\r
696 \r
697 #define dapls_io_trc_alloc(a)\r
698 #define dapls_io_trc_update_completion(a, b, c)\r
699 #define dapls_io_trc_dump(a, b, c)\r
700 \r
701 #endif /* DAPL_DBG_IO_TRC */\r
702 \r
703 \r
704 /*********************************************************************\r
705  *                                                                   *\r
706  * Function Prototypes                                               *\r
707  *                                                                   *\r
708  *********************************************************************/\r
709 \r
710 /*\r
711  * DAT Mandated functions\r
712  */\r
713 \r
714 extern DAT_RETURN DAT_API dapl_ia_open (\r
715         IN      const DAT_NAME_PTR,     /* name */\r
716         IN      DAT_COUNT,              /* asynch_evd_qlen */\r
717         INOUT   DAT_EVD_HANDLE *,       /* asynch_evd_handle */\r
718         OUT     DAT_IA_HANDLE *);       /* ia_handle */\r
719 \r
720 extern DAT_RETURN DAT_API dapl_ia_close (\r
721         IN      DAT_IA_HANDLE,          /* ia_handle */\r
722         IN      DAT_CLOSE_FLAGS );      /* ia_flags */\r
723 \r
724 \r
725 extern DAT_RETURN DAT_API dapl_ia_query (\r
726         IN      DAT_IA_HANDLE,          /* ia handle */\r
727         OUT     DAT_EVD_HANDLE *,       /* async_evd_handle */\r
728         IN      DAT_IA_ATTR_MASK,       /* ia_params_mask */\r
729         OUT     DAT_IA_ATTR *,          /* ia_params */\r
730         IN      DAT_PROVIDER_ATTR_MASK, /* provider_params_mask */\r
731         OUT     DAT_PROVIDER_ATTR * );  /* provider_params */\r
732 \r
733 \r
734 /* helper functions */\r
735 \r
736 extern DAT_RETURN DAT_API dapl_set_consumer_context (\r
737         IN      DAT_HANDLE,                     /* dat handle */\r
738         IN      DAT_CONTEXT);                   /* context */\r
739 \r
740 extern DAT_RETURN DAT_API dapl_get_consumer_context (\r
741         IN      DAT_HANDLE,                     /* dat handle */\r
742         OUT     DAT_CONTEXT * );                /* context */\r
743 \r
744 extern DAT_RETURN DAT_API dapl_get_handle_type (\r
745         IN      DAT_HANDLE,\r
746         OUT     DAT_HANDLE_TYPE * );\r
747 \r
748 /* CNO functions */\r
749 \r
750 #if !defined(__KERNEL__)\r
751 extern DAT_RETURN DAT_API dapl_cno_create (\r
752         IN      DAT_IA_HANDLE,                  /* ia_handle */\r
753         IN      DAT_OS_WAIT_PROXY_AGENT,        /* agent */\r
754         OUT     DAT_CNO_HANDLE *);              /* cno_handle */\r
755 \r
756 extern DAT_RETURN DAT_API dapl_cno_modify_agent (\r
757         IN      DAT_CNO_HANDLE,                 /* cno_handle */\r
758         IN      DAT_OS_WAIT_PROXY_AGENT);       /* agent */\r
759 \r
760 extern DAT_RETURN DAT_API dapl_cno_query (\r
761         IN      DAT_CNO_HANDLE,         /* cno_handle */\r
762         IN      DAT_CNO_PARAM_MASK,     /* cno_param_mask */\r
763         OUT     DAT_CNO_PARAM * );      /* cno_param */\r
764 \r
765 extern DAT_RETURN DAT_API dapl_cno_free (\r
766         IN      DAT_CNO_HANDLE);        /* cno_handle */\r
767 \r
768 extern DAT_RETURN DAT_API dapl_cno_wait (\r
769         IN      DAT_CNO_HANDLE,         /* cno_handle */\r
770         IN      DAT_TIMEOUT,            /* timeout */\r
771         OUT     DAT_EVD_HANDLE *);      /* evd_handle */\r
772 \r
773 extern DAT_RETURN DAT_API dapl_cno_fd_create (\r
774         IN      DAT_IA_HANDLE,          /* ia_handle            */\r
775         OUT     DAT_FD *,               /* file_descriptor      */\r
776         OUT     DAT_CNO_HANDLE *);      /* cno_handle           */\r
777 \r
778 extern DAT_RETURN DAT_API dapl_cno_trigger (\r
779         IN      DAT_CNO_HANDLE,         /* cno_handle */\r
780         OUT     DAT_EVD_HANDLE *);      /* evd_handle */\r
781 \r
782 #endif  /* !defined(__KERNEL__) */\r
783 \r
784 /* CR Functions */\r
785 \r
786 extern DAT_RETURN DAT_API dapl_cr_query (\r
787         IN      DAT_CR_HANDLE,          /* cr_handle */\r
788         IN      DAT_CR_PARAM_MASK,      /* cr_args_mask */\r
789         OUT     DAT_CR_PARAM * );       /* cwr_args */\r
790 \r
791 extern DAT_RETURN DAT_API dapl_cr_accept (\r
792         IN      DAT_CR_HANDLE,          /* cr_handle */\r
793         IN      DAT_EP_HANDLE,          /* ep_handle */\r
794         IN      DAT_COUNT,              /* private_data_size */\r
795         IN      const DAT_PVOID );      /* private_data */\r
796 \r
797 extern DAT_RETURN DAT_API dapl_cr_reject (\r
798         IN      DAT_CR_HANDLE,          /* cr_handle            */\r
799         IN      DAT_COUNT,              /* private_data_size    */\r
800         IN      const DAT_PVOID );      /* private_data         */\r
801 \r
802 extern DAT_RETURN DAT_API dapl_cr_handoff (\r
803         IN DAT_CR_HANDLE,               /* cr_handle */\r
804         IN DAT_CONN_QUAL);              /* handoff */\r
805 \r
806 /* EVD Functions */\r
807 \r
808 #if defined(__KERNEL__)\r
809 extern DAT_RETURN DAT_API dapl_ia_memtype_hint (\r
810         IN    DAT_IA_HANDLE,            /* ia_handle */\r
811         IN    DAT_MEM_TYPE,             /* mem_type */\r
812         IN    DAT_VLEN,                 /* length */\r
813         IN    DAT_MEM_OPT,              /* mem_optimization */\r
814         OUT   DAT_VLEN *,               /* suggested_length */\r
815         OUT   DAT_VADDR *);             /* suggested_alignment */\r
816 \r
817 extern DAT_RETURN DAT_API dapl_evd_kcreate (\r
818         IN      DAT_IA_HANDLE,          /* ia_handle */\r
819         IN      DAT_COUNT,              /* evd_min_qlen */\r
820         IN      DAT_UPCALL_POLICY,      /* upcall_policy */\r
821         IN      const DAT_UPCALL_OBJECT *, /* upcall */\r
822         IN      DAT_EVD_FLAGS,          /* evd_flags */\r
823         OUT     DAT_EVD_HANDLE * );     /* evd_handle */\r
824 \r
825 extern DAT_RETURN DAT_API dapl_evd_kquery (\r
826         IN      DAT_EVD_HANDLE,         /* evd_handle */\r
827         IN      DAT_EVD_PARAM_MASK,     /* evd_args_mask */\r
828         OUT     DAT_EVD_PARAM * );      /* evd_args */\r
829 \r
830 #else\r
831 extern DAT_RETURN DAT_API dapl_evd_create (\r
832         IN      DAT_IA_HANDLE,          /* ia_handle */\r
833         IN      DAT_COUNT,              /* evd_min_qlen */\r
834         IN      DAT_CNO_HANDLE,         /* cno_handle */\r
835         IN      DAT_EVD_FLAGS,          /* evd_flags */\r
836         OUT     DAT_EVD_HANDLE * );     /* evd_handle */\r
837 \r
838 extern DAT_RETURN DAT_API dapl_evd_query (\r
839         IN      DAT_EVD_HANDLE,         /* evd_handle */\r
840         IN      DAT_EVD_PARAM_MASK,     /* evd_args_mask */\r
841         OUT     DAT_EVD_PARAM * );      /* evd_args */\r
842 #endif  /* defined(__KERNEL__) */\r
843 \r
844 #if defined(__KERNEL__)\r
845 extern DAT_RETURN DAT_API dapl_evd_modify_upcall (\r
846         IN      DAT_EVD_HANDLE,         /* evd_handle */\r
847         IN      DAT_UPCALL_POLICY,      /* upcall_policy */\r
848         IN      const DAT_UPCALL_OBJECT * ); /* upcall */\r
849 \r
850 #else\r
851 \r
852 extern DAT_RETURN DAT_API dapl_evd_modify_cno (\r
853         IN      DAT_EVD_HANDLE,         /* evd_handle */\r
854         IN      DAT_CNO_HANDLE);        /* cno_handle */\r
855 #endif\r
856 \r
857 extern DAT_RETURN DAT_API dapl_evd_enable (\r
858         IN      DAT_EVD_HANDLE);        /* evd_handle */\r
859 \r
860 extern DAT_RETURN DAT_API dapl_evd_disable (\r
861         IN      DAT_EVD_HANDLE);        /* evd_handle */\r
862 \r
863 #if !defined(__KERNEL__)\r
864 extern DAT_RETURN DAT_API dapl_evd_wait (\r
865         IN      DAT_EVD_HANDLE,         /* evd_handle */\r
866         IN      DAT_TIMEOUT,            /* timeout */\r
867         IN      DAT_COUNT,              /* threshold */\r
868         OUT     DAT_EVENT *,            /* event */\r
869         OUT     DAT_COUNT *);           /* nmore */\r
870 #endif  /* !defined(__KERNEL__) */\r
871 \r
872 extern DAT_RETURN DAT_API dapl_evd_resize (\r
873         IN      DAT_EVD_HANDLE,         /* evd_handle */\r
874         IN      DAT_COUNT );            /* evd_qlen */\r
875 \r
876 extern DAT_RETURN DAT_API dapl_evd_post_se (\r
877         DAT_EVD_HANDLE,                 /* evd_handle */\r
878         const DAT_EVENT * );            /* event */\r
879 \r
880 extern DAT_RETURN DAT_API dapl_evd_dequeue (\r
881         IN      DAT_EVD_HANDLE,         /* evd_handle */\r
882         OUT     DAT_EVENT * );          /* event */\r
883 \r
884 extern DAT_RETURN DAT_API dapl_evd_free (\r
885         IN      DAT_EVD_HANDLE );\r
886 \r
887 extern DAT_RETURN DAT_API\r
888 dapl_evd_set_unwaitable (\r
889         IN      DAT_EVD_HANDLE  evd_handle );\r
890 \r
891 extern DAT_RETURN DAT_API\r
892 dapl_evd_clear_unwaitable (\r
893         IN      DAT_EVD_HANDLE  evd_handle );\r
894 \r
895 /* EP functions */\r
896 \r
897 extern DAT_RETURN DAT_API dapl_ep_create (\r
898         IN      DAT_IA_HANDLE,          /* ia_handle */\r
899         IN      DAT_PZ_HANDLE,          /* pz_handle */\r
900         IN      DAT_EVD_HANDLE,         /* in_dto_completion_evd_handle */\r
901         IN      DAT_EVD_HANDLE,         /* out_dto_completion_evd_handle */\r
902         IN      DAT_EVD_HANDLE,         /* connect_evd_handle */\r
903         IN      const DAT_EP_ATTR *,    /* ep_parameters */\r
904         OUT     DAT_EP_HANDLE * );      /* ep_handle */\r
905 \r
906 extern DAT_RETURN DAT_API dapl_ep_query (\r
907         IN      DAT_EP_HANDLE,          /* ep_handle */\r
908         IN      DAT_EP_PARAM_MASK,      /* ep_args_mask */\r
909         OUT     DAT_EP_PARAM * );       /* ep_args */\r
910 \r
911 extern DAT_RETURN DAT_API dapl_ep_modify (\r
912         IN      DAT_EP_HANDLE,          /* ep_handle */\r
913         IN      DAT_EP_PARAM_MASK,      /* ep_args_mask */\r
914         IN      const DAT_EP_PARAM * ); /* ep_args */\r
915 \r
916 extern DAT_RETURN DAT_API dapl_ep_connect (\r
917         IN      DAT_EP_HANDLE,          /* ep_handle */\r
918         IN      DAT_IA_ADDRESS_PTR,     /* remote_ia_address */\r
919         IN      DAT_CONN_QUAL,          /* remote_conn_qual */\r
920         IN      DAT_TIMEOUT,            /* timeout */\r
921         IN      DAT_COUNT,              /* private_data_size */\r
922         IN      const DAT_PVOID,        /* private_data  */\r
923         IN      DAT_QOS,                /* quality_of_service */\r
924         IN      DAT_CONNECT_FLAGS );    /* connect_flags */\r
925 \r
926 extern DAT_RETURN DAT_API dapl_ep_common_connect (\r
927         IN      DAT_EP_HANDLE ep,               /* ep_handle            */\r
928         IN      DAT_IA_ADDRESS_PTR remote_addr, /* remote_ia_address    */\r
929         IN      DAT_TIMEOUT timeout,            /* timeout              */\r
930         IN      DAT_COUNT pdata_size,           /* private_data_size    */\r
931         IN      const DAT_PVOID pdata   );      /* private_data         */\r
932 \r
933 extern DAT_RETURN DAT_API dapl_ep_dup_connect (\r
934         IN      DAT_EP_HANDLE,          /* ep_handle */\r
935         IN      DAT_EP_HANDLE,          /* ep_dup_handle */\r
936         IN      DAT_TIMEOUT,            /* timeout*/\r
937         IN      DAT_COUNT,              /* private_data_size */\r
938         IN      const DAT_PVOID,        /* private_data */\r
939         IN      DAT_QOS);               /* quality_of_service */\r
940 \r
941 extern DAT_RETURN DAT_API dapl_ep_disconnect (\r
942         IN      DAT_EP_HANDLE,          /* ep_handle */\r
943         IN      DAT_CLOSE_FLAGS );      /* close_flags */\r
944 \r
945 extern DAT_RETURN DAT_API dapl_ep_post_send (\r
946         IN      DAT_EP_HANDLE,          /* ep_handle */\r
947         IN      DAT_COUNT,              /* num_segments */\r
948         IN      DAT_LMR_TRIPLET *,      /* local_iov */\r
949         IN      DAT_DTO_COOKIE,         /* user_cookie */\r
950         IN      DAT_COMPLETION_FLAGS ); /* completion_flags */\r
951 \r
952 extern DAT_RETURN DAT_API dapl_ep_post_recv (\r
953         IN      DAT_EP_HANDLE,          /* ep_handle */\r
954         IN      DAT_COUNT,              /* num_segments */\r
955         IN      DAT_LMR_TRIPLET *,      /* local_iov */\r
956         IN      DAT_DTO_COOKIE,         /* user_cookie */\r
957         IN      DAT_COMPLETION_FLAGS ); /* completion_flags */\r
958 \r
959 extern DAT_RETURN DAT_API dapl_ep_post_rdma_read (\r
960         IN      DAT_EP_HANDLE,           /* ep_handle */\r
961         IN      DAT_COUNT,               /* num_segments */\r
962         IN      DAT_LMR_TRIPLET *,       /* local_iov */\r
963         IN      DAT_DTO_COOKIE,          /* user_cookie */\r
964         IN      const DAT_RMR_TRIPLET *, /* remote_iov */\r
965         IN      DAT_COMPLETION_FLAGS );  /* completion_flags */\r
966 \r
967 extern DAT_RETURN DAT_API dapl_ep_post_rdma_read_to_rmr (\r
968         IN      DAT_EP_HANDLE,          /* ep_handle            */\r
969         IN      const DAT_RMR_TRIPLET *,/* local_iov            */\r
970         IN      DAT_DTO_COOKIE,         /* user_cookie          */\r
971         IN      const DAT_RMR_TRIPLET *,/* remote_iov           */\r
972         IN      DAT_COMPLETION_FLAGS);  /* completion_flags     */\r
973 \r
974 extern DAT_RETURN DAT_API dapl_ep_post_rdma_write (\r
975         IN      DAT_EP_HANDLE,           /* ep_handle */\r
976         IN      DAT_COUNT,               /* num_segments */\r
977         IN      DAT_LMR_TRIPLET *,       /* local_iov */\r
978         IN      DAT_DTO_COOKIE,          /* user_cookie */\r
979         IN      const DAT_RMR_TRIPLET *, /* remote_iov */\r
980         IN      DAT_COMPLETION_FLAGS );  /* completion_flags */\r
981 \r
982 extern DAT_RETURN DAT_API dapl_ep_post_send_with_invalidate (\r
983         IN      DAT_EP_HANDLE,          /* ep_handle            */\r
984         IN      DAT_COUNT,              /* num_segments         */\r
985         IN      DAT_LMR_TRIPLET *,      /* local_iov            */\r
986         IN      DAT_DTO_COOKIE,         /* user_cookie          */\r
987         IN      DAT_COMPLETION_FLAGS,   /* completion_flags     */\r
988         IN      DAT_BOOLEAN,            /* invalidate_flag      */\r
989         IN      DAT_RMR_CONTEXT);      /* RMR context          */\r
990 \r
991 extern DAT_RETURN DAT_API dapl_ep_get_status (\r
992         IN      DAT_EP_HANDLE,          /* ep_handle */\r
993         OUT     DAT_EP_STATE *,         /* ep_state */\r
994         OUT     DAT_BOOLEAN *,          /* in_dto_idle */\r
995         OUT     DAT_BOOLEAN * );        /* out_dto_idle */\r
996 \r
997 extern DAT_RETURN DAT_API dapl_ep_free (\r
998         IN      DAT_EP_HANDLE);         /* ep_handle */\r
999 \r
1000 extern DAT_RETURN DAT_API dapl_ep_reset (\r
1001         IN      DAT_EP_HANDLE);         /* ep_handle */\r
1002 \r
1003 extern DAT_RETURN DAT_API dapl_ep_create_with_srq (\r
1004         IN      DAT_IA_HANDLE,          /* ia_handle            */\r
1005         IN      DAT_PZ_HANDLE,          /* pz_handle            */\r
1006         IN      DAT_EVD_HANDLE,         /* recv_evd_handle      */\r
1007         IN      DAT_EVD_HANDLE,         /* request_evd_handle   */\r
1008         IN      DAT_EVD_HANDLE,         /* connect_evd_handle   */\r
1009         IN      DAT_SRQ_HANDLE,         /* srq_handle           */\r
1010         IN      const DAT_EP_ATTR *,    /* ep_attributes        */\r
1011         OUT     DAT_EP_HANDLE *);       /* ep_handle            */\r
1012 \r
1013 extern DAT_RETURN DAT_API dapl_ep_recv_query (\r
1014         IN      DAT_EP_HANDLE,          /* ep_handle            */\r
1015         OUT     DAT_COUNT *,            /* nbufs_allocated      */\r
1016         OUT     DAT_COUNT *);           /* bufs_alloc_span      */\r
1017 \r
1018 extern DAT_RETURN DAT_API dapl_ep_set_watermark (\r
1019         IN      DAT_EP_HANDLE,          /* ep_handle            */\r
1020         IN      DAT_COUNT,              /* soft_high_watermark  */\r
1021         IN      DAT_COUNT);             /* hard_high_watermark  */\r
1022 \r
1023 /* LMR functions */\r
1024 \r
1025 #if defined(__KERNEL__)\r
1026 extern DAT_RETURN DAT_API dapl_lmr_kcreate (\r
1027         IN      DAT_IA_HANDLE,          /* ia_handle */\r
1028         IN      DAT_MEM_TYPE,           /* mem_type */\r
1029         IN      DAT_REGION_DESCRIPTION, /* region_description */\r
1030         IN      DAT_VLEN,               /* length */\r
1031         IN      DAT_PZ_HANDLE,          /* pz_handle */\r
1032         IN      DAT_MEM_PRIV_FLAGS,     /* privileges */\r
1033         IN      DAT_VA_TYPE,            /* va_type */\r
1034         IN      DAT_MEM_OPT,            /* optimization */\r
1035         OUT     DAT_LMR_HANDLE *,       /* lmr_handle */\r
1036         OUT     DAT_LMR_CONTEXT *,      /* lmr_context */\r
1037         OUT     DAT_RMR_CONTEXT *,      /* rmr_context          */\r
1038         OUT     DAT_VLEN *,             /* registered_length */\r
1039         OUT     DAT_VADDR * );          /* registered_address */\r
1040 #else\r
1041 extern DAT_RETURN DAT_API dapl_lmr_create (\r
1042         IN      DAT_IA_HANDLE,          /* ia_handle */\r
1043         IN      DAT_MEM_TYPE,           /* mem_type */\r
1044         IN      DAT_REGION_DESCRIPTION, /* region_description */\r
1045         IN      DAT_VLEN,               /* length */\r
1046         IN      DAT_PZ_HANDLE,          /* pz_handle */\r
1047         IN      DAT_MEM_PRIV_FLAGS,     /* privileges */\r
1048         IN      DAT_VA_TYPE,            /* va_type */\r
1049         OUT     DAT_LMR_HANDLE *,       /* lmr_handle */\r
1050         OUT     DAT_LMR_CONTEXT *,      /* lmr_context */\r
1051         OUT     DAT_RMR_CONTEXT *,      /* rmr_context          */\r
1052         OUT     DAT_VLEN *,             /* registered_length */\r
1053         OUT     DAT_VADDR * );          /* registered_address */\r
1054 #endif  /* defined(__KERNEL__) */\r
1055 \r
1056 extern DAT_RETURN DAT_API dapl_lmr_query (\r
1057         IN      DAT_LMR_HANDLE,\r
1058         IN      DAT_LMR_PARAM_MASK,\r
1059         OUT     DAT_LMR_PARAM *);\r
1060 \r
1061 extern DAT_RETURN DAT_API dapl_lmr_free (\r
1062         IN      DAT_LMR_HANDLE);\r
1063 \r
1064 extern DAT_RETURN DAT_API dapl_lmr_sync_rdma_read (\r
1065         IN      DAT_IA_HANDLE,          /* ia_handle            */\r
1066         IN      const DAT_LMR_TRIPLET *, /* local_segments      */\r
1067         IN      DAT_VLEN);              /* num_segments         */\r
1068 \r
1069 extern DAT_RETURN DAT_API dapl_lmr_sync_rdma_write (\r
1070         IN      DAT_IA_HANDLE,          /* ia_handle            */\r
1071         IN      const DAT_LMR_TRIPLET *, /* local_segments      */\r
1072         IN      DAT_VLEN);              /* num_segments         */\r
1073 \r
1074 /* RMR Functions */\r
1075 \r
1076 extern DAT_RETURN DAT_API dapl_rmr_create (\r
1077         IN      DAT_PZ_HANDLE,          /* pz_handle */\r
1078         OUT     DAT_RMR_HANDLE *);      /* rmr_handle */\r
1079 \r
1080 extern DAT_RETURN DAT_API dapl_rmr_create_for_ep (\r
1081         IN      DAT_PZ_HANDLE pz_handle,        /* pz_handle    */\r
1082         OUT     DAT_RMR_HANDLE *rmr_handle);    /* rmr_handle   */\r
1083 \r
1084 extern DAT_RETURN DAT_API dapl_rmr_query (\r
1085         IN      DAT_RMR_HANDLE,         /* rmr_handle */\r
1086         IN      DAT_RMR_PARAM_MASK,     /* rmr_args_mask */\r
1087         OUT     DAT_RMR_PARAM *);       /* rmr_args */\r
1088 \r
1089 extern DAT_RETURN DAT_API dapl_rmr_bind (\r
1090         IN      DAT_RMR_HANDLE,          /* rmr_handle */\r
1091         IN      DAT_LMR_HANDLE,          /* lmr_handle */\r
1092         IN      const DAT_LMR_TRIPLET *, /* lmr_triplet */\r
1093         IN      DAT_MEM_PRIV_FLAGS,      /* mem_priv */\r
1094         IN      DAT_VA_TYPE,             /* va_type */\r
1095         IN      DAT_EP_HANDLE,           /* ep_handle */\r
1096         IN      DAT_RMR_COOKIE,          /* user_cookie */\r
1097         IN      DAT_COMPLETION_FLAGS,    /* completion_flags */\r
1098         INOUT   DAT_RMR_CONTEXT * );     /* context */\r
1099 \r
1100 extern DAT_RETURN DAT_API dapl_rmr_free (\r
1101         IN      DAT_RMR_HANDLE);\r
1102 \r
1103 /* PSP Functions */\r
1104 \r
1105 extern DAT_RETURN DAT_API dapl_psp_create (\r
1106         IN      DAT_IA_HANDLE,          /* ia_handle */\r
1107         IN      DAT_CONN_QUAL,          /* conn_qual */\r
1108         IN      DAT_EVD_HANDLE,         /* evd_handle */\r
1109         IN      DAT_PSP_FLAGS,          /* psp_flags */\r
1110         OUT     DAT_PSP_HANDLE * );     /* psp_handle */\r
1111 \r
1112 extern DAT_RETURN DAT_API dapl_psp_create_any (\r
1113         IN      DAT_IA_HANDLE,          /* ia_handle */\r
1114         OUT     DAT_CONN_QUAL *,        /* conn_qual */\r
1115         IN      DAT_EVD_HANDLE,         /* evd_handle */\r
1116         IN      DAT_PSP_FLAGS,          /* psp_flags */\r
1117         OUT     DAT_PSP_HANDLE *);      /* psp_handle */\r
1118 \r
1119 extern DAT_RETURN DAT_API dapl_psp_query (\r
1120         IN      DAT_PSP_HANDLE,\r
1121         IN      DAT_PSP_PARAM_MASK,\r
1122         OUT     DAT_PSP_PARAM * );\r
1123 \r
1124 extern DAT_RETURN DAT_API dapl_psp_free (\r
1125         IN      DAT_PSP_HANDLE );       /* psp_handle */\r
1126 \r
1127 /* RSP Functions */\r
1128 \r
1129 extern DAT_RETURN DAT_API dapl_rsp_create (\r
1130         IN      DAT_IA_HANDLE,          /* ia_handle */\r
1131         IN      DAT_CONN_QUAL,          /* conn_qual */\r
1132         IN      DAT_EP_HANDLE,          /* ep_handle */\r
1133         IN      DAT_EVD_HANDLE,         /* evd_handle */\r
1134         OUT     DAT_RSP_HANDLE * );     /* rsp_handle */\r
1135 \r
1136 extern DAT_RETURN DAT_API dapl_rsp_query (\r
1137         IN      DAT_RSP_HANDLE,\r
1138         IN      DAT_RSP_PARAM_MASK,\r
1139         OUT     DAT_RSP_PARAM * );\r
1140 \r
1141 extern DAT_RETURN DAT_API dapl_rsp_free (\r
1142         IN      DAT_RSP_HANDLE );       /* rsp_handle */\r
1143 \r
1144 /* PZ Functions */\r
1145 \r
1146 extern DAT_RETURN DAT_API dapl_pz_create (\r
1147         IN      DAT_IA_HANDLE,          /* ia_handle */\r
1148         OUT     DAT_PZ_HANDLE * );      /* pz_handle */\r
1149 \r
1150 extern DAT_RETURN DAT_API dapl_pz_query (\r
1151         IN      DAT_PZ_HANDLE,          /* pz_handle */\r
1152         IN      DAT_PZ_PARAM_MASK,      /* pz_args_mask */\r
1153         OUT     DAT_PZ_PARAM * );       /* pz_args */\r
1154 \r
1155 extern DAT_RETURN DAT_API dapl_pz_free (\r
1156         IN      DAT_PZ_HANDLE );        /* pz_handle */\r
1157 \r
1158 /* SRQ functions */\r
1159 \r
1160 extern DAT_RETURN DAT_API dapl_srq_create (\r
1161         IN      DAT_IA_HANDLE,          /* ia_handle            */\r
1162         IN      DAT_PZ_HANDLE,          /* pz_handle            */\r
1163         IN      DAT_SRQ_ATTR *,         /* srq_attr             */\r
1164         OUT     DAT_SRQ_HANDLE *);      /* srq_handle           */\r
1165 \r
1166 extern DAT_RETURN DAT_API dapl_srq_free (\r
1167         IN      DAT_SRQ_HANDLE);        /* srq_handle           */\r
1168 \r
1169 extern DAT_RETURN DAT_API dapl_srq_post_recv (\r
1170         IN      DAT_SRQ_HANDLE,         /* srq_handle           */\r
1171         IN      DAT_COUNT,              /* num_segments         */\r
1172         IN      DAT_LMR_TRIPLET *,      /* local_iov            */\r
1173         IN      DAT_DTO_COOKIE);        /* user_cookie          */\r
1174 \r
1175 extern DAT_RETURN DAT_API dapl_srq_query (\r
1176         IN      DAT_SRQ_HANDLE,         /* srq_handle           */\r
1177         IN      DAT_SRQ_PARAM_MASK,     /* srq_param_mask       */\r
1178         OUT     DAT_SRQ_PARAM *);       /* srq_param            */\r
1179 \r
1180 extern DAT_RETURN DAT_API dapl_srq_resize (\r
1181         IN      DAT_SRQ_HANDLE,         /* srq_handle           */\r
1182         IN      DAT_COUNT);             /* srq_max_recv_dto     */\r
1183 \r
1184 extern DAT_RETURN DAT_API dapl_srq_set_lw (\r
1185         IN      DAT_SRQ_HANDLE,         /* srq_handle           */\r
1186         IN      DAT_COUNT);             /* low_watermark        */\r
1187 \r
1188 /* CSP functions */\r
1189 extern DAT_RETURN DAT_API dapl_csp_create (\r
1190         IN      DAT_IA_HANDLE,          /* ia_handle      */\r
1191         IN      DAT_COMM *,             /* communicator   */\r
1192         IN      DAT_IA_ADDRESS_PTR,     /* address        */\r
1193         IN      DAT_EVD_HANDLE,         /* evd_handle     */\r
1194         OUT     DAT_CSP_HANDLE *);      /* csp_handle     */\r
1195 \r
1196 extern DAT_RETURN DAT_API dapl_csp_query (\r
1197         IN      DAT_CSP_HANDLE,         /* csp_handle     */\r
1198         IN      DAT_CSP_PARAM_MASK,     /* csp_param_mask */\r
1199         OUT     DAT_CSP_PARAM *);       /* csp_param      */\r
1200 \r
1201 extern DAT_RETURN DAT_API dapl_csp_free (\r
1202         IN      DAT_CSP_HANDLE);        /* csp_handle     */\r
1203 \r
1204 /* HA functions */\r
1205 DAT_RETURN DAT_API dapl_ia_ha (\r
1206         IN       DAT_IA_HANDLE,         /* ia_handle */\r
1207         IN const DAT_NAME_PTR,          /* provider  */\r
1208         OUT      DAT_BOOLEAN *);        /* answer    */\r
1209 \r
1210 #ifdef DAT_EXTENSIONS\r
1211 #include <stdarg.h>\r
1212 extern DAT_RETURN DAT_API dapl_extensions (\r
1213         IN      DAT_HANDLE,             /* handle */\r
1214         IN      DAT_EXTENDED_OP,        /* extended op */\r
1215         IN      va_list);               /* argument list */\r
1216 #endif\r
1217 \r
1218 /*\r
1219  * DAPL internal utility function prototpyes\r
1220  */\r
1221 \r
1222 extern void dapl_llist_init_head (\r
1223     DAPL_LLIST_HEAD *   head);\r
1224 \r
1225 extern void dapl_llist_init_entry (\r
1226     DAPL_LLIST_ENTRY *  entry);\r
1227 \r
1228 extern DAT_BOOLEAN dapl_llist_is_empty (\r
1229     DAPL_LLIST_HEAD *   head);\r
1230 \r
1231 extern void dapl_llist_add_head (\r
1232     DAPL_LLIST_HEAD *   head,\r
1233     DAPL_LLIST_ENTRY *  entry,\r
1234     void *              data);\r
1235 \r
1236 extern void dapl_llist_add_tail (\r
1237     DAPL_LLIST_HEAD *   head,\r
1238     DAPL_LLIST_ENTRY *  entry,\r
1239     void *              data);\r
1240 \r
1241 extern void dapl_llist_add_entry (\r
1242     DAPL_LLIST_HEAD * head,\r
1243     DAPL_LLIST_ENTRY * entry,\r
1244     DAPL_LLIST_ENTRY * new_entry,\r
1245     void * data);\r
1246 \r
1247 extern void * dapl_llist_remove_head (\r
1248     DAPL_LLIST_HEAD *   head);\r
1249 \r
1250 extern void * dapl_llist_remove_tail (\r
1251     DAPL_LLIST_HEAD *   head);\r
1252 \r
1253 extern void * dapl_llist_remove_entry (\r
1254     DAPL_LLIST_HEAD *   head,\r
1255     DAPL_LLIST_ENTRY *  entry);\r
1256 \r
1257 extern void * dapl_llist_peek_head (\r
1258     DAPL_LLIST_HEAD *   head);\r
1259 \r
1260 extern void * dapl_llist_next_entry (\r
1261     IN    DAPL_LLIST_HEAD       *head,\r
1262     IN    DAPL_LLIST_ENTRY      *cur_ent);\r
1263 \r
1264 extern void dapl_llist_debug_print_list (\r
1265     DAPL_LLIST_HEAD *   head);\r
1266 \r
1267 \r
1268 #endif\r