root/usr/src/lib/udapl/libdat/include/dat/dat_redirection.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 2002-2004, Network Appliance, Inc. All rights reserved.
 */

/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */


#ifndef _DAT_REDIRECTION_H_
#define _DAT_REDIRECTION_H_

/*
 *
 * HEADER: dat_redirection.h
 *
 * PURPOSE: Defines the common redirection macros
 *
 * Description: Macros to invoke DAPL functions from the dat_registry
 *
 * Mapping rules:
 *      All global symbols are prepended with "DAT_" or "dat_"
 *      All DAT objects have an 'api' tag which, such as 'ep' or 'lmr'
 *      The method table is in the provider definition structure.
 *
 *
 *
 */

#ifdef __cplusplus
extern "C" {
#endif

typedef struct dat_provider DAT_PROVIDER;

#ifndef DAT_HANDLE_TO_PROVIDER

/*
 * A utility macro to fetch the Provider Library for any object
 *
 * An alternate version could be defined for single library systems.
 * it would look something like:
 *      extern const struct dat_ia my_single_ia_provider;
 *      #define DAT_HANDLE_TO_PROVIDER(ignore) &my_single_ia_provider
 *
 * This would allow a good compiler to avoid indirection overhead when
 * making function calls.
 */

#define DAT_HANDLE_TO_PROVIDER(handle) (*(DAT_PROVIDER **)(handle))
#endif

#define DAT_IA_QUERY(ia, evd, ia_msk, ia_ptr, p_msk, p_ptr) \
        (*DAT_HANDLE_TO_PROVIDER(ia)->ia_query_func)(\
                (ia),\
                (evd),\
                (ia_msk),\
                (ia_ptr),\
                (p_msk),\
                (p_ptr))

#define DAT_SET_CONSUMER_CONTEXT(handle, context) \
        (*DAT_HANDLE_TO_PROVIDER(handle)->set_consumer_context_func)(\
                (handle),\
                (context))

#define DAT_GET_CONSUMER_CONTEXT(handle, context) \
        (*DAT_HANDLE_TO_PROVIDER(handle)->get_consumer_context_func)(\
                (handle),\
                (context))

#define DAT_GET_HANDLE_TYPE(handle, handle_type) \
        (*DAT_HANDLE_TO_PROVIDER(handle)->get_handle_type_func)(\
                (handle),\
                (handle_type))

#define DAT_CR_QUERY(cr, mask, param) \
        (*DAT_HANDLE_TO_PROVIDER(cr)->cr_query_func)(\
                (cr),\
                (mask),\
                (param))

#define DAT_CR_ACCEPT(cr, ep, size, pdata) \
        (*DAT_HANDLE_TO_PROVIDER(cr)->cr_accept_func)(\
                (cr),\
                (ep),\
                (size),\
                (pdata))

#define DAT_CR_REJECT(cr) \
        (*DAT_HANDLE_TO_PROVIDER(cr)->cr_reject_func)(\
                (cr))

#define DAT_CR_HANDOFF(cr, qual) \
        (*DAT_HANDLE_TO_PROVIDER(cr)->cr_handoff_func)(\
                (cr),\
                (qual))

#define DAT_EVD_QUERY(evd, mask, param) \
        (*DAT_HANDLE_TO_PROVIDER(evd)->evd_query_func)(\
                (evd),\
                (mask),\
                (param))

#define DAT_EVD_RESIZE(evd, qsize) \
        (*DAT_HANDLE_TO_PROVIDER(evd)->evd_resize_func)(\
                (evd),\
                (qsize))

#define DAT_EVD_POST_SE(evd, event) \
        (*DAT_HANDLE_TO_PROVIDER(evd)->evd_post_se_func)(\
                (evd),\
                (event))

#define DAT_EVD_DEQUEUE(evd, event) \
        (*DAT_HANDLE_TO_PROVIDER(evd)->evd_dequeue_func)(\
                (evd),\
                (event))

#define DAT_EVD_FREE(evd)\
        (*DAT_HANDLE_TO_PROVIDER(evd)->evd_free_func)(\
                (evd))

#define DAT_EP_CREATE(ia, pz, in_evd, out_evd, connect_evd, attr, ep) \
        (*DAT_HANDLE_TO_PROVIDER(ia)->ep_create_func)(\
                (ia),\
                (pz),\
                (in_evd),\
                (out_evd),\
                (connect_evd),\
                (attr),\
                (ep))

#define DAT_EP_CREATE_WITH_SRQ(ia, pz, in_evd, out_evd, connect_evd, srq,\
        attr, ep) \
        (*DAT_HANDLE_TO_PROVIDER(ia)->ep_create_with_srq_func)(\
                (ia),\
                (pz),\
                (in_evd),\
                (out_evd),\
                (connect_evd),\
                (srq),\
                (attr),\
                (ep))

