]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
dapl: fix ring buffer synchronization
authorSean Hefty <sean.hefty@intel.com>
Thu, 4 Mar 2010 22:00:34 +0000 (14:00 -0800)
committerSean Hefty <sean.hefty@intel.com>
Thu, 4 Mar 2010 22:15:21 +0000 (14:15 -0800)
The dapl ring buffer implementation is not thread safe.  Replace
the use of atomic variables with actual locking to ensure that
there are not races inserting and/or removing items at the same time.

Without proper synchronization, the EVD can report invalid events or
the same event multiple times.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
trunk/ulp/dapl2/dapl/common/dapl_ring_buffer_util.c
trunk/ulp/dapl2/dapl/common/dapl_ring_buffer_util.h
trunk/ulp/dapl2/dapl/include/dapl.h

index 54517a936c874a935ba7b1da33fc0a79cbe3d9eb..d1ee2693e58b2c6f7f506e6a53c48985d5767117 100644 (file)
@@ -41,8 +41,7 @@
  * dapls_rbuf_alloc
  *
  * Given a DAPL_RING_BUFFER, initialize it and provide memory for
- * the ringbuf itself. A passed in size will be adjusted to the next
- * largest power of two number to simplify management.
+ * the ringbuf itself.
  *
  * Input:
  *     rbuf            pointer to DAPL_RING_BUFFER
  */
 DAT_RETURN dapls_rbuf_alloc(INOUT DAPL_RING_BUFFER * rbuf, IN DAT_COUNT size)
 {
-       unsigned int rsize;     /* real size */
-
        /* The circular buffer must be allocated one too large.
         * This eliminates any need for a distinct counter, as
         * having the two pointers equal always means "empty" -- never "full"
         */
        size++;
 
-       /* Put size on a power of 2 boundary */
-       rsize = 1;
-       while ((DAT_COUNT) rsize < size) {
-               rsize <<= 1;
-       }
-
-       rbuf->base = (void *)dapl_os_alloc(rsize * sizeof(void *));
-       if (rbuf->base != NULL) {
-               rbuf->lim = rsize - 1;
-               dapl_os_atomic_set(&rbuf->head, 0);
-               dapl_os_atomic_set(&rbuf->tail, 0);
-       } else {
+       rbuf->base = (void *)dapl_os_alloc(size * sizeof(void *));
+       if (rbuf->base == NULL)
                return DAT_INSUFFICIENT_RESOURCES | DAT_RESOURCE_MEMORY;
-       }
 
+       dapl_os_lock_init(&rbuf->lock);
+       rbuf->size = size;
+       rbuf->head = 0;
+       rbuf->tail = 0;
        return DAT_SUCCESS;
 }
 
 /*
  * dapls_rbuf_realloc
  *
- * Resizes a DAPL_RING_BUFFER. This function is not thread safe;
- * adding or removing elements from a ring buffer while resizing 
- * will have indeterminate results.
+ * Resizes a DAPL_RING_BUFFER.
  *
  * Input:
  *     rbuf            pointer to DAPL_RING_BUFFER
@@ -106,41 +94,35 @@ DAT_RETURN dapls_rbuf_alloc(INOUT DAPL_RING_BUFFER * rbuf, IN DAT_COUNT size)
  */
 DAT_RETURN dapls_rbuf_realloc(INOUT DAPL_RING_BUFFER * rbuf, IN DAT_COUNT size)
 {
-       DAPL_RING_BUFFER new_rbuf;
-       void *entry;
-       DAT_RETURN dat_status;
-
-       dat_status = DAT_SUCCESS;
+       void **base;
 
        /* decreasing the size or retaining the old size is not allowed */
-       if (size <= rbuf->lim + 1) {
-               dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
-               goto bail;
-       }
+       if (size <= rbuf->size + 1)
+               return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
 
-       /*
-        * !This is NOT ATOMIC!
-        * Simple algorithm: Allocate a new ring buffer, take everything
-        * out of the old one and put it in the new one, and release the 
-        * old base buffer.
-        */
-       dat_status = dapls_rbuf_alloc(&new_rbuf, size);
-       if (dat_status != DAT_SUCCESS) {
-               goto bail;
-       }
+       base = (void *) dapl_os_alloc(size * sizeof(void *));
+       if (base == NULL)
+               return DAT_INSUFFICIENT_RESOURCES | DAT_RESOURCE_MEMORY;
 
-       while ((entry = dapls_rbuf_remove(rbuf)) != NULL) {
-               /* We know entries will fit so ignore the return code */
-               (void)dapls_rbuf_add(&new_rbuf, entry);
+       dapl_os_lock(&rbuf->lock);
+       if (rbuf->head > rbuf->tail) {
+               memcpy(&base[rbuf->tail], &rbuf->base[rbuf->tail],
+                       (rbuf->head - rbuf->tail) * sizeof(void *));
+       } else if (rbuf->head < rbuf->tail) {
+               memcpy(&base[0], &rbuf->base[rbuf->tail],
+                       (rbuf->size - rbuf->tail) * sizeof(void *));
+               memcpy(&base[rbuf->size - rbuf->tail], &rbuf->base[0],
+                       rbuf->head * sizeof(void *));
+               rbuf->head = rbuf->size - rbuf->tail + rbuf->head;
+               rbuf->tail = 0;
        }
 
-       /* release the old base buffer */
-       dapl_os_free(rbuf->base, (rbuf->lim + 1) * sizeof(void *));
+       dapl_os_free(rbuf->base, rbuf->size * sizeof(void *));
+       rbuf->base = base;
+       rbuf->size = size;
+       dapl_os_unlock(&rbuf->lock);
 
-       *rbuf = new_rbuf;
-
-      bail:
-       return dat_status;
+       return DAT_SUCCESS;
 }
 
 /*
@@ -160,15 +142,21 @@ DAT_RETURN dapls_rbuf_realloc(INOUT DAPL_RING_BUFFER * rbuf, IN DAT_COUNT size)
  */
 void dapls_rbuf_destroy(IN DAPL_RING_BUFFER * rbuf)
 {
-       if ((NULL == rbuf) || (NULL == rbuf->base)) {
-               return;
-       }
+       dapl_os_lock_destroy(&rbuf->lock);
+       dapl_os_free(rbuf->base, rbuf->size * sizeof(void *));
+}
 
-       dapl_os_free(rbuf->base, (rbuf->lim + 1) * sizeof(void *));
-       rbuf->base = NULL;
-       rbuf->lim = 0;
+static DAT_COUNT dapli_rbuf_count(IN DAPL_RING_BUFFER * rbuf)
+{
+       if (rbuf->head >= rbuf->tail)
+               return rbuf->head - rbuf->tail;
+       else
+               return rbuf->size - rbuf->tail + rbuf->head;
+}
 
-       return;
+static int dapli_rbuf_empty(IN DAPL_RING_BUFFER *rbuf)
+{
+       return rbuf->head == rbuf->tail;
 }
 
 /*
@@ -190,22 +178,20 @@ void dapls_rbuf_destroy(IN DAPL_RING_BUFFER * rbuf)
  */
 DAT_RETURN dapls_rbuf_add(IN DAPL_RING_BUFFER * rbuf, IN void *entry)
 {
-       int pos;
-       int val;
-
-       while (((dapl_os_atomic_read(&rbuf->head) + 1) & rbuf->lim) !=
-              (dapl_os_atomic_read(&rbuf->tail) & rbuf->lim)) {
-               pos = dapl_os_atomic_read(&rbuf->head);
-               val = dapl_os_atomic_assign(&rbuf->head, pos, pos + 1);
-               if (val == pos) {
-                       pos = (pos + 1) & rbuf->lim;    /* verify in range */
-                       rbuf->base[pos] = entry;
-                       return DAT_SUCCESS;
-               }
+       DAT_RETURN ret;
+
+       dapl_os_lock(&rbuf->lock);
+       if (dapli_rbuf_count(rbuf) < rbuf->size - 1) {
+               rbuf->base[rbuf->head++] = entry;
+               if (rbuf->head == rbuf->size)
+                       rbuf->head = 0;
+               ret = DAT_SUCCESS;
+       } else {
+               ret = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
        }
+       dapl_os_unlock(&rbuf->lock);
 
-       return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-
+       return ret;
 }
 
 /*
@@ -226,21 +212,19 @@ DAT_RETURN dapls_rbuf_add(IN DAPL_RING_BUFFER * rbuf, IN void *entry)
  */
 void *dapls_rbuf_remove(IN DAPL_RING_BUFFER * rbuf)
 {
-       int pos;
-       int val;
-
-       while (dapl_os_atomic_read(&rbuf->head) !=
-              dapl_os_atomic_read(&rbuf->tail)) {
-               pos = dapl_os_atomic_read(&rbuf->tail);
-               val = dapl_os_atomic_assign(&rbuf->tail, pos, pos + 1);
-               if (val == pos) {
-                       pos = (pos + 1) & rbuf->lim;    /* verify in range */
+       void *entry;
 
-                       return (rbuf->base[pos]);
-               }
+       dapl_os_lock(&rbuf->lock);
+       if (!dapli_rbuf_empty(rbuf)) {
+               entry = rbuf->base[rbuf->tail++];
+               if (rbuf->tail == rbuf->size)
+                       rbuf->tail = 0;
+       } else {
+               entry = NULL;
        }
+       dapl_os_unlock(&rbuf->lock);
 
-       return NULL;
+       return entry;
 
 }
 
@@ -263,18 +247,10 @@ void *dapls_rbuf_remove(IN DAPL_RING_BUFFER * rbuf)
 DAT_COUNT dapls_rbuf_count(IN DAPL_RING_BUFFER * rbuf)
 {
        DAT_COUNT count;
-       int head;
-       int tail;
-
-       head = dapl_os_atomic_read(&rbuf->head) & rbuf->lim;
-       tail = dapl_os_atomic_read(&rbuf->tail) & rbuf->lim;
-       if (head > tail) {
-               count = head - tail;
-       } else {
-               /* add 1 to lim as it is a mask, number of entries - 1 */
-               count = (rbuf->lim + 1 - tail + head) & rbuf->lim;
-       }
 
+       dapl_os_lock(&rbuf->lock);
+       count = dapli_rbuf_count(rbuf);
+       dapl_os_unlock(&rbuf->lock);
        return count;
 }
 
@@ -299,19 +275,20 @@ DAT_COUNT dapls_rbuf_count(IN DAPL_RING_BUFFER * rbuf)
  */
 void dapls_rbuf_adjust(IN DAPL_RING_BUFFER * rbuf, IN intptr_t offset)
 {
-       int pos;
+       int i;
 
-       pos = dapl_os_atomic_read(&rbuf->head);
-       while (pos != dapl_os_atomic_read(&rbuf->tail)) {
-               rbuf->base[pos] = (void *)((char *)rbuf->base[pos] + offset);
-               pos = (pos + 1) & rbuf->lim;    /* verify in range */
-       }
+       dapl_os_lock(&rbuf->lock);
+       for (i = 0; i < rbuf->size; i++)
+               rbuf->base[i] = (void *) ((char *)rbuf->base[i] + offset);
+       dapl_os_unlock(&rbuf->lock);
 }
 
-/*
- * Local variables:
- *  c-indent-level: 4
- *  c-basic-offset: 4
- *  tab-width: 8
- * End:
- */
+int dapls_rbuf_empty(IN DAPL_RING_BUFFER * rbuf)
+{
+       int empty;
+
+       dapl_os_lock(&rbuf->lock);
+       empty = dapli_rbuf_empty(rbuf);
+       dapl_os_unlock(&rbuf->lock);
+       return empty;
+}
index 46c82c95e717119854b6fcc33cacb8a55a0dac4b..1eb782d63e746a43266aa64cefc1c3543e83e2db 100644 (file)
@@ -68,11 +68,8 @@ void dapls_rbuf_adjust (
        IN  DAPL_RING_BUFFER            *rbuf,
        IN  intptr_t                    offset);
 
-
-/*
- * Simple functions
- */
-#define dapls_rbuf_empty(rbuf) (rbuf->head == rbuf->tail)
+int dapls_rbuf_empty(
+       IN   DAPL_RING_BUFFER           *rbuf);
 
 
 #endif /* _DAPL_RING_BUFFER_H_ */
index 4439ec58fab456a4879682d48e1049a6f3679ea3..208113b27af90efd9adc355a24b8cd15ef5a55c0 100644 (file)
-/*\r
- * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.\r
- *\r
- * This Software is licensed under one of the following licenses:\r
- *\r
- * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
- *    in the file LICENSE.txt in the root directory. The license is also\r
- *    available from the Open Source Initiative, see\r
- *    http://www.opensource.org/licenses/cpl.php.\r
- *\r
- * 2) under the terms of the "The BSD License" a copy of which is in the file\r
- *    LICENSE2.txt in the root directory. The license is also available from\r
- *    the Open Source Initiative, see\r
- *    http://www.opensource.org/licenses/bsd-license.php.\r
- *\r
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a \r
- *    copy of which is in the file LICENSE3.txt in the root directory. The \r
- *    license is also available from the Open Source Initiative, see\r
- *    http://www.opensource.org/licenses/gpl-license.php.\r
- *\r
- * Licensee has the right to choose one of the above licenses.\r
- *\r
- * Redistributions of source code must retain the above copyright\r
- * notice and one of the license notices.\r
- *\r
- * Redistributions in binary form must reproduce both the above copyright\r
- * notice, one of the license notices in the documentation\r
- * and/or other materials provided with the distribution.\r
- */\r
-\r
-/**********************************************************************\r
- *\r
- * MODULE: dapl.h\r
- *\r
- * PURPOSE: defines common data structures for the DAPL reference implemenation\r
- *\r
- * Description: This file describes the working data structures used within\r
- *              DAPL RI.\r
- *\r
- *\r
- * $Id: dapl.h 1317 2005-04-25 17:29:42Z jlentini $\r
- **********************************************************************/\r
-\r
-#ifndef _DAPL_H_\r
-#define _DAPL_H_\r
-\r
-#if defined(__KERNEL__)\r
-#include <dat2/kdat.h>\r
-#else\r
-#include <dat2/udat.h>\r
-#endif /* defined(__KERNEL__) */\r
-#include <dat2/dat_registry.h>\r
-#include "dapl_osd.h"\r
-#include "dapl_debug.h"\r
-\r
-\r
-\r
-/*********************************************************************\r
- *                                                                   *\r
- * Enumerations                                                      *\r
- *                                                                   *\r
- *********************************************************************/\r
-\r
-typedef enum dapl_magic\r
-{\r
-    /* magic number values for verification & debug */\r
-    DAPL_MAGIC_IA      = 0xCafeF00d,\r
-    DAPL_MAGIC_EVD     = 0xFeedFace,\r
-    DAPL_MAGIC_EP      = 0xDeadBabe,\r
-    DAPL_MAGIC_LMR     = 0xBeefCafe,\r
-    DAPL_MAGIC_RMR      = 0xABadCafe,\r
-    DAPL_MAGIC_PZ      = 0xDeafBeef,\r
-    DAPL_MAGIC_PSP     = 0xBeadeD0c,\r
-    DAPL_MAGIC_RSP     = 0xFab4Feed,\r
-    DAPL_MAGIC_SRQ     = 0xC001Babe,\r
-    DAPL_MAGIC_CR      = 0xBe12Cee1,\r
-    DAPL_MAGIC_CR_DESTROYED = 0xB12bDead,\r
-    DAPL_MAGIC_CNO     = 0xDeadF00d,\r
-    DAPL_MAGIC_INVALID  = 0xFFFFFFFF\r
-} DAPL_MAGIC;\r
-\r
-typedef enum dapl_evd_state\r
-{\r
-    DAPL_EVD_STATE_TERMINAL,\r
-    DAPL_EVD_STATE_INITIAL,\r
-    DAPL_EVD_STATE_OPEN,\r
-    DAPL_EVD_STATE_WAITED,\r
-    DAPL_EVD_STATE_DEAD        = 0xDEAD\r
-} DAPL_EVD_STATE;\r
-\r
-typedef enum dapl_evd_completion\r
-{\r
-    DAPL_EVD_STATE_INIT,\r
-    DAPL_EVD_STATE_SOLICITED_WAIT,\r
-    DAPL_EVD_STATE_THRESHOLD,\r
-    DAPL_EVD_STATE_UNSIGNALLED\r
-} DAPL_EVD_COMPLETION;\r
-\r
-typedef enum dapl_cno_state\r
-{\r
-    DAPL_CNO_STATE_UNTRIGGERED,\r
-    DAPL_CNO_STATE_TRIGGERED,\r
-    DAPL_CNO_STATE_DEAD = 0xDeadFeed,\r
-} DAPL_CNO_STATE;\r
-\r
-typedef enum dapl_qp_state\r
-{\r
-    DAPL_QP_STATE_UNCONNECTED,\r
-    DAPL_QP_STATE_RESERVED,\r
-    DAPL_QP_STATE_PASSIVE_CONNECTION_PENDING,\r
-    DAPL_QP_STATE_ACTIVE_CONNECTION_PENDING,\r
-    DAPL_QP_STATE_TENTATIVE_CONNECTION_PENDING,\r
-    DAPL_QP_STATE_CONNECTED,\r
-    DAPL_QP_STATE_DISCONNECT_PENDING,\r
-    DAPL_QP_STATE_ERROR,\r
-    DAPL_QP_STATE_NOT_REUSABLE,\r
-    DAPL_QP_STATE_FREE\r
-} DAPL_QP_STATE;\r
-\r
-\r
-/*********************************************************************\r
- *                                                                   *\r
- * Constants                                                         *\r
- *                                                                   *\r
- *********************************************************************/\r
-\r
-/*\r
- * number of HCAs allowed\r
- */\r
-#define DAPL_MAX_HCA_COUNT             4\r
-\r
-/*\r
- * Configures the RMR bind evd restriction\r
- */\r
-\r
-#define DAPL_RMR_BIND_EVD_RESTRICTION  DAT_RMR_EVD_SAME_AS_REQUEST_EVD\r
-\r
-/*\r
- * special qp_state indicating the EP does not have a QP attached yet\r
- */\r
-#define DAPL_QP_STATE_UNATTACHED       0xFFF0\r
-\r
-#define DAPL_MAX_PRIVATE_DATA_SIZE     256\r
-\r
-/*********************************************************************\r
- *                                                                   *\r
- * Macros                                                            *\r
- *                                                                   *\r
- *********************************************************************/\r
-\r
-#if defined (sun) || defined(__sun) || defined(_sun_) || defined (__solaris__) \r
-#define DAPL_BAD_PTR(a) ((unsigned long)(a) & 3)\r
-#elif defined(__linux__)\r
-#define DAPL_BAD_PTR(a) ((unsigned long)(a) & 3)\r
-#elif defined(_WIN64)\r
-#define DAPL_BAD_PTR(a) ((unsigned long)((DAT_UINT64)(a)) & 3)\r
-#elif defined(_WIN32)\r
-#define DAPL_BAD_PTR(a) ((unsigned long)((DAT_UINT64)(a)) & 3)\r
-#endif\r
-\r
-/*\r
- * Simple macro to verify a handle is bad. Conditions:\r
- * - pointer is NULL\r
- * - pointer is not word aligned\r
- * - pointer's magic number is wrong\r
- */\r
-\r
-#define DAPL_BAD_HANDLE(h, magicNum) (                         \\r
-           ((h) == NULL) ||                                    \\r
-           DAPL_BAD_PTR(h) ||                                  \\r
-           (((DAPL_HEADER *)(h))->magic != (magicNum)))\r
-\r
-#define DAPL_MIN(a, b)        ((a < b) ? (a) : (b))\r
-#define DAPL_MAX(a, b)        ((a > b) ? (a) : (b))\r
-\r
-#if NDEBUG > 0\r
-#define DEBUG_IS_BAD_HANDLE(h, magicNum) (DAPL_BAD_HANDLE(h, magicNum))\r
-#else\r
-#define DEBUG_IS_BAD_HANDLE(h, magicNum) (0)\r
-#endif\r
-\r
-#define DAT_ERROR(Type, SubType) ((DAT_RETURN)(DAT_CLASS_ERROR | Type | SubType))\r
-\r
-/*********************************************************************\r
- *                                                                   *\r
- * Typedefs                                                          *\r
- *                                                                   *\r
- *********************************************************************/\r
-\r
-typedef struct dapl_llist_entry                DAPL_LLIST_ENTRY;\r
-typedef DAPL_LLIST_ENTRY *             DAPL_LLIST_HEAD;\r
-typedef struct dapl_ring_buffer                DAPL_RING_BUFFER;\r
-typedef struct dapl_cookie_buffer      DAPL_COOKIE_BUFFER;\r
-\r
-typedef struct dapl_hash_table          DAPL_HASH_TABLE;\r
-typedef struct dapl_hash_table *        DAPL_HASH_TABLEP;\r
-typedef DAT_UINT64                      DAPL_HASH_KEY;\r
-typedef void *                          DAPL_HASH_DATA;\r
-\r
-typedef struct dapl_hca                        DAPL_HCA;\r
-\r
-typedef struct dapl_header             DAPL_HEADER;\r
-\r
-typedef struct dapl_ia                 DAPL_IA;\r
-typedef struct dapl_cno                        DAPL_CNO;\r
-typedef struct dapl_evd                DAPL_EVD;\r
-typedef struct dapl_ep                         DAPL_EP;\r
-typedef struct dapl_srq                        DAPL_SRQ;\r
-typedef struct dapl_pz                 DAPL_PZ;\r
-typedef struct dapl_lmr                        DAPL_LMR;\r
-typedef struct dapl_rmr                        DAPL_RMR;\r
-typedef struct dapl_sp                 DAPL_SP;\r
-typedef struct dapl_cr                 DAPL_CR;\r
-\r
-typedef struct dapl_cookie             DAPL_COOKIE;\r
-typedef struct dapl_dto_cookie         DAPL_DTO_COOKIE;\r
-typedef struct dapl_rmr_cookie         DAPL_RMR_COOKIE;\r
-\r
-typedef struct dapl_private            DAPL_PRIVATE;\r
-\r
-\r
-\r
-/*********************************************************************\r
- *                                                                   *\r
- * Structures                                                        *\r
- *                                                                   *\r
- *********************************************************************/\r
-\r
-struct dapl_llist_entry\r
-{\r
-    struct dapl_llist_entry    *flink;\r
-    struct dapl_llist_entry    *blink;\r
-    void                       *data;\r
-    DAPL_LLIST_HEAD            *list_head; /* for consistency checking */\r
-};\r
-\r
-struct dapl_ring_buffer\r
-{\r
-    void               **base;         /* base of element array */\r
-    DAT_COUNT          lim;            /* mask, number of entries - 1 */\r
-    DAPL_ATOMIC                head;           /* head pointer index */\r
-    DAPL_ATOMIC                tail;           /* tail pointer index */\r
-};\r
-\r
-struct dapl_cookie_buffer\r
-{\r
-    DAPL_COOKIE                *pool;\r
-    DAT_COUNT          pool_size;\r
-    DAPL_ATOMIC                head;\r
-    DAPL_ATOMIC                tail;\r
-};\r
-\r
-#ifdef IBAPI\r
-#include "dapl_ibapi_util.h"\r
-#elif VAPI\r
-#include "dapl_vapi_util.h"\r
-#elif __OPENIB__\r
-#include "dapl_openib_util.h"\r
-#include "dapl_openib_cm.h"\r
-#elif DUMMY\r
-#include "dapl_dummy_util.h"\r
-#elif OPENIB\r
-#include "dapl_ib_util.h"\r
-#else /* windows - IBAL and/or IBAL+Sock_CM */\r
-#include "dapl_ibal_util.h"\r
-#endif\r
-\r
-struct dapl_hca\r
-{\r
-    DAPL_OS_LOCK       lock;\r
-    DAPL_LLIST_HEAD    ia_list_head;      /* list of all open IAs */\r
-    DAPL_ATOMIC                handle_ref_count;  /* count of ia_opens on handle */\r
-    DAPL_EVD           *async_evd;\r
-    DAPL_EVD           *async_error_evd;\r
-    DAT_SOCK_ADDR6     hca_address;       /* local address of HCA*/\r
-    char               *name;             /* provider name */\r
-    ib_hca_handle_t    ib_hca_handle;\r
-    unsigned long       port_num;         /* physical port number */\r
-    ib_hca_transport_t  ib_trans;         /* Values specific transport API */\r
-    /* Memory Subsystem Support */\r
-    DAPL_HASH_TABLE    *lmr_hash_table;\r
-    /* Limits & useful HCA attributes */\r
-    DAT_IA_ATTR                ia_attr;\r
-};\r
-\r
-/* DAPL Objects always have the following header */\r
-struct dapl_header\r
-{\r
-    DAT_PROVIDER       *provider;      /* required by DAT - must be first */\r
-    DAPL_MAGIC         magic;          /* magic number for verification */\r
-    DAT_HANDLE_TYPE    handle_type;    /* struct type */\r
-    DAPL_IA            *owner_ia;      /* ia which owns this stuct */\r
-    DAPL_LLIST_ENTRY   ia_list_entry;  /* link entry on ia struct */\r
-    DAT_CONTEXT                user_context;   /* user context - opaque to DAPL */\r
-    DAPL_OS_LOCK       lock;           /* lock - in header for easier macros */\r
-};\r
-\r
-/* DAPL_IA maps to DAT_IA_HANDLE */\r
-struct dapl_ia\r
-{\r
-    DAPL_HEADER                header;\r
-    DAPL_HCA           *hca_ptr;\r
-    DAPL_EVD           *async_error_evd;\r
-    DAT_BOOLEAN                cleanup_async_error_evd;\r
-\r
-    DAPL_LLIST_ENTRY   hca_ia_list_entry;      /* HCAs list of IAs */\r
-    DAPL_LLIST_HEAD    ep_list_head;           /* EP queue */\r
-    DAPL_LLIST_HEAD    lmr_list_head;          /* LMR queue */\r
-    DAPL_LLIST_HEAD    rmr_list_head;          /* RMR queue */\r
-    DAPL_LLIST_HEAD    pz_list_head;           /* PZ queue */\r
-    DAPL_LLIST_HEAD    evd_list_head;          /* EVD queue */\r
-    DAPL_LLIST_HEAD    cno_list_head;          /* CNO queue */\r
-    DAPL_LLIST_HEAD    psp_list_head;          /* PSP queue */\r
-    DAPL_LLIST_HEAD    rsp_list_head;          /* RSP queue */\r
-    DAPL_LLIST_HEAD    srq_list_head;          /* SRQ queue */\r
-#ifdef DAPL_COUNTERS\r
-    void               *cntrs;\r
-#endif\r
-};\r
-\r
-/* DAPL_CNO maps to DAT_CNO_HANDLE */\r
-struct dapl_cno\r
-{\r
-    DAPL_HEADER        header;\r
-\r
-    /* A CNO cannot be freed while it is referenced elsewhere.  */\r
-    DAPL_ATOMIC                        cno_ref_count;\r
-    DAPL_CNO_STATE             cno_state;\r
-\r
-    DAT_COUNT                  cno_waiters;\r
-    DAPL_EVD                   *cno_evd_triggered;\r
-#if defined(__KERNEL__)\r
-    DAT_UPCALL_OBJECT          cno_upcall;\r
-    DAT_UPCALL_POLICY          cno_upcall_policy;\r
-#else\r
-    DAT_OS_WAIT_PROXY_AGENT    cno_wait_agent;\r
-#endif /* defined(__KERNEL__) */\r
-\r
-    DAPL_OS_WAIT_OBJECT                cno_wait_object;\r
-};\r
-\r
-/* DAPL_EVD maps to DAT_EVD_HANDLE */\r
-struct dapl_evd\r
-{\r
-    DAPL_HEADER                header;\r
-\r
-    DAPL_EVD_STATE     evd_state;\r
-    DAT_EVD_FLAGS      evd_flags;\r
-    DAT_BOOLEAN                evd_enabled; /* For attached CNO.  */\r
-    DAT_BOOLEAN                evd_waitable; /* EVD state.  */\r
-\r
-    /* Derived from evd_flags; see dapls_evd_internal_create.  */\r
-    DAT_BOOLEAN                evd_producer_locking_needed;\r
-\r
-    /* Every EVD has a CQ unless it is a SOFTWARE_EVENT only EVD */\r
-    ib_cq_handle_t     ib_cq_handle;\r
-\r
-    /* An Event Dispatcher cannot be freed while\r
-     * it is referenced elsewhere.\r
-     */\r
-    DAPL_ATOMIC                evd_ref_count;\r
-\r
-    /* Set if there has been a catastrophic overflow */\r
-    DAT_BOOLEAN                catastrophic_overflow;\r
-\r
-    /* the actual events */\r
-    DAT_COUNT          qlen;\r
-    DAT_EVENT          *events;\r
-    DAPL_RING_BUFFER   free_event_queue;\r
-    DAPL_RING_BUFFER   pending_event_queue;\r
-\r
-    /* CQ Completions are not placed into 'deferred_events'\r
-     ** rather they are simply left on the Completion Queue\r
-     ** and the fact that there was a notification is flagged.\r
-     */\r
-    DAT_BOOLEAN                cq_notified;\r
-    DAPL_OS_TICKS      cq_notified_when;\r
-\r
-    DAT_COUNT          cno_active_count;\r
-    DAPL_CNO           *cno_ptr;\r
-\r
-    DAPL_OS_WAIT_OBJECT        wait_object;\r
-\r
-    DAT_COUNT          threshold;\r
-    DAPL_EVD_COMPLETION        completion_type;\r
-\r
-#ifdef DAPL_COUNTERS\r
-    void               *cntrs;\r
-#endif\r
-};\r
-\r
-/* DAPL_PRIVATE used to pass private data in a connection */\r
-struct dapl_private\r
-{\r
-#ifdef IBHOSTS_NAMING\r
-    DAT_SOCK_ADDR6             hca_address;    /* local address of HCA*/\r
-#endif /* IBHOSTS_NAMING */\r
-    unsigned char              private_data[DAPL_MAX_PRIVATE_DATA_SIZE];\r
-};\r
-\r
-/* uDAPL timer entry, used to queue timeouts */\r
-struct dapl_timer_entry\r
-{\r
-    DAPL_LLIST_ENTRY           list_entry;     /* link entry on ia struct */\r
-    DAPL_OS_TIMEVAL            expires;\r
-    void                       (*function) (uintptr_t);\r
-    void                       *data;\r
-};\r
-\r
-#ifdef DAPL_DBG_IO_TRC\r
-\r
-#define DBG_IO_TRC_QLEN   32           /* length of trace buffer        */\r
-#define DBG_IO_TRC_IOV 3               /* iov elements we keep track of */\r
-\r
-struct io_buf_track\r
-{\r
-    Ib_send_op_type            op_type;\r
-    DAPL_COOKIE                        *cookie;\r
-    DAT_LMR_TRIPLET            iov[DBG_IO_TRC_IOV];\r
-    DAT_RMR_TRIPLET            remote_iov;\r
-    unsigned int               done;   /* count to track completion ordering */\r
-    int                                status;\r
-    void                       *wqe;\r
-};\r
-\r
-#endif /* DAPL_DBG_IO_TRC */\r
-\r
-/* DAPL_EP maps to DAT_EP_HANDLE */\r
-struct dapl_ep\r
-{\r
-    DAPL_HEADER                        header;\r
-    /* What the DAT Consumer asked for */\r
-    DAT_EP_PARAM               param;\r
-\r
-    /* The RC Queue Pair (IBM OS API) */\r
-    ib_qp_handle_t             qp_handle;\r
-    unsigned int               qpn;    /* qp number */\r
-    ib_qp_state_t              qp_state;\r
-\r
-    /* communications manager handle (IBM OS API) */\r
-   // dp_ib_cm_handle_t                cm_handle;\r
-\r
-    /* Add support for multiple CM object ownership */\r
-    DAPL_LLIST_HEAD            cm_list_head;   \r
-\r
-    /* store the remote IA address here, reference from the param\r
-     * struct which only has a pointer, no storage\r
-     */\r
-    DAT_SOCK_ADDR6             remote_ia_address;\r
-\r
-    /* For passive connections we maintain a back pointer to the CR */\r
-    void *                     cr_ptr;\r
-\r
-    /* pointer to connection timer, if set */\r
-    struct dapl_timer_entry    *cxn_timer;\r
-\r
-    /* private data container */\r
-    DAPL_PRIVATE               private;\r
-\r
-    /* DTO data */\r
-    DAPL_ATOMIC                        req_count;\r
-    DAPL_ATOMIC                        recv_count;\r
-\r
-    DAPL_COOKIE_BUFFER req_buffer;\r
-    DAPL_COOKIE_BUFFER recv_buffer;\r
-\r
-#ifdef DAPL_DBG_IO_TRC\r
-    int                        ibt_dumped;\r
-    struct io_buf_track *ibt_base;\r
-    DAPL_RING_BUFFER   ibt_queue;\r
-#endif /* DAPL_DBG_IO_TRC */\r
-#if defined(_WIN32) || defined(_WIN64)\r
-    DAT_BOOLEAN         recv_discreq;\r
-    DAT_BOOLEAN         sent_discreq;\r
-#endif\r
-#ifdef DAPL_COUNTERS\r
-    void               *cntrs;\r
-#endif\r
-};\r
-\r
-/* DAPL_SRQ maps to DAT_SRQ_HANDLE */\r
-struct dapl_srq\r
-{\r
-    DAPL_HEADER                header;\r
-    DAT_SRQ_PARAM      param;\r
-    DAPL_ATOMIC                srq_ref_count;\r
-    DAPL_COOKIE_BUFFER recv_buffer;\r
-    DAPL_ATOMIC                recv_count;\r
-};\r
-\r
-/* DAPL_PZ maps to DAT_PZ_HANDLE */\r
-struct dapl_pz\r
-{\r
-    DAPL_HEADER                header;\r
-    ib_pd_handle_t     pd_handle;\r
-    DAPL_ATOMIC                pz_ref_count;\r
-};\r
-\r
-/* DAPL_LMR maps to DAT_LMR_HANDLE */\r
-struct dapl_lmr\r
-{\r
-    DAPL_HEADER                header;\r
-    DAT_LMR_PARAM      param;\r
-    ib_mr_handle_t     mr_handle;\r
-    DAPL_ATOMIC                lmr_ref_count;\r
-#if !defined(__KDAPL__)\r
-    char               shmid[DAT_LMR_COOKIE_SIZE]; /* shared memory ID */\r
-    ib_shm_transport_t ib_trans;       /* provider specific data */\r
-#endif /* !__KDAPL__ */\r
-};\r
-\r
-/* DAPL_RMR maps to DAT_RMR_HANDLE */\r
-struct dapl_rmr\r
-{\r
-    DAPL_HEADER                header;\r
-    DAT_RMR_PARAM      param;\r
-    DAPL_EP             *ep;\r
-    DAPL_PZ             *pz;\r
-    DAPL_LMR            *lmr;\r
-    ib_mw_handle_t     mw_handle;\r
-};\r
-\r
-/* SP types, indicating the state and queue */\r
-typedef enum dapl_sp_state\r
-{\r
-    DAPL_SP_STATE_FREE,\r
-    DAPL_SP_STATE_PSP_LISTENING,\r
-    DAPL_SP_STATE_PSP_PENDING,\r
-    DAPL_SP_STATE_RSP_LISTENING,\r
-    DAPL_SP_STATE_RSP_PENDING\r
-} DAPL_SP_STATE;\r
-\r
-/* DAPL_SP maps to DAT_PSP_HANDLE and DAT_RSP_HANDLE */\r
-struct dapl_sp\r
-{\r
-    DAPL_HEADER                header;\r
-    DAPL_SP_STATE      state;          /* type and queue of the SP */\r
-\r
-    /* PSP/RSP PARAM fields */\r
-    DAT_CONN_QUAL       conn_qual;\r
-    DAT_EVD_HANDLE      evd_handle;\r
-    DAT_PSP_FLAGS       psp_flags;\r
-    DAT_EP_HANDLE       ep_handle;\r
-\r
-     /* maintenence fields */\r
-    DAT_BOOLEAN                listening;      /* PSP is registered & active */\r
-    ib_cm_srvc_handle_t        cm_srvc_handle; /* Used by Mellanox CM */\r
-    DAPL_LLIST_HEAD    cr_list_head;   /* CR pending queue */\r
-    DAT_COUNT          cr_list_count;  /* count of CRs on queue */\r
-#if defined(_VENDOR_IBAL_)\r
-    DAPL_OS_WAIT_OBJECT wait_object;    /* cancel & destroy. */\r
-#endif\r
-};\r
-\r
-/* DAPL_CR maps to DAT_CR_HANDLE */\r
-struct dapl_cr\r
-{\r
-    DAPL_HEADER                header;\r
-\r
-    /* for convenience the data is kept as a DAT_CR_PARAM.\r
-     * however, the "local_endpoint" field is always NULL\r
-     * so this wastes a pointer. This is probably ok to\r
-     * simplify code, espedially dat_cr_query.\r
-     */\r
-    DAT_CR_PARAM       param;\r
-    /* IB specific fields */\r
-    dp_ib_cm_handle_t  ib_cm_handle;\r
-\r
-    DAT_SOCK_ADDR6     remote_ia_address;\r
-    /* Assuming that the maximum private data size is small.\r
-     * If it gets large, use of a pointer may be appropriate.\r
-     */\r
-    unsigned char      private_data[DAPL_MAX_PRIVATE_DATA_SIZE];\r
-    /*\r
-     * Need to be able to associate the CR back to the PSP for\r
-     * dapl_cr_reject.\r
-     */\r
-    DAPL_SP            *sp_ptr;\r
-};\r
-\r
-typedef enum dapl_dto_type\r
-{\r
-    DAPL_DTO_TYPE_SEND,\r
-    DAPL_DTO_TYPE_RECV,\r
-    DAPL_DTO_TYPE_RDMA_WRITE,\r
-    DAPL_DTO_TYPE_RDMA_READ,\r
-#ifdef DAT_EXTENSIONS\r
-    DAPL_DTO_TYPE_EXTENSION,\r
-#endif\r
-} DAPL_DTO_TYPE;\r
-\r
-typedef enum dapl_cookie_type\r
-{\r
-    DAPL_COOKIE_TYPE_NULL,\r
-    DAPL_COOKIE_TYPE_DTO,\r
-    DAPL_COOKIE_TYPE_RMR,\r
-} DAPL_COOKIE_TYPE;\r
-\r
-/* DAPL_DTO_COOKIE used as context for DTO WQEs */\r
-struct dapl_dto_cookie\r
-{\r
-    DAPL_DTO_TYPE              type;\r
-    DAT_DTO_COOKIE             cookie;\r
-    DAT_COUNT                  size;   /* used for SEND and RDMA write */\r
-};\r
-\r
-/* DAPL_RMR_COOKIE used as context for bind WQEs */\r
-struct dapl_rmr_cookie\r
-{\r
-    DAPL_RMR                   *rmr;\r
-    DAT_RMR_COOKIE              cookie;\r
-};\r
-\r
-/* DAPL_COOKIE used as context for WQEs */\r
-struct dapl_cookie\r
-{\r
-    DAPL_COOKIE_TYPE           type; /* Must be first, to define struct.  */\r
-    DAPL_EP                    *ep;\r
-    DAT_COUNT                  index;\r
-    union\r
-    {\r
-       DAPL_DTO_COOKIE         dto;\r
-       DAPL_RMR_COOKIE         rmr;\r
-    } val;\r
-};\r
-\r
-/*\r
- * Private Data operations. Used to obtain the size of the private\r
- * data from the provider layer.\r
- */\r
-typedef enum dapl_private_data_op\r
-{\r
-    DAPL_PDATA_CONN_REQ  = 0,          /* connect request    */\r
-    DAPL_PDATA_CONN_REP  = 1,          /* connect reply      */\r
-    DAPL_PDATA_CONN_REJ  = 2,          /* connect reject     */\r
-    DAPL_PDATA_CONN_DREQ = 3,          /* disconnect request */\r
-    DAPL_PDATA_CONN_DREP = 4,          /* disconnect reply   */\r
-} DAPL_PDATA_OP;\r
-\r
-\r
-/*\r
- * Generic HCA name field\r
- */\r
-#define DAPL_HCA_NAME_MAX_LEN 260\r
-typedef char DAPL_HCA_NAME[DAPL_HCA_NAME_MAX_LEN+1];\r
-\r
-#ifdef IBHOSTS_NAMING\r
-\r
-/*\r
- * Simple mapping table to match IP addresses to GIDs. Loaded\r
- * by dapl_init.\r
- */\r
-typedef struct _dapl_gid_map_table\r
-{\r
-    uint32_t           ip_address;\r
-    ib_gid_t           gid;\r
-} DAPL_GID_MAP;\r
-\r
-#endif /* IBHOSTS_NAMING */\r
-\r
-/*\r
- * IBTA defined reason for reject message: See IBTA 1.1 specification,\r
- * 12.6.7.2 REJECTION REASON section.\r
- */\r
-#define IB_CM_REJ_REASON_CONSUMER_REJ            0x001C\r
-\r
-\r
-#if defined(DAPL_DBG_IO_TRC)\r
-/*********************************************************************\r
- *                                                                   *\r
- * Debug I/O tracing support prototypes                              *\r
- *                                                                   *\r
- *********************************************************************/\r
-/*\r
- * I/O tracing support\r
- */\r
-void dapls_io_trc_alloc (\r
-    DAPL_EP                    *ep_ptr);\r
-\r
-void dapls_io_trc_update_completion (\r
-    DAPL_EP                    *ep_ptr,\r
-    DAPL_COOKIE                        *cookie,\r
-    ib_uint32_t                        ib_status );\r
-\r
-void dapls_io_trc_dump (\r
-    DAPL_EP                    *ep_ptr,\r
-    ib_work_completion_t       *cqe_ptr,\r
-    ib_uint32_t                        ib_status);\r
-\r
-#else /* DAPL_DBG_IO_TRC */\r
-\r
-#define dapls_io_trc_alloc(a)\r
-#define dapls_io_trc_update_completion(a, b, c)\r
-#define dapls_io_trc_dump(a, b, c)\r
-\r
-#endif /* DAPL_DBG_IO_TRC */\r
-\r
-\r
-/*********************************************************************\r
- *                                                                   *\r
- * Function Prototypes                                               *\r
- *                                                                   *\r
- *********************************************************************/\r
-\r
-typedef void (*DAPL_CONNECTION_STATE_HANDLER) (\r
-       IN      DAPL_EP *,\r
-       IN      ib_cm_events_t,\r
-       IN      const void *,\r
-       OUT     DAT_EVENT *);\r
-\r
-/*\r
- * DAT Mandated functions\r
- */\r
-\r
-extern DAT_RETURN DAT_API dapl_ia_open (\r
-       IN      const DAT_NAME_PTR,     /* name */\r
-       IN      DAT_COUNT,              /* asynch_evd_qlen */\r
-       INOUT   DAT_EVD_HANDLE *,       /* asynch_evd_handle */\r
-       OUT     DAT_IA_HANDLE *);       /* ia_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_ia_close (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle */\r
-       IN      DAT_CLOSE_FLAGS );      /* ia_flags */\r
-\r
-\r
-extern DAT_RETURN DAT_API dapl_ia_query (\r
-       IN      DAT_IA_HANDLE,          /* ia handle */\r
-       OUT     DAT_EVD_HANDLE *,       /* async_evd_handle */\r
-       IN      DAT_IA_ATTR_MASK,       /* ia_params_mask */\r
-       OUT     DAT_IA_ATTR *,          /* ia_params */\r
-       IN      DAT_PROVIDER_ATTR_MASK, /* provider_params_mask */\r
-       OUT     DAT_PROVIDER_ATTR * );  /* provider_params */\r
-\r
-\r
-/* helper functions */\r
-\r
-extern DAT_RETURN DAT_API dapl_set_consumer_context (\r
-       IN      DAT_HANDLE,                     /* dat handle */\r
-       IN      DAT_CONTEXT);                   /* context */\r
-\r
-extern DAT_RETURN DAT_API dapl_get_consumer_context (\r
-       IN      DAT_HANDLE,                     /* dat handle */\r
-       OUT     DAT_CONTEXT * );                /* context */\r
-\r
-extern DAT_RETURN DAT_API dapl_get_handle_type (\r
-       IN      DAT_HANDLE,\r
-       OUT     DAT_HANDLE_TYPE * );\r
-\r
-/* CNO functions */\r
-\r
-#if !defined(__KERNEL__)\r
-extern DAT_RETURN DAT_API dapl_cno_create (\r
-       IN      DAT_IA_HANDLE,                  /* ia_handle */\r
-       IN      DAT_OS_WAIT_PROXY_AGENT,        /* agent */\r
-       OUT     DAT_CNO_HANDLE *);              /* cno_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_cno_modify_agent (\r
-       IN      DAT_CNO_HANDLE,                 /* cno_handle */\r
-       IN      DAT_OS_WAIT_PROXY_AGENT);       /* agent */\r
-\r
-extern DAT_RETURN DAT_API dapl_cno_query (\r
-       IN      DAT_CNO_HANDLE,         /* cno_handle */\r
-       IN      DAT_CNO_PARAM_MASK,     /* cno_param_mask */\r
-       OUT     DAT_CNO_PARAM * );      /* cno_param */\r
-\r
-extern DAT_RETURN DAT_API dapl_cno_free (\r
-       IN      DAT_CNO_HANDLE);        /* cno_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_cno_wait (\r
-       IN      DAT_CNO_HANDLE,         /* cno_handle */\r
-       IN      DAT_TIMEOUT,            /* timeout */\r
-       OUT     DAT_EVD_HANDLE *);      /* evd_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_cno_fd_create (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle            */\r
-       OUT     DAT_FD *,               /* file_descriptor      */\r
-       OUT     DAT_CNO_HANDLE *);      /* cno_handle           */\r
-\r
-extern DAT_RETURN DAT_API dapl_cno_trigger (\r
-       IN      DAT_CNO_HANDLE,         /* cno_handle */\r
-       OUT     DAT_EVD_HANDLE *);      /* evd_handle */\r
-\r
-#endif /* !defined(__KERNEL__) */\r
-\r
-/* CR Functions */\r
-\r
-extern DAT_RETURN DAT_API dapl_cr_query (\r
-       IN      DAT_CR_HANDLE,          /* cr_handle */\r
-       IN      DAT_CR_PARAM_MASK,      /* cr_args_mask */\r
-       OUT     DAT_CR_PARAM * );       /* cwr_args */\r
-\r
-extern DAT_RETURN DAT_API dapl_cr_accept (\r
-       IN      DAT_CR_HANDLE,          /* cr_handle */\r
-       IN      DAT_EP_HANDLE,          /* ep_handle */\r
-       IN      DAT_COUNT,              /* private_data_size */\r
-       IN      const DAT_PVOID );      /* private_data */\r
-\r
-extern DAT_RETURN DAT_API dapl_cr_reject (\r
-       IN      DAT_CR_HANDLE,          /* cr_handle            */\r
-       IN      DAT_COUNT,              /* private_data_size    */\r
-       IN      const DAT_PVOID );      /* private_data         */\r
-\r
-extern DAT_RETURN DAT_API dapl_cr_handoff (\r
-       IN DAT_CR_HANDLE,               /* cr_handle */\r
-       IN DAT_CONN_QUAL);              /* handoff */\r
-\r
-/* EVD Functions */\r
-\r
-#if defined(__KERNEL__)\r
-extern DAT_RETURN DAT_API dapl_ia_memtype_hint (\r
-       IN    DAT_IA_HANDLE,            /* ia_handle */\r
-       IN    DAT_MEM_TYPE,             /* mem_type */\r
-       IN    DAT_VLEN,                 /* length */\r
-       IN    DAT_MEM_OPT,              /* mem_optimization */\r
-       OUT   DAT_VLEN *,               /* suggested_length */\r
-       OUT   DAT_VADDR *);             /* suggested_alignment */\r
-\r
-extern DAT_RETURN DAT_API dapl_evd_kcreate (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle */\r
-       IN      DAT_COUNT,              /* evd_min_qlen */\r
-       IN      DAT_UPCALL_POLICY,      /* upcall_policy */\r
-       IN      const DAT_UPCALL_OBJECT *, /* upcall */\r
-       IN      DAT_EVD_FLAGS,          /* evd_flags */\r
-       OUT     DAT_EVD_HANDLE * );     /* evd_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_evd_kquery (\r
-       IN      DAT_EVD_HANDLE,         /* evd_handle */\r
-       IN      DAT_EVD_PARAM_MASK,     /* evd_args_mask */\r
-       OUT     DAT_EVD_PARAM * );      /* evd_args */\r
-\r
-#else\r
-extern DAT_RETURN DAT_API dapl_evd_create (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle */\r
-       IN      DAT_COUNT,              /* evd_min_qlen */\r
-       IN      DAT_CNO_HANDLE,         /* cno_handle */\r
-       IN      DAT_EVD_FLAGS,          /* evd_flags */\r
-       OUT     DAT_EVD_HANDLE * );     /* evd_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_evd_query (\r
-       IN      DAT_EVD_HANDLE,         /* evd_handle */\r
-       IN      DAT_EVD_PARAM_MASK,     /* evd_args_mask */\r
-       OUT     DAT_EVD_PARAM * );      /* evd_args */\r
-#endif /* defined(__KERNEL__) */\r
-\r
-#if defined(__KERNEL__)\r
-extern DAT_RETURN DAT_API dapl_evd_modify_upcall (\r
-       IN      DAT_EVD_HANDLE,         /* evd_handle */\r
-       IN      DAT_UPCALL_POLICY,      /* upcall_policy */\r
-       IN      const DAT_UPCALL_OBJECT * ); /* upcall */\r
-\r
-#else\r
-\r
-extern DAT_RETURN DAT_API dapl_evd_modify_cno (\r
-       IN      DAT_EVD_HANDLE,         /* evd_handle */\r
-       IN      DAT_CNO_HANDLE);        /* cno_handle */\r
-#endif\r
-\r
-extern DAT_RETURN DAT_API dapl_evd_enable (\r
-       IN      DAT_EVD_HANDLE);        /* evd_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_evd_disable (\r
-       IN      DAT_EVD_HANDLE);        /* evd_handle */\r
-\r
-#if !defined(__KERNEL__)\r
-extern DAT_RETURN DAT_API dapl_evd_wait (\r
-       IN      DAT_EVD_HANDLE,         /* evd_handle */\r
-       IN      DAT_TIMEOUT,            /* timeout */\r
-       IN      DAT_COUNT,              /* threshold */\r
-       OUT     DAT_EVENT *,            /* event */\r
-       OUT     DAT_COUNT *);           /* nmore */\r
-#endif /* !defined(__KERNEL__) */\r
-\r
-extern DAT_RETURN DAT_API dapl_evd_resize (\r
-       IN      DAT_EVD_HANDLE,         /* evd_handle */\r
-       IN      DAT_COUNT );            /* evd_qlen */\r
-\r
-extern DAT_RETURN DAT_API dapl_evd_post_se (\r
-       DAT_EVD_HANDLE,                 /* evd_handle */\r
-       const DAT_EVENT * );            /* event */\r
-\r
-extern DAT_RETURN DAT_API dapl_evd_dequeue (\r
-       IN      DAT_EVD_HANDLE,         /* evd_handle */\r
-       OUT     DAT_EVENT * );          /* event */\r
-\r
-extern DAT_RETURN DAT_API dapl_evd_free (\r
-       IN      DAT_EVD_HANDLE );\r
-\r
-extern DAT_RETURN DAT_API\r
-dapl_evd_set_unwaitable (\r
-       IN      DAT_EVD_HANDLE  evd_handle );\r
-\r
-extern DAT_RETURN DAT_API\r
-dapl_evd_clear_unwaitable (\r
-       IN      DAT_EVD_HANDLE  evd_handle );\r
-\r
-/* EP functions */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_create (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle */\r
-       IN      DAT_PZ_HANDLE,          /* pz_handle */\r
-       IN      DAT_EVD_HANDLE,         /* in_dto_completion_evd_handle */\r
-       IN      DAT_EVD_HANDLE,         /* out_dto_completion_evd_handle */\r
-       IN      DAT_EVD_HANDLE,         /* connect_evd_handle */\r
-       IN      const DAT_EP_ATTR *,    /* ep_parameters */\r
-       OUT     DAT_EP_HANDLE * );      /* ep_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_query (\r
-       IN      DAT_EP_HANDLE,          /* ep_handle */\r
-       IN      DAT_EP_PARAM_MASK,      /* ep_args_mask */\r
-       OUT     DAT_EP_PARAM * );       /* ep_args */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_modify (\r
-       IN      DAT_EP_HANDLE,          /* ep_handle */\r
-       IN      DAT_EP_PARAM_MASK,      /* ep_args_mask */\r
-       IN      const DAT_EP_PARAM * ); /* ep_args */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_connect (\r
-       IN      DAT_EP_HANDLE,          /* ep_handle */\r
-       IN      DAT_IA_ADDRESS_PTR,     /* remote_ia_address */\r
-       IN      DAT_CONN_QUAL,          /* remote_conn_qual */\r
-       IN      DAT_TIMEOUT,            /* timeout */\r
-       IN      DAT_COUNT,              /* private_data_size */\r
-       IN      const DAT_PVOID,        /* private_data  */\r
-       IN      DAT_QOS,                /* quality_of_service */\r
-       IN      DAT_CONNECT_FLAGS );    /* connect_flags */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_common_connect (\r
-       IN      DAT_EP_HANDLE ep,               /* ep_handle            */\r
-       IN      DAT_IA_ADDRESS_PTR remote_addr, /* remote_ia_address    */\r
-       IN      DAT_TIMEOUT timeout,            /* timeout              */\r
-       IN      DAT_COUNT pdata_size,           /* private_data_size    */\r
-       IN      const DAT_PVOID pdata   );      /* private_data         */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_dup_connect (\r
-       IN      DAT_EP_HANDLE,          /* ep_handle */\r
-       IN      DAT_EP_HANDLE,          /* ep_dup_handle */\r
-       IN      DAT_TIMEOUT,            /* timeout*/\r
-       IN      DAT_COUNT,              /* private_data_size */\r
-       IN      const DAT_PVOID,        /* private_data */\r
-       IN      DAT_QOS);               /* quality_of_service */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_disconnect (\r
-       IN      DAT_EP_HANDLE,          /* ep_handle */\r
-       IN      DAT_CLOSE_FLAGS );      /* close_flags */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_post_send (\r
-       IN      DAT_EP_HANDLE,          /* ep_handle */\r
-       IN      DAT_COUNT,              /* num_segments */\r
-       IN      DAT_LMR_TRIPLET *,      /* local_iov */\r
-       IN      DAT_DTO_COOKIE,         /* user_cookie */\r
-       IN      DAT_COMPLETION_FLAGS ); /* completion_flags */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_post_recv (\r
-       IN      DAT_EP_HANDLE,          /* ep_handle */\r
-       IN      DAT_COUNT,              /* num_segments */\r
-       IN      DAT_LMR_TRIPLET *,      /* local_iov */\r
-       IN      DAT_DTO_COOKIE,         /* user_cookie */\r
-       IN      DAT_COMPLETION_FLAGS ); /* completion_flags */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_post_rdma_read (\r
-       IN      DAT_EP_HANDLE,           /* ep_handle */\r
-       IN      DAT_COUNT,               /* num_segments */\r
-       IN      DAT_LMR_TRIPLET *,       /* local_iov */\r
-       IN      DAT_DTO_COOKIE,          /* user_cookie */\r
-       IN      const DAT_RMR_TRIPLET *, /* remote_iov */\r
-       IN      DAT_COMPLETION_FLAGS );  /* completion_flags */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_post_rdma_read_to_rmr (\r
-       IN      DAT_EP_HANDLE,          /* ep_handle            */\r
-       IN      const DAT_RMR_TRIPLET *,/* local_iov            */\r
-       IN      DAT_DTO_COOKIE,         /* user_cookie          */\r
-       IN      const DAT_RMR_TRIPLET *,/* remote_iov           */\r
-       IN      DAT_COMPLETION_FLAGS);  /* completion_flags     */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_post_rdma_write (\r
-       IN      DAT_EP_HANDLE,           /* ep_handle */\r
-       IN      DAT_COUNT,               /* num_segments */\r
-       IN      DAT_LMR_TRIPLET *,       /* local_iov */\r
-       IN      DAT_DTO_COOKIE,          /* user_cookie */\r
-       IN      const DAT_RMR_TRIPLET *, /* remote_iov */\r
-       IN      DAT_COMPLETION_FLAGS );  /* completion_flags */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_post_send_with_invalidate (\r
-       IN      DAT_EP_HANDLE,          /* ep_handle            */\r
-       IN      DAT_COUNT,              /* num_segments         */\r
-       IN      DAT_LMR_TRIPLET *,      /* local_iov            */\r
-       IN      DAT_DTO_COOKIE,         /* user_cookie          */\r
-       IN      DAT_COMPLETION_FLAGS,   /* completion_flags     */\r
-       IN      DAT_BOOLEAN,            /* invalidate_flag      */\r
-       IN      DAT_RMR_CONTEXT);      /* RMR context          */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_get_status (\r
-       IN      DAT_EP_HANDLE,          /* ep_handle */\r
-       OUT     DAT_EP_STATE *,         /* ep_state */\r
-       OUT     DAT_BOOLEAN *,          /* in_dto_idle */\r
-       OUT     DAT_BOOLEAN * );        /* out_dto_idle */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_free (\r
-       IN      DAT_EP_HANDLE);         /* ep_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_reset (\r
-       IN      DAT_EP_HANDLE);         /* ep_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_create_with_srq (\r
-        IN      DAT_IA_HANDLE,          /* ia_handle            */\r
-        IN      DAT_PZ_HANDLE,          /* pz_handle            */\r
-        IN      DAT_EVD_HANDLE,         /* recv_evd_handle      */\r
-        IN      DAT_EVD_HANDLE,         /* request_evd_handle   */\r
-        IN      DAT_EVD_HANDLE,         /* connect_evd_handle   */\r
-        IN      DAT_SRQ_HANDLE,         /* srq_handle           */\r
-        IN      const DAT_EP_ATTR *,    /* ep_attributes        */\r
-        OUT     DAT_EP_HANDLE *);       /* ep_handle            */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_recv_query (\r
-        IN      DAT_EP_HANDLE,          /* ep_handle            */\r
-        OUT     DAT_COUNT *,            /* nbufs_allocated      */\r
-        OUT     DAT_COUNT *);           /* bufs_alloc_span      */\r
-\r
-extern DAT_RETURN DAT_API dapl_ep_set_watermark (\r
-        IN      DAT_EP_HANDLE,          /* ep_handle            */\r
-        IN      DAT_COUNT,              /* soft_high_watermark  */\r
-        IN      DAT_COUNT);             /* hard_high_watermark  */\r
-\r
-/* LMR functions */\r
-\r
-#if defined(__KERNEL__)\r
-extern DAT_RETURN DAT_API dapl_lmr_kcreate (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle */\r
-       IN      DAT_MEM_TYPE,           /* mem_type */\r
-       IN      DAT_REGION_DESCRIPTION, /* region_description */\r
-       IN      DAT_VLEN,               /* length */\r
-       IN      DAT_PZ_HANDLE,          /* pz_handle */\r
-       IN      DAT_MEM_PRIV_FLAGS,     /* privileges */\r
-       IN      DAT_VA_TYPE,            /* va_type */\r
-       IN      DAT_MEM_OPT,            /* optimization */\r
-       OUT     DAT_LMR_HANDLE *,       /* lmr_handle */\r
-       OUT     DAT_LMR_CONTEXT *,      /* lmr_context */\r
-       OUT     DAT_RMR_CONTEXT *,      /* rmr_context          */\r
-       OUT     DAT_VLEN *,             /* registered_length */\r
-       OUT     DAT_VADDR * );          /* registered_address */\r
-#else\r
-extern DAT_RETURN DAT_API dapl_lmr_create (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle */\r
-       IN      DAT_MEM_TYPE,           /* mem_type */\r
-       IN      DAT_REGION_DESCRIPTION, /* region_description */\r
-       IN      DAT_VLEN,               /* length */\r
-       IN      DAT_PZ_HANDLE,          /* pz_handle */\r
-       IN      DAT_MEM_PRIV_FLAGS,     /* privileges */\r
-       IN      DAT_VA_TYPE,            /* va_type */\r
-       OUT     DAT_LMR_HANDLE *,       /* lmr_handle */\r
-       OUT     DAT_LMR_CONTEXT *,      /* lmr_context */\r
-       OUT     DAT_RMR_CONTEXT *,      /* rmr_context          */\r
-       OUT     DAT_VLEN *,             /* registered_length */\r
-       OUT     DAT_VADDR * );          /* registered_address */\r
-#endif /* defined(__KERNEL__) */\r
-\r
-extern DAT_RETURN DAT_API dapl_lmr_query (\r
-       IN      DAT_LMR_HANDLE,\r
-       IN      DAT_LMR_PARAM_MASK,\r
-       OUT     DAT_LMR_PARAM *);\r
-\r
-extern DAT_RETURN DAT_API dapl_lmr_free (\r
-       IN      DAT_LMR_HANDLE);\r
-\r
-extern DAT_RETURN DAT_API dapl_lmr_sync_rdma_read (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle            */\r
-       IN      const DAT_LMR_TRIPLET *, /* local_segments      */\r
-       IN      DAT_VLEN);              /* num_segments         */\r
-\r
-extern DAT_RETURN DAT_API dapl_lmr_sync_rdma_write (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle            */\r
-       IN      const DAT_LMR_TRIPLET *, /* local_segments      */\r
-       IN      DAT_VLEN);              /* num_segments         */\r
-\r
-/* RMR Functions */\r
-\r
-extern DAT_RETURN DAT_API dapl_rmr_create (\r
-       IN      DAT_PZ_HANDLE,          /* pz_handle */\r
-       OUT     DAT_RMR_HANDLE *);      /* rmr_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_rmr_create_for_ep (\r
-       IN      DAT_PZ_HANDLE pz_handle,        /* pz_handle    */\r
-       OUT     DAT_RMR_HANDLE *rmr_handle);    /* rmr_handle   */\r
-\r
-extern DAT_RETURN DAT_API dapl_rmr_query (\r
-       IN      DAT_RMR_HANDLE,         /* rmr_handle */\r
-       IN      DAT_RMR_PARAM_MASK,     /* rmr_args_mask */\r
-       OUT     DAT_RMR_PARAM *);       /* rmr_args */\r
-\r
-extern DAT_RETURN DAT_API dapl_rmr_bind (\r
-       IN      DAT_RMR_HANDLE,          /* rmr_handle */\r
-       IN      DAT_LMR_HANDLE,          /* lmr_handle */\r
-       IN      const DAT_LMR_TRIPLET *, /* lmr_triplet */\r
-       IN      DAT_MEM_PRIV_FLAGS,      /* mem_priv */\r
-       IN      DAT_VA_TYPE,             /* va_type */\r
-       IN      DAT_EP_HANDLE,           /* ep_handle */\r
-       IN      DAT_RMR_COOKIE,          /* user_cookie */\r
-       IN      DAT_COMPLETION_FLAGS,    /* completion_flags */\r
-       INOUT   DAT_RMR_CONTEXT * );     /* context */\r
-\r
-extern DAT_RETURN DAT_API dapl_rmr_free (\r
-       IN      DAT_RMR_HANDLE);\r
-\r
-/* PSP Functions */\r
-\r
-extern DAT_RETURN DAT_API dapl_psp_create (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle */\r
-       IN      DAT_CONN_QUAL,          /* conn_qual */\r
-       IN      DAT_EVD_HANDLE,         /* evd_handle */\r
-       IN      DAT_PSP_FLAGS,          /* psp_flags */\r
-       OUT     DAT_PSP_HANDLE * );     /* psp_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_psp_create_any (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle */\r
-       OUT     DAT_CONN_QUAL *,        /* conn_qual */\r
-       IN      DAT_EVD_HANDLE,         /* evd_handle */\r
-       IN      DAT_PSP_FLAGS,          /* psp_flags */\r
-       OUT     DAT_PSP_HANDLE *);      /* psp_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_psp_query (\r
-       IN      DAT_PSP_HANDLE,\r
-       IN      DAT_PSP_PARAM_MASK,\r
-       OUT     DAT_PSP_PARAM * );\r
-\r
-extern DAT_RETURN DAT_API dapl_psp_free (\r
-       IN      DAT_PSP_HANDLE );       /* psp_handle */\r
-\r
-/* RSP Functions */\r
-\r
-extern DAT_RETURN DAT_API dapl_rsp_create (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle */\r
-       IN      DAT_CONN_QUAL,          /* conn_qual */\r
-       IN      DAT_EP_HANDLE,          /* ep_handle */\r
-       IN      DAT_EVD_HANDLE,         /* evd_handle */\r
-       OUT     DAT_RSP_HANDLE * );     /* rsp_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_rsp_query (\r
-       IN      DAT_RSP_HANDLE,\r
-       IN      DAT_RSP_PARAM_MASK,\r
-       OUT     DAT_RSP_PARAM * );\r
-\r
-extern DAT_RETURN DAT_API dapl_rsp_free (\r
-       IN      DAT_RSP_HANDLE );       /* rsp_handle */\r
-\r
-/* PZ Functions */\r
-\r
-extern DAT_RETURN DAT_API dapl_pz_create (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle */\r
-       OUT     DAT_PZ_HANDLE * );      /* pz_handle */\r
-\r
-extern DAT_RETURN DAT_API dapl_pz_query (\r
-       IN      DAT_PZ_HANDLE,          /* pz_handle */\r
-       IN      DAT_PZ_PARAM_MASK,      /* pz_args_mask */\r
-       OUT     DAT_PZ_PARAM * );       /* pz_args */\r
-\r
-extern DAT_RETURN DAT_API dapl_pz_free (\r
-       IN      DAT_PZ_HANDLE );        /* pz_handle */\r
-\r
-/* SRQ functions */\r
-\r
-extern DAT_RETURN DAT_API dapl_srq_create (\r
-        IN      DAT_IA_HANDLE,          /* ia_handle            */\r
-        IN      DAT_PZ_HANDLE,          /* pz_handle            */\r
-        IN      DAT_SRQ_ATTR *,         /* srq_attr             */\r
-        OUT     DAT_SRQ_HANDLE *);      /* srq_handle           */\r
-\r
-extern DAT_RETURN DAT_API dapl_srq_free (\r
-       IN      DAT_SRQ_HANDLE);        /* srq_handle           */\r
-\r
-extern DAT_RETURN DAT_API dapl_srq_post_recv (\r
-       IN      DAT_SRQ_HANDLE,         /* srq_handle           */\r
-       IN      DAT_COUNT,              /* num_segments         */\r
-       IN      DAT_LMR_TRIPLET *,      /* local_iov            */\r
-       IN      DAT_DTO_COOKIE);        /* user_cookie          */\r
-\r
-extern DAT_RETURN DAT_API dapl_srq_query (\r
-       IN      DAT_SRQ_HANDLE,         /* srq_handle           */\r
-       IN      DAT_SRQ_PARAM_MASK,     /* srq_param_mask       */\r
-       OUT     DAT_SRQ_PARAM *);       /* srq_param            */\r
-\r
-extern DAT_RETURN DAT_API dapl_srq_resize (\r
-       IN      DAT_SRQ_HANDLE,         /* srq_handle           */\r
-       IN      DAT_COUNT);             /* srq_max_recv_dto     */\r
-\r
-extern DAT_RETURN DAT_API dapl_srq_set_lw (\r
-       IN      DAT_SRQ_HANDLE,         /* srq_handle           */\r
-       IN      DAT_COUNT);             /* low_watermark        */\r
-\r
-/* CSP functions */\r
-extern DAT_RETURN DAT_API dapl_csp_create (\r
-       IN      DAT_IA_HANDLE,          /* ia_handle      */\r
-       IN      DAT_COMM *,             /* communicator   */\r
-       IN      DAT_IA_ADDRESS_PTR,     /* address        */\r
-       IN      DAT_EVD_HANDLE,         /* evd_handle     */\r
-       OUT     DAT_CSP_HANDLE *);      /* csp_handle     */\r
-\r
-extern DAT_RETURN DAT_API dapl_csp_query (\r
-       IN      DAT_CSP_HANDLE,         /* csp_handle     */\r
-       IN      DAT_CSP_PARAM_MASK,     /* csp_param_mask */\r
-       OUT     DAT_CSP_PARAM *);       /* csp_param      */\r
-\r
-extern DAT_RETURN DAT_API dapl_csp_free (\r
-       IN      DAT_CSP_HANDLE);        /* csp_handle     */\r
-\r
-/* HA functions */\r
-DAT_RETURN DAT_API dapl_ia_ha (\r
-       IN       DAT_IA_HANDLE,         /* ia_handle */\r
-       IN const DAT_NAME_PTR,          /* provider  */\r
-       OUT      DAT_BOOLEAN *);        /* answer    */\r
-\r
-#ifdef DAT_EXTENSIONS\r
-#include <stdarg.h>\r
-extern DAT_RETURN DAT_API dapl_extensions (\r
-       IN      DAT_HANDLE,             /* handle */\r
-       IN      DAT_EXTENDED_OP,        /* extended op */\r
-       IN      va_list);               /* argument list */\r
-#endif\r
-\r
-/*\r
- * DAPL internal utility function prototpyes\r
- */\r
-\r
-extern void dapl_llist_init_head (\r
-    DAPL_LLIST_HEAD *  head);\r
-\r
-extern void dapl_llist_init_entry (\r
-    DAPL_LLIST_ENTRY *         entry);\r
-\r
-extern DAT_BOOLEAN dapl_llist_is_empty (\r
-    DAPL_LLIST_HEAD *  head);\r
-\r
-extern void dapl_llist_add_head (\r
-    DAPL_LLIST_HEAD *  head,\r
-    DAPL_LLIST_ENTRY *         entry,\r
-    void *             data);\r
-\r
-extern void dapl_llist_add_tail (\r
-    DAPL_LLIST_HEAD *   head,\r
-    DAPL_LLIST_ENTRY *  entry,\r
-    void *             data);\r
-\r
-extern void dapl_llist_add_entry (\r
-    DAPL_LLIST_HEAD * head,\r
-    DAPL_LLIST_ENTRY * entry,\r
-    DAPL_LLIST_ENTRY * new_entry,\r
-    void * data);\r
-\r
-extern void * dapl_llist_remove_head (\r
-    DAPL_LLIST_HEAD *  head);\r
-\r
-extern void * dapl_llist_remove_tail (\r
-    DAPL_LLIST_HEAD *  head);\r
-\r
-extern void * dapl_llist_remove_entry (\r
-    DAPL_LLIST_HEAD *  head,\r
-    DAPL_LLIST_ENTRY * entry);\r
-\r
-extern void * dapl_llist_peek_head (\r
-    DAPL_LLIST_HEAD *  head);\r
-\r
-extern void * dapl_llist_next_entry (\r
-    IN    DAPL_LLIST_HEAD      *head,\r
-    IN    DAPL_LLIST_ENTRY     *cur_ent);\r
-\r
-extern void dapl_llist_debug_print_list (\r
-    DAPL_LLIST_HEAD *  head);\r
-\r
-\r
-#endif\r
+/*
+ * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
+ *
+ * This Software is licensed under one of the following licenses:
+ *
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is
+ *    in the file LICENSE.txt in the root directory. The license is also
+ *    available from the Open Source Initiative, see
+ *    http://www.opensource.org/licenses/cpl.php.
+ *
+ * 2) under the terms of the "The BSD License" a copy of which is in the file
+ *    LICENSE2.txt in the root directory. The license is also available from
+ *    the Open Source Initiative, see
+ *    http://www.opensource.org/licenses/bsd-license.php.
+ *
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a 
+ *    copy of which is in the file LICENSE3.txt in the root directory. The 
+ *    license is also available from the Open Source Initiative, see
+ *    http://www.opensource.org/licenses/gpl-license.php.
+ *
+ * Licensee has the right to choose one of the above licenses.
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice and one of the license notices.
+ *
+ * Redistributions in binary form must reproduce both the above copyright
+ * notice, one of the license notices in the documentation
+ * and/or other materials provided with the distribution.
+ */
+
+/**********************************************************************
+ *
+ * MODULE: dapl.h
+ *
+ * PURPOSE: defines common data structures for the DAPL reference implemenation
+ *
+ * Description: This file describes the working data structures used within
+ *              DAPL RI.
+ *
+ *
+ * $Id: dapl.h 1317 2005-04-25 17:29:42Z jlentini $
+ **********************************************************************/
+
+#ifndef _DAPL_H_
+#define _DAPL_H_
+
+#if defined(__KERNEL__)
+#include <dat2/kdat.h>
+#else
+#include <dat2/udat.h>
+#endif /* defined(__KERNEL__) */
+#include <dat2/dat_registry.h>
+#include "dapl_osd.h"
+#include "dapl_debug.h"
+
+
+
+/*********************************************************************
+ *                                                                   *
+ * Enumerations                                                      *
+ *                                                                   *
+ *********************************************************************/
+
+typedef enum dapl_magic
+{
+    /* magic number values for verification & debug */
+    DAPL_MAGIC_IA      = 0xCafeF00d,
+    DAPL_MAGIC_EVD     = 0xFeedFace,
+    DAPL_MAGIC_EP      = 0xDeadBabe,
+    DAPL_MAGIC_LMR     = 0xBeefCafe,
+    DAPL_MAGIC_RMR      = 0xABadCafe,
+    DAPL_MAGIC_PZ      = 0xDeafBeef,
+    DAPL_MAGIC_PSP     = 0xBeadeD0c,
+    DAPL_MAGIC_RSP     = 0xFab4Feed,
+    DAPL_MAGIC_SRQ     = 0xC001Babe,
+    DAPL_MAGIC_CR      = 0xBe12Cee1,
+    DAPL_MAGIC_CR_DESTROYED = 0xB12bDead,
+    DAPL_MAGIC_CNO     = 0xDeadF00d,
+    DAPL_MAGIC_INVALID  = 0xFFFFFFFF
+} DAPL_MAGIC;
+
+typedef enum dapl_evd_state
+{
+    DAPL_EVD_STATE_TERMINAL,
+    DAPL_EVD_STATE_INITIAL,
+    DAPL_EVD_STATE_OPEN,
+    DAPL_EVD_STATE_WAITED,
+    DAPL_EVD_STATE_DEAD        = 0xDEAD
+} DAPL_EVD_STATE;
+
+typedef enum dapl_evd_completion
+{
+    DAPL_EVD_STATE_INIT,
+    DAPL_EVD_STATE_SOLICITED_WAIT,
+    DAPL_EVD_STATE_THRESHOLD,
+    DAPL_EVD_STATE_UNSIGNALLED
+} DAPL_EVD_COMPLETION;
+
+typedef enum dapl_cno_state
+{
+    DAPL_CNO_STATE_UNTRIGGERED,
+    DAPL_CNO_STATE_TRIGGERED,
+    DAPL_CNO_STATE_DEAD = 0xDeadFeed,
+} DAPL_CNO_STATE;
+
+typedef enum dapl_qp_state
+{
+    DAPL_QP_STATE_UNCONNECTED,
+    DAPL_QP_STATE_RESERVED,
+    DAPL_QP_STATE_PASSIVE_CONNECTION_PENDING,
+    DAPL_QP_STATE_ACTIVE_CONNECTION_PENDING,
+    DAPL_QP_STATE_TENTATIVE_CONNECTION_PENDING,
+    DAPL_QP_STATE_CONNECTED,
+    DAPL_QP_STATE_DISCONNECT_PENDING,
+    DAPL_QP_STATE_ERROR,
+    DAPL_QP_STATE_NOT_REUSABLE,
+    DAPL_QP_STATE_FREE
+} DAPL_QP_STATE;
+
+
+/*********************************************************************
+ *                                                                   *
+ * Constants                                                         *
+ *                                                                   *
+ *********************************************************************/
+
+/*
+ * number of HCAs allowed
+ */
+#define DAPL_MAX_HCA_COUNT             4
+
+/*
+ * Configures the RMR bind evd restriction
+ */
+
+#define DAPL_RMR_BIND_EVD_RESTRICTION  DAT_RMR_EVD_SAME_AS_REQUEST_EVD
+
+/*
+ * special qp_state indicating the EP does not have a QP attached yet
+ */
+#define DAPL_QP_STATE_UNATTACHED       0xFFF0
+
+#define DAPL_MAX_PRIVATE_DATA_SIZE     256
+
+/*********************************************************************
+ *                                                                   *
+ * Macros                                                            *
+ *                                                                   *
+ *********************************************************************/
+
+#if defined (sun) || defined(__sun) || defined(_sun_) || defined (__solaris__) 
+#define DAPL_BAD_PTR(a) ((unsigned long)(a) & 3)
+#elif defined(__linux__)
+#define DAPL_BAD_PTR(a) ((unsigned long)(a) & 3)
+#elif defined(_WIN64)
+#define DAPL_BAD_PTR(a) ((unsigned long)((DAT_UINT64)(a)) & 3)
+#elif defined(_WIN32)
+#define DAPL_BAD_PTR(a) ((unsigned long)((DAT_UINT64)(a)) & 3)
+#endif
+
+/*
+ * Simple macro to verify a handle is bad. Conditions:
+ * - pointer is NULL
+ * - pointer is not word aligned
+ * - pointer's magic number is wrong
+ */
+
+#define DAPL_BAD_HANDLE(h, magicNum) (                         \
+           ((h) == NULL) ||                                    \
+           DAPL_BAD_PTR(h) ||                                  \
+           (((DAPL_HEADER *)(h))->magic != (magicNum)))
+
+#define DAPL_MIN(a, b)        ((a < b) ? (a) : (b))
+#define DAPL_MAX(a, b)        ((a > b) ? (a) : (b))
+
+#if NDEBUG > 0
+#define DEBUG_IS_BAD_HANDLE(h, magicNum) (DAPL_BAD_HANDLE(h, magicNum))
+#else
+#define DEBUG_IS_BAD_HANDLE(h, magicNum) (0)
+#endif
+
+#define DAT_ERROR(Type, SubType) ((DAT_RETURN)(DAT_CLASS_ERROR | Type | SubType))
+
+/*********************************************************************
+ *                                                                   *
+ * Typedefs                                                          *
+ *                                                                   *
+ *********************************************************************/
+
+typedef struct dapl_llist_entry                DAPL_LLIST_ENTRY;
+typedef DAPL_LLIST_ENTRY *             DAPL_LLIST_HEAD;
+typedef struct dapl_ring_buffer                DAPL_RING_BUFFER;
+typedef struct dapl_cookie_buffer      DAPL_COOKIE_BUFFER;
+
+typedef struct dapl_hash_table          DAPL_HASH_TABLE;
+typedef struct dapl_hash_table *        DAPL_HASH_TABLEP;
+typedef DAT_UINT64                      DAPL_HASH_KEY;
+typedef void *                          DAPL_HASH_DATA;
+
+typedef struct dapl_hca                        DAPL_HCA;
+
+typedef struct dapl_header             DAPL_HEADER;
+
+typedef struct dapl_ia                 DAPL_IA;
+typedef struct dapl_cno                        DAPL_CNO;
+typedef struct dapl_evd                DAPL_EVD;
+typedef struct dapl_ep                         DAPL_EP;
+typedef struct dapl_srq                        DAPL_SRQ;
+typedef struct dapl_pz                 DAPL_PZ;
+typedef struct dapl_lmr                        DAPL_LMR;
+typedef struct dapl_rmr                        DAPL_RMR;
+typedef struct dapl_sp                 DAPL_SP;
+typedef struct dapl_cr                 DAPL_CR;
+
+typedef struct dapl_cookie             DAPL_COOKIE;
+typedef struct dapl_dto_cookie         DAPL_DTO_COOKIE;
+typedef struct dapl_rmr_cookie         DAPL_RMR_COOKIE;
+
+typedef struct dapl_private            DAPL_PRIVATE;
+
+
+
+/*********************************************************************
+ *                                                                   *
+ * Structures                                                        *
+ *                                                                   *
+ *********************************************************************/
+
+struct dapl_llist_entry
+{
+    struct dapl_llist_entry    *flink;
+    struct dapl_llist_entry    *blink;
+    void                       *data;
+    DAPL_LLIST_HEAD            *list_head; /* for consistency checking */
+};
+
+struct dapl_ring_buffer
+{
+    void               **base;         /* base of element array */
+    DAT_COUNT          lim;            /* mask, number of entries - 1 */
+    DAPL_ATOMIC                head;           /* head pointer index */
+    DAPL_ATOMIC                tail;           /* tail pointer index */
+};
+
+struct dapl_cookie_buffer
+{
+    DAPL_COOKIE                *pool;
+    DAT_COUNT          pool_size;
+    DAPL_ATOMIC                head;
+    DAPL_ATOMIC                tail;
+};
+
+#ifdef IBAPI
+#include "dapl_ibapi_util.h"
+#elif VAPI
+#include "dapl_vapi_util.h"
+#elif __OPENIB__
+#include "dapl_openib_util.h"
+#include "dapl_openib_cm.h"
+#elif DUMMY
+#include "dapl_dummy_util.h"
+#elif OPENIB
+#include "dapl_ib_util.h"
+#else /* windows - IBAL and/or IBAL+Sock_CM */
+#include "dapl_ibal_util.h"
+#endif
+
+struct dapl_hca
+{
+    DAPL_OS_LOCK       lock;
+    DAPL_LLIST_HEAD    ia_list_head;      /* list of all open IAs */
+    DAPL_ATOMIC                handle_ref_count;  /* count of ia_opens on handle */
+    DAPL_EVD           *async_evd;
+    DAPL_EVD           *async_error_evd;
+    DAT_SOCK_ADDR6     hca_address;       /* local address of HCA*/
+    char               *name;             /* provider name */
+    ib_hca_handle_t    ib_hca_handle;
+    unsigned long       port_num;         /* physical port number */
+    ib_hca_transport_t  ib_trans;         /* Values specific transport API */
+    /* Memory Subsystem Support */
+    DAPL_HASH_TABLE    *lmr_hash_table;
+    /* Limits & useful HCA attributes */
+    DAT_IA_ATTR                ia_attr;
+};
+
+/* DAPL Objects always have the following header */
+struct dapl_header
+{
+    DAT_PROVIDER       *provider;      /* required by DAT - must be first */
+    DAPL_MAGIC         magic;          /* magic number for verification */
+    DAT_HANDLE_TYPE    handle_type;    /* struct type */
+    DAPL_IA            *owner_ia;      /* ia which owns this stuct */
+    DAPL_LLIST_ENTRY   ia_list_entry;  /* link entry on ia struct */
+    DAT_CONTEXT                user_context;   /* user context - opaque to DAPL */
+    DAPL_OS_LOCK       lock;           /* lock - in header for easier macros */
+};
+
+/* DAPL_IA maps to DAT_IA_HANDLE */
+struct dapl_ia
+{
+    DAPL_HEADER                header;
+    DAPL_HCA           *hca_ptr;
+    DAPL_EVD           *async_error_evd;
+    DAT_BOOLEAN                cleanup_async_error_evd;
+
+    DAPL_LLIST_ENTRY   hca_ia_list_entry;      /* HCAs list of IAs */
+    DAPL_LLIST_HEAD    ep_list_head;           /* EP queue */
+    DAPL_LLIST_HEAD    lmr_list_head;          /* LMR queue */
+    DAPL_LLIST_HEAD    rmr_list_head;          /* RMR queue */
+    DAPL_LLIST_HEAD    pz_list_head;           /* PZ queue */
+    DAPL_LLIST_HEAD    evd_list_head;          /* EVD queue */
+    DAPL_LLIST_HEAD    cno_list_head;          /* CNO queue */
+    DAPL_LLIST_HEAD    psp_list_head;          /* PSP queue */
+    DAPL_LLIST_HEAD    rsp_list_head;          /* RSP queue */
+    DAPL_LLIST_HEAD    srq_list_head;          /* SRQ queue */
+#ifdef DAPL_COUNTERS
+    void               *cntrs;
+#endif
+};
+
+/* DAPL_CNO maps to DAT_CNO_HANDLE */
+struct dapl_cno
+{
+    DAPL_HEADER        header;
+
+    /* A CNO cannot be freed while it is referenced elsewhere.  */
+    DAPL_ATOMIC                        cno_ref_count;
+    DAPL_CNO_STATE             cno_state;
+
+    DAT_COUNT                  cno_waiters;
+    DAPL_EVD                   *cno_evd_triggered;
+#if defined(__KERNEL__)
+    DAT_UPCALL_OBJECT          cno_upcall;
+    DAT_UPCALL_POLICY          cno_upcall_policy;
+#else
+    DAT_OS_WAIT_PROXY_AGENT    cno_wait_agent;
+#endif /* defined(__KERNEL__) */
+
+    DAPL_OS_WAIT_OBJECT                cno_wait_object;
+};
+
+/* DAPL_EVD maps to DAT_EVD_HANDLE */
+struct dapl_evd
+{
+    DAPL_HEADER                header;
+
+    DAPL_EVD_STATE     evd_state;
+    DAT_EVD_FLAGS      evd_flags;
+    DAT_BOOLEAN                evd_enabled; /* For attached CNO.  */
+    DAT_BOOLEAN                evd_waitable; /* EVD state.  */
+
+    /* Derived from evd_flags; see dapls_evd_internal_create.  */
+    DAT_BOOLEAN                evd_producer_locking_needed;
+
+    /* Every EVD has a CQ unless it is a SOFTWARE_EVENT only EVD */
+    ib_cq_handle_t     ib_cq_handle;
+
+    /* An Event Dispatcher cannot be freed while
+     * it is referenced elsewhere.
+     */
+    DAPL_ATOMIC                evd_ref_count;
+
+    /* Set if there has been a catastrophic overflow */
+    DAT_BOOLEAN                catastrophic_overflow;
+
+    /* the actual events */
+    DAT_COUNT          qlen;
+    DAT_EVENT          *events;
+    DAPL_RING_BUFFER   free_event_queue;
+    DAPL_RING_BUFFER   pending_event_queue;
+
+    /* CQ Completions are not placed into 'deferred_events'
+     ** rather they are simply left on the Completion Queue
+     ** and the fact that there was a notification is flagged.
+     */
+    DAT_BOOLEAN                cq_notified;
+    DAPL_OS_TICKS      cq_notified_when;
+
+    DAT_COUNT          cno_active_count;
+    DAPL_CNO           *cno_ptr;
+
+    DAPL_OS_WAIT_OBJECT        wait_object;
+
+    DAT_COUNT          threshold;
+    DAPL_EVD_COMPLETION        completion_type;
+
+#ifdef DAPL_COUNTERS
+    void               *cntrs;
+#endif
+};
+
+/* DAPL_PRIVATE used to pass private data in a connection */
+struct dapl_private
+{
+#ifdef IBHOSTS_NAMING
+    DAT_SOCK_ADDR6             hca_address;    /* local address of HCA*/
+#endif /* IBHOSTS_NAMING */
+    unsigned char              private_data[DAPL_MAX_PRIVATE_DATA_SIZE];
+};
+
+/* uDAPL timer entry, used to queue timeouts */
+struct dapl_timer_entry
+{
+    DAPL_LLIST_ENTRY           list_entry;     /* link entry on ia struct */
+    DAPL_OS_TIMEVAL            expires;
+    void                       (*function) (uintptr_t);
+    void                       *data;
+};
+
+#ifdef DAPL_DBG_IO_TRC
+
+#define DBG_IO_TRC_QLEN   32           /* length of trace buffer        */
+#define DBG_IO_TRC_IOV 3               /* iov elements we keep track of */
+
+struct io_buf_track
+{
+    Ib_send_op_type            op_type;
+    DAPL_COOKIE                        *cookie;
+    DAT_LMR_TRIPLET            iov[DBG_IO_TRC_IOV];
+    DAT_RMR_TRIPLET            remote_iov;
+    unsigned int               done;   /* count to track completion ordering */
+    int                                status;
+    void                       *wqe;
+};
+
+#endif /* DAPL_DBG_IO_TRC */
+
+/* DAPL_EP maps to DAT_EP_HANDLE */
+struct dapl_ep
+{
+    DAPL_HEADER                        header;
+    /* What the DAT Consumer asked for */
+    DAT_EP_PARAM               param;
+
+    /* The RC Queue Pair (IBM OS API) */
+    ib_qp_handle_t             qp_handle;
+    unsigned int               qpn;    /* qp number */
+    ib_qp_state_t              qp_state;
+
+    /* communications manager handle (IBM OS API) */
+   // dp_ib_cm_handle_t                cm_handle;
+
+    /* Add support for multiple CM object ownership */
+    DAPL_LLIST_HEAD            cm_list_head;   
+
+    /* store the remote IA address here, reference from the param
+     * struct which only has a pointer, no storage
+     */
+    DAT_SOCK_ADDR6             remote_ia_address;
+
+    /* For passive connections we maintain a back pointer to the CR */
+    void *                     cr_ptr;
+
+    /* pointer to connection timer, if set */
+    struct dapl_timer_entry    *cxn_timer;
+
+    /* private data container */
+    DAPL_PRIVATE               private;
+
+    /* DTO data */
+    DAPL_ATOMIC                        req_count;
+    DAPL_ATOMIC                        recv_count;
+
+    DAPL_COOKIE_BUFFER req_buffer;
+    DAPL_COOKIE_BUFFER recv_buffer;
+
+#ifdef DAPL_DBG_IO_TRC
+    int                        ibt_dumped;
+    struct io_buf_track *ibt_base;
+    DAPL_RING_BUFFER   ibt_queue;
+#endif /* DAPL_DBG_IO_TRC */
+#if defined(_WIN32) || defined(_WIN64)
+    DAT_BOOLEAN         recv_discreq;
+    DAT_BOOLEAN         sent_discreq;
+    dp_ib_cm_handle_t   ibal_cm_handle;
+#endif
+#ifdef DAPL_COUNTERS
+    void               *cntrs;
+#endif
+};
+
+/* DAPL_SRQ maps to DAT_SRQ_HANDLE */
+struct dapl_srq
+{
+    DAPL_HEADER                header;
+    DAT_SRQ_PARAM      param;
+    DAPL_ATOMIC                srq_ref_count;
+    DAPL_COOKIE_BUFFER recv_buffer;
+    DAPL_ATOMIC                recv_count;
+};
+
+/* DAPL_PZ maps to DAT_PZ_HANDLE */
+struct dapl_pz
+{
+    DAPL_HEADER                header;
+    ib_pd_handle_t     pd_handle;
+    DAPL_ATOMIC                pz_ref_count;
+};
+
+/* DAPL_LMR maps to DAT_LMR_HANDLE */
+struct dapl_lmr
+{
+    DAPL_HEADER                header;
+    DAT_LMR_PARAM      param;
+    ib_mr_handle_t     mr_handle;
+    DAPL_ATOMIC                lmr_ref_count;
+#if !defined(__KDAPL__)
+    char               shmid[DAT_LMR_COOKIE_SIZE]; /* shared memory ID */
+    ib_shm_transport_t ib_trans;       /* provider specific data */
+#endif /* !__KDAPL__ */
+};
+
+/* DAPL_RMR maps to DAT_RMR_HANDLE */
+struct dapl_rmr
+{
+    DAPL_HEADER                header;
+    DAT_RMR_PARAM      param;
+    DAPL_EP             *ep;
+    DAPL_PZ             *pz;
+    DAPL_LMR            *lmr;
+    ib_mw_handle_t     mw_handle;
+};
+
+/* SP types, indicating the state and queue */
+typedef enum dapl_sp_state
+{
+    DAPL_SP_STATE_FREE,
+    DAPL_SP_STATE_PSP_LISTENING,
+    DAPL_SP_STATE_PSP_PENDING,
+    DAPL_SP_STATE_RSP_LISTENING,
+    DAPL_SP_STATE_RSP_PENDING
+} DAPL_SP_STATE;
+
+/* DAPL_SP maps to DAT_PSP_HANDLE and DAT_RSP_HANDLE */
+struct dapl_sp
+{
+    DAPL_HEADER                header;
+    DAPL_SP_STATE      state;          /* type and queue of the SP */
+
+    /* PSP/RSP PARAM fields */
+    DAT_CONN_QUAL       conn_qual;
+    DAT_EVD_HANDLE      evd_handle;
+    DAT_PSP_FLAGS       psp_flags;
+    DAT_EP_HANDLE       ep_handle;
+
+     /* maintenence fields */
+    DAT_BOOLEAN                listening;      /* PSP is registered & active */
+    ib_cm_srvc_handle_t        cm_srvc_handle; /* Used by Mellanox CM */
+    DAPL_LLIST_HEAD    cr_list_head;   /* CR pending queue */
+    DAT_COUNT          cr_list_count;  /* count of CRs on queue */
+#if defined(_VENDOR_IBAL_)
+    DAPL_OS_WAIT_OBJECT wait_object;    /* cancel & destroy. */
+#endif
+};
+
+/* DAPL_CR maps to DAT_CR_HANDLE */
+struct dapl_cr
+{
+    DAPL_HEADER                header;
+
+    /* for convenience the data is kept as a DAT_CR_PARAM.
+     * however, the "local_endpoint" field is always NULL
+     * so this wastes a pointer. This is probably ok to
+     * simplify code, espedially dat_cr_query.
+     */
+    DAT_CR_PARAM       param;
+    /* IB specific fields */
+    dp_ib_cm_handle_t  ib_cm_handle;
+
+    DAT_SOCK_ADDR6     remote_ia_address;
+    /* Assuming that the maximum private data size is small.
+     * If it gets large, use of a pointer may be appropriate.
+     */
+    unsigned char      private_data[DAPL_MAX_PRIVATE_DATA_SIZE];
+    /*
+     * Need to be able to associate the CR back to the PSP for
+     * dapl_cr_reject.
+     */
+    DAPL_SP            *sp_ptr;
+};
+
+typedef enum dapl_dto_type
+{
+    DAPL_DTO_TYPE_SEND,
+    DAPL_DTO_TYPE_RECV,
+    DAPL_DTO_TYPE_RDMA_WRITE,
+    DAPL_DTO_TYPE_RDMA_READ,
+#ifdef DAT_EXTENSIONS
+    DAPL_DTO_TYPE_EXTENSION,
+#endif
+} DAPL_DTO_TYPE;
+
+typedef enum dapl_cookie_type
+{
+    DAPL_COOKIE_TYPE_NULL,
+    DAPL_COOKIE_TYPE_DTO,
+    DAPL_COOKIE_TYPE_RMR,
+} DAPL_COOKIE_TYPE;
+
+/* DAPL_DTO_COOKIE used as context for DTO WQEs */
+struct dapl_dto_cookie
+{
+    DAPL_DTO_TYPE              type;
+    DAT_DTO_COOKIE             cookie;
+    DAT_COUNT                  size;   /* used for SEND and RDMA write */
+};
+
+/* DAPL_RMR_COOKIE used as context for bind WQEs */
+struct dapl_rmr_cookie
+{
+    DAPL_RMR                   *rmr;
+    DAT_RMR_COOKIE              cookie;
+};
+
+/* DAPL_COOKIE used as context for WQEs */
+struct dapl_cookie
+{
+    DAPL_COOKIE_TYPE           type; /* Must be first, to define struct.  */
+    DAPL_EP                    *ep;
+    DAT_COUNT                  index;
+    union
+    {
+       DAPL_DTO_COOKIE         dto;
+       DAPL_RMR_COOKIE         rmr;
+    } val;
+};
+
+/*
+ * Private Data operations. Used to obtain the size of the private
+ * data from the provider layer.
+ */
+typedef enum dapl_private_data_op
+{
+    DAPL_PDATA_CONN_REQ  = 0,          /* connect request    */
+    DAPL_PDATA_CONN_REP  = 1,          /* connect reply      */
+    DAPL_PDATA_CONN_REJ  = 2,          /* connect reject     */
+    DAPL_PDATA_CONN_DREQ = 3,          /* disconnect request */
+    DAPL_PDATA_CONN_DREP = 4,          /* disconnect reply   */
+} DAPL_PDATA_OP;
+
+
+/*
+ * Generic HCA name field
+ */
+#define DAPL_HCA_NAME_MAX_LEN 260
+typedef char DAPL_HCA_NAME[DAPL_HCA_NAME_MAX_LEN+1];
+
+#ifdef IBHOSTS_NAMING
+
+/*
+ * Simple mapping table to match IP addresses to GIDs. Loaded
+ * by dapl_init.
+ */
+typedef struct _dapl_gid_map_table
+{
+    uint32_t           ip_address;
+    ib_gid_t           gid;
+} DAPL_GID_MAP;
+
+#endif /* IBHOSTS_NAMING */
+
+/*
+ * IBTA defined reason for reject message: See IBTA 1.1 specification,
+ * 12.6.7.2 REJECTION REASON section.
+ */
+#define IB_CM_REJ_REASON_CONSUMER_REJ            0x001C
+
+
+#if defined(DAPL_DBG_IO_TRC)
+/*********************************************************************
+ *                                                                   *
+ * Debug I/O tracing support prototypes                              *
+ *                                                                   *
+ *********************************************************************/
+/*
+ * I/O tracing support
+ */
+void dapls_io_trc_alloc (
+    DAPL_EP                    *ep_ptr);
+
+void dapls_io_trc_update_completion (
+    DAPL_EP                    *ep_ptr,
+    DAPL_COOKIE                        *cookie,
+    ib_uint32_t                        ib_status );
+
+void dapls_io_trc_dump (
+    DAPL_EP                    *ep_ptr,
+    ib_work_completion_t       *cqe_ptr,
+    ib_uint32_t                        ib_status);
+
+#else /* DAPL_DBG_IO_TRC */
+
+#define dapls_io_trc_alloc(a)
+#define dapls_io_trc_update_completion(a, b, c)
+#define dapls_io_trc_dump(a, b, c)
+
+#endif /* DAPL_DBG_IO_TRC */
+
+
+/*********************************************************************
+ *                                                                   *
+ * Function Prototypes                                               *
+ *                                                                   *
+ *********************************************************************/
+
+typedef void (*DAPL_CONNECTION_STATE_HANDLER) (
+       IN      DAPL_EP *,
+       IN      ib_cm_events_t,
+       IN      const void *,
+       OUT     DAT_EVENT *);
+
+/*
+ * DAT Mandated functions
+ */
+
+extern DAT_RETURN DAT_API dapl_ia_open (
+       IN      const DAT_NAME_PTR,     /* name */
+       IN      DAT_COUNT,              /* asynch_evd_qlen */
+       INOUT   DAT_EVD_HANDLE *,       /* asynch_evd_handle */
+       OUT     DAT_IA_HANDLE *);       /* ia_handle */
+
+extern DAT_RETURN DAT_API dapl_ia_close (
+       IN      DAT_IA_HANDLE,          /* ia_handle */
+       IN      DAT_CLOSE_FLAGS );      /* ia_flags */
+
+
+extern DAT_RETURN DAT_API dapl_ia_query (
+       IN      DAT_IA_HANDLE,          /* ia handle */
+       OUT     DAT_EVD_HANDLE *,       /* async_evd_handle */
+       IN      DAT_IA_ATTR_MASK,       /* ia_params_mask */
+       OUT     DAT_IA_ATTR *,          /* ia_params */
+       IN      DAT_PROVIDER_ATTR_MASK, /* provider_params_mask */
+       OUT     DAT_PROVIDER_ATTR * );  /* provider_params */
+
+
+/* helper functions */
+
+extern DAT_RETURN DAT_API dapl_set_consumer_context (
+       IN      DAT_HANDLE,                     /* dat handle */
+       IN      DAT_CONTEXT);                   /* context */
+
+extern DAT_RETURN DAT_API dapl_get_consumer_context (
+       IN      DAT_HANDLE,                     /* dat handle */
+       OUT     DAT_CONTEXT * );                /* context */
+
+extern DAT_RETURN DAT_API dapl_get_handle_type (
+       IN      DAT_HANDLE,
+       OUT     DAT_HANDLE_TYPE * );
+
+/* CNO functions */
+
+#if !defined(__KERNEL__)
+extern DAT_RETURN DAT_API dapl_cno_create (
+       IN      DAT_IA_HANDLE,                  /* ia_handle */
+       IN      DAT_OS_WAIT_PROXY_AGENT,        /* agent */
+       OUT     DAT_CNO_HANDLE *);              /* cno_handle */
+
+extern DAT_RETURN DAT_API dapl_cno_modify_agent (
+       IN      DAT_CNO_HANDLE,                 /* cno_handle */
+       IN      DAT_OS_WAIT_PROXY_AGENT);       /* agent */
+
+extern DAT_RETURN DAT_API dapl_cno_query (
+       IN      DAT_CNO_HANDLE,         /* cno_handle */
+       IN      DAT_CNO_PARAM_MASK,     /* cno_param_mask */
+       OUT     DAT_CNO_PARAM * );      /* cno_param */
+
+extern DAT_RETURN DAT_API dapl_cno_free (
+       IN      DAT_CNO_HANDLE);        /* cno_handle */
+
+extern DAT_RETURN DAT_API dapl_cno_wait (
+       IN      DAT_CNO_HANDLE,         /* cno_handle */
+       IN      DAT_TIMEOUT,            /* timeout */
+       OUT     DAT_EVD_HANDLE *);      /* evd_handle */
+
+extern DAT_RETURN DAT_API dapl_cno_fd_create (
+       IN      DAT_IA_HANDLE,          /* ia_handle            */
+       OUT     DAT_FD *,               /* file_descriptor      */
+       OUT     DAT_CNO_HANDLE *);      /* cno_handle           */
+
+extern DAT_RETURN DAT_API dapl_cno_trigger (
+       IN      DAT_CNO_HANDLE,         /* cno_handle */
+       OUT     DAT_EVD_HANDLE *);      /* evd_handle */
+
+#endif /* !defined(__KERNEL__) */
+
+/* CR Functions */
+
+extern DAT_RETURN DAT_API dapl_cr_query (
+       IN      DAT_CR_HANDLE,          /* cr_handle */
+       IN      DAT_CR_PARAM_MASK,      /* cr_args_mask */
+       OUT     DAT_CR_PARAM * );       /* cwr_args */
+
+extern DAT_RETURN DAT_API dapl_cr_accept (
+       IN      DAT_CR_HANDLE,          /* cr_handle */
+       IN      DAT_EP_HANDLE,          /* ep_handle */
+       IN      DAT_COUNT,              /* private_data_size */
+       IN      const DAT_PVOID );      /* private_data */
+
+extern DAT_RETURN DAT_API dapl_cr_reject (
+       IN      DAT_CR_HANDLE,          /* cr_handle            */
+       IN      DAT_COUNT,              /* private_data_size    */
+       IN      const DAT_PVOID );      /* private_data         */
+
+extern DAT_RETURN DAT_API dapl_cr_handoff (
+       IN DAT_CR_HANDLE,               /* cr_handle */
+       IN DAT_CONN_QUAL);              /* handoff */
+
+/* EVD Functions */
+
+#if defined(__KERNEL__)
+extern DAT_RETURN DAT_API dapl_ia_memtype_hint (
+       IN    DAT_IA_HANDLE,            /* ia_handle */
+       IN    DAT_MEM_TYPE,             /* mem_type */
+       IN    DAT_VLEN,                 /* length */
+       IN    DAT_MEM_OPT,              /* mem_optimization */
+       OUT   DAT_VLEN *,               /* suggested_length */
+       OUT   DAT_VADDR *);             /* suggested_alignment */
+
+extern DAT_RETURN DAT_API dapl_evd_kcreate (
+       IN      DAT_IA_HANDLE,          /* ia_handle */
+       IN      DAT_COUNT,              /* evd_min_qlen */
+       IN      DAT_UPCALL_POLICY,      /* upcall_policy */
+       IN      const DAT_UPCALL_OBJECT *, /* upcall */
+       IN      DAT_EVD_FLAGS,          /* evd_flags */
+       OUT     DAT_EVD_HANDLE * );     /* evd_handle */
+
+extern DAT_RETURN DAT_API dapl_evd_kquery (
+       IN      DAT_EVD_HANDLE,         /* evd_handle */
+       IN      DAT_EVD_PARAM_MASK,     /* evd_args_mask */
+       OUT     DAT_EVD_PARAM * );      /* evd_args */
+
+#else
+extern DAT_RETURN DAT_API dapl_evd_create (
+       IN      DAT_IA_HANDLE,          /* ia_handle */
+       IN      DAT_COUNT,              /* evd_min_qlen */
+       IN      DAT_CNO_HANDLE,         /* cno_handle */
+       IN      DAT_EVD_FLAGS,          /* evd_flags */
+       OUT     DAT_EVD_HANDLE * );     /* evd_handle */
+
+extern DAT_RETURN DAT_API dapl_evd_query (
+       IN      DAT_EVD_HANDLE,         /* evd_handle */
+       IN      DAT_EVD_PARAM_MASK,     /* evd_args_mask */
+       OUT     DAT_EVD_PARAM * );      /* evd_args */
+#endif /* defined(__KERNEL__) */
+
+#if defined(__KERNEL__)
+extern DAT_RETURN DAT_API dapl_evd_modify_upcall (
+       IN      DAT_EVD_HANDLE,         /* evd_handle */
+       IN      DAT_UPCALL_POLICY,      /* upcall_policy */
+       IN      const DAT_UPCALL_OBJECT * ); /* upcall */
+
+#else
+
+extern DAT_RETURN DAT_API dapl_evd_modify_cno (
+       IN      DAT_EVD_HANDLE,         /* evd_handle */
+       IN      DAT_CNO_HANDLE);        /* cno_handle */
+#endif
+
+extern DAT_RETURN DAT_API dapl_evd_enable (
+       IN      DAT_EVD_HANDLE);        /* evd_handle */
+
+extern DAT_RETURN DAT_API dapl_evd_disable (
+       IN      DAT_EVD_HANDLE);        /* evd_handle */
+
+#if !defined(__KERNEL__)
+extern DAT_RETURN DAT_API dapl_evd_wait (
+       IN      DAT_EVD_HANDLE,         /* evd_handle */
+       IN      DAT_TIMEOUT,            /* timeout */
+       IN      DAT_COUNT,              /* threshold */
+       OUT     DAT_EVENT *,            /* event */
+       OUT     DAT_COUNT *);           /* nmore */
+#endif /* !defined(__KERNEL__) */
+
+extern DAT_RETURN DAT_API dapl_evd_resize (
+       IN      DAT_EVD_HANDLE,         /* evd_handle */
+       IN      DAT_COUNT );            /* evd_qlen */
+
+extern DAT_RETURN DAT_API dapl_evd_post_se (
+       DAT_EVD_HANDLE,                 /* evd_handle */
+       const DAT_EVENT * );            /* event */
+
+extern DAT_RETURN DAT_API dapl_evd_dequeue (
+       IN      DAT_EVD_HANDLE,         /* evd_handle */
+       OUT     DAT_EVENT * );          /* event */
+
+extern DAT_RETURN DAT_API dapl_evd_free (
+       IN      DAT_EVD_HANDLE );
+
+extern DAT_RETURN DAT_API
+dapl_evd_set_unwaitable (
+       IN      DAT_EVD_HANDLE  evd_handle );
+
+extern DAT_RETURN DAT_API
+dapl_evd_clear_unwaitable (
+       IN      DAT_EVD_HANDLE  evd_handle );
+
+/* EP functions */
+
+extern DAT_RETURN DAT_API dapl_ep_create (
+       IN      DAT_IA_HANDLE,          /* ia_handle */
+       IN      DAT_PZ_HANDLE,          /* pz_handle */
+       IN      DAT_EVD_HANDLE,         /* in_dto_completion_evd_handle */
+       IN      DAT_EVD_HANDLE,         /* out_dto_completion_evd_handle */
+       IN      DAT_EVD_HANDLE,         /* connect_evd_handle */
+       IN      const DAT_EP_ATTR *,    /* ep_parameters */
+       OUT     DAT_EP_HANDLE * );      /* ep_handle */
+
+extern DAT_RETURN DAT_API dapl_ep_query (
+       IN      DAT_EP_HANDLE,          /* ep_handle */
+       IN      DAT_EP_PARAM_MASK,      /* ep_args_mask */
+       OUT     DAT_EP_PARAM * );       /* ep_args */
+
+extern DAT_RETURN DAT_API dapl_ep_modify (
+       IN      DAT_EP_HANDLE,          /* ep_handle */
+       IN      DAT_EP_PARAM_MASK,      /* ep_args_mask */
+       IN      const DAT_EP_PARAM * ); /* ep_args */
+
+extern DAT_RETURN DAT_API dapl_ep_connect (
+       IN      DAT_EP_HANDLE,          /* ep_handle */
+       IN      DAT_IA_ADDRESS_PTR,     /* remote_ia_address */
+       IN      DAT_CONN_QUAL,          /* remote_conn_qual */
+       IN      DAT_TIMEOUT,            /* timeout */
+       IN      DAT_COUNT,              /* private_data_size */
+       IN      const DAT_PVOID,        /* private_data  */
+       IN      DAT_QOS,                /* quality_of_service */
+       IN      DAT_CONNECT_FLAGS );    /* connect_flags */
+
+extern DAT_RETURN DAT_API dapl_ep_common_connect (
+       IN      DAT_EP_HANDLE ep,               /* ep_handle            */
+       IN      DAT_IA_ADDRESS_PTR remote_addr, /* remote_ia_address    */
+       IN      DAT_TIMEOUT timeout,            /* timeout              */
+       IN      DAT_COUNT pdata_size,           /* private_data_size    */
+       IN      const DAT_PVOID pdata   );      /* private_data         */
+
+extern DAT_RETURN DAT_API dapl_ep_dup_connect (
+       IN      DAT_EP_HANDLE,          /* ep_handle */
+       IN      DAT_EP_HANDLE,          /* ep_dup_handle */
+       IN      DAT_TIMEOUT,            /* timeout*/
+       IN      DAT_COUNT,              /* private_data_size */
+       IN      const DAT_PVOID,        /* private_data */
+       IN      DAT_QOS);               /* quality_of_service */
+
+extern DAT_RETURN DAT_API dapl_ep_disconnect (
+       IN      DAT_EP_HANDLE,          /* ep_handle */
+       IN      DAT_CLOSE_FLAGS );      /* close_flags */
+
+extern DAT_RETURN DAT_API dapl_ep_post_send (
+       IN      DAT_EP_HANDLE,          /* ep_handle */
+       IN      DAT_COUNT,              /* num_segments */
+       IN      DAT_LMR_TRIPLET *,      /* local_iov */
+       IN      DAT_DTO_COOKIE,         /* user_cookie */
+       IN      DAT_COMPLETION_FLAGS ); /* completion_flags */
+
+extern DAT_RETURN DAT_API dapl_ep_post_recv (
+       IN      DAT_EP_HANDLE,          /* ep_handle */
+       IN      DAT_COUNT,              /* num_segments */
+       IN      DAT_LMR_TRIPLET *,      /* local_iov */
+       IN      DAT_DTO_COOKIE,         /* user_cookie */
+       IN      DAT_COMPLETION_FLAGS ); /* completion_flags */
+
+extern DAT_RETURN DAT_API dapl_ep_post_rdma_read (
+       IN      DAT_EP_HANDLE,           /* ep_handle */
+       IN      DAT_COUNT,               /* num_segments */
+       IN      DAT_LMR_TRIPLET *,       /* local_iov */
+       IN      DAT_DTO_COOKIE,          /* user_cookie */
+       IN      const DAT_RMR_TRIPLET *, /* remote_iov */
+       IN      DAT_COMPLETION_FLAGS );  /* completion_flags */
+
+extern DAT_RETURN DAT_API dapl_ep_post_rdma_read_to_rmr (
+       IN      DAT_EP_HANDLE,          /* ep_handle            */
+       IN      const DAT_RMR_TRIPLET *,/* local_iov            */
+       IN      DAT_DTO_COOKIE,         /* user_cookie          */
+       IN      const DAT_RMR_TRIPLET *,/* remote_iov           */
+       IN      DAT_COMPLETION_FLAGS);  /* completion_flags     */
+
+extern DAT_RETURN DAT_API dapl_ep_post_rdma_write (
+       IN      DAT_EP_HANDLE,           /* ep_handle */
+       IN      DAT_COUNT,               /* num_segments */
+       IN      DAT_LMR_TRIPLET *,       /* local_iov */
+       IN      DAT_DTO_COOKIE,          /* user_cookie */
+       IN      const DAT_RMR_TRIPLET *, /* remote_iov */
+       IN      DAT_COMPLETION_FLAGS );  /* completion_flags */
+
+extern DAT_RETURN DAT_API dapl_ep_post_send_with_invalidate (
+       IN      DAT_EP_HANDLE,          /* ep_handle            */
+       IN      DAT_COUNT,              /* num_segments         */
+       IN      DAT_LMR_TRIPLET *,      /* local_iov            */
+       IN      DAT_DTO_COOKIE,         /* user_cookie          */
+       IN      DAT_COMPLETION_FLAGS,   /* completion_flags     */
+       IN      DAT_BOOLEAN,            /* invalidate_flag      */
+       IN      DAT_RMR_CONTEXT);      /* RMR context          */
+
+extern DAT_RETURN DAT_API dapl_ep_get_status (
+       IN      DAT_EP_HANDLE,          /* ep_handle */
+       OUT     DAT_EP_STATE *,         /* ep_state */
+       OUT     DAT_BOOLEAN *,          /* in_dto_idle */
+       OUT     DAT_BOOLEAN * );        /* out_dto_idle */
+
+extern DAT_RETURN DAT_API dapl_ep_free (
+       IN      DAT_EP_HANDLE);         /* ep_handle */
+
+extern DAT_RETURN DAT_API dapl_ep_reset (
+       IN      DAT_EP_HANDLE);         /* ep_handle */
+
+extern DAT_RETURN DAT_API dapl_ep_create_with_srq (
+        IN      DAT_IA_HANDLE,          /* ia_handle            */
+        IN      DAT_PZ_HANDLE,          /* pz_handle            */
+        IN      DAT_EVD_HANDLE,         /* recv_evd_handle      */
+        IN      DAT_EVD_HANDLE,         /* request_evd_handle   */
+        IN      DAT_EVD_HANDLE,         /* connect_evd_handle   */
+        IN      DAT_SRQ_HANDLE,         /* srq_handle           */
+        IN      const DAT_EP_ATTR *,    /* ep_attributes        */
+        OUT     DAT_EP_HANDLE *);       /* ep_handle            */
+
+extern DAT_RETURN DAT_API dapl_ep_recv_query (
+        IN      DAT_EP_HANDLE,          /* ep_handle            */
+        OUT     DAT_COUNT *,            /* nbufs_allocated      */
+        OUT     DAT_COUNT *);           /* bufs_alloc_span      */
+
+extern DAT_RETURN DAT_API dapl_ep_set_watermark (
+        IN      DAT_EP_HANDLE,          /* ep_handle            */
+        IN      DAT_COUNT,              /* soft_high_watermark  */
+        IN      DAT_COUNT);             /* hard_high_watermark  */
+
+/* LMR functions */
+
+#if defined(__KERNEL__)
+extern DAT_RETURN DAT_API dapl_lmr_kcreate (
+       IN      DAT_IA_HANDLE,          /* ia_handle */
+       IN      DAT_MEM_TYPE,           /* mem_type */
+       IN      DAT_REGION_DESCRIPTION, /* region_description */
+       IN      DAT_VLEN,               /* length */
+       IN      DAT_PZ_HANDLE,          /* pz_handle */
+       IN      DAT_MEM_PRIV_FLAGS,     /* privileges */
+       IN      DAT_VA_TYPE,            /* va_type */
+       IN      DAT_MEM_OPT,            /* optimization */
+       OUT     DAT_LMR_HANDLE *,       /* lmr_handle */
+       OUT     DAT_LMR_CONTEXT *,      /* lmr_context */
+       OUT     DAT_RMR_CONTEXT *,      /* rmr_context          */
+       OUT     DAT_VLEN *,             /* registered_length */
+       OUT     DAT_VADDR * );          /* registered_address */
+#else
+extern DAT_RETURN DAT_API dapl_lmr_create (
+       IN      DAT_IA_HANDLE,          /* ia_handle */
+       IN      DAT_MEM_TYPE,           /* mem_type */
+       IN      DAT_REGION_DESCRIPTION, /* region_description */
+       IN      DAT_VLEN,               /* length */
+       IN      DAT_PZ_HANDLE,          /* pz_handle */
+       IN      DAT_MEM_PRIV_FLAGS,     /* privileges */
+       IN      DAT_VA_TYPE,            /* va_type */
+       OUT     DAT_LMR_HANDLE *,       /* lmr_handle */
+       OUT     DAT_LMR_CONTEXT *,      /* lmr_context */
+       OUT     DAT_RMR_CONTEXT *,      /* rmr_context          */
+       OUT     DAT_VLEN *,             /* registered_length */
+       OUT     DAT_VADDR * );          /* registered_address */
+#endif /* defined(__KERNEL__) */
+
+extern DAT_RETURN DAT_API dapl_lmr_query (
+       IN      DAT_LMR_HANDLE,
+       IN      DAT_LMR_PARAM_MASK,
+       OUT     DAT_LMR_PARAM *);
+
+extern DAT_RETURN DAT_API dapl_lmr_free (
+       IN      DAT_LMR_HANDLE);
+
+extern DAT_RETURN DAT_API dapl_lmr_sync_rdma_read (
+       IN      DAT_IA_HANDLE,          /* ia_handle            */
+       IN      const DAT_LMR_TRIPLET *, /* local_segments      */
+       IN      DAT_VLEN);              /* num_segments         */
+
+extern DAT_RETURN DAT_API dapl_lmr_sync_rdma_write (
+       IN      DAT_IA_HANDLE,          /* ia_handle            */
+       IN      const DAT_LMR_TRIPLET *, /* local_segments      */
+       IN      DAT_VLEN);              /* num_segments         */
+
+/* RMR Functions */
+
+extern DAT_RETURN DAT_API dapl_rmr_create (
+       IN      DAT_PZ_HANDLE,          /* pz_handle */
+       OUT     DAT_RMR_HANDLE *);      /* rmr_handle */
+
+extern DAT_RETURN DAT_API dapl_rmr_create_for_ep (
+       IN      DAT_PZ_HANDLE pz_handle,        /* pz_handle    */
+       OUT     DAT_RMR_HANDLE *rmr_handle);    /* rmr_handle   */
+
+extern DAT_RETURN DAT_API dapl_rmr_query (
+       IN      DAT_RMR_HANDLE,         /* rmr_handle */
+       IN      DAT_RMR_PARAM_MASK,     /* rmr_args_mask */
+       OUT     DAT_RMR_PARAM *);       /* rmr_args */
+
+extern DAT_RETURN DAT_API dapl_rmr_bind (
+       IN      DAT_RMR_HANDLE,          /* rmr_handle */
+       IN      DAT_LMR_HANDLE,          /* lmr_handle */
+       IN      const DAT_LMR_TRIPLET *, /* lmr_triplet */
+       IN      DAT_MEM_PRIV_FLAGS,      /* mem_priv */
+       IN      DAT_VA_TYPE,             /* va_type */
+       IN      DAT_EP_HANDLE,           /* ep_handle */
+       IN      DAT_RMR_COOKIE,          /* user_cookie */
+       IN      DAT_COMPLETION_FLAGS,    /* completion_flags */
+       INOUT   DAT_RMR_CONTEXT * );     /* context */
+
+extern DAT_RETURN DAT_API dapl_rmr_free (
+       IN      DAT_RMR_HANDLE);
+
+/* PSP Functions */
+
+extern DAT_RETURN DAT_API dapl_psp_create (
+       IN      DAT_IA_HANDLE,          /* ia_handle */
+       IN      DAT_CONN_QUAL,          /* conn_qual */
+       IN      DAT_EVD_HANDLE,         /* evd_handle */
+       IN      DAT_PSP_FLAGS,          /* psp_flags */
+       OUT     DAT_PSP_HANDLE * );     /* psp_handle */
+
+extern DAT_RETURN DAT_API dapl_psp_create_any (
+       IN      DAT_IA_HANDLE,          /* ia_handle */
+       OUT     DAT_CONN_QUAL *,        /* conn_qual */
+       IN      DAT_EVD_HANDLE,         /* evd_handle */
+       IN      DAT_PSP_FLAGS,          /* psp_flags */
+       OUT     DAT_PSP_HANDLE *);      /* psp_handle */
+
+extern DAT_RETURN DAT_API dapl_psp_query (
+       IN      DAT_PSP_HANDLE,
+       IN      DAT_PSP_PARAM_MASK,
+       OUT     DAT_PSP_PARAM * );
+
+extern DAT_RETURN DAT_API dapl_psp_free (
+       IN      DAT_PSP_HANDLE );       /* psp_handle */
+
+/* RSP Functions */
+
+extern DAT_RETURN DAT_API dapl_rsp_create (
+       IN      DAT_IA_HANDLE,          /* ia_handle */
+       IN      DAT_CONN_QUAL,          /* conn_qual */
+       IN      DAT_EP_HANDLE,          /* ep_handle */
+       IN      DAT_EVD_HANDLE,         /* evd_handle */
+       OUT     DAT_RSP_HANDLE * );     /* rsp_handle */
+
+extern DAT_RETURN DAT_API dapl_rsp_query (
+       IN      DAT_RSP_HANDLE,
+       IN      DAT_RSP_PARAM_MASK,
+       OUT     DAT_RSP_PARAM * );
+
+extern DAT_RETURN DAT_API dapl_rsp_free (
+       IN      DAT_RSP_HANDLE );       /* rsp_handle */
+
+/* PZ Functions */
+
+extern DAT_RETURN DAT_API dapl_pz_create (
+       IN      DAT_IA_HANDLE,          /* ia_handle */
+       OUT     DAT_PZ_HANDLE * );      /* pz_handle */
+
+extern DAT_RETURN DAT_API dapl_pz_query (
+       IN      DAT_PZ_HANDLE,          /* pz_handle */
+       IN      DAT_PZ_PARAM_MASK,      /* pz_args_mask */
+       OUT     DAT_PZ_PARAM * );       /* pz_args */
+
+extern DAT_RETURN DAT_API dapl_pz_free (
+       IN      DAT_PZ_HANDLE );        /* pz_handle */
+
+/* SRQ functions */
+
+extern DAT_RETURN DAT_API dapl_srq_create (
+        IN      DAT_IA_HANDLE,          /* ia_handle            */
+        IN      DAT_PZ_HANDLE,          /* pz_handle            */
+        IN      DAT_SRQ_ATTR *,         /* srq_attr             */
+        OUT     DAT_SRQ_HANDLE *);      /* srq_handle           */
+
+extern DAT_RETURN DAT_API dapl_srq_free (
+       IN      DAT_SRQ_HANDLE);        /* srq_handle           */
+
+extern DAT_RETURN DAT_API dapl_srq_post_recv (
+       IN      DAT_SRQ_HANDLE,         /* srq_handle           */
+       IN      DAT_COUNT,              /* num_segments         */
+       IN      DAT_LMR_TRIPLET *,      /* local_iov            */
+       IN      DAT_DTO_COOKIE);        /* user_cookie          */
+
+extern DAT_RETURN DAT_API dapl_srq_query (
+       IN      DAT_SRQ_HANDLE,         /* srq_handle           */
+       IN      DAT_SRQ_PARAM_MASK,     /* srq_param_mask       */
+       OUT     DAT_SRQ_PARAM *);       /* srq_param            */
+
+extern DAT_RETURN DAT_API dapl_srq_resize (
+       IN      DAT_SRQ_HANDLE,         /* srq_handle           */
+       IN      DAT_COUNT);             /* srq_max_recv_dto     */
+
+extern DAT_RETURN DAT_API dapl_srq_set_lw (
+       IN      DAT_SRQ_HANDLE,         /* srq_handle           */
+       IN      DAT_COUNT);             /* low_watermark        */
+
+/* CSP functions */
+extern DAT_RETURN DAT_API dapl_csp_create (
+       IN      DAT_IA_HANDLE,          /* ia_handle      */
+       IN      DAT_COMM *,             /* communicator   */
+       IN      DAT_IA_ADDRESS_PTR,     /* address        */
+       IN      DAT_EVD_HANDLE,         /* evd_handle     */
+       OUT     DAT_CSP_HANDLE *);      /* csp_handle     */
+
+extern DAT_RETURN DAT_API dapl_csp_query (
+       IN      DAT_CSP_HANDLE,         /* csp_handle     */
+       IN      DAT_CSP_PARAM_MASK,     /* csp_param_mask */
+       OUT     DAT_CSP_PARAM *);       /* csp_param      */
+
+extern DAT_RETURN DAT_API dapl_csp_free (
+       IN      DAT_CSP_HANDLE);        /* csp_handle     */
+
+/* HA functions */
+DAT_RETURN DAT_API dapl_ia_ha (
+       IN       DAT_IA_HANDLE,         /* ia_handle */
+       IN const DAT_NAME_PTR,          /* provider  */
+       OUT      DAT_BOOLEAN *);        /* answer    */
+
+#ifdef DAT_EXTENSIONS
+#include <stdarg.h>
+extern DAT_RETURN DAT_API dapl_extensions (
+       IN      DAT_HANDLE,             /* handle */
+       IN      DAT_EXTENDED_OP,        /* extended op */
+       IN      va_list);               /* argument list */
+#endif
+
+/*
+ * DAPL internal utility function prototpyes
+ */
+
+extern void dapl_llist_init_head (
+    DAPL_LLIST_HEAD *  head);
+
+extern void dapl_llist_init_entry (
+    DAPL_LLIST_ENTRY *         entry);
+
+extern DAT_BOOLEAN dapl_llist_is_empty (
+    DAPL_LLIST_HEAD *  head);
+
+extern void dapl_llist_add_head (
+    DAPL_LLIST_HEAD *  head,
+    DAPL_LLIST_ENTRY *         entry,
+    void *             data);
+
+extern void dapl_llist_add_tail (
+    DAPL_LLIST_HEAD *   head,
+    DAPL_LLIST_ENTRY *  entry,
+    void *             data);
+
+extern void dapl_llist_add_entry (
+    DAPL_LLIST_HEAD * head,
+    DAPL_LLIST_ENTRY * entry,
+    DAPL_LLIST_ENTRY * new_entry,
+    void * data);
+
+extern void * dapl_llist_remove_head (
+    DAPL_LLIST_HEAD *  head);
+
+extern void * dapl_llist_remove_tail (
+    DAPL_LLIST_HEAD *  head);
+
+extern void * dapl_llist_remove_entry (
+    DAPL_LLIST_HEAD *  head,
+    DAPL_LLIST_ENTRY * entry);
+
+extern void * dapl_llist_peek_head (
+    DAPL_LLIST_HEAD *  head);
+
+extern void * dapl_llist_next_entry (
+    IN    DAPL_LLIST_HEAD      *head,
+    IN    DAPL_LLIST_ENTRY     *cur_ent);
+
+extern void dapl_llist_debug_print_list (
+    DAPL_LLIST_HEAD *  head);
+
+
+#endif