#ifndef _IDM_TRANSPORT_H_
#define _IDM_TRANSPORT_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/nvpair.h>
#include <sys/sunldi.h>
#define IDM_TRANSPORT_PATHLEN 0x40
#define IDM_TRANSPORT_HEADER_LENGTH 0x20
typedef enum {
IDM_TRANSPORT_TYPE_ISER = 0,
IDM_TRANSPORT_TYPE_SOCKETS,
IDM_TRANSPORT_NUM_TYPES,
IDM_TRANSPORT_TYPE_UNDEFINED
} idm_transport_type_t;
typedef struct idm_transport_caps_s {
uint32_t flags;
} idm_transport_caps_t;
typedef void (transport_tx_op_t)(struct idm_conn_s *ic, struct idm_pdu_s *pdu);
typedef idm_status_t (transport_buf_tx_to_ini_op_t)(struct idm_task_s *idt,
struct idm_buf_s *idb);
typedef idm_status_t (transport_buf_rx_from_ini_op_t)(struct idm_task_s *idt,
struct idm_buf_s *idb);
typedef void (transport_rx_datain_op_t)(struct idm_conn_s *ic,
struct idm_pdu_s *pdu);
typedef void (transport_rx_rtt_op_t)(struct idm_conn_s *ic,
struct idm_pdu_s *pdu);
typedef void (transport_rx_dataout_op_t)(struct idm_conn_s *ic,
struct idm_pdu_s *pdu);
typedef idm_status_t (transport_alloc_conn_rsrc_op_t)(struct idm_conn_s *ic);
typedef idm_status_t (transport_free_conn_rsrc_op_t)(struct idm_conn_s *ic);
typedef idm_status_t (transport_tgt_enable_datamover_op_t)(struct
idm_conn_s *ic);
typedef idm_status_t (transport_ini_enable_datamover_op_t)(struct
idm_conn_s *ic);
typedef idm_status_t (transport_conn_terminate_op_t)(struct idm_conn_s *ic);
typedef idm_status_t (transport_free_task_rsrcs_op_t)(struct idm_task_s *it);
typedef kv_status_t (transport_negotiate_key_values_op_t)(struct
idm_conn_s *ic, nvlist_t *request_nvl, nvlist_t *response_nvl,
nvlist_t *negotiated_nvl);
typedef void (transport_notice_key_values_op_t)(struct idm_conn_s *ic,
nvlist_t *negotiated_nvl);
typedef kv_status_t (transport_declare_key_values_op_t)(struct idm_conn_s *ic,
nvlist_t *config_nvl, nvlist_t *outgoing_nvl);
typedef boolean_t (transport_conn_is_capable_op_t)(idm_conn_req_t *ic,
struct idm_transport_caps_s *caps);
typedef idm_status_t (transport_buf_alloc_op_t)(struct idm_buf_s *idb,
uint64_t buflen);
typedef idm_status_t (transport_buf_setup_op_t)(struct idm_buf_s *idb);
typedef void (transport_buf_teardown_op_t)(struct idm_buf_s *idb);
typedef void (transport_buf_free_op_t)(struct idm_buf_s *idb);
typedef idm_status_t (transport_tgt_svc_create_op_t)(idm_svc_req_t *sr,
struct idm_svc_s *is);
typedef void (transport_tgt_svc_destroy_op_t)(struct idm_svc_s *is);
typedef idm_status_t (transport_tgt_svc_online_op_t)(struct idm_svc_s *is);
typedef void (transport_tgt_svc_offline_op_t)(struct idm_svc_s *is);
typedef void (transport_tgt_conn_destroy_op_t)(struct idm_conn_s *ic);
typedef idm_status_t (transport_tgt_conn_connect_op_t)(struct idm_conn_s *ic);
typedef void (transport_tgt_conn_disconnect_op_t)(struct idm_conn_s *ic);
typedef idm_status_t (transport_ini_conn_create_op_t)(idm_conn_req_t *cr,
struct idm_conn_s *ic);
typedef void (transport_ini_conn_destroy_op_t)(struct idm_conn_s *ic);
typedef idm_status_t (transport_ini_conn_connect_op_t)(struct idm_conn_s *ic);
typedef void (transport_ini_conn_disconnect_op_t)(struct idm_conn_s *ic);
typedef struct idm_transport_ops_s {
transport_tx_op_t *it_tx_pdu;
transport_buf_tx_to_ini_op_t *it_buf_tx_to_ini;
transport_buf_rx_from_ini_op_t *it_buf_rx_from_ini;
transport_rx_datain_op_t *it_rx_datain;
transport_rx_rtt_op_t *it_rx_rtt;
transport_rx_dataout_op_t *it_rx_dataout;
transport_alloc_conn_rsrc_op_t *it_alloc_conn_rsrc;
transport_free_conn_rsrc_op_t *it_free_conn_rsrc;
transport_tgt_enable_datamover_op_t *it_tgt_enable_datamover;
transport_ini_enable_datamover_op_t *it_ini_enable_datamover;
transport_conn_terminate_op_t *it_conn_terminate;
transport_free_task_rsrcs_op_t *it_free_task_rsrc;
transport_negotiate_key_values_op_t *it_negotiate_key_values;
transport_notice_key_values_op_t *it_notice_key_values;
transport_conn_is_capable_op_t *it_conn_is_capable;
transport_buf_alloc_op_t *it_buf_alloc;
transport_buf_free_op_t *it_buf_free;
transport_buf_setup_op_t *it_buf_setup;
transport_buf_teardown_op_t *it_buf_teardown;
transport_tgt_svc_create_op_t *it_tgt_svc_create;
transport_tgt_svc_destroy_op_t *it_tgt_svc_destroy;
transport_tgt_svc_online_op_t *it_tgt_svc_online;
transport_tgt_svc_offline_op_t *it_tgt_svc_offline;
transport_tgt_conn_destroy_op_t *it_tgt_conn_destroy;
transport_tgt_conn_connect_op_t *it_tgt_conn_connect;
transport_tgt_conn_disconnect_op_t *it_tgt_conn_disconnect;
transport_ini_conn_create_op_t *it_ini_conn_create;
transport_ini_conn_destroy_op_t *it_ini_conn_destroy;
transport_ini_conn_connect_op_t *it_ini_conn_connect;
transport_ini_conn_disconnect_op_t *it_ini_conn_disconnect;
transport_declare_key_values_op_t *it_declare_key_values;
} idm_transport_ops_t;
typedef struct idm_transport_s {
idm_transport_type_t it_type;
char *it_device_path;
ldi_handle_t it_ldi_hdl;
idm_transport_ops_t *it_ops;
idm_transport_caps_t *it_caps;
} idm_transport_t;
typedef struct idm_transport_attr_s {
idm_transport_type_t type;
idm_transport_ops_t *it_ops;
idm_transport_caps_t *it_caps;
} idm_transport_attr_t;
idm_status_t
idm_transport_register(idm_transport_attr_t *attr);
idm_transport_t *
idm_transport_lookup(idm_conn_req_t *cr);
void
idm_transport_setup(ldi_ident_t li, boolean_t boot_conn);
void
idm_transport_teardown();
#ifdef __cplusplus
}
#endif
#endif