1*9162SPeter.Dunlap@Sun.COM /* 2*9162SPeter.Dunlap@Sun.COM * CDDL HEADER START 3*9162SPeter.Dunlap@Sun.COM * 4*9162SPeter.Dunlap@Sun.COM * The contents of this file are subject to the terms of the 5*9162SPeter.Dunlap@Sun.COM * Common Development and Distribution License (the "License"). 6*9162SPeter.Dunlap@Sun.COM * You may not use this file except in compliance with the License. 7*9162SPeter.Dunlap@Sun.COM * 8*9162SPeter.Dunlap@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*9162SPeter.Dunlap@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*9162SPeter.Dunlap@Sun.COM * See the License for the specific language governing permissions 11*9162SPeter.Dunlap@Sun.COM * and limitations under the License. 12*9162SPeter.Dunlap@Sun.COM * 13*9162SPeter.Dunlap@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*9162SPeter.Dunlap@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*9162SPeter.Dunlap@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*9162SPeter.Dunlap@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*9162SPeter.Dunlap@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*9162SPeter.Dunlap@Sun.COM * 19*9162SPeter.Dunlap@Sun.COM * CDDL HEADER END 20*9162SPeter.Dunlap@Sun.COM */ 21*9162SPeter.Dunlap@Sun.COM /* 22*9162SPeter.Dunlap@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23*9162SPeter.Dunlap@Sun.COM * Use is subject to license terms. 24*9162SPeter.Dunlap@Sun.COM */ 25*9162SPeter.Dunlap@Sun.COM 26*9162SPeter.Dunlap@Sun.COM #ifndef _ISER_H 27*9162SPeter.Dunlap@Sun.COM #define _ISER_H 28*9162SPeter.Dunlap@Sun.COM 29*9162SPeter.Dunlap@Sun.COM #ifdef __cplusplus 30*9162SPeter.Dunlap@Sun.COM extern "C" { 31*9162SPeter.Dunlap@Sun.COM #endif 32*9162SPeter.Dunlap@Sun.COM 33*9162SPeter.Dunlap@Sun.COM #include <sys/types.h> 34*9162SPeter.Dunlap@Sun.COM #include <sys/ddi.h> 35*9162SPeter.Dunlap@Sun.COM #include <sys/cmn_err.h> 36*9162SPeter.Dunlap@Sun.COM #include <sys/socket.h> 37*9162SPeter.Dunlap@Sun.COM #include <netinet/in.h> 38*9162SPeter.Dunlap@Sun.COM #include <sys/sunddi.h> 39*9162SPeter.Dunlap@Sun.COM #include <sys/ib/ibtl/ibti.h> 40*9162SPeter.Dunlap@Sun.COM #include <sys/ib/ibtl/ibtl_types.h> 41*9162SPeter.Dunlap@Sun.COM 42*9162SPeter.Dunlap@Sun.COM #include <sys/idm/idm.h> 43*9162SPeter.Dunlap@Sun.COM #include <sys/ib/clients/iser/iser_ib.h> 44*9162SPeter.Dunlap@Sun.COM #include <sys/ib/clients/iser/iser_resource.h> 45*9162SPeter.Dunlap@Sun.COM #include <sys/ib/clients/iser/iser_cm.h> 46*9162SPeter.Dunlap@Sun.COM #include <sys/ib/clients/iser/iser_xfer.h> 47*9162SPeter.Dunlap@Sun.COM 48*9162SPeter.Dunlap@Sun.COM /* 49*9162SPeter.Dunlap@Sun.COM * iser.h 50*9162SPeter.Dunlap@Sun.COM * Definitions and macros related to iSER core functionality, 51*9162SPeter.Dunlap@Sun.COM * softstate and DDI routines. 52*9162SPeter.Dunlap@Sun.COM */ 53*9162SPeter.Dunlap@Sun.COM extern boolean_t iser_logging; 54*9162SPeter.Dunlap@Sun.COM #define ISER_LOG if (iser_logging) cmn_err 55*9162SPeter.Dunlap@Sun.COM 56*9162SPeter.Dunlap@Sun.COM #define ISER_TASKQ_NTHREADS 4 57*9162SPeter.Dunlap@Sun.COM 58*9162SPeter.Dunlap@Sun.COM #define ISER_HEADER_LENGTH 28 59*9162SPeter.Dunlap@Sun.COM 60*9162SPeter.Dunlap@Sun.COM #define ISER_DELAY_HALF_SECOND 500000 /* for use with drv_usectohz() */ 61*9162SPeter.Dunlap@Sun.COM 62*9162SPeter.Dunlap@Sun.COM /* iSER Operational Parameters */ 63*9162SPeter.Dunlap@Sun.COM #define ISER_TARGET_RECV_DATA_SEGMENT_LENGTH_MIN 0x200 64*9162SPeter.Dunlap@Sun.COM #define ISER_TARGET_RECV_DATA_SEGMENT_LENGTH_MAX 0xFFFFFF 65*9162SPeter.Dunlap@Sun.COM #define ISER_TARGET_RECV_DATA_SEGMENT_LENGTH_IMPL_MAX 0xFFFFFF 66*9162SPeter.Dunlap@Sun.COM #define ISER_TARGET_RECV_DATA_SEGMENT_LENGTH_DEFAULT \ 67*9162SPeter.Dunlap@Sun.COM ISCSI_DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH 68*9162SPeter.Dunlap@Sun.COM #define ISER_INITIATOR_RECV_DATA_SEGMENT_LENGTH_MIN 0x200 69*9162SPeter.Dunlap@Sun.COM #define ISER_INITIATOR_RECV_DATA_SEGMENT_LENGTH_MAX 0xFFFFFF 70*9162SPeter.Dunlap@Sun.COM #define ISER_INITIATOR_RECV_DATA_SEGMENT_LENGTH_IMPL_MAX 0xFFFFFF 71*9162SPeter.Dunlap@Sun.COM #define ISER_INITIATOR_RECV_DATA_SEGMENT_LENGTH_DEFAULT \ 72*9162SPeter.Dunlap@Sun.COM ISCSI_DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH 73*9162SPeter.Dunlap@Sun.COM #define ISER_MAX_OUTSTANDING_UNEXPECTED_PDUS_MIN 0x0 74*9162SPeter.Dunlap@Sun.COM #define ISER_MAX_OUTSTANDING_UNEXPECTED_PDUS_MAX 0xFFFFFFFF 75*9162SPeter.Dunlap@Sun.COM #define ISER_MAX_OUTSTANDING_UNEXPECTED_PDUS_IMPL_MAX 0xFFFFFFFF 76*9162SPeter.Dunlap@Sun.COM #define ISER_MAX_OUTSTANDING_UNEXPECTED_PDUS_DEFAULT 0x0 77*9162SPeter.Dunlap@Sun.COM 78*9162SPeter.Dunlap@Sun.COM /* iSCSI key names that iSER is interested in */ 79*9162SPeter.Dunlap@Sun.COM #define ISER_KV_KEY_NAME_RDMA_EXTENSIONS "RDMAExtensions" 80*9162SPeter.Dunlap@Sun.COM #define ISER_KV_KEY_NAME_OF_MARKER "OFMarker" 81*9162SPeter.Dunlap@Sun.COM #define ISER_KV_KEY_NAME_IF_MARKER "IFMarker" 82*9162SPeter.Dunlap@Sun.COM #define ISER_KV_KEY_NAME_TGT_RECV_SEGLEN "TargetRecvDataSegmentLength" 83*9162SPeter.Dunlap@Sun.COM #define ISER_KV_KEY_NAME_INI_RECV_SEGLEN "InitiatorRecvDataSegmentLength" 84*9162SPeter.Dunlap@Sun.COM #define ISER_KV_KEY_NAME_MAX_OUTSTANDING_PDU "MaxOutstandingUnexpectedPDUs" 85*9162SPeter.Dunlap@Sun.COM 86*9162SPeter.Dunlap@Sun.COM typedef struct iser_sbind_s { 87*9162SPeter.Dunlap@Sun.COM list_node_t is_list_node; 88*9162SPeter.Dunlap@Sun.COM ibt_sbind_hdl_t is_sbindhdl; 89*9162SPeter.Dunlap@Sun.COM ib_gid_t is_gid; 90*9162SPeter.Dunlap@Sun.COM ib_guid_t is_guid; 91*9162SPeter.Dunlap@Sun.COM } iser_sbind_t; 92*9162SPeter.Dunlap@Sun.COM 93*9162SPeter.Dunlap@Sun.COM /* iSER-specific portion of idm_svc_t */ 94*9162SPeter.Dunlap@Sun.COM typedef struct iser_svc_s { 95*9162SPeter.Dunlap@Sun.COM idm_refcnt_t is_refcnt; 96*9162SPeter.Dunlap@Sun.COM ib_svc_id_t is_svcid; 97*9162SPeter.Dunlap@Sun.COM ibt_srv_hdl_t is_srvhdl; 98*9162SPeter.Dunlap@Sun.COM /* list of service bind handles - one per HCA port */ 99*9162SPeter.Dunlap@Sun.COM list_t is_sbindlist; 100*9162SPeter.Dunlap@Sun.COM } iser_svc_t; 101*9162SPeter.Dunlap@Sun.COM 102*9162SPeter.Dunlap@Sun.COM /* 103*9162SPeter.Dunlap@Sun.COM * iSER endpoint connection type 104*9162SPeter.Dunlap@Sun.COM */ 105*9162SPeter.Dunlap@Sun.COM typedef enum { 106*9162SPeter.Dunlap@Sun.COM ISER_CONN_TYPE_INI = 1, 107*9162SPeter.Dunlap@Sun.COM ISER_CONN_TYPE_TGT 108*9162SPeter.Dunlap@Sun.COM } iser_conn_type_t; 109*9162SPeter.Dunlap@Sun.COM 110*9162SPeter.Dunlap@Sun.COM /* 111*9162SPeter.Dunlap@Sun.COM * iSER Connection States to keep track of the connection going into 112*9162SPeter.Dunlap@Sun.COM * iSER-assisted mode 113*9162SPeter.Dunlap@Sun.COM */ 114*9162SPeter.Dunlap@Sun.COM typedef enum { 115*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_UNDEFINED, 116*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_ALLOCATED, /* conn handle allocated */ 117*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_IC_CONNECTED, /* conn established */ 118*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_HELLO_SENT, /* hello exchange stages */ 119*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_HELLO_SENT_FAIL, 120*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_HELLO_WAIT, 121*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_HELLO_RCV, 122*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_HELLO_RCV_FAIL, 123*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_HELLOREPLY_SENT, 124*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_HELLOREPLY_SENT_FAIL, 125*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_HELLOREPLY_RCV, 126*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_HELLOREPLY_RCV_FAIL, 127*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_LOGGED_IN, 128*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_IC_DISCONNECTED, /* conn disconnected */ 129*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_IC_FREED, /* conn handle allocated */ 130*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_CLOSING, /* channel closing */ 131*9162SPeter.Dunlap@Sun.COM ISER_CONN_STAGE_CLOSED /* channel closed */ 132*9162SPeter.Dunlap@Sun.COM } iser_conn_stage_t; 133*9162SPeter.Dunlap@Sun.COM 134*9162SPeter.Dunlap@Sun.COM /* 135*9162SPeter.Dunlap@Sun.COM * iSER operations parameters negotiated for a given connection 136*9162SPeter.Dunlap@Sun.COM */ 137*9162SPeter.Dunlap@Sun.COM typedef struct iser_op_params_s { 138*9162SPeter.Dunlap@Sun.COM uint32_t op_header_digest:1, 139*9162SPeter.Dunlap@Sun.COM op_data_digest:1, 140*9162SPeter.Dunlap@Sun.COM op_rdma_extensions:1, 141*9162SPeter.Dunlap@Sun.COM op_ofmarker:1, 142*9162SPeter.Dunlap@Sun.COM op_ifmarker:1; 143*9162SPeter.Dunlap@Sun.COM uint64_t op_target_recv_data_segment_length; 144*9162SPeter.Dunlap@Sun.COM uint64_t op_initiator_recv_data_segment_length; 145*9162SPeter.Dunlap@Sun.COM uint64_t op_max_outstanding_unexpected_pdus; 146*9162SPeter.Dunlap@Sun.COM } iser_op_params_t; 147*9162SPeter.Dunlap@Sun.COM 148*9162SPeter.Dunlap@Sun.COM /* 149*9162SPeter.Dunlap@Sun.COM * iSER connection information 150*9162SPeter.Dunlap@Sun.COM */ 151*9162SPeter.Dunlap@Sun.COM typedef struct iser_conn_s { 152*9162SPeter.Dunlap@Sun.COM kmutex_t ic_lock; 153*9162SPeter.Dunlap@Sun.COM kcondvar_t ic_stage_cv; 154*9162SPeter.Dunlap@Sun.COM iser_conn_type_t ic_type; 155*9162SPeter.Dunlap@Sun.COM iser_chan_t *ic_chan; 156*9162SPeter.Dunlap@Sun.COM iser_conn_stage_t ic_stage; /* for iSER-assisted mode */ 157*9162SPeter.Dunlap@Sun.COM iser_op_params_t ic_op_params; 158*9162SPeter.Dunlap@Sun.COM idm_conn_t *ic_idmc; 159*9162SPeter.Dunlap@Sun.COM idm_svc_t *ic_idms; 160*9162SPeter.Dunlap@Sun.COM } iser_conn_t; 161*9162SPeter.Dunlap@Sun.COM 162*9162SPeter.Dunlap@Sun.COM /* 163*9162SPeter.Dunlap@Sun.COM * iser_state_t is the iser driver's state structure, encoding all of 164*9162SPeter.Dunlap@Sun.COM * the state information. 165*9162SPeter.Dunlap@Sun.COM */ 166*9162SPeter.Dunlap@Sun.COM typedef struct iser_state_s { 167*9162SPeter.Dunlap@Sun.COM dev_info_t *is_dip; 168*9162SPeter.Dunlap@Sun.COM int is_instance; 169*9162SPeter.Dunlap@Sun.COM 170*9162SPeter.Dunlap@Sun.COM /* IDM open ref counter and lock */ 171*9162SPeter.Dunlap@Sun.COM kmutex_t is_refcnt_lock; 172*9162SPeter.Dunlap@Sun.COM int is_open_refcnt; 173*9162SPeter.Dunlap@Sun.COM 174*9162SPeter.Dunlap@Sun.COM ibt_clnt_hdl_t is_ibhdl; /* IBT handle */ 175*9162SPeter.Dunlap@Sun.COM 176*9162SPeter.Dunlap@Sun.COM /* list of HCAs */ 177*9162SPeter.Dunlap@Sun.COM kmutex_t is_hcalist_lock; /* locked by is_hcalist_lock */ 178*9162SPeter.Dunlap@Sun.COM list_t is_hcalist; 179*9162SPeter.Dunlap@Sun.COM uint_t is_num_hcas; 180*9162SPeter.Dunlap@Sun.COM 181*9162SPeter.Dunlap@Sun.COM /* Connection list */ 182*9162SPeter.Dunlap@Sun.COM iser_conn_t *is_connlist; 183*9162SPeter.Dunlap@Sun.COM 184*9162SPeter.Dunlap@Sun.COM /* Global work request handle cache */ 185*9162SPeter.Dunlap@Sun.COM kmem_cache_t *iser_wr_cache; 186*9162SPeter.Dunlap@Sun.COM } iser_state_t; 187*9162SPeter.Dunlap@Sun.COM 188*9162SPeter.Dunlap@Sun.COM typedef enum { 189*9162SPeter.Dunlap@Sun.COM ISER_STATUS_SUCCESS = 0, 190*9162SPeter.Dunlap@Sun.COM ISER_STATUS_FAIL 191*9162SPeter.Dunlap@Sun.COM } iser_status_t; 192*9162SPeter.Dunlap@Sun.COM 193*9162SPeter.Dunlap@Sun.COM int iser_idm_register(); 194*9162SPeter.Dunlap@Sun.COM 195*9162SPeter.Dunlap@Sun.COM iser_status_t iser_register_service(idm_svc_t *idm_svc); 196*9162SPeter.Dunlap@Sun.COM 197*9162SPeter.Dunlap@Sun.COM iser_status_t iser_bind_service(idm_svc_t *idm_svc); 198*9162SPeter.Dunlap@Sun.COM 199*9162SPeter.Dunlap@Sun.COM void iser_unbind_service(idm_svc_t *idm_svc); 200*9162SPeter.Dunlap@Sun.COM 201*9162SPeter.Dunlap@Sun.COM void iser_deregister_service(idm_svc_t *idm_svc); 202*9162SPeter.Dunlap@Sun.COM 203*9162SPeter.Dunlap@Sun.COM boolean_t iser_path_exists(idm_sockaddr_t *laddr, idm_sockaddr_t *raddr); 204*9162SPeter.Dunlap@Sun.COM 205*9162SPeter.Dunlap@Sun.COM iser_chan_t *iser_channel_alloc(idm_sockaddr_t *laddr, idm_sockaddr_t *raddr); 206*9162SPeter.Dunlap@Sun.COM 207*9162SPeter.Dunlap@Sun.COM iser_status_t iser_channel_open(iser_chan_t *chan); 208*9162SPeter.Dunlap@Sun.COM 209*9162SPeter.Dunlap@Sun.COM void iser_channel_close(iser_chan_t *chan); 210*9162SPeter.Dunlap@Sun.COM 211*9162SPeter.Dunlap@Sun.COM void iser_channel_free(iser_chan_t *chan); 212*9162SPeter.Dunlap@Sun.COM 213*9162SPeter.Dunlap@Sun.COM void iser_internal_conn_destroy(iser_conn_t *ic); 214*9162SPeter.Dunlap@Sun.COM 215*9162SPeter.Dunlap@Sun.COM /* IDM refcnt utilities for the iSER tgt svc handle */ 216*9162SPeter.Dunlap@Sun.COM void iser_tgt_svc_hold(iser_svc_t *is); 217*9162SPeter.Dunlap@Sun.COM void iser_tgt_svc_rele(iser_svc_t *is); 218*9162SPeter.Dunlap@Sun.COM 219*9162SPeter.Dunlap@Sun.COM 220*9162SPeter.Dunlap@Sun.COM #ifdef __cplusplus 221*9162SPeter.Dunlap@Sun.COM } 222*9162SPeter.Dunlap@Sun.COM #endif 223*9162SPeter.Dunlap@Sun.COM 224*9162SPeter.Dunlap@Sun.COM #endif /* _ISER_H */ 225