#define DAT_EP_QUERY(ep, mask, param) \
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_query_func)(\
                (ep),\
                (mask),\
                (param))

#define DAT_EP_MODIFY(ep, mask, param) \
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_modify_func)(\
                (ep),\
                (mask),\
                (param))

#define DAT_EP_CONNECT(ep, ia_addr, conn_qual, timeout, psize, pdata,   \
                qos, flags)                                             \
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_connect_func)(\
                (ep),\
                (ia_addr),\
                (conn_qual),\
                (timeout),\
                (psize),\
                (pdata),\
                (qos),\
                (flags))

#define DAT_EP_DUP_CONNECT(ep, dup, timeout, psize, pdata, qos) \
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_dup_connect_func)(\
                (ep),\
                (dup),\
                (timeout),\
                (psize),\
                (pdata),\
                (qos))

#define DAT_EP_DISCONNECT(ep, flags) \
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_disconnect_func)(\
                (ep),\
                (flags))

#define DAT_EP_POST_SEND(ep, size, lbuf, cookie, flags) \
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_post_send_func)(\
                (ep),\
                (size),\
                (lbuf),\
                (cookie),\
                (flags))

#define DAT_EP_POST_RECV(ep, size, lbuf, cookie, flags) \
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_post_recv_func)(\
                (ep),\
                (size),\
                (lbuf),\
                (cookie),\
                (flags))

#define DAT_EP_POST_RDMA_READ(ep, size, lbuf, cookie, rbuf, flags) \
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_post_rdma_read_func)(\
                (ep),\
                (size),\
                (lbuf),\
                (cookie),\
                (rbuf),\
                (flags))

#define DAT_EP_POST_RDMA_WRITE(ep, size, lbuf, cookie, rbuf, flags) \
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_post_rdma_write_func)(\
                (ep),\
                (size),\
                (lbuf),\
                (cookie),\
                (rbuf),\
                (flags))

#define DAT_EP_GET_STATUS(ep, ep_state, recv_idle, request_idle) \
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_get_status_func)(\
                (ep), \
                (ep_state),\
                (recv_idle),\
                (request_idle))

#define DAT_EP_FREE(ep)\
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_free_func)(\
                (ep))

#define DAT_EP_RESET(ep)\
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_reset_func)(\
                (ep))

#define DAT_EP_RECV_QUERY(ep, nbuf_alloc, buf_span) \
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_recv_query_func)(\
                (ep),\
                (nbuf_alloc),\
                (buf_span))

#define DAT_EP_SET_WATERMARK(ep, soft_wm, hard_wm) \
        (*DAT_HANDLE_TO_PROVIDER(ep)->ep_set_watermark_func)(\
                (ep),\
                (soft_wm),\
                (hard_wm))

#define DAT_LMR_QUERY(lmr, mask, param)\
        (*DAT_HANDLE_TO_PROVIDER(lmr)->lmr_query_func)(\
                (lmr),\
                (mask),\
                (param))

