#ifndef _ISER_H
#define _ISER_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <sys/ddi.h>
#include <sys/cmn_err.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/sunddi.h>
#include <sys/ib/ibtl/ibti.h>
#include <sys/ib/ibtl/ibtl_types.h>
#include <sys/idm/idm.h>
#include <sys/ib/clients/iser/iser_ib.h>
#include <sys/ib/clients/iser/iser_resource.h>
#include <sys/ib/clients/iser/iser_cm.h>
#include <sys/ib/clients/iser/iser_xfer.h>
extern boolean_t iser_logging;
#define ISER_LOG if (iser_logging) cmn_err
#define ISER_TASKQ_NTHREADS 4
#define ISER_HEADER_LENGTH 28
#define ISER_DELAY_HALF_SECOND 500000
#define ISER_TARGET_RECV_DATA_SEGMENT_LENGTH_MIN 0x200
#define ISER_TARGET_RECV_DATA_SEGMENT_LENGTH_MAX 0xFFFFFF
#define ISER_TARGET_RECV_DATA_SEGMENT_LENGTH_IMPL_MAX 0xFFFFFF
#define ISER_TARGET_RECV_DATA_SEGMENT_LENGTH_DEFAULT \
ISCSI_DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH
#define ISER_INITIATOR_RECV_DATA_SEGMENT_LENGTH_MIN 0x200
#define ISER_INITIATOR_RECV_DATA_SEGMENT_LENGTH_MAX 0xFFFFFF
#define ISER_INITIATOR_RECV_DATA_SEGMENT_LENGTH_IMPL_MAX 0xFFFFFF
#define ISER_INITIATOR_RECV_DATA_SEGMENT_LENGTH_DEFAULT \
ISCSI_DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH
#define ISER_MAX_OUTSTANDING_UNEXPECTED_PDUS_MIN 0x0
#define ISER_MAX_OUTSTANDING_UNEXPECTED_PDUS_MAX 0xFFFFFFFF
#define ISER_MAX_OUTSTANDING_UNEXPECTED_PDUS_IMPL_MAX 0xFFFFFFFF
#define ISER_MAX_OUTSTANDING_UNEXPECTED_PDUS_DEFAULT 0x0
#define ISER_KV_KEY_NAME_RDMA_EXTENSIONS "RDMAExtensions"
#define ISER_KV_KEY_NAME_OF_MARKER "OFMarker"
#define ISER_KV_KEY_NAME_IF_MARKER "IFMarker"
#define ISER_KV_KEY_NAME_TGT_RECV_SEGLEN "TargetRecvDataSegmentLength"
#define ISER_KV_KEY_NAME_INI_RECV_SEGLEN "InitiatorRecvDataSegmentLength"
#define ISER_KV_KEY_NAME_MAX_OUTSTANDING_PDU "MaxOutstandingUnexpectedPDUs"
typedef struct iser_sbind_s {
list_node_t is_list_node;
ibt_sbind_hdl_t is_sbindhdl;
ib_gid_t is_gid;
ib_guid_t is_guid;
} iser_sbind_t;
typedef struct iser_svc_s {
idm_refcnt_t is_refcnt;
ib_svc_id_t is_svcid;
ibt_srv_hdl_t is_srvhdl;
list_t is_sbindlist;
} iser_svc_t;
typedef enum {
ISER_CONN_TYPE_INI = 1,
ISER_CONN_TYPE_TGT
} iser_conn_type_t;
typedef enum {
ISER_CONN_STAGE_UNDEFINED,
ISER_CONN_STAGE_ALLOCATED,
ISER_CONN_STAGE_IC_CONNECTED,
ISER_CONN_STAGE_HELLO_SENT,
ISER_CONN_STAGE_HELLO_SENT_FAIL,
ISER_CONN_STAGE_HELLO_WAIT,
ISER_CONN_STAGE_HELLO_RCV,
ISER_CONN_STAGE_HELLO_RCV_FAIL,
ISER_CONN_STAGE_HELLOREPLY_SENT,
ISER_CONN_STAGE_HELLOREPLY_SENT_FAIL,
ISER_CONN_STAGE_HELLOREPLY_RCV,
ISER_CONN_STAGE_HELLOREPLY_RCV_FAIL,
ISER_CONN_STAGE_LOGGED_IN,
ISER_CONN_STAGE_IC_DISCONNECTED,
ISER_CONN_STAGE_IC_FREED,
ISER_CONN_STAGE_CLOSING,
ISER_CONN_STAGE_CLOSED
} iser_conn_stage_t;
typedef struct iser_op_params_s {
uint32_t op_header_digest:1,
op_data_digest:1,
op_rdma_extensions:1,
op_ofmarker:1,
op_ifmarker:1;
uint64_t op_target_recv_data_segment_length;
uint64_t op_initiator_recv_data_segment_length;
uint64_t op_max_outstanding_unexpected_pdus;
} iser_op_params_t;
typedef struct iser_conn_s {
kmutex_t ic_lock;
kcondvar_t ic_stage_cv;
iser_conn_type_t ic_type;
iser_chan_t *ic_chan;
iser_conn_stage_t ic_stage;
iser_op_params_t ic_op_params;
idm_conn_t *ic_idmc;
idm_svc_t *ic_idms;
} iser_conn_t;
typedef struct iser_state_s {
dev_info_t *is_dip;
int is_instance;
kmutex_t is_refcnt_lock;
int is_open_refcnt;
ibt_clnt_hdl_t is_ibhdl;
kmutex_t is_hcalist_lock;
list_t is_hcalist;
uint_t is_num_hcas;
iser_conn_t *is_connlist;
kmem_cache_t *iser_wr_cache;
} iser_state_t;
typedef enum {
ISER_STATUS_SUCCESS = 0,
ISER_STATUS_FAIL
} iser_status_t;
int iser_idm_register();
iser_status_t iser_register_service(idm_svc_t *idm_svc);
iser_status_t iser_bind_service(idm_svc_t *idm_svc);
void iser_unbind_service(idm_svc_t *idm_svc);
void iser_deregister_service(idm_svc_t *idm_svc);
boolean_t iser_path_exists(idm_sockaddr_t *laddr, idm_sockaddr_t *raddr);
iser_chan_t *iser_channel_alloc(idm_sockaddr_t *laddr, idm_sockaddr_t *raddr);
iser_status_t iser_channel_open(iser_chan_t *chan);
void iser_channel_close(iser_chan_t *chan);
void iser_channel_free(iser_chan_t *chan);
void iser_internal_conn_destroy(iser_conn_t *ic);
void iser_tgt_svc_hold(iser_svc_t *is);
void iser_tgt_svc_rele(iser_svc_t *is);
#ifdef __cplusplus
}
#endif
#endif