1a6d42e7dSPeter Dunlap /* 2a6d42e7dSPeter Dunlap * CDDL HEADER START 3a6d42e7dSPeter Dunlap * 4a6d42e7dSPeter Dunlap * The contents of this file are subject to the terms of the 5a6d42e7dSPeter Dunlap * Common Development and Distribution License (the "License"). 6a6d42e7dSPeter Dunlap * You may not use this file except in compliance with the License. 7a6d42e7dSPeter Dunlap * 8a6d42e7dSPeter Dunlap * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9a6d42e7dSPeter Dunlap * or http://www.opensolaris.org/os/licensing. 10a6d42e7dSPeter Dunlap * See the License for the specific language governing permissions 11a6d42e7dSPeter Dunlap * and limitations under the License. 12a6d42e7dSPeter Dunlap * 13a6d42e7dSPeter Dunlap * When distributing Covered Code, include this CDDL HEADER in each 14a6d42e7dSPeter Dunlap * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15a6d42e7dSPeter Dunlap * If applicable, add the following below this CDDL HEADER, with the 16a6d42e7dSPeter Dunlap * fields enclosed by brackets "[]" replaced with your own identifying 17a6d42e7dSPeter Dunlap * information: Portions Copyright [yyyy] [name of copyright owner] 18a6d42e7dSPeter Dunlap * 19a6d42e7dSPeter Dunlap * CDDL HEADER END 20a6d42e7dSPeter Dunlap */ 21a6d42e7dSPeter Dunlap 22a6d42e7dSPeter Dunlap /* 23*bbe72583SJack Meng * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24a6d42e7dSPeter Dunlap * Use is subject to license terms. 25a6d42e7dSPeter Dunlap */ 26a6d42e7dSPeter Dunlap 27a6d42e7dSPeter Dunlap #ifndef _IDM_TRANSPORT_H_ 28a6d42e7dSPeter Dunlap #define _IDM_TRANSPORT_H_ 29a6d42e7dSPeter Dunlap 30a6d42e7dSPeter Dunlap #ifdef __cplusplus 31a6d42e7dSPeter Dunlap extern "C" { 32a6d42e7dSPeter Dunlap #endif 33a6d42e7dSPeter Dunlap 34a6d42e7dSPeter Dunlap #include <sys/nvpair.h> 35a6d42e7dSPeter Dunlap #include <sys/sunldi.h> 36a6d42e7dSPeter Dunlap 37a6d42e7dSPeter Dunlap #define IDM_TRANSPORT_PATHLEN 0x40 38a6d42e7dSPeter Dunlap 39a6d42e7dSPeter Dunlap /* Note, this is tied to iSER currently */ 40a6d42e7dSPeter Dunlap #define IDM_TRANSPORT_HEADER_LENGTH 0x20 41a6d42e7dSPeter Dunlap 42a6d42e7dSPeter Dunlap /* 43a6d42e7dSPeter Dunlap * idm_transport_type_t 44a6d42e7dSPeter Dunlap * An enumerated list of the transports available to iSER. 45a6d42e7dSPeter Dunlap * Note that new transports should be added to the enum prior to NUM_TYPES. 46a6d42e7dSPeter Dunlap */ 47a6d42e7dSPeter Dunlap typedef enum { 48a6d42e7dSPeter Dunlap IDM_TRANSPORT_TYPE_ISER = 0, 49a6d42e7dSPeter Dunlap IDM_TRANSPORT_TYPE_SOCKETS, 50a6d42e7dSPeter Dunlap IDM_TRANSPORT_NUM_TYPES, 51a6d42e7dSPeter Dunlap IDM_TRANSPORT_TYPE_UNDEFINED 52a6d42e7dSPeter Dunlap } idm_transport_type_t; 53a6d42e7dSPeter Dunlap 54a6d42e7dSPeter Dunlap /* 55a6d42e7dSPeter Dunlap * idm_transport_caps_t 56a6d42e7dSPeter Dunlap * Encodes a set of attributes describing an IDM transport's capabilities. 57a6d42e7dSPeter Dunlap * JB - do we need this? 58a6d42e7dSPeter Dunlap */ 59a6d42e7dSPeter Dunlap typedef struct idm_transport_caps_s { 60a6d42e7dSPeter Dunlap uint32_t flags; 61a6d42e7dSPeter Dunlap } idm_transport_caps_t; 62a6d42e7dSPeter Dunlap 63a6d42e7dSPeter Dunlap /* 64a6d42e7dSPeter Dunlap * Transport routine definitions for idm_transport_ops_t below 65a6d42e7dSPeter Dunlap */ 66a6d42e7dSPeter Dunlap 67a6d42e7dSPeter Dunlap /* Send_Control - transmit a Control-type PDU */ 68a6d42e7dSPeter Dunlap typedef void (transport_tx_op_t)(struct idm_conn_s *ic, struct idm_pdu_s *pdu); 69a6d42e7dSPeter Dunlap 70a6d42e7dSPeter Dunlap /* 71a6d42e7dSPeter Dunlap * Target transport data primitives, caller (IDM) holds idt->idt_mutex, 72a6d42e7dSPeter Dunlap * and the transport should release the mutex before returning. 73a6d42e7dSPeter Dunlap */ 74a6d42e7dSPeter Dunlap typedef idm_status_t (transport_buf_tx_to_ini_op_t)(struct idm_task_s *idt, 75a6d42e7dSPeter Dunlap struct idm_buf_s *idb); 76a6d42e7dSPeter Dunlap typedef idm_status_t (transport_buf_rx_from_ini_op_t)(struct idm_task_s *idt, 77a6d42e7dSPeter Dunlap struct idm_buf_s *idb); 78a6d42e7dSPeter Dunlap 79a6d42e7dSPeter Dunlap /* Initiator transport data handlers */ 80a6d42e7dSPeter Dunlap typedef void (transport_rx_datain_op_t)(struct idm_conn_s *ic, 81a6d42e7dSPeter Dunlap struct idm_pdu_s *pdu); 82a6d42e7dSPeter Dunlap typedef void (transport_rx_rtt_op_t)(struct idm_conn_s *ic, 83a6d42e7dSPeter Dunlap struct idm_pdu_s *pdu); 84a6d42e7dSPeter Dunlap 85a6d42e7dSPeter Dunlap /* Target transport Data-out handler */ 86a6d42e7dSPeter Dunlap typedef void (transport_rx_dataout_op_t)(struct idm_conn_s *ic, 87a6d42e7dSPeter Dunlap struct idm_pdu_s *pdu); 88a6d42e7dSPeter Dunlap 89a6d42e7dSPeter Dunlap /* Transport-specific resource allocation and free */ 90a6d42e7dSPeter Dunlap typedef idm_status_t (transport_alloc_conn_rsrc_op_t)(struct idm_conn_s *ic); 91a6d42e7dSPeter Dunlap typedef idm_status_t (transport_free_conn_rsrc_op_t)(struct idm_conn_s *ic); 92a6d42e7dSPeter Dunlap 93a6d42e7dSPeter Dunlap /* Transport driver operations enable/disable */ 94a6d42e7dSPeter Dunlap typedef idm_status_t (transport_tgt_enable_datamover_op_t)(struct 95a6d42e7dSPeter Dunlap idm_conn_s *ic); 96a6d42e7dSPeter Dunlap typedef idm_status_t (transport_ini_enable_datamover_op_t)(struct 97a6d42e7dSPeter Dunlap idm_conn_s *ic); 98a6d42e7dSPeter Dunlap typedef idm_status_t (transport_conn_terminate_op_t)(struct idm_conn_s *ic); 99a6d42e7dSPeter Dunlap 100a6d42e7dSPeter Dunlap /* Task resource cleanup */ 101a6d42e7dSPeter Dunlap typedef idm_status_t (transport_free_task_rsrcs_op_t)(struct idm_task_s *it); 102a6d42e7dSPeter Dunlap 103a6d42e7dSPeter Dunlap /* Negotiate key value pairs */ 104a6d42e7dSPeter Dunlap typedef kv_status_t (transport_negotiate_key_values_op_t)(struct 105a6d42e7dSPeter Dunlap idm_conn_s *ic, nvlist_t *request_nvl, nvlist_t *response_nvl, 106a6d42e7dSPeter Dunlap nvlist_t *negotiated_nvl); 107a6d42e7dSPeter Dunlap 108a6d42e7dSPeter Dunlap /* Activate the negotiated key value pairs */ 10930e7468fSPeter Dunlap typedef void (transport_notice_key_values_op_t)(struct idm_conn_s *ic, 110a6d42e7dSPeter Dunlap nvlist_t *negotiated_nvl); 111a6d42e7dSPeter Dunlap 11256261083SCharles Ting /* Declare the declarative key value pairs */ 11356261083SCharles Ting typedef kv_status_t (transport_declare_key_values_op_t)(struct idm_conn_s *ic, 11456261083SCharles Ting nvlist_t *config_nvl, nvlist_t *outgoing_nvl); 11556261083SCharles Ting 116a6d42e7dSPeter Dunlap /* Transport capability probe */ 117a6d42e7dSPeter Dunlap typedef boolean_t (transport_conn_is_capable_op_t)(idm_conn_req_t *ic, 118a6d42e7dSPeter Dunlap struct idm_transport_caps_s *caps); 119a6d42e7dSPeter Dunlap 120a6d42e7dSPeter Dunlap /* Transport buffer services */ 121a6d42e7dSPeter Dunlap typedef idm_status_t (transport_buf_alloc_op_t)(struct idm_buf_s *idb, 122a6d42e7dSPeter Dunlap uint64_t buflen); 123a6d42e7dSPeter Dunlap typedef idm_status_t (transport_buf_setup_op_t)(struct idm_buf_s *idb); 124a6d42e7dSPeter Dunlap typedef void (transport_buf_teardown_op_t)(struct idm_buf_s *idb); 125a6d42e7dSPeter Dunlap typedef void (transport_buf_free_op_t)(struct idm_buf_s *idb); 126a6d42e7dSPeter Dunlap 127a6d42e7dSPeter Dunlap /* Transport target context and service management services */ 128a6d42e7dSPeter Dunlap typedef idm_status_t (transport_tgt_svc_create_op_t)(idm_svc_req_t *sr, 129a6d42e7dSPeter Dunlap struct idm_svc_s *is); 130a6d42e7dSPeter Dunlap typedef void (transport_tgt_svc_destroy_op_t)(struct idm_svc_s *is); 131a6d42e7dSPeter Dunlap typedef idm_status_t (transport_tgt_svc_online_op_t)(struct idm_svc_s *is); 132a6d42e7dSPeter Dunlap typedef void (transport_tgt_svc_offline_op_t)(struct idm_svc_s *is); 133a6d42e7dSPeter Dunlap 134a6d42e7dSPeter Dunlap /* Transport target connection establishment */ 135a6d42e7dSPeter Dunlap typedef void (transport_tgt_conn_destroy_op_t)(struct idm_conn_s *ic); 136a6d42e7dSPeter Dunlap typedef idm_status_t (transport_tgt_conn_connect_op_t)(struct idm_conn_s *ic); 137a6d42e7dSPeter Dunlap typedef void (transport_tgt_conn_disconnect_op_t)(struct idm_conn_s *ic); 138a6d42e7dSPeter Dunlap 139a6d42e7dSPeter Dunlap /* Transport initiator context and connection management services */ 140a6d42e7dSPeter Dunlap typedef idm_status_t (transport_ini_conn_create_op_t)(idm_conn_req_t *cr, 141a6d42e7dSPeter Dunlap struct idm_conn_s *ic); 142a6d42e7dSPeter Dunlap typedef void (transport_ini_conn_destroy_op_t)(struct idm_conn_s *ic); 143a6d42e7dSPeter Dunlap typedef idm_status_t (transport_ini_conn_connect_op_t)(struct idm_conn_s *ic); 144a6d42e7dSPeter Dunlap typedef void (transport_ini_conn_disconnect_op_t)(struct idm_conn_s *ic); 145a6d42e7dSPeter Dunlap 146a6d42e7dSPeter Dunlap 147a6d42e7dSPeter Dunlap /* 148a6d42e7dSPeter Dunlap * idm_transport_ops_t 149a6d42e7dSPeter Dunlap * Encodes a set of vectors into an IDM transport driver that implement the 150a6d42e7dSPeter Dunlap * transport-specific Datamover operations for IDM usage. These routines are 151a6d42e7dSPeter Dunlap * invoked by the IDM layer to execute the transport-specific implementations 152a6d42e7dSPeter Dunlap * of the DataMover primitives and supporting routines. 153a6d42e7dSPeter Dunlap */ 154a6d42e7dSPeter Dunlap typedef struct idm_transport_ops_s { 155a6d42e7dSPeter Dunlap transport_tx_op_t *it_tx_pdu; 156a6d42e7dSPeter Dunlap transport_buf_tx_to_ini_op_t *it_buf_tx_to_ini; 157a6d42e7dSPeter Dunlap transport_buf_rx_from_ini_op_t *it_buf_rx_from_ini; 158a6d42e7dSPeter Dunlap transport_rx_datain_op_t *it_rx_datain; 159a6d42e7dSPeter Dunlap transport_rx_rtt_op_t *it_rx_rtt; 160a6d42e7dSPeter Dunlap transport_rx_dataout_op_t *it_rx_dataout; 161a6d42e7dSPeter Dunlap transport_alloc_conn_rsrc_op_t *it_alloc_conn_rsrc; 162a6d42e7dSPeter Dunlap transport_free_conn_rsrc_op_t *it_free_conn_rsrc; 163a6d42e7dSPeter Dunlap transport_tgt_enable_datamover_op_t *it_tgt_enable_datamover; 164a6d42e7dSPeter Dunlap transport_ini_enable_datamover_op_t *it_ini_enable_datamover; 165a6d42e7dSPeter Dunlap transport_conn_terminate_op_t *it_conn_terminate; 166a6d42e7dSPeter Dunlap transport_free_task_rsrcs_op_t *it_free_task_rsrc; 167a6d42e7dSPeter Dunlap transport_negotiate_key_values_op_t *it_negotiate_key_values; 168a6d42e7dSPeter Dunlap transport_notice_key_values_op_t *it_notice_key_values; 169a6d42e7dSPeter Dunlap transport_conn_is_capable_op_t *it_conn_is_capable; 170a6d42e7dSPeter Dunlap transport_buf_alloc_op_t *it_buf_alloc; 171a6d42e7dSPeter Dunlap transport_buf_free_op_t *it_buf_free; 172a6d42e7dSPeter Dunlap transport_buf_setup_op_t *it_buf_setup; 173a6d42e7dSPeter Dunlap transport_buf_teardown_op_t *it_buf_teardown; 174a6d42e7dSPeter Dunlap transport_tgt_svc_create_op_t *it_tgt_svc_create; 175a6d42e7dSPeter Dunlap transport_tgt_svc_destroy_op_t *it_tgt_svc_destroy; 176a6d42e7dSPeter Dunlap transport_tgt_svc_online_op_t *it_tgt_svc_online; 177a6d42e7dSPeter Dunlap transport_tgt_svc_offline_op_t *it_tgt_svc_offline; 178a6d42e7dSPeter Dunlap transport_tgt_conn_destroy_op_t *it_tgt_conn_destroy; 179a6d42e7dSPeter Dunlap transport_tgt_conn_connect_op_t *it_tgt_conn_connect; 180a6d42e7dSPeter Dunlap transport_tgt_conn_disconnect_op_t *it_tgt_conn_disconnect; 181a6d42e7dSPeter Dunlap transport_ini_conn_create_op_t *it_ini_conn_create; 182a6d42e7dSPeter Dunlap transport_ini_conn_destroy_op_t *it_ini_conn_destroy; 183a6d42e7dSPeter Dunlap transport_ini_conn_connect_op_t *it_ini_conn_connect; 184a6d42e7dSPeter Dunlap transport_ini_conn_disconnect_op_t *it_ini_conn_disconnect; 18556261083SCharles Ting transport_declare_key_values_op_t *it_declare_key_values; 186a6d42e7dSPeter Dunlap } idm_transport_ops_t; 187a6d42e7dSPeter Dunlap 188a6d42e7dSPeter Dunlap /* 189a6d42e7dSPeter Dunlap * idm_transport_t encodes all of the data related to an IDM transport 190a6d42e7dSPeter Dunlap * type. In addition to type and capabilities, it also stores a pointer 191a6d42e7dSPeter Dunlap * to the connection and transport operation implementations, and also 192a6d42e7dSPeter Dunlap * it stores the LDI handle. 193a6d42e7dSPeter Dunlap */ 194a6d42e7dSPeter Dunlap typedef struct idm_transport_s { 195a6d42e7dSPeter Dunlap idm_transport_type_t it_type; 196a6d42e7dSPeter Dunlap char *it_device_path; 197a6d42e7dSPeter Dunlap ldi_handle_t it_ldi_hdl; 198a6d42e7dSPeter Dunlap idm_transport_ops_t *it_ops; 199a6d42e7dSPeter Dunlap idm_transport_caps_t *it_caps; 200a6d42e7dSPeter Dunlap } idm_transport_t; 201a6d42e7dSPeter Dunlap 202a6d42e7dSPeter Dunlap /* 203a6d42e7dSPeter Dunlap * idm_transport_attr_t encodes details of a transport driver seeking 204a6d42e7dSPeter Dunlap * registration with the IDM kernel module. 205a6d42e7dSPeter Dunlap */ 206a6d42e7dSPeter Dunlap typedef struct idm_transport_attr_s { 207a6d42e7dSPeter Dunlap idm_transport_type_t type; 208a6d42e7dSPeter Dunlap idm_transport_ops_t *it_ops; 209a6d42e7dSPeter Dunlap idm_transport_caps_t *it_caps; 210a6d42e7dSPeter Dunlap } idm_transport_attr_t; 211a6d42e7dSPeter Dunlap 212a6d42e7dSPeter Dunlap /* IDM transport API */ 213a6d42e7dSPeter Dunlap idm_status_t 214a6d42e7dSPeter Dunlap idm_transport_register(idm_transport_attr_t *attr); 215a6d42e7dSPeter Dunlap 216a6d42e7dSPeter Dunlap idm_transport_t * 217a6d42e7dSPeter Dunlap idm_transport_lookup(idm_conn_req_t *cr); 218a6d42e7dSPeter Dunlap 219a6d42e7dSPeter Dunlap void 220*bbe72583SJack Meng idm_transport_setup(ldi_ident_t li, boolean_t boot_conn); 221a6d42e7dSPeter Dunlap 22230e7468fSPeter Dunlap void 22330e7468fSPeter Dunlap idm_transport_teardown(); 22430e7468fSPeter Dunlap 225a6d42e7dSPeter Dunlap #ifdef __cplusplus 226a6d42e7dSPeter Dunlap } 227a6d42e7dSPeter Dunlap #endif 228a6d42e7dSPeter Dunlap 229a6d42e7dSPeter Dunlap #endif /* _IDM_TRANSPORT_H_ */ 230