#define DAT_LMR_FREE(lmr)\
        (*DAT_HANDLE_TO_PROVIDER(lmr)->lmr_free_func)(\
                (lmr))

#define DAT_LMR_SYNC_RDMA_READ(ia, lbuf, size) \
        (*DAT_HANDLE_TO_PROVIDER(ia)->lmr_sync_rdma_read_func)(\
                (ia), \
                (lbuf), \
                (size))

#define DAT_LMR_SYNC_RDMA_WRITE(ia, lbuf, size) \
        (*DAT_HANDLE_TO_PROVIDER(ia)->lmr_sync_rdma_write_func)(\
                (ia), \
                (lbuf), \
                (size))

#define DAT_RMR_CREATE(pz, rmr) \
        (*DAT_HANDLE_TO_PROVIDER(pz)->rmr_create_func)(\
                (pz),\
                (rmr))

#define DAT_RMR_QUERY(rmr, mask, param) \
        (*DAT_HANDLE_TO_PROVIDER(rmr)->rmr_query_func)(\
                (rmr),\
                (mask),\
                (param))

#define DAT_RMR_BIND(rmr, lmr, mem_priv, ep, cookie, flags, context) \
        (*DAT_HANDLE_TO_PROVIDER(rmr)->rmr_bind_func)(\
                (rmr),\
                (lmr),\
                (mem_priv),\
                (ep),\
                (cookie),\
                (flags),\
                (context))

#define DAT_RMR_FREE(rmr)\
        (*DAT_HANDLE_TO_PROVIDER(rmr)->rmr_free_func)(\
                (rmr))

#define DAT_PSP_CREATE(ia, conn_qual, evd, flags, handle) \
        (*DAT_HANDLE_TO_PROVIDER(ia)->psp_create_func)(\
                (ia),\
                (conn_qual),\
                (evd),\
                (flags),\
                (handle))

#define DAT_PSP_CREATE_ANY(ia, conn_qual, evd, flags, handle) \
        (*DAT_HANDLE_TO_PROVIDER(ia)->psp_create_any_func)(\
                (ia), \
                (conn_qual), \
                (evd), \
                (flags), \
                (handle))

#define DAT_PSP_QUERY(psp, mask, param) \
        (*DAT_HANDLE_TO_PROVIDER(psp)->psp_query_func)(\
                (psp),\
                (mask),\
                (param))

#define DAT_PSP_FREE(psp)\
        (*DAT_HANDLE_TO_PROVIDER(psp)->psp_free_func)(\
                (psp))

#define DAT_RSP_CREATE(ia, conn_qual, ep, evd, handle) \
        (*DAT_HANDLE_TO_PROVIDER(ia)->rsp_create_func)(\
                (ia),\
                (conn_qual),\
                (ep),\
                (evd),\
                (handle))

#define DAT_RSP_QUERY(rsp, mask, param) \
        (*DAT_HANDLE_TO_PROVIDER(rsp)->rsp_query_func)(\
                (rsp),\
                (mask),\
                (param))

#define DAT_RSP_FREE(rsp)\
        (*DAT_HANDLE_TO_PROVIDER(rsp)->rsp_free_func)(\
                (rsp))

#define DAT_PZ_CREATE(ia, pz) \
        (*DAT_HANDLE_TO_PROVIDER(ia)->pz_create_func)(\
                (ia),\
                (pz))

#define DAT_PZ_QUERY(pz, mask, param) \
        (*DAT_HANDLE_TO_PROVIDER(pz)->pz_query_func)(\
                (pz),\
                (mask),\
                (param))

#define DAT_PZ_FREE(pz) \
        (*DAT_HANDLE_TO_PROVIDER(pz)->pz_free_func)(\
                (pz))

#define DAT_SRQ_CREATE(ia, pz, attr, srq) \
        (*DAT_HANDLE_TO_PROVIDER(ia)->srq_create_func)(\
                (ia),\
                (pz),\
                (attr),\
                (srq))

