#ifndef _DAPL_IF_H_
#define _DAPL_IF_H_
#ifdef __cplusplus
extern "C" {
#endif
#define DAPL_IF_VERSION (0x05302007)
#define DAPL_IOC (0x0da9 << 16)
#define DAPL_TYPE_IA (DAPL_IOC | 0x11 << 8)
#define DAPL_TYPE_EVD (DAPL_IOC | 0x12 << 8)
#define DAPL_TYPE_EP (DAPL_IOC | 0x13 << 8)
#define DAPL_TYPE_MR (DAPL_IOC | 0x14 << 8)
#define DAPL_TYPE_PD (DAPL_IOC | 0x15 << 8)
#define DAPL_TYPE_SP (DAPL_IOC | 0x16 << 8)
#define DAPL_TYPE_CNO (DAPL_IOC | 0x17 << 8)
#define DAPL_TYPE_MW (DAPL_IOC | 0x18 << 8)
#define DAPL_TYPE_MISC (DAPL_IOC | 0x19 << 8)
#define DAPL_TYPE_SRQ (DAPL_IOC | 0x1a << 8)
#define DAPL_TYPE_NONE (DAPL_IOC | 0x1f << 8)
#define DAPL_TYPE_MASK (0xffffff00)
#define DAPL_IA_CREATE (DAPL_TYPE_NONE | 0x01)
#define DAPL_CR_ACCEPT (DAPL_TYPE_MISC | 0x01)
#define DAPL_CR_REJECT (DAPL_TYPE_MISC | 0x02)
#define DAPL_IA_QUERY (DAPL_TYPE_MISC | 0x03)
#define DAPL_CR_HANDOFF (DAPL_TYPE_MISC | 0x04)
#define DAPL_EP_CREATE (DAPL_TYPE_EP | 0x01)
#define DAPL_EP_FREE (DAPL_TYPE_EP | 0x02)
#define DAPL_EP_CONNECT (DAPL_TYPE_EP | 0x03)
#define DAPL_EP_MODIFY (DAPL_TYPE_EP | 0x04)
#define DAPL_EP_DISCONNECT (DAPL_TYPE_EP | 0x05)
#define DAPL_EP_REINIT (DAPL_TYPE_EP | 0x06)
#define DAPL_EVD_CREATE (DAPL_TYPE_EVD | 0x01)
#define DAPL_CQ_RESIZE (DAPL_TYPE_EVD | 0x02)
#define DAPL_EVD_FREE (DAPL_TYPE_EVD | 0x03)
#define DAPL_EVENT_POLL (DAPL_TYPE_EVD | 0x04)
#define DAPL_EVENT_WAKEUP (DAPL_TYPE_EVD | 0x05)
#define DAPL_EVD_MODIFY_CNO (DAPL_TYPE_EVD | 0x06)
#define DAPL_MR_REGISTER (DAPL_TYPE_MR | 0x01)
#define DAPL_MR_REGISTER_LMR (DAPL_TYPE_MR | 0x02)
#define DAPL_MR_REGISTER_SHARED (DAPL_TYPE_MR | 0x03)
#define DAPL_MR_DEREGISTER (DAPL_TYPE_MR | 0x04)
#define DAPL_MR_SYNC (DAPL_TYPE_MR | 0x05)
#define DAPL_MW_ALLOC (DAPL_TYPE_MW | 0x01)
#define DAPL_MW_FREE (DAPL_TYPE_MW | 0x02)
#define DAPL_CNO_ALLOC (DAPL_TYPE_CNO | 0x01)
#define DAPL_CNO_FREE (DAPL_TYPE_CNO | 0x02)
#define DAPL_CNO_WAIT (DAPL_TYPE_CNO | 0x03)
#define DAPL_PD_ALLOC (DAPL_TYPE_PD | 0x01)
#define DAPL_PD_FREE (DAPL_TYPE_PD | 0x02)
#define DAPL_SERVICE_REGISTER (DAPL_TYPE_SP | 0x01)
#define DAPL_SERVICE_DEREGISTER (DAPL_TYPE_SP | 0x02)
#define DAPL_SRQ_CREATE (DAPL_TYPE_SRQ | 0x01)
#define DAPL_SRQ_FREE (DAPL_TYPE_SRQ | 0x02)
#define DAPL_SRQ_RESIZE (DAPL_TYPE_SRQ | 0x03)
#define DAPLKA_DRV_NAME "daplt"
#define DAPLKA_MINOR_NAME "daplt"
#define DAPLKA_DEFAULT_PATH "/devices/ib/daplt@0:daplt"
#define DAPLKA_DRIVER_MINOR 0
#define DAPL_EVD_MAX_EVENTS 16384
#define NUM_EVENTS_PER_POLL 16
#ifndef _DAT_H_
typedef enum dat_evd_flags {
DAT_EVD_SOFTWARE_FLAG = 0x01,
DAT_EVD_CR_FLAG = 0x10,
DAT_EVD_DTO_FLAG = 0x20,
DAT_EVD_CONNECTION_FLAG = 0x40,
DAT_EVD_RMR_BIND_FLAG = 0x80,
DAT_EVD_ASYNC_FLAG = 0x100,
DAT_EVD_DEFAULT_FLAG = 0x1F0
} DAT_EVD_FLAGS;
#endif
#define DAPL_MAX_PRIVATE_DATA_SIZE IBT_MAX_PRIV_DATA_SZ
#define DAPL_ATS_NBYTES 16
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif
typedef union dapl_ia_addr_s {
struct {
uint32_t iad_pad[3];
struct in_addr iad_v4data;
} iad_v4_s;
in6_addr_t iad_v6data;
uint8_t iad_sadata[DAPL_ATS_NBYTES];
uint32_t iad_src;
} dapl_ia_addr_t;
#define iad_v4 iad_v4_s.iad_v4data
#define iad_v4pad iad_v4_s.iad_pad
#define iad_v6 iad_v6data
#define iad_sa iad_sadata
typedef struct dapl_hello_msg {
uint16_t hi_checksum;
uint8_t hi_clen;
uint8_t hi_mid;
uint16_t hi_rsvd1;
uint8_t hi_ipv;
uint8_t hi_vers;
in_port_t hi_port;
uint16_t hi_rsvd2;
dapl_ia_addr_t _hi_ipaddr;
} DAPL_HELLO_MSG;
#define hi_v4ipaddr _hi_ipaddr.iad_v4
#define hi_v4pad _hi_ipaddr.iad_v4pad
#define hi_v6ipaddr _hi_ipaddr.iad_v6
#define hi_saaddr _hi_ipaddr.iad_sa
#define DAPL_CHECKSUM 0xbeef
#define DAPL_HELLO_MSG_VERS 0x10
#define DAPL_CONSUMER_MAX_PRIVATE_DATA_SIZE 64
typedef struct dapl_private {
unsigned char private_data[DAPL_CONSUMER_MAX_PRIVATE_DATA_SIZE];
DAPL_HELLO_MSG hello_msg;
} DAPL_PRIVATE;
#define DAPL_CQ_DATA_OUT_SIZE 24
#define DAPL_QP_DATA_OUT_SIZE 24
#define DAPL_SRQ_DATA_OUT_SIZE 24
typedef uint64_t dapl_cq_data_out_t[DAPL_QP_DATA_OUT_SIZE];
typedef uint64_t dapl_qp_data_out_t[DAPL_CQ_DATA_OUT_SIZE];
typedef uint64_t dapl_srq_data_out_t[DAPL_SRQ_DATA_OUT_SIZE];
typedef struct dapl_chan_sizes_s {
uint_t dcs_sq;
uint_t dcs_rq;
uint_t dcs_sq_sgl;
uint_t dcs_rq_sgl;
} dapl_chan_sizes_t;
typedef struct dapl_ep_create_s {
uint64_t ep_hkey;
uint64_t ep_pd_hkey;
uint64_t ep_rcv_evd_hkey;
uint64_t ep_snd_evd_hkey;
uint64_t ep_conn_evd_hkey;
uint64_t ep_srq_hkey;
uint32_t ep_srq_attached;
uint64_t ep_cookie;
dapl_chan_sizes_t ep_ch_sizes;
dapl_chan_sizes_t ep_ch_real_sizes;
dapl_qp_data_out_t ep_qp_data_out;
} dapl_ep_create_t;
typedef struct dapl_ep_modify_s {
uint64_t epm_hkey;
ibt_cep_modify_flags_t epm_flags;
uint8_t epm_rdma_ra_out;
uint8_t epm_rdma_ra_in;
} dapl_ep_modify_t;
typedef struct dapl_ep_connect_s {
uint64_t epc_hkey;
ib_gid_t epc_dgid;
uint64_t epc_sid;
uint64_t epc_timeout;
uint32_t epc_priv_sz;
dapl_ia_addr_t epc_raddr_sadata;
uchar_t epc_priv[DAPL_MAX_PRIVATE_DATA_SIZE];
} dapl_ep_connect_t;
typedef struct dapl_ep_disconnect_s {
uint64_t epd_hkey;
} dapl_ep_disconnect_t;
typedef struct dapl_ep_reinit_s {
uint64_t epri_hkey;
uint64_t epri_map_offset;
uint64_t epri_map_len;
uint32_t epri_qpnum;
uint32_t epri_rq_offset;
uint32_t epri_rq_desc_addr;
uint32_t epri_rq_numwqe;
uint32_t epri_rq_wqesz;
uint32_t epri_sq_offset;
uint32_t epri_sq_desc_addr;
uint32_t epri_sq_numwqe;
uint32_t epri_sq_wqesz;
} dapl_ep_reinit_t;
typedef struct dapl_ep_free_s {
uint64_t epf_hkey;
} dapl_ep_free_t;
typedef struct dapl_evd_create_s {
uint64_t evd_hkey;
DAT_EVD_FLAGS evd_flags;
uint64_t evd_cookie;
uint64_t evd_cno_hkey;
uint32_t evd_cq_size;
uint32_t evd_cq_real_size;
dapl_cq_data_out_t evd_cq_data_out;
} dapl_evd_create_t;
typedef struct dapl_cq_resize_s {
uint64_t cqr_evd_hkey;
uint32_t cqr_cq_new_size;
uint32_t cqr_cq_real_size;
dapl_cq_data_out_t cqr_cq_data_out;
} dapl_cq_resize_t;
typedef enum {
DAPL_ASYNC_EVENTS = 0x01,
DAPL_CR_EVENTS = 0x02,
DAPL_PASSIVE_CONNECTION_EVENTS = 0x04,
DAPL_ACTIVE_CONNECTION_EVENTS = 0x08
} dapl_event_family_t;
typedef struct dapl_ib_async_event_s {
ibt_async_code_t ibae_type;
ib_guid_t ibae_hca_guid;
uint64_t ibae_cookie;
uint8_t ibae_port;
} dapl_ib_async_event_t;
typedef enum {
DAPL_IB_CME_CONNECTED = 1,
DAPL_IB_CME_DISCONNECTED,
DAPL_IB_CME_CONNECTION_REQUEST_PENDING,
DAPL_IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,
DAPL_IB_CME_DESTINATION_REJECT,
DAPL_IB_CME_DESTINATION_REJECT_PRIVATE_DATA,
DAPL_IB_CME_DESTINATION_UNREACHABLE,
DAPL_IB_CME_TOO_MANY_CONNECTION_REQUESTS,
DAPL_IB_CME_LOCAL_FAILURE,
DAPL_IB_CME_TIMED_OUT,
DAPL_IB_CME_DISCONNECTED_ON_LINK_DOWN,
DAPL_IB_CM_REJ_REASON_CONSUMER_REJ
} dapl_ib_cm_event_type_t;
typedef struct dapl_ib_cm_event_s {
dapl_ib_cm_event_type_t ibce_event;
uint64_t ibce_cookie;
uint64_t ibce_psep_cookie;
uint32_t ibce_priv_data_size;
uchar_t ibce_priv_data_ptr[DAPL_MAX_PRIVATE_DATA_SIZE];
} dapl_ib_cm_event_t;
typedef struct dapl_ib_event_s {
dapl_event_family_t ibe_ev_family;
union {
dapl_ib_async_event_t ibe_async;
dapl_ib_cm_event_t ibe_ce;
} ev_data;
#define ibe_async ev_data.ibe_async
#define ibe_ce ev_data.ibe_ce
} dapl_ib_event_t;
typedef struct dapl_event_poll_s {
uint64_t evp_evd_hkey;
uint64_t evp_timeout;
uint_t evp_threshold;
dapl_ib_event_t *evp_ep;
uint_t evp_num_ev;
uint_t evp_num_polled;
} dapl_event_poll_t;
typedef struct dapl_event_poll32_s {
uint64_t evp_evd_hkey;
uint64_t evp_timeout;
uint_t evp_threshold;
caddr32_t evp_ep;
uint_t evp_num_ev;
uint_t evp_num_polled;
} dapl_event_poll32_t;
typedef struct dapl_event_wakeup_s {
uint64_t evw_hkey;
} dapl_event_wakeup_t;
typedef struct dapl_evd_modify_cno_s {
uint64_t evmc_hkey;
uint64_t evmc_cno_hkey;
} dapl_evd_modify_cno_t;
typedef struct dapl_evd_free_s {
uint64_t evf_hkey;
} dapl_evd_free_t;
typedef struct dapl_mr_register_s {
uint64_t mr_hkey;
uint64_t mr_pd_hkey;
ib_vaddr_t mr_vaddr;
ib_memlen_t mr_len;
ibt_mr_flags_t mr_flags;
ibt_lkey_t mr_lkey;
ibt_rkey_t mr_rkey;
} dapl_mr_register_t;
typedef union dapl_mr_cookie_u {
uint64_t mc_uint_arr[5];
uchar_t mc_byte_arr[40];
} dapl_mr_cookie_t;
typedef struct dapl_mr_register_shared_s {
uint64_t mrs_hkey;
uint64_t mrs_pd_hkey;
ib_vaddr_t mrs_vaddr;
ib_memlen_t mrs_len;
ibt_mr_flags_t mrs_flags;
ibt_lkey_t mrs_lkey;
ibt_rkey_t mrs_rkey;
dapl_mr_cookie_t mrs_shm_cookie;
} dapl_mr_register_shared_t;
typedef struct dapl_mr_register_lmr_s {
uint64_t mrl_hkey;
uint64_t mrl_orig_hkey;
ibt_mr_flags_t mrl_flags;
ibt_lkey_t mrl_lkey;
ibt_rkey_t mrl_rkey;
} dapl_mr_register_lmr_t;
typedef struct dapl_mr_deregister_s {
uint64_t mrd_hkey;
} dapl_mr_deregister_t;
#define DAPL_MR_PER_SYNC 16
#define DAPL_MR_SYNC_RDMA_RD 0
#define DAPL_MR_SYNC_RDMA_WR 1
typedef struct dapl_mr_sync_vec_s {
uint64_t mrsv_hkey;
uint64_t mrsv_va;
uint64_t mrsv_len;
} dapl_mr_sync_vec_t;
typedef struct dapl_mr_sync_s {
uint32_t mrs_flags;
uint64_t mrs_numseg;
dapl_mr_sync_vec_t mrs_vec[DAPL_MR_PER_SYNC];
} dapl_mr_sync_t;
typedef struct dapl_ia_create_s {
uint32_t ia_version;
ib_guid_t ia_guid;
uint32_t ia_port;
uint32_t ia_pkey;
uint32_t ia_resnum;
uint8_t ia_sadata[DAPL_ATS_NBYTES];
} dapl_ia_create_t;
typedef struct dapl_hca_attr_s {
uint32_t dhca_vendor_id:24;
uint16_t dhca_device_id;
uint32_t dhca_version_id;
uint_t dhca_max_chans;
uint_t dhca_max_chan_sz;
uint_t dhca_max_sgl;
uint_t dhca_max_cq;
uint_t dhca_max_cq_sz;
uint_t dhca_max_memr;
ib_memlen_t dhca_max_memr_len;
uint_t dhca_max_mem_win;
uint8_t dhca_max_rdma_in_chan;
uint8_t dhca_max_rdma_out_chan;
uint16_t dhca_max_partitions;
uint8_t dhca_nports;
ib_guid_t dhca_node_guid;
uint_t dhca_max_pd;
uint_t dhca_max_srqs;
uint_t dhca_max_srqs_sz;
uint_t dhca_max_srq_sgl;
} dapl_hca_attr_t;
typedef struct dapl_ia_query_s {
dapl_hca_attr_t hca_attr;
} dapl_ia_query_t;
#define DAPL_MAX_IA 64
typedef struct dapl_ia_enum_s {
uint32_t ia_count;
uint16_t ia_devnum[DAPL_MAX_IA];
} dapl_ia_enum_t;
typedef struct dapl_pd_alloc_s {
uint64_t pda_hkey;
} dapl_pd_alloc_t;
typedef struct dapl_pd_free_s {
uint64_t pdf_hkey;
} dapl_pd_free_t;
typedef struct dapl_mw_alloc_s {
uint64_t mw_pd_hkey;
uint64_t mw_hkey;
ibt_rkey_t mw_rkey;
} dapl_mw_alloc_t;
typedef struct dapl_mw_free_s {
uint64_t mw_hkey;
} dapl_mw_free_t;
typedef struct dapl_service_register_s {
ib_svc_id_t sr_sid;
uint64_t sr_evd_hkey;
uint64_t sr_sp_hkey;
uint64_t sr_sp_cookie;
ib_svc_id_t sr_retsid;
} dapl_service_register_t;
typedef struct dapl_service_deregister_s {
uint64_t sdr_sp_hkey;
} dapl_service_deregister_t;
typedef struct dapl_cr_accept_s {
uint64_t cra_sp_hkey;
uint64_t cra_ep_hkey;
uint64_t cra_bkl_cookie;
uint32_t cra_priv_sz;
uchar_t cra_priv[DAPL_MAX_PRIVATE_DATA_SIZE];
} dapl_cr_accept_t;
typedef struct dapl_cr_reject_s {
uint64_t crr_sp_hkey;
uint64_t crr_bkl_cookie;
int crr_reason;
} dapl_cr_reject_t;
typedef struct dapl_cr_handoff_s {
uint64_t crh_sp_hkey;
uint64_t crh_bkl_cookie;
ib_svc_id_t crh_conn_qual;
} dapl_cr_handoff_t;
typedef struct dapl_cno_alloc_s {
uint64_t cno_hkey;
} dapl_cno_alloc_t;
typedef struct dapl_cno_free_s {
uint64_t cnf_hkey;
} dapl_cno_free_t;
typedef struct dapl_cno_wait_s {
uint64_t cnw_hkey;
uint64_t cnw_timeout;
uint64_t cnw_evd_cookie;
} dapl_cno_wait_t;
typedef struct dapl_srq_sizes_s {
uint_t srqs_sz;
uint_t srqs_sgl;
} dapl_srq_sizes_t;
typedef struct dapl_srq_create_s {
uint64_t srqc_pd_hkey;
dapl_srq_sizes_t srqc_sizes;
uint64_t srqc_hkey;
dapl_srq_sizes_t srqc_real_sizes;
dapl_srq_data_out_t srqc_data_out;
} dapl_srq_create_t;
typedef struct dapl_srq_resize_s {
uint64_t srqr_hkey;
uint32_t srqr_new_size;
uint32_t srqr_real_size;
dapl_srq_data_out_t srqr_data_out;
} dapl_srq_resize_t;
typedef struct dapl_srq_free_s {
uint64_t srqf_hkey;
} dapl_srq_free_t;
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif
#ifdef __cplusplus
}
#endif
#endif