#ifndef _IB_H
#define _IB_H
#include <sys/types.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
#include <sys/conf.h>
#include <sys/stat.h>
#include <rpc/rpc.h>
#include <rpc/rpc_rdma.h>
#include <sys/ib/ibtl/ibti.h>
#include <sys/avl.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_BUFS 1024
#define DEF_CQ_SIZE 4096 - 1
#define DEF_SQ_SIZE 128
#define DEF_RQ_SIZE 256
#define DSEG_MAX 2
#define RQ_DSEG_MAX 1
#define IBSRM_HB 0x8000
#define REFRESH_ATTEMPTS 3
typedef struct rib_hca_s rib_hca_t;
typedef struct rib_qp_s rib_qp_t;
typedef struct rib_cq_s rib_cq_t;
struct rdma_done_list {
uint32_t xid;
kcondvar_t rdma_done_cv;
struct rdma_done_list *next;
struct rdma_done_list *prev;
};
#define ACCEPT 1
#define NO_ACCEPT 2
#define SEND_WAIT -1
#define REPLY_WAIT -1
typedef void * rib_pvoid;
typedef rib_pvoid RIB_SYNCMEM_HANDLE;
typedef struct {
kmutex_t buflock;
caddr_t buf;
uint32_t bufhandle;
ulong_t bufsize;
int rsize;
int numelems;
int buffree;
void *buflist[1];
} bufpool_t;
typedef struct {
bufpool_t *bpool;
ibt_mr_hdl_t *mr_hdl;
ibt_mr_desc_t *mr_desc;
} rib_bufpool_t;
#define ATS_AR_DATA_LEN 16
#define NFS 1
#define NLM 2
typedef enum {
RIB_SERVER,
RIB_CLIENT
} rib_mode_t;
struct rib_cq_s {
rib_hca_t *rib_hca;
ibt_cq_hdl_t rib_cq_hdl;
};
typedef struct rib_service_s rib_service_t;
struct rib_service_s {
uint32_t srv_type;
ibt_srv_hdl_t srv_hdl;
ib_svc_id_t srv_id;
rib_service_t *next;
};
typedef struct rpcib_state {
ibt_clnt_hdl_t ibt_clnt_hdl;
uint32_t hca_count;
uint32_t nhca_inited;
rib_hca_t *hcas_list;
krwlock_t hcas_list_lock;
int refcount;
kmutex_t open_hca_lock;
queue_t *q;
void *private;
rib_service_t *service_list;
krwlock_t service_list_lock;
kmutex_t listen_lock;
} rpcib_state_t;
typedef struct {
krwlock_t conn_lock;
CONN *conn_hd;
} rib_conn_list_t;
enum hca_state {
HCA_DETACHED,
HCA_INITED,
};
typedef struct rib_hca_service_s rib_hca_service_t;
struct rib_hca_service_s {
ib_svc_id_t srv_id;
ib_gid_t gid;
ibt_sbind_hdl_t sbind_hdl;
rib_hca_service_t *next;
};
struct rib_hca_s {
ibt_clnt_hdl_t ibt_clnt_hdl;
ibt_hca_hdl_t hca_hdl;
ibt_hca_attr_t hca_attrs;
ibt_pd_hdl_t pd_hdl;
rib_hca_service_t *bound_services;
krwlock_t bound_services_lock;
ib_guid_t hca_guid;
uint32_t hca_nports;
ibt_hca_portinfo_t *hca_ports;
size_t hca_pinfosz;
enum hca_state state;
krwlock_t state_lock;
bool_t inuse;
kmutex_t inuse_lock;
rib_conn_list_t cl_conn_list;
rib_conn_list_t srv_conn_list;
rib_cq_t *clnt_scq;
rib_cq_t *clnt_rcq;
rib_cq_t *svc_scq;
rib_cq_t *svc_rcq;
kmutex_t cb_lock;
kcondvar_t cb_cv;
rib_bufpool_t *recv_pool;
rib_bufpool_t *send_pool;
void *iblock;
kmem_cache_t *server_side_cache;
avl_tree_t avl_tree;
kmutex_t avl_lock;
krwlock_t avl_rw_lock;
volatile bool_t avl_init;
kmutex_t cache_allocation_lock;
ddi_taskq_t *cleanup_helper;
ib_svc_id_t srv_id;
ibt_srv_hdl_t srv_hdl;
uint_t reg_state;
volatile uint64_t cache_allocation;
uint64_t cache_hits;
uint64_t cache_misses;
uint64_t cache_cold_misses;
uint64_t cache_hot_misses;
uint64_t cache_misses_above_the_limit;
struct rib_hca_s *next;
};
struct send_wid {
uint32_t xid;
int cv_sig;
kmutex_t sendwait_lock;
kcondvar_t wait_cv;
uint_t status;
rib_qp_t *qp;
int nsbufs;
uint64_t sbufaddr[DSEG_MAX];
caddr_t c;
caddr_t c1;
int l1;
caddr_t c2;
int l2;
int wl, rl;
};
struct reply {
uint32_t xid;
uint_t status;
uint64_t vaddr_cq;
uint_t bytes_xfer;
kcondvar_t wait_cv;
struct reply *next;
struct reply *prev;
};
struct svc_recv {
rib_qp_t *qp;
uint64_t vaddr;
uint_t bytes_xfer;
};
struct recv_wid {
uint32_t xid;
rib_qp_t *qp;
uint64_t addr;
};
struct rib_qp_s {
rib_hca_t *hca;
rib_mode_t mode;
CONN rdmaconn;
ibt_channel_hdl_t qp_hdl;
uint_t port_num;
ib_qpn_t qpn;
int chan_flags;
clock_t timeout;
ibt_rc_chan_query_attr_t qp_q_attrs;
rib_cq_t *send_cq;
rib_cq_t *recv_cq;
uint_t n_posted_rbufs;
kcondvar_t posted_rbufs_cv;
kmutex_t posted_rbufs_lock;
uint_t n_send_rbufs;
kcondvar_t send_rbufs_cv;
kmutex_t send_rbufs_lock;
uint_t rep_list_size;
struct reply *replylist;
kmutex_t replylist_lock;
struct rdma_done_list *rdlist;
kmutex_t rdlist_lock;
kmutex_t cb_lock;
kcondvar_t cb_conn_cv;
caddr_t q;
struct send_wid wd;
};
#define ctoqp(conn) ((rib_qp_t *)((conn)->c_private))
#define qptoc(rqp) ((CONN *)&((rqp)->rdmaconn))
#define CONN_WAIT_TIME 40
#define SEND_WAIT_TIME 40
#define REPLY_WAIT_TIME 40
#ifdef __cplusplus
}
#endif
#endif