#define DAT_SRQ_SET_LW(srq, lw) \
        (*DAT_HANDLE_TO_PROVIDER(srq)->srq_set_lw_func)(\
                (srq),\
                (lw))

#define DAT_SRQ_FREE(srq) \
        (*DAT_HANDLE_TO_PROVIDER(srq)->srq_free_func)(\
                (srq))

#define DAT_SRQ_QUERY(srq, mask, param) \
        (*DAT_HANDLE_TO_PROVIDER(srq)->srq_query_func)(\
                (srq),\
                (mask),\
                (param))

#define DAT_SRQ_RESIZE(srq, qsize) \
        (*DAT_HANDLE_TO_PROVIDER(srq)->srq_resize_func)(\
                (srq),\
                (qsize))

#define DAT_SRQ_POST_RECV(srq, size, lbuf, cookie) \
        (*DAT_HANDLE_TO_PROVIDER(srq)->srq_post_recv_func)(\
                (srq),\
                (size),\
                (lbuf),\
                (cookie))

/*
 * FUNCTION PROTOTYPES
 */

typedef DAT_RETURN (*DAT_IA_OPEN_FUNC)(
        IN      const DAT_NAME_PTR,     /* provider             */
        IN      DAT_COUNT,              /* asynch_evd_min_qlen  */
        INOUT   DAT_EVD_HANDLE *,       /* asynch_evd_handle    */
        OUT     DAT_IA_HANDLE *,        /* ia_handle            */
        IN      boolean_t);             /* relaxed ordering aware */

typedef DAT_RETURN (*DAT_IA_OPENV_FUNC)(
        IN      const DAT_NAME_PTR,     /* provider             */
        IN      DAT_COUNT,              /* asynch_evd_min_qlen  */
        INOUT   DAT_EVD_HANDLE *,       /* asynch_evd_handle    */
        OUT     DAT_IA_HANDLE *,        /* ia_handle            */
        IN      DAT_UINT32,             /* dat major version number */
        IN      DAT_UINT32,             /* dat minor version number */
        IN      DAT_BOOLEAN);           /* dat thread safety */

typedef DAT_RETURN (*DAT_IA_CLOSE_FUNC)(
        IN      DAT_IA_HANDLE,          /* ia_handle            */
        IN      DAT_CLOSE_FLAGS);       /* close_flags          */

typedef DAT_RETURN (*DAT_IA_QUERY_FUNC)(
        IN      DAT_IA_HANDLE,          /* ia handle            */
        OUT     DAT_EVD_HANDLE *,       /* async_evd_handle     */
        IN      DAT_IA_ATTR_MASK,       /* ia_attr_mask         */
        OUT     DAT_IA_ATTR *,          /* ia_attr              */
        IN      DAT_PROVIDER_ATTR_MASK, /* provider_attr_mask   */
        OUT     DAT_PROVIDER_ATTR *);   /* provider_attr        */

/* helper functions */

typedef DAT_RETURN (*DAT_SET_CONSUMER_CONTEXT_FUNC)(
        IN      DAT_HANDLE,             /* dat handle           */
        IN      DAT_CONTEXT);           /* context              */

typedef DAT_RETURN (*DAT_GET_CONSUMER_CONTEXT_FUNC)(
        IN      DAT_HANDLE,             /* dat handle           */
        OUT     DAT_CONTEXT *);         /* context              */

typedef DAT_RETURN (*DAT_GET_HANDLE_TYPE_FUNC)(
        IN      DAT_HANDLE,
        OUT     DAT_HANDLE_TYPE *);

/* CR Functions */

typedef DAT_RETURN (*DAT_CR_QUERY_FUNC)(
        IN      DAT_CR_HANDLE,          /* cr_handle            */
        IN      DAT_CR_PARAM_MASK,      /* cr_param_mask        */
        OUT     DAT_CR_PARAM *);        /* cr_param             */

typedef DAT_RETURN (*DAT_CR_ACCEPT_FUNC)(
        IN      DAT_CR_HANDLE,          /* cr_handle            */
        IN      DAT_EP_HANDLE,          /* ep_handle            */
        IN      DAT_COUNT,              /* private_data_size    */
        IN      const DAT_PVOID);       /* private_data         */

typedef DAT_RETURN (*DAT_CR_REJECT_FUNC)(
        IN      DAT_CR_HANDLE);

/*
 * For DAT-1.1 this function is defined for both uDAPL and kDAPL.
 * For DAT-1.0 it was only defined for uDAPL.
 */
typedef DAT_RETURN (*DAT_CR_HANDOFF_FUNC)(
        IN      DAT_CR_HANDLE,          /* cr_handle            */
        IN      DAT_CONN_QUAL);         /* handoff              */

/* EVD Functions */

typedef DAT_RETURN (*DAT_EVD_RESIZE_FUNC)(
        IN      DAT_EVD_HANDLE,         /* evd_handle           */
        IN      DAT_COUNT);             /* evd_min_qlen         */

typedef DAT_RETURN (*DAT_EVD_POST_SE_FUNC)(
        IN      DAT_EVD_HANDLE,         /* evd_handle           */
        IN      const DAT_EVENT *);     /* event                */

typedef DAT_RETURN (*DAT_EVD_DEQUEUE_FUNC)(
        IN      DAT_EVD_HANDLE,         /* evd_handle           */
        OUT     DAT_EVENT *);           /* event                */

typedef DAT_RETURN (*DAT_EVD_FREE_FUNC)(
        IN      DAT_EVD_HANDLE);        /* evd_handle           */

typedef DAT_RETURN (*DAT_EVD_QUERY_FUNC)(
        IN      DAT_EVD_HANDLE,         /* evd_handle           */
        IN      DAT_EVD_PARAM_MASK,     /* evd_param_mask       */
        OUT     DAT_EVD_PARAM *);       /* evd_param            */

/* EP functions */

typedef DAT_RETURN (*DAT_EP_CREATE_FUNC)(
        IN      DAT_IA_HANDLE,          /* ia_handle            */
        IN      DAT_PZ_HANDLE,          /* pz_handle            */
        IN      DAT_EVD_HANDLE,         /* recv_completion_evd_handle */
        IN      DAT_EVD_HANDLE,         /* request_completion_evd_handle */
        IN      DAT_EVD_HANDLE,         /* connect_evd_handle   */
        IN      const DAT_EP_ATTR *,    /* ep_attributes        */
        OUT     DAT_EP_HANDLE *);       /* ep_handle            */

typedef DAT_RETURN (*DAT_EP_CREATE_WITH_SRQ_FUNC)(
        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            */

typedef DAT_RETURN (*DAT_EP_QUERY_FUNC)(
        IN      DAT_EP_HANDLE,          /* ep_handle            */
        IN      DAT_EP_PARAM_MASK,      /* ep_param_mask        */
        OUT     DAT_EP_PARAM *);        /* ep_param             */

typedef DAT_RETURN (*DAT_EP_MODIFY_FUNC)(
        IN      DAT_EP_HANDLE,          /* ep_handle            */
        IN      DAT_EP_PARAM_MASK,      /* ep_param_mask        */
        IN      const DAT_EP_PARAM *);  /* ep_param             */

typedef DAT_RETURN (*DAT_EP_CONNECT_FUNC)(
        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        */

typedef DAT_RETURN (*DAT_EP_DUP_CONNECT_FUNC)(
        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   */

typedef DAT_RETURN (*DAT_EP_DISCONNECT_FUNC)(
        IN      DAT_EP_HANDLE,          /* ep_handle            */
        IN      DAT_CLOSE_FLAGS);       /* close_flags          */

typedef DAT_RETURN (*DAT_EP_POST_SEND_FUNC)(
        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     */

typedef DAT_RETURN (*DAT_EP_POST_RECV_FUNC)(
        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     */

typedef DAT_RETURN (*DAT_EP_POST_RDMA_READ_FUNC)(
        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     */

typedef DAT_RETURN (*DAT_EP_POST_RDMA_WRITE_FUNC)(
        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     */

typedef DAT_RETURN (*DAT_EP_GET_STATUS_FUNC)(
        IN      DAT_EP_HANDLE,          /* ep_handle            */
        OUT     DAT_EP_STATE *,         /* ep_state             */
        OUT     DAT_BOOLEAN *,          /* recv_idle            */
        OUT     DAT_BOOLEAN *);         /* request_idle         */

typedef DAT_RETURN (*DAT_EP_FREE_FUNC)(
        IN      DAT_EP_HANDLE);         /* ep_handle            */

typedef DAT_RETURN (*DAT_EP_RESET_FUNC)(
        IN      DAT_EP_HANDLE);         /* ep_handle            */

typedef DAT_RETURN (*DAT_EP_RECV_QUERY_FUNC)(
        IN      DAT_EP_HANDLE,          /* ep_handle            */
        OUT     DAT_COUNT *,            /* nbufs_allocated      */
        OUT     DAT_COUNT *);           /* bufs_alloc_span      */

typedef DAT_RETURN (*DAT_EP_SET_WATERMARK_FUNC)(
        IN      DAT_EP_HANDLE,          /* ep_handle            */
        IN      DAT_COUNT,              /* soft_high_watermark  */
        IN      DAT_COUNT);             /* hard_high_watermark  */

/* LMR functions */

typedef DAT_RETURN (*DAT_LMR_FREE_FUNC)(
        IN      DAT_LMR_HANDLE);

typedef DAT_RETURN (*DAT_LMR_QUERY_FUNC)(
        IN      DAT_LMR_HANDLE,         /* lmr_handle           */
        IN      DAT_LMR_PARAM_MASK,     /* lmr_param_mask       */
        OUT     DAT_LMR_PARAM *);       /* lmr_param            */

typedef DAT_RETURN (*DAT_LMR_SYNC_RDMA_READ_FUNC)(
        IN      DAT_IA_HANDLE,          /* ia_handle            */
        IN      const DAT_LMR_TRIPLET *, /* local_segments      */
        IN      DAT_VLEN);              /* num_segments         */

typedef DAT_RETURN (*DAT_LMR_SYNC_RDMA_WRITE_FUNC)(
        IN      DAT_IA_HANDLE,          /* ia_handle            */
        IN      const DAT_LMR_TRIPLET *, /* local_segments      */
        IN      DAT_VLEN);              /* num_segments         */

/* RMR Functions */

typedef DAT_RETURN (*DAT_RMR_CREATE_FUNC)(
        IN      DAT_PZ_HANDLE,          /* pz_handle            */
        OUT     DAT_RMR_HANDLE *);      /* rmr_handle           */

typedef DAT_RETURN (*DAT_RMR_QUERY_FUNC)(
        IN      DAT_RMR_HANDLE,         /* rmr_handle           */
        IN      DAT_RMR_PARAM_MASK,     /* rmr_param_mask       */
        OUT     DAT_RMR_PARAM *);       /* rmr_param            */

typedef DAT_RETURN (*DAT_RMR_BIND_FUNC)(
        IN      DAT_RMR_HANDLE,         /* rmr_handle           */
        IN      const DAT_LMR_TRIPLET *,        /* lmr_triplet          */
        IN      DAT_MEM_PRIV_FLAGS,     /* mem_priv             */
        IN      DAT_EP_HANDLE,          /* ep_handle            */
        IN      DAT_RMR_COOKIE,         /* user_cookie          */
        IN      DAT_COMPLETION_FLAGS,   /* completion_flags     */
        OUT     DAT_RMR_CONTEXT *);     /* context              */

typedef DAT_RETURN (*DAT_RMR_FREE_FUNC)(
        IN      DAT_RMR_HANDLE);

/* PSP Functions */

typedef DAT_RETURN (*DAT_PSP_CREATE_FUNC)(
        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           */

typedef DAT_RETURN (*DAT_PSP_CREATE_ANY_FUNC)(
        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           */

typedef DAT_RETURN (*DAT_PSP_QUERY_FUNC)(
        IN      DAT_PSP_HANDLE,         /* psp_handle           */
        IN      DAT_PSP_PARAM_MASK,     /* psp_param_mask       */
        OUT     DAT_PSP_PARAM *);       /* *psp_param           */

typedef DAT_RETURN (*DAT_PSP_FREE_FUNC)(
        IN      DAT_PSP_HANDLE);        /* psp_handle           */

/* RSP Functions */

typedef DAT_RETURN (*DAT_RSP_CREATE_FUNC)(
        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           */

typedef DAT_RETURN (*DAT_RSP_QUERY_FUNC) (
        IN      DAT_RSP_HANDLE,         /* rsp_handle           */
        IN      DAT_RSP_PARAM_MASK,     /* rsp_param_mask       */
        OUT     DAT_RSP_PARAM *);       /* *rsp_param           */

typedef DAT_RETURN (*DAT_RSP_FREE_FUNC)(
        IN      DAT_RSP_HANDLE);        /* rsp_handle           */

/* PZ Functions */

typedef DAT_RETURN (*DAT_PZ_CREATE_FUNC)(
        IN      DAT_IA_HANDLE,          /* ia_handle            */
        OUT     DAT_PZ_HANDLE *);       /* pz_handle            */

typedef DAT_RETURN (*DAT_PZ_QUERY_FUNC)(
        IN      DAT_PZ_HANDLE,          /* pz_handle            */
        IN      DAT_PZ_PARAM_MASK,      /* pz_param_mask        */
        OUT     DAT_PZ_PARAM *);        /* pz_param             */

typedef DAT_RETURN (*DAT_PZ_FREE_FUNC)(
        IN      DAT_PZ_HANDLE);         /* pz_handle            */

/* SRQ Functions */

typedef DAT_RETURN (*DAT_SRQ_CREATE_FUNC)(
        IN      DAT_IA_HANDLE,          /* ia_handle            */
        IN      DAT_PZ_HANDLE,          /* pz_handle            */
        IN      DAT_SRQ_ATTR *,         /* srq_attr             */
        OUT     DAT_SRQ_HANDLE *);      /* srq_handle           */

typedef DAT_RETURN (*DAT_SRQ_SET_LW_FUNC)(
        IN      DAT_SRQ_HANDLE,         /* srq_handle           */
        IN      DAT_COUNT);             /* low_watermark        */

typedef DAT_RETURN (*DAT_SRQ_FREE_FUNC)(
        IN      DAT_SRQ_HANDLE);        /* srq_handle           */

typedef DAT_RETURN (*DAT_SRQ_QUERY_FUNC)(
        IN      DAT_SRQ_HANDLE,         /* srq_handle           */
        IN      DAT_SRQ_PARAM_MASK,     /* srq_param_mask       */
        OUT     DAT_SRQ_PARAM *);               /* srq_param            */

typedef DAT_RETURN (*DAT_SRQ_RESIZE_FUNC)(
        IN      DAT_SRQ_HANDLE,         /* srq_handle           */
        IN      DAT_COUNT);             /* srq_max_recv_dto     */

typedef DAT_RETURN (*DAT_SRQ_POST_RECV_FUNC)(
        IN      DAT_SRQ_HANDLE,         /* srq_handle           */
        IN      DAT_COUNT,              /* num_segments         */
        IN      DAT_LMR_TRIPLET *,      /* local_iov            */
        IN      DAT_DTO_COOKIE);        /* user_cookie          */

#ifdef __cplusplus
}
#endif

#endif /* _DAT_REDIRECTION_H_ */