1*a6d42e7dSPeter Dunlap /*
2*a6d42e7dSPeter Dunlap  * CDDL HEADER START
3*a6d42e7dSPeter Dunlap  *
4*a6d42e7dSPeter Dunlap  * The contents of this file are subject to the terms of the
5*a6d42e7dSPeter Dunlap  * Common Development and Distribution License (the "License").
6*a6d42e7dSPeter Dunlap  * You may not use this file except in compliance with the License.
7*a6d42e7dSPeter Dunlap  *
8*a6d42e7dSPeter Dunlap  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*a6d42e7dSPeter Dunlap  * or http://www.opensolaris.org/os/licensing.
10*a6d42e7dSPeter Dunlap  * See the License for the specific language governing permissions
11*a6d42e7dSPeter Dunlap  * and limitations under the License.
12*a6d42e7dSPeter Dunlap  *
13*a6d42e7dSPeter Dunlap  * When distributing Covered Code, include this CDDL HEADER in each
14*a6d42e7dSPeter Dunlap  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*a6d42e7dSPeter Dunlap  * If applicable, add the following below this CDDL HEADER, with the
16*a6d42e7dSPeter Dunlap  * fields enclosed by brackets "[]" replaced with your own identifying
17*a6d42e7dSPeter Dunlap  * information: Portions Copyright [yyyy] [name of copyright owner]
18*a6d42e7dSPeter Dunlap  *
19*a6d42e7dSPeter Dunlap  * CDDL HEADER END
20*a6d42e7dSPeter Dunlap  */
21*a6d42e7dSPeter Dunlap /*
22*a6d42e7dSPeter Dunlap  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23*a6d42e7dSPeter Dunlap  * Use is subject to license terms.
24*a6d42e7dSPeter Dunlap  */
25*a6d42e7dSPeter Dunlap 
26*a6d42e7dSPeter Dunlap #ifndef _ISCSI_IF_H
27*a6d42e7dSPeter Dunlap #define	_ISCSI_IF_H
28*a6d42e7dSPeter Dunlap 
29*a6d42e7dSPeter Dunlap #ifdef __cplusplus
30*a6d42e7dSPeter Dunlap extern "C" {
31*a6d42e7dSPeter Dunlap #endif
32*a6d42e7dSPeter Dunlap 
33*a6d42e7dSPeter Dunlap #ifdef _KERNEL
34*a6d42e7dSPeter Dunlap #include <sys/types.h>
35*a6d42e7dSPeter Dunlap #include <sys/strsubr.h>	/* for prototype of kstrgetmsg */
36*a6d42e7dSPeter Dunlap #include <sys/socket.h>
37*a6d42e7dSPeter Dunlap #include <sys/socketvar.h>	/* for struct sonode */
38*a6d42e7dSPeter Dunlap #endif
39*a6d42e7dSPeter Dunlap #include <netinet/in.h>
40*a6d42e7dSPeter Dunlap #include <sys/scsi/impl/uscsi.h>
41*a6d42e7dSPeter Dunlap #include <sys/iscsi_protocol.h>
42*a6d42e7dSPeter Dunlap 
43*a6d42e7dSPeter Dunlap /*
44*a6d42e7dSPeter Dunlap  * Each of the top level structures have a version field as
45*a6d42e7dSPeter Dunlap  * the first member. That version value will be set by the
46*a6d42e7dSPeter Dunlap  * caller. The consumer of the structure will check to see
47*a6d42e7dSPeter Dunlap  * if the version is correct.
48*a6d42e7dSPeter Dunlap  */
49*a6d42e7dSPeter Dunlap #define	ISCSI_INTERFACE_VERSION			3
50*a6d42e7dSPeter Dunlap 
51*a6d42e7dSPeter Dunlap /*
52*a6d42e7dSPeter Dunlap  * The maximum length of an iSCSI name is 223.  224 is used
53*a6d42e7dSPeter Dunlap  * to provide space for a null character.
54*a6d42e7dSPeter Dunlap  */
55*a6d42e7dSPeter Dunlap #define	ISCSI_MAX_NAME_LEN			224
56*a6d42e7dSPeter Dunlap 
57*a6d42e7dSPeter Dunlap /*
58*a6d42e7dSPeter Dunlap  * Login parameter values are used instead of ascii text
59*a6d42e7dSPeter Dunlap  * between the IMA plug-in and kernel.
60*a6d42e7dSPeter Dunlap  */
61*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_DATA_SEQUENCE_IN_ORDER	0x0000  /* bool */
62*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_IMMEDIATE_DATA		0x0001  /* bool */
63*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_INITIAL_R2T			0x0002  /* bool */
64*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_DATA_PDU_IN_ORDER		0x0003  /* bool */
65*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_HEADER_DIGEST			0x0004	/* int */
66*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_DATA_DIGEST			0x0005	/* int */
67*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_DEFAULT_TIME_2_RETAIN		0x0006  /* int */
68*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_DEFAULT_TIME_2_WAIT		0x0007  /* int */
69*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_MAX_RECV_DATA_SEGMENT_LENGTH	0x0008  /* int */
70*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_FIRST_BURST_LENGTH		0x0009  /* int */
71*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_MAX_BURST_LENGTH		0x000A  /* int */
72*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_MAX_CONNECTIONS		0x000B  /* int */
73*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_OUTSTANDING_R2T		0x000C  /* int */
74*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_ERROR_RECOVERY_LEVEL		0x000D  /* int */
75*a6d42e7dSPeter Dunlap /*
76*a6d42e7dSPeter Dunlap  * number of login parameters - needs to be updated when new parameter added
77*a6d42e7dSPeter Dunlap  */
78*a6d42e7dSPeter Dunlap #define	ISCSI_NUM_LOGIN_PARAM				0x000E
79*a6d42e7dSPeter Dunlap 
80*a6d42e7dSPeter Dunlap /*
81*a6d42e7dSPeter Dunlap  * Used internally by the persistent store code. Currently a bitmap is kept of
82*a6d42e7dSPeter Dunlap  * which params are currently set. This allows for quick a look up instead of
83*a6d42e7dSPeter Dunlap  * cycling through the possible entries. Using an unsigned int as the bitmap we
84*a6d42e7dSPeter Dunlap  * can have parameter numbers up through 31. Since the current only has 22
85*a6d42e7dSPeter Dunlap  * we're okay.
86*a6d42e7dSPeter Dunlap  */
87*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_DB_ENTRY			0x0020
88*a6d42e7dSPeter Dunlap /*
89*a6d42e7dSPeter Dunlap  * Special case. When this parameter value is set in iscsi_param_set_t
90*a6d42e7dSPeter Dunlap  * the member s_value (type iscsi_param_set_t) is not used.
91*a6d42e7dSPeter Dunlap  * The name field contains the InitiatorName for the system which
92*a6d42e7dSPeter Dunlap  * should be used for all future sessions.
93*a6d42e7dSPeter Dunlap  */
94*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_INITIATOR_NAME		0x0021
95*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN_PARAM_INITIATOR_ALIAS		0x0022
96*a6d42e7dSPeter Dunlap 
97*a6d42e7dSPeter Dunlap #define	ISCSI_DEVCTL		"devctl"
98*a6d42e7dSPeter Dunlap #define	ISCSI_DRIVER_DEVCTL	"/devices/iscsi:" ISCSI_DEVCTL
99*a6d42e7dSPeter Dunlap 
100*a6d42e7dSPeter Dunlap /*
101*a6d42e7dSPeter Dunlap  * ioctls supported by the driver.
102*a6d42e7dSPeter Dunlap  */
103*a6d42e7dSPeter Dunlap #define	ISCSI_IOCTL		(('i' << 24) | ('S' << 16) | ('C' << 8))
104*a6d42e7dSPeter Dunlap #define	ISCSI_CREATE_OID		(ISCSI_IOCTL | 2)
105*a6d42e7dSPeter Dunlap #define	ISCSI_LOGIN			(ISCSI_IOCTL | 3)
106*a6d42e7dSPeter Dunlap #define	ISCSI_LOGOUT			(ISCSI_IOCTL | 4)
107*a6d42e7dSPeter Dunlap #define	ISCSI_PARAM_GET			(ISCSI_IOCTL | 5)
108*a6d42e7dSPeter Dunlap #define	ISCSI_PARAM_SET			(ISCSI_IOCTL | 6)
109*a6d42e7dSPeter Dunlap #define	ISCSI_TARGET_PARAM_CLEAR	(ISCSI_IOCTL | 8)
110*a6d42e7dSPeter Dunlap #define	ISCSI_TARGET_OID_LIST_GET	(ISCSI_IOCTL | 9)
111*a6d42e7dSPeter Dunlap #define	ISCSI_TARGET_PROPS_GET		(ISCSI_IOCTL | 10)
112*a6d42e7dSPeter Dunlap #define	ISCSI_TARGET_PROPS_SET		(ISCSI_IOCTL | 11)
113*a6d42e7dSPeter Dunlap #define	ISCSI_TARGET_ADDRESS_GET	(ISCSI_IOCTL | 12)
114*a6d42e7dSPeter Dunlap #define	ISCSI_CHAP_SET			(ISCSI_IOCTL | 13)
115*a6d42e7dSPeter Dunlap #define	ISCSI_CHAP_GET			(ISCSI_IOCTL | 14)
116*a6d42e7dSPeter Dunlap #define	ISCSI_CHAP_CLEAR		(ISCSI_IOCTL | 15)
117*a6d42e7dSPeter Dunlap #define	ISCSI_STATIC_GET		(ISCSI_IOCTL | 16)
118*a6d42e7dSPeter Dunlap #define	ISCSI_STATIC_SET		(ISCSI_IOCTL | 17)
119*a6d42e7dSPeter Dunlap #define	ISCSI_STATIC_CLEAR		(ISCSI_IOCTL | 18)
120*a6d42e7dSPeter Dunlap #define	ISCSI_DISCOVERY_SET		(ISCSI_IOCTL | 19)
121*a6d42e7dSPeter Dunlap #define	ISCSI_DISCOVERY_GET		(ISCSI_IOCTL | 20)
122*a6d42e7dSPeter Dunlap #define	ISCSI_DISCOVERY_CLEAR		(ISCSI_IOCTL | 21)
123*a6d42e7dSPeter Dunlap #define	ISCSI_DISCOVERY_PROPS		(ISCSI_IOCTL | 22)
124*a6d42e7dSPeter Dunlap #define	ISCSI_DISCOVERY_ADDR_SET	(ISCSI_IOCTL | 23)
125*a6d42e7dSPeter Dunlap #define	ISCSI_DISCOVERY_ADDR_LIST_GET	(ISCSI_IOCTL | 24)
126*a6d42e7dSPeter Dunlap #define	ISCSI_DISCOVERY_ADDR_CLEAR	(ISCSI_IOCTL | 25)
127*a6d42e7dSPeter Dunlap #define	ISCSI_RADIUS_SET		(ISCSI_IOCTL | 26)
128*a6d42e7dSPeter Dunlap #define	ISCSI_RADIUS_GET		(ISCSI_IOCTL | 27)
129*a6d42e7dSPeter Dunlap #define	ISCSI_DB_RELOAD			(ISCSI_IOCTL | 28)
130*a6d42e7dSPeter Dunlap #define	ISCSI_LUN_OID_LIST_GET		(ISCSI_IOCTL | 29)
131*a6d42e7dSPeter Dunlap #define	ISCSI_LUN_PROPS_GET		(ISCSI_IOCTL | 30)
132*a6d42e7dSPeter Dunlap #define	ISCSI_CONN_OID_LIST_GET		(ISCSI_IOCTL | 31)
133*a6d42e7dSPeter Dunlap #define	ISCSI_CONN_PROPS_GET		(ISCSI_IOCTL | 32)
134*a6d42e7dSPeter Dunlap #define	ISCSI_USCSI			(ISCSI_IOCTL | 33)
135*a6d42e7dSPeter Dunlap #define	ISCSI_DOOR_HANDLE_SET		(ISCSI_IOCTL | 34)
136*a6d42e7dSPeter Dunlap #define	ISCSI_DISCOVERY_EVENTS		(ISCSI_IOCTL | 35)
137*a6d42e7dSPeter Dunlap #define	ISCSI_AUTH_SET			(ISCSI_IOCTL | 36)
138*a6d42e7dSPeter Dunlap #define	ISCSI_AUTH_GET			(ISCSI_IOCTL | 37)
139*a6d42e7dSPeter Dunlap #define	ISCSI_AUTH_CLEAR		(ISCSI_IOCTL | 38)
140*a6d42e7dSPeter Dunlap #define	ISCSI_SENDTGTS_GET		(ISCSI_IOCTL | 39)
141*a6d42e7dSPeter Dunlap #define	ISCSI_ISNS_SERVER_ADDR_SET	(ISCSI_IOCTL | 40)
142*a6d42e7dSPeter Dunlap #define	ISCSI_ISNS_SERVER_ADDR_LIST_GET	(ISCSI_IOCTL | 41)
143*a6d42e7dSPeter Dunlap #define	ISCSI_ISNS_SERVER_ADDR_CLEAR	(ISCSI_IOCTL | 42)
144*a6d42e7dSPeter Dunlap #define	ISCSI_ISNS_SERVER_GET		(ISCSI_IOCTL | 43)
145*a6d42e7dSPeter Dunlap #define	ISCSI_GET_CONFIG_SESSIONS	(ISCSI_IOCTL | 44)
146*a6d42e7dSPeter Dunlap #define	ISCSI_SET_CONFIG_SESSIONS	(ISCSI_IOCTL | 45)
147*a6d42e7dSPeter Dunlap #define	ISCSI_INIT_NODE_NAME_SET	(ISCSI_IOCTL | 46)
148*a6d42e7dSPeter Dunlap #define	ISCSI_DB_DUMP			(ISCSI_IOCTL | 100) /* DBG */
149*a6d42e7dSPeter Dunlap 
150*a6d42e7dSPeter Dunlap /*
151*a6d42e7dSPeter Dunlap  * Misc. defines
152*a6d42e7dSPeter Dunlap  */
153*a6d42e7dSPeter Dunlap #define	ISCSI_CHAP_NAME_LEN			512
154*a6d42e7dSPeter Dunlap #define	ISCSI_CHAP_SECRET_LEN			16
155*a6d42e7dSPeter Dunlap #define	ISCSI_TGT_OID_LIST			0x0001
156*a6d42e7dSPeter Dunlap #define	ISCSI_STATIC_TGT_OID_LIST		0x0002
157*a6d42e7dSPeter Dunlap #define	ISCSI_TGT_PARAM_OID_LIST		0x0004
158*a6d42e7dSPeter Dunlap #define	ISCSI_SESS_PARAM			0x0001
159*a6d42e7dSPeter Dunlap #define	ISCSI_CONN_PARAM			0x0002
160*a6d42e7dSPeter Dunlap 
161*a6d42e7dSPeter Dunlap /* digest level defines */
162*a6d42e7dSPeter Dunlap #define	ISCSI_DIGEST_NONE		0
163*a6d42e7dSPeter Dunlap #define	ISCSI_DIGEST_CRC32C		1
164*a6d42e7dSPeter Dunlap #define	ISCSI_DIGEST_CRC32C_NONE	2 /* offer both, prefer CRC32C */
165*a6d42e7dSPeter Dunlap #define	ISCSI_DIGEST_NONE_CRC32C	3 /* offer both, prefer None */
166*a6d42e7dSPeter Dunlap 
167*a6d42e7dSPeter Dunlap /*
168*a6d42e7dSPeter Dunlap  * A last error associated with each target session is returned in the
169*a6d42e7dSPeter Dunlap  * iscsi_target_t structure.
170*a6d42e7dSPeter Dunlap  */
171*a6d42e7dSPeter Dunlap typedef enum iscsi_error {
172*a6d42e7dSPeter Dunlap 	NoError, AuthenticationError, LoginParamError, ConnectionReset
173*a6d42e7dSPeter Dunlap } iscsi_error_t;
174*a6d42e7dSPeter Dunlap 
175*a6d42e7dSPeter Dunlap /*
176*a6d42e7dSPeter Dunlap  * The values associated with each enum is based on the IMA specification.
177*a6d42e7dSPeter Dunlap  */
178*a6d42e7dSPeter Dunlap typedef enum	iSCSIDiscoveryMethod {
179*a6d42e7dSPeter Dunlap 	iSCSIDiscoveryMethodUnknown	= 0,
180*a6d42e7dSPeter Dunlap 	iSCSIDiscoveryMethodStatic	= 1,
181*a6d42e7dSPeter Dunlap 	iSCSIDiscoveryMethodSLP		= 2,
182*a6d42e7dSPeter Dunlap 	iSCSIDiscoveryMethodISNS	= 4,
183*a6d42e7dSPeter Dunlap 	iSCSIDiscoveryMethodSendTargets	= 8
184*a6d42e7dSPeter Dunlap } iSCSIDiscoveryMethod_t;
185*a6d42e7dSPeter Dunlap #define	ISCSI_ALL_DISCOVERY_METHODS	(iSCSIDiscoveryMethodStatic |	\
186*a6d42e7dSPeter Dunlap 					iSCSIDiscoveryMethodSLP |	\
187*a6d42e7dSPeter Dunlap 					iSCSIDiscoveryMethodISNS |	\
188*a6d42e7dSPeter Dunlap 					iSCSIDiscoveryMethodSendTargets)
189*a6d42e7dSPeter Dunlap 
190*a6d42e7dSPeter Dunlap /*
191*a6d42e7dSPeter Dunlap  * Before anything can be done to a target it must have an OID.
192*a6d42e7dSPeter Dunlap  */
193*a6d42e7dSPeter Dunlap typedef struct iscsi_oid {
194*a6d42e7dSPeter Dunlap 	uint32_t		o_vers;				/* In */
195*a6d42e7dSPeter Dunlap 	uchar_t			o_name[ISCSI_MAX_NAME_LEN];	/* In */
196*a6d42e7dSPeter Dunlap 	/*
197*a6d42e7dSPeter Dunlap 	 * tpgt is only 16 bits per spec.  use 32 in ioctl to reduce
198*a6d42e7dSPeter Dunlap 	 * packing issue.  Also -1 tpgt denotes default value.  iSCSI
199*a6d42e7dSPeter Dunlap 	 * stack will detemermine tpgt during login.
200*a6d42e7dSPeter Dunlap 	 */
201*a6d42e7dSPeter Dunlap 	int			o_tpgt;				/* In */
202*a6d42e7dSPeter Dunlap 	uint32_t		o_oid;				/* Out */
203*a6d42e7dSPeter Dunlap } iscsi_oid_t;
204*a6d42e7dSPeter Dunlap #define	ISCSI_OID_NOTSET	0
205*a6d42e7dSPeter Dunlap #define	ISCSI_INITIATOR_OID	1	/* Other OIDs follow > 1 */
206*a6d42e7dSPeter Dunlap #define	ISCSI_DEFAULT_TPGT	-1
207*a6d42e7dSPeter Dunlap 
208*a6d42e7dSPeter Dunlap /*
209*a6d42e7dSPeter Dunlap  * iSCSI Login Parameters - Reference iscsi draft for
210*a6d42e7dSPeter Dunlap  * definitions of the below login params.
211*a6d42e7dSPeter Dunlap  */
212*a6d42e7dSPeter Dunlap typedef struct iscsi_login_params {
213*a6d42e7dSPeter Dunlap 	boolean_t	immediate_data;
214*a6d42e7dSPeter Dunlap 	boolean_t	initial_r2t;
215*a6d42e7dSPeter Dunlap 	int		first_burst_length;	/* range: 512 - 2**24-1 */
216*a6d42e7dSPeter Dunlap 	int		max_burst_length;	/* range: 512 - 2**24-1 */
217*a6d42e7dSPeter Dunlap 	boolean_t	data_pdu_in_order;
218*a6d42e7dSPeter Dunlap 	boolean_t	data_sequence_in_order;
219*a6d42e7dSPeter Dunlap 	int		default_time_to_wait;
220*a6d42e7dSPeter Dunlap 	int		default_time_to_retain;
221*a6d42e7dSPeter Dunlap 	int		header_digest;
222*a6d42e7dSPeter Dunlap 	int		data_digest;
223*a6d42e7dSPeter Dunlap 	int		max_recv_data_seg_len;	/* range: 512 - 2**24-1 */
224*a6d42e7dSPeter Dunlap 	int		max_xmit_data_seg_len;	/* range: 512 - 2**24-1 */
225*a6d42e7dSPeter Dunlap 	int		max_connections;
226*a6d42e7dSPeter Dunlap 	int		max_outstanding_r2t;
227*a6d42e7dSPeter Dunlap 	int		error_recovery_level;
228*a6d42e7dSPeter Dunlap 	boolean_t	ifmarker;
229*a6d42e7dSPeter Dunlap 	boolean_t	ofmarker;
230*a6d42e7dSPeter Dunlap } iscsi_login_params_t;
231*a6d42e7dSPeter Dunlap 
232*a6d42e7dSPeter Dunlap /*
233*a6d42e7dSPeter Dunlap  * Once parameters have been set via ISCSI_SET_PARAM the login is initiated
234*a6d42e7dSPeter Dunlap  * by sending an ISCSI_LOGIN ioctl with the following structure filled in.
235*a6d42e7dSPeter Dunlap  */
236*a6d42e7dSPeter Dunlap typedef struct entry {
237*a6d42e7dSPeter Dunlap 	int			e_vers;
238*a6d42e7dSPeter Dunlap 	uint32_t		e_oid;
239*a6d42e7dSPeter Dunlap 	union {
240*a6d42e7dSPeter Dunlap 		struct in_addr		u_in4;
241*a6d42e7dSPeter Dunlap 		struct in6_addr		u_in6;
242*a6d42e7dSPeter Dunlap 	} e_u;
243*a6d42e7dSPeter Dunlap 	/*
244*a6d42e7dSPeter Dunlap 	 * e_insize indicates which of the previous structs is valid.
245*a6d42e7dSPeter Dunlap 	 */
246*a6d42e7dSPeter Dunlap 	int			e_insize;
247*a6d42e7dSPeter Dunlap 	int			e_port;
248*a6d42e7dSPeter Dunlap 	int			e_tpgt;
249*a6d42e7dSPeter Dunlap } entry_t;
250*a6d42e7dSPeter Dunlap 
251*a6d42e7dSPeter Dunlap /*
252*a6d42e7dSPeter Dunlap  * Used when setting or gettnig the Initiator Name or Alias.
253*a6d42e7dSPeter Dunlap  */
254*a6d42e7dSPeter Dunlap typedef struct node_name {
255*a6d42e7dSPeter Dunlap 	unsigned char		n_name[ISCSI_MAX_NAME_LEN];
256*a6d42e7dSPeter Dunlap 	int			n_len;
257*a6d42e7dSPeter Dunlap } node_name_t;
258*a6d42e7dSPeter Dunlap 
259*a6d42e7dSPeter Dunlap typedef struct	_iSCSIMinMaxValue {
260*a6d42e7dSPeter Dunlap 	uint32_t		i_current,
261*a6d42e7dSPeter Dunlap 				i_default,
262*a6d42e7dSPeter Dunlap 				i_min,
263*a6d42e7dSPeter Dunlap 				i_max,
264*a6d42e7dSPeter Dunlap 				i_incr;
265*a6d42e7dSPeter Dunlap } iscsi_int_info_t;
266*a6d42e7dSPeter Dunlap 
267*a6d42e7dSPeter Dunlap typedef struct	_iSCSIBoolValue {
268*a6d42e7dSPeter Dunlap 	boolean_t		b_current,
269*a6d42e7dSPeter Dunlap 				b_default;
270*a6d42e7dSPeter Dunlap } iscsi_bool_info_t;
271*a6d42e7dSPeter Dunlap 
272*a6d42e7dSPeter Dunlap typedef struct	_iSCSIParamValueGet {
273*a6d42e7dSPeter Dunlap 	boolean_t		v_valid,
274*a6d42e7dSPeter Dunlap 				v_settable;
275*a6d42e7dSPeter Dunlap 	iscsi_int_info_t	v_integer;
276*a6d42e7dSPeter Dunlap 	iscsi_bool_info_t	v_bool;
277*a6d42e7dSPeter Dunlap 	uchar_t			v_name[ISCSI_MAX_NAME_LEN];
278*a6d42e7dSPeter Dunlap } iscsi_get_value_t;
279*a6d42e7dSPeter Dunlap 
280*a6d42e7dSPeter Dunlap typedef struct	_iSCSILoginParamGet {
281*a6d42e7dSPeter Dunlap 	uint32_t		g_vers;				/* In */
282*a6d42e7dSPeter Dunlap 	uint32_t		g_oid;				/* In */
283*a6d42e7dSPeter Dunlap 	uint32_t		g_param;			/* Out */
284*a6d42e7dSPeter Dunlap 	iscsi_get_value_t	g_value;			/* Out */
285*a6d42e7dSPeter Dunlap 	uint32_t		g_conn_cid;			/* In */
286*a6d42e7dSPeter Dunlap 
287*a6d42e7dSPeter Dunlap 	/*
288*a6d42e7dSPeter Dunlap 	 * To indicate whether session or connection related param is
289*a6d42e7dSPeter Dunlap 	 * being requested.
290*a6d42e7dSPeter Dunlap 	 */
291*a6d42e7dSPeter Dunlap 	uint32_t		g_param_type;			/* In */
292*a6d42e7dSPeter Dunlap } iscsi_param_get_t;
293*a6d42e7dSPeter Dunlap 
294*a6d42e7dSPeter Dunlap typedef struct	iscsi_set_value {
295*a6d42e7dSPeter Dunlap 	uint32_t		v_integer;
296*a6d42e7dSPeter Dunlap 	boolean_t		v_bool;
297*a6d42e7dSPeter Dunlap 	uchar_t			v_name[ISCSI_MAX_NAME_LEN];
298*a6d42e7dSPeter Dunlap } iscsi_set_value_t;
299*a6d42e7dSPeter Dunlap 
300*a6d42e7dSPeter Dunlap /*
301*a6d42e7dSPeter Dunlap  * All of the members of this structure are set by the user agent and
302*a6d42e7dSPeter Dunlap  * consumed by the driver.
303*a6d42e7dSPeter Dunlap  */
304*a6d42e7dSPeter Dunlap typedef struct	iSCSILoginParamSet {
305*a6d42e7dSPeter Dunlap 	uint32_t		s_vers,
306*a6d42e7dSPeter Dunlap 				s_oid;
307*a6d42e7dSPeter Dunlap 	uint32_t		s_param;
308*a6d42e7dSPeter Dunlap 	iscsi_set_value_t	s_value;
309*a6d42e7dSPeter Dunlap } iscsi_param_set_t;
310*a6d42e7dSPeter Dunlap 
311*a6d42e7dSPeter Dunlap /*
312*a6d42e7dSPeter Dunlap  * Data in this structure is set by the user agent and consumed by
313*a6d42e7dSPeter Dunlap  * the driver.
314*a6d42e7dSPeter Dunlap  */
315*a6d42e7dSPeter Dunlap typedef struct chap_props {
316*a6d42e7dSPeter Dunlap 	uint32_t		c_vers,
317*a6d42e7dSPeter Dunlap 				c_retries,
318*a6d42e7dSPeter Dunlap 				c_oid;
319*a6d42e7dSPeter Dunlap 	unsigned char		c_user[128];
320*a6d42e7dSPeter Dunlap 	uint32_t		c_user_len;
321*a6d42e7dSPeter Dunlap 	unsigned char		c_secret[16];
322*a6d42e7dSPeter Dunlap 	uint32_t		c_secret_len;
323*a6d42e7dSPeter Dunlap } iscsi_chap_props_t;
324*a6d42e7dSPeter Dunlap 
325*a6d42e7dSPeter Dunlap typedef enum	authMethod {
326*a6d42e7dSPeter Dunlap 	authMethodNone  = 0x00,
327*a6d42e7dSPeter Dunlap 	authMethodCHAP  = 0x01,
328*a6d42e7dSPeter Dunlap 	authMethodSRP   = 0x02,
329*a6d42e7dSPeter Dunlap 	authMethodKRB5  = 0x04,
330*a6d42e7dSPeter Dunlap 	authMethodSPKM1 = 0x08,
331*a6d42e7dSPeter Dunlap 	authMethodSPKM2 = 0x10
332*a6d42e7dSPeter Dunlap } authMethod_t;
333*a6d42e7dSPeter Dunlap 
334*a6d42e7dSPeter Dunlap /*
335*a6d42e7dSPeter Dunlap  * Data in this structure is set by the user agent and consumed by
336*a6d42e7dSPeter Dunlap  * the driver.
337*a6d42e7dSPeter Dunlap  */
338*a6d42e7dSPeter Dunlap typedef struct auth_props {
339*a6d42e7dSPeter Dunlap 	uint32_t a_vers;
340*a6d42e7dSPeter Dunlap 	uint32_t a_oid;
341*a6d42e7dSPeter Dunlap 	boolean_t a_bi_auth;
342*a6d42e7dSPeter Dunlap 	authMethod_t a_auth_method;
343*a6d42e7dSPeter Dunlap } iscsi_auth_props_t;
344*a6d42e7dSPeter Dunlap 
345*a6d42e7dSPeter Dunlap /*
346*a6d42e7dSPeter Dunlap  * Data in this structure is set by the user agent and consumed by
347*a6d42e7dSPeter Dunlap  * the driver.
348*a6d42e7dSPeter Dunlap  */
349*a6d42e7dSPeter Dunlap #define	MAX_RAD_SHARED_SECRET_LEN 128
350*a6d42e7dSPeter Dunlap typedef struct radius_props {
351*a6d42e7dSPeter Dunlap 	uint32_t		r_vers;
352*a6d42e7dSPeter Dunlap 	uint32_t		r_oid;
353*a6d42e7dSPeter Dunlap 	union {
354*a6d42e7dSPeter Dunlap 		struct in_addr		u_in4;
355*a6d42e7dSPeter Dunlap 		struct in6_addr		u_in6;
356*a6d42e7dSPeter Dunlap 	} r_addr;
357*a6d42e7dSPeter Dunlap 	/*
358*a6d42e7dSPeter Dunlap 	 * r_insize indicates which of the previous structs is valid.
359*a6d42e7dSPeter Dunlap 	 */
360*a6d42e7dSPeter Dunlap 	int			r_insize;
361*a6d42e7dSPeter Dunlap 
362*a6d42e7dSPeter Dunlap 	uint32_t		r_port;
363*a6d42e7dSPeter Dunlap 	uint8_t			r_shared_secret[MAX_RAD_SHARED_SECRET_LEN];
364*a6d42e7dSPeter Dunlap 	boolean_t		r_radius_access;
365*a6d42e7dSPeter Dunlap 	boolean_t		r_radius_config_valid;
366*a6d42e7dSPeter Dunlap 	uint32_t		r_shared_secret_len;
367*a6d42e7dSPeter Dunlap } iscsi_radius_props_t;
368*a6d42e7dSPeter Dunlap 
369*a6d42e7dSPeter Dunlap typedef struct	_IPAddress {
370*a6d42e7dSPeter Dunlap 	union {
371*a6d42e7dSPeter Dunlap 		struct in_addr	in4;
372*a6d42e7dSPeter Dunlap 		struct in6_addr	in6;
373*a6d42e7dSPeter Dunlap 	} i_addr;
374*a6d42e7dSPeter Dunlap 	/* i_insize determines which is valid in the union above */
375*a6d42e7dSPeter Dunlap 	int			i_insize;
376*a6d42e7dSPeter Dunlap } iscsi_ipaddr_t;
377*a6d42e7dSPeter Dunlap 
378*a6d42e7dSPeter Dunlap typedef struct	_iSCSITargetAddressKey {
379*a6d42e7dSPeter Dunlap 	iscsi_ipaddr_t		a_addr;
380*a6d42e7dSPeter Dunlap 	uint32_t		a_port,
381*a6d42e7dSPeter Dunlap 				a_oid;
382*a6d42e7dSPeter Dunlap } iscsi_addr_t;
383*a6d42e7dSPeter Dunlap 
384*a6d42e7dSPeter Dunlap typedef struct	_iSCSITargetAddressKeyProperties {
385*a6d42e7dSPeter Dunlap 	uint32_t		al_vers,			/* In */
386*a6d42e7dSPeter Dunlap 				al_oid;				/* In */
387*a6d42e7dSPeter Dunlap 	uint32_t		al_in_cnt;			/* In */
388*a6d42e7dSPeter Dunlap 	uint32_t		al_out_cnt;			/* Out */
389*a6d42e7dSPeter Dunlap 	uint32_t		al_tpgt;			/* Out */
390*a6d42e7dSPeter Dunlap 	iscsi_addr_t		al_addrs[1];			/* Out */
391*a6d42e7dSPeter Dunlap } iscsi_addr_list_t;
392*a6d42e7dSPeter Dunlap 
393*a6d42e7dSPeter Dunlap typedef struct	_iSCSITargetProperties {
394*a6d42e7dSPeter Dunlap 	uint32_t		p_vers,				/* In */
395*a6d42e7dSPeter Dunlap 				p_oid;				/* In */
396*a6d42e7dSPeter Dunlap 	uchar_t			p_name[ISCSI_MAX_NAME_LEN];	/* Out */
397*a6d42e7dSPeter Dunlap 	uint_t			p_name_len;			/* Out */
398*a6d42e7dSPeter Dunlap 	uchar_t			p_alias[ISCSI_MAX_NAME_LEN];	/* Out */
399*a6d42e7dSPeter Dunlap 	uint_t			p_alias_len;			/* Out */
400*a6d42e7dSPeter Dunlap 	iSCSIDiscoveryMethod_t	p_discovery;			/* Out */
401*a6d42e7dSPeter Dunlap 	boolean_t		p_connected;			/* Out */
402*a6d42e7dSPeter Dunlap 	uint32_t		p_num_of_connections;		/* Out */
403*a6d42e7dSPeter Dunlap 	/* ---- If connected == B_TRUE then lastErr has no meaning. ---- */
404*a6d42e7dSPeter Dunlap 	iscsi_error_t		p_last_err;			/* Out */
405*a6d42e7dSPeter Dunlap 	/*
406*a6d42e7dSPeter Dunlap 	 * Target portal group tag = -1 value means default.
407*a6d42e7dSPeter Dunlap 	 */
408*a6d42e7dSPeter Dunlap 	int			p_tpgt_conf;			/* Out */
409*a6d42e7dSPeter Dunlap 	int			p_tpgt_nego;			/* Out */
410*a6d42e7dSPeter Dunlap 	uchar_t			p_isid[ISCSI_ISID_LEN];		/* Out */
411*a6d42e7dSPeter Dunlap 	uchar_t			p_reserved[128];
412*a6d42e7dSPeter Dunlap } iscsi_property_t;
413*a6d42e7dSPeter Dunlap 
414*a6d42e7dSPeter Dunlap typedef struct	_iSCSITargetDeviceList {
415*a6d42e7dSPeter Dunlap 	uint32_t		tl_vers,			/* In */
416*a6d42e7dSPeter Dunlap 				tl_in_cnt,			/* In */
417*a6d42e7dSPeter Dunlap 				tl_tgt_list_type,		/* In */
418*a6d42e7dSPeter Dunlap 				tl_out_cnt,			/* Out */
419*a6d42e7dSPeter Dunlap 				tl_oid_list[1];			/* Out */
420*a6d42e7dSPeter Dunlap } iscsi_target_list_t;
421*a6d42e7dSPeter Dunlap 
422*a6d42e7dSPeter Dunlap typedef struct	_iSCSIStaticTargetProperties {
423*a6d42e7dSPeter Dunlap 	uint32_t		p_vers,				/* In */
424*a6d42e7dSPeter Dunlap 				p_oid;				/* In */
425*a6d42e7dSPeter Dunlap 	uchar_t			p_name[ISCSI_MAX_NAME_LEN];	/* Out */
426*a6d42e7dSPeter Dunlap 	uint_t			p_name_len;			/* Out */
427*a6d42e7dSPeter Dunlap 	iscsi_addr_list_t	p_addr_list;			/* Out */
428*a6d42e7dSPeter Dunlap } iscsi_static_property_t;
429*a6d42e7dSPeter Dunlap 
430*a6d42e7dSPeter Dunlap typedef enum iscsi_lun_status {
431*a6d42e7dSPeter Dunlap 	LunValid, LunDoesNotExist
432*a6d42e7dSPeter Dunlap } iscsi_lun_status_t;
433*a6d42e7dSPeter Dunlap 
434*a6d42e7dSPeter Dunlap /*
435*a6d42e7dSPeter Dunlap  * SCSI inquiry vendor and product identifier buffer length - these values are
436*a6d42e7dSPeter Dunlap  * defined by the identifier length plus 1 byte for the
437*a6d42e7dSPeter Dunlap  * null termination.
438*a6d42e7dSPeter Dunlap  */
439*a6d42e7dSPeter Dunlap #define	ISCSI_INQ_VID_BUF_LEN		9	/* 8 byte ID */
440*a6d42e7dSPeter Dunlap #define	ISCSI_INQ_PID_BUF_LEN		17	/* 16 byte ID */
441*a6d42e7dSPeter Dunlap 
442*a6d42e7dSPeter Dunlap typedef struct iscsi_lun_props {
443*a6d42e7dSPeter Dunlap 	uint32_t		lp_vers,			/* In */
444*a6d42e7dSPeter Dunlap 				lp_tgt_oid,			/* In */
445*a6d42e7dSPeter Dunlap 				lp_oid,				/* In */
446*a6d42e7dSPeter Dunlap 				lp_num,				/* Out */
447*a6d42e7dSPeter Dunlap 				lp_status;			/* Out */
448*a6d42e7dSPeter Dunlap 	char			lp_pathname[MAXPATHLEN],	/* Out */
449*a6d42e7dSPeter Dunlap 				lp_vid[ISCSI_INQ_VID_BUF_LEN],	/* Out */
450*a6d42e7dSPeter Dunlap 				lp_pid[ISCSI_INQ_PID_BUF_LEN];	/* Out */
451*a6d42e7dSPeter Dunlap 	time_t			lp_time_online;			/* Out */
452*a6d42e7dSPeter Dunlap } iscsi_lun_props_t;
453*a6d42e7dSPeter Dunlap 
454*a6d42e7dSPeter Dunlap typedef struct iscsi_if_lun {
455*a6d42e7dSPeter Dunlap 	uint32_t		l_tgt_oid,
456*a6d42e7dSPeter Dunlap 				l_oid,
457*a6d42e7dSPeter Dunlap 				l_num;
458*a6d42e7dSPeter Dunlap } iscsi_if_lun_t;
459*a6d42e7dSPeter Dunlap 
460*a6d42e7dSPeter Dunlap typedef struct iscsi_lun_list {
461*a6d42e7dSPeter Dunlap 	uint32_t		ll_vers;			/* In */
462*a6d42e7dSPeter Dunlap 	boolean_t		ll_all_tgts;			/* In */
463*a6d42e7dSPeter Dunlap 	uint32_t		ll_tgt_oid,			/* In */
464*a6d42e7dSPeter Dunlap 				ll_in_cnt,			/* In */
465*a6d42e7dSPeter Dunlap 				ll_out_cnt;			/* Out */
466*a6d42e7dSPeter Dunlap 	iscsi_if_lun_t		ll_luns[1];			/* Out */
467*a6d42e7dSPeter Dunlap } iscsi_lun_list_t;
468*a6d42e7dSPeter Dunlap 
469*a6d42e7dSPeter Dunlap typedef struct iscsi_conn_props {
470*a6d42e7dSPeter Dunlap 	uint32_t		cp_vers,			/* In */
471*a6d42e7dSPeter Dunlap 				cp_oid,				/* In */
472*a6d42e7dSPeter Dunlap 				cp_cid,				/* In */
473*a6d42e7dSPeter Dunlap 				cp_sess_oid;			/* In */
474*a6d42e7dSPeter Dunlap 	union {
475*a6d42e7dSPeter Dunlap 		struct	sockaddr_in	soa4;
476*a6d42e7dSPeter Dunlap 		struct	sockaddr_in6	soa6;
477*a6d42e7dSPeter Dunlap 	} cp_local;						/* Out */
478*a6d42e7dSPeter Dunlap 	union {
479*a6d42e7dSPeter Dunlap 		struct	sockaddr_in	soa4;
480*a6d42e7dSPeter Dunlap 		struct	sockaddr_in6	soa6;
481*a6d42e7dSPeter Dunlap 	} cp_peer;						/* Out */
482*a6d42e7dSPeter Dunlap 
483*a6d42e7dSPeter Dunlap 
484*a6d42e7dSPeter Dunlap 	iscsi_login_params_t 	cp_params;
485*a6d42e7dSPeter Dunlap 	boolean_t 		cp_params_valid;
486*a6d42e7dSPeter Dunlap 
487*a6d42e7dSPeter Dunlap } iscsi_conn_props_t;
488*a6d42e7dSPeter Dunlap 
489*a6d42e7dSPeter Dunlap typedef struct iscsi_if_conn {
490*a6d42e7dSPeter Dunlap 	uint32_t		c_sess_oid,
491*a6d42e7dSPeter Dunlap 				c_oid,
492*a6d42e7dSPeter Dunlap 				c_cid;
493*a6d42e7dSPeter Dunlap } iscsi_if_conn_t;
494*a6d42e7dSPeter Dunlap 
495*a6d42e7dSPeter Dunlap typedef struct iscsi_conn_list {
496*a6d42e7dSPeter Dunlap 	uint32_t		cl_vers;			/* In */
497*a6d42e7dSPeter Dunlap 	boolean_t		cl_all_sess;			/* In */
498*a6d42e7dSPeter Dunlap 	uint32_t		cl_sess_oid,			/* In */
499*a6d42e7dSPeter Dunlap 				cl_in_cnt,			/* In */
500*a6d42e7dSPeter Dunlap 				cl_out_cnt;			/* Out */
501*a6d42e7dSPeter Dunlap 	iscsi_if_conn_t		cl_list[1];			/* Out */
502*a6d42e7dSPeter Dunlap } iscsi_conn_list_t;
503*a6d42e7dSPeter Dunlap 
504*a6d42e7dSPeter Dunlap typedef enum iSNSDiscoveryMethod {
505*a6d42e7dSPeter Dunlap 	iSNSDiscoveryMethodStatic	= 0,
506*a6d42e7dSPeter Dunlap 	iSNSDiscoveryMethodDHCP		= 1,
507*a6d42e7dSPeter Dunlap 	iSNSDiscoveryMethodSLP		= 2
508*a6d42e7dSPeter Dunlap } isns_method_t;
509*a6d42e7dSPeter Dunlap 
510*a6d42e7dSPeter Dunlap typedef struct iSCSIDiscoveryProperties {
511*a6d42e7dSPeter Dunlap 	uint32_t		vers;
512*a6d42e7dSPeter Dunlap 	boolean_t		iSNSDiscoverySettable;
513*a6d42e7dSPeter Dunlap 	boolean_t		iSNSDiscoveryEnabled;
514*a6d42e7dSPeter Dunlap 	isns_method_t		iSNSDiscoveryMethod;
515*a6d42e7dSPeter Dunlap 	unsigned char		iSNSDomainName[256];
516*a6d42e7dSPeter Dunlap 	boolean_t		SLPDiscoverySettable;
517*a6d42e7dSPeter Dunlap 	boolean_t		SLPDiscoveryEnabled;
518*a6d42e7dSPeter Dunlap 	boolean_t		StaticDiscoverySettable;
519*a6d42e7dSPeter Dunlap 	boolean_t		StaticDiscoveryEnabled;
520*a6d42e7dSPeter Dunlap 	boolean_t		SendTargetsDiscoverySettable;
521*a6d42e7dSPeter Dunlap 	boolean_t		SendTargetsDiscoveryEnabled;
522*a6d42e7dSPeter Dunlap } iSCSIDiscoveryProperties_t;
523*a6d42e7dSPeter Dunlap 
524*a6d42e7dSPeter Dunlap typedef struct iscsi_uscsi {
525*a6d42e7dSPeter Dunlap 	uint32_t		iu_vers;
526*a6d42e7dSPeter Dunlap 	uint32_t		iu_oid;
527*a6d42e7dSPeter Dunlap 	int			iu_tpgt;
528*a6d42e7dSPeter Dunlap 	uint32_t		iu_len;
529*a6d42e7dSPeter Dunlap 	uint32_t		iu_lun;
530*a6d42e7dSPeter Dunlap 	struct uscsi_cmd	iu_ucmd;
531*a6d42e7dSPeter Dunlap } iscsi_uscsi_t;
532*a6d42e7dSPeter Dunlap 
533*a6d42e7dSPeter Dunlap #if defined(_SYSCALL32)
534*a6d42e7dSPeter Dunlap typedef struct iscsi_uscsi32 {
535*a6d42e7dSPeter Dunlap 	uint32_t		iu_vers;
536*a6d42e7dSPeter Dunlap 	uint32_t		iu_oid;
537*a6d42e7dSPeter Dunlap 	int			iu_tpgt;
538*a6d42e7dSPeter Dunlap 	uint32_t		iu_len;
539*a6d42e7dSPeter Dunlap 	uint32_t		iu_lun;
540*a6d42e7dSPeter Dunlap 	struct uscsi_cmd32	iu_ucmd;
541*a6d42e7dSPeter Dunlap } iscsi_uscsi32_t;
542*a6d42e7dSPeter Dunlap #endif /* _SYSCALL32 */
543*a6d42e7dSPeter Dunlap 
544*a6d42e7dSPeter Dunlap typedef struct iscsi_sendtgts_entry {
545*a6d42e7dSPeter Dunlap 	/* ---- Node name, NULL terminated UTF-8 string ---- */
546*a6d42e7dSPeter Dunlap 	uchar_t			ste_name[ISCSI_MAX_NAME_LEN];
547*a6d42e7dSPeter Dunlap 
548*a6d42e7dSPeter Dunlap 	iscsi_addr_t		ste_ipaddr;
549*a6d42e7dSPeter Dunlap 	int			ste_tpgt;
550*a6d42e7dSPeter Dunlap } iscsi_sendtgts_entry_t;
551*a6d42e7dSPeter Dunlap 
552*a6d42e7dSPeter Dunlap typedef struct iscsi_sendtgts_list {
553*a6d42e7dSPeter Dunlap 	entry_t			stl_entry;			/* In */
554*a6d42e7dSPeter Dunlap 	uint32_t		stl_in_cnt,			/* In */
555*a6d42e7dSPeter Dunlap 				stl_out_cnt;			/* Out */
556*a6d42e7dSPeter Dunlap 	iscsi_sendtgts_entry_t	stl_list[1];			/* Out */
557*a6d42e7dSPeter Dunlap } iscsi_sendtgts_list_t;
558*a6d42e7dSPeter Dunlap 
559*a6d42e7dSPeter Dunlap typedef struct iscsi_statictgt_entry {
560*a6d42e7dSPeter Dunlap 	entry_t			te_entry;			/* In */
561*a6d42e7dSPeter Dunlap 	uchar_t			te_name[ISCSI_MAX_NAME_LEN];	/* In */
562*a6d42e7dSPeter Dunlap } iscsi_target_entry_t;
563*a6d42e7dSPeter Dunlap 
564*a6d42e7dSPeter Dunlap /* iSNS Draft - section 4.1.1. */
565*a6d42e7dSPeter Dunlap typedef struct isns_portal_group {
566*a6d42e7dSPeter Dunlap 	uint8_t pg_iscsi_name[ISCSI_MAX_NAME_LEN];
567*a6d42e7dSPeter Dunlap 	union {
568*a6d42e7dSPeter Dunlap 		in_addr_t	u_ip4;
569*a6d42e7dSPeter Dunlap 		in6_addr_t	u_ip6;
570*a6d42e7dSPeter Dunlap 	} pg_ip_addr;
571*a6d42e7dSPeter Dunlap 	int	insize;
572*a6d42e7dSPeter Dunlap 
573*a6d42e7dSPeter Dunlap 	in_port_t pg_port;
574*a6d42e7dSPeter Dunlap 	uint16_t pg_tag;
575*a6d42e7dSPeter Dunlap 
576*a6d42e7dSPeter Dunlap 	iscsi_ipaddr_t	isns_server_ip;
577*a6d42e7dSPeter Dunlap 	uint32_t	isns_server_port;
578*a6d42e7dSPeter Dunlap } isns_portal_group_t;
579*a6d42e7dSPeter Dunlap 
580*a6d42e7dSPeter Dunlap typedef struct isns_portal_group_list {
581*a6d42e7dSPeter Dunlap 	uint32_t		pg_in_cnt,
582*a6d42e7dSPeter Dunlap 				pg_out_cnt;
583*a6d42e7dSPeter Dunlap 	isns_portal_group_t	pg_list[1];
584*a6d42e7dSPeter Dunlap } isns_portal_group_list_t;
585*a6d42e7dSPeter Dunlap 
586*a6d42e7dSPeter Dunlap typedef struct isns_server_portal_group_list {
587*a6d42e7dSPeter Dunlap 	iscsi_addr_t		    addr;
588*a6d42e7dSPeter Dunlap 	isns_portal_group_list_t    addr_port_list;
589*a6d42e7dSPeter Dunlap } isns_server_portal_group_list_t;
590*a6d42e7dSPeter Dunlap 
591*a6d42e7dSPeter Dunlap #define	ISCSI_MIN_CONFIG_SESSIONS	1
592*a6d42e7dSPeter Dunlap /* lowered max config sessions due to ct_power_cnt >= 0 assert */
593*a6d42e7dSPeter Dunlap #define	ISCSI_MAX_CONFIG_SESSIONS	4
594*a6d42e7dSPeter Dunlap 
595*a6d42e7dSPeter Dunlap typedef struct iscsi_config_sess {
596*a6d42e7dSPeter Dunlap 	uint32_t	ics_ver;
597*a6d42e7dSPeter Dunlap 	uint32_t	ics_oid;
598*a6d42e7dSPeter Dunlap 	boolean_t	ics_bound;
599*a6d42e7dSPeter Dunlap 	uint_t		ics_in;
600*a6d42e7dSPeter Dunlap 	uint_t		ics_out;
601*a6d42e7dSPeter Dunlap 	iscsi_ipaddr_t	ics_bindings[1];
602*a6d42e7dSPeter Dunlap } iscsi_config_sess_t;
603*a6d42e7dSPeter Dunlap 
604*a6d42e7dSPeter Dunlap #define	ISCSI_SESSION_CONFIG_SIZE(SIZE)		\
605*a6d42e7dSPeter Dunlap 	(sizeof (iscsi_config_sess_t) +		\
606*a6d42e7dSPeter Dunlap 	((SIZE - 1) * sizeof (iscsi_ipaddr_t)))
607*a6d42e7dSPeter Dunlap 
608*a6d42e7dSPeter Dunlap /*
609*a6d42e7dSPeter Dunlap  * Event class and subclass information
610*a6d42e7dSPeter Dunlap  */
611*a6d42e7dSPeter Dunlap #define	EC_ISCSI			"EC_iSCSI"
612*a6d42e7dSPeter Dunlap #define	ESC_ISCSI_STATIC_START		"ESC_static_start"
613*a6d42e7dSPeter Dunlap #define	ESC_ISCSI_STATIC_END		"ESC_static_end"
614*a6d42e7dSPeter Dunlap #define	ESC_ISCSI_SEND_TARGETS_START	"ESC_send_targets_start"
615*a6d42e7dSPeter Dunlap #define	ESC_ISCSI_SEND_TARGETS_END	"ESC_send_targets_end"
616*a6d42e7dSPeter Dunlap #define	ESC_ISCSI_SLP_START		"ESC_slp_start"
617*a6d42e7dSPeter Dunlap #define	ESC_ISCSI_SLP_END		"ESC_slp_end"
618*a6d42e7dSPeter Dunlap #define	ESC_ISCSI_ISNS_START		"ESC_isns_start"
619*a6d42e7dSPeter Dunlap #define	ESC_ISCSI_ISNS_END		"ESC_isns_end"
620*a6d42e7dSPeter Dunlap #define	ESC_ISCSI_PROP_CHANGE		"ESC_prop_change"
621*a6d42e7dSPeter Dunlap 
622*a6d42e7dSPeter Dunlap #ifdef _KERNEL
623*a6d42e7dSPeter Dunlap /* ---- iscsi_utils.c ---- */
624*a6d42e7dSPeter Dunlap extern int		iscsid_open(char *, int, int);
625*a6d42e7dSPeter Dunlap extern int		iscsid_close(int);
626*a6d42e7dSPeter Dunlap extern int		iscsid_remove(char *filename);
627*a6d42e7dSPeter Dunlap extern int		iscsid_rename(char *oldname, char *newname);
628*a6d42e7dSPeter Dunlap extern ssize_t		iscsid_write(int, void *, ssize_t);
629*a6d42e7dSPeter Dunlap extern ssize_t		iscsid_read(int, void *, ssize_t);
630*a6d42e7dSPeter Dunlap extern ssize_t		iscsid_sendto(struct sonode *, void *, size_t,
631*a6d42e7dSPeter Dunlap     struct sockaddr *, socklen_t);
632*a6d42e7dSPeter Dunlap extern ssize_t		iscsid_recvfrom(struct sonode *, void *buffer,
633*a6d42e7dSPeter Dunlap     size_t len);
634*a6d42e7dSPeter Dunlap extern int		iscsid_errno;
635*a6d42e7dSPeter Dunlap #endif
636*a6d42e7dSPeter Dunlap 
637*a6d42e7dSPeter Dunlap /*
638*a6d42e7dSPeter Dunlap  * Function prototypes for those routines found in the common code
639*a6d42e7dSPeter Dunlap  */
640*a6d42e7dSPeter Dunlap /* ---- utils.c ---- */
641*a6d42e7dSPeter Dunlap extern boolean_t	utils_iqn_create(char *, int);
642*a6d42e7dSPeter Dunlap extern char		*prt_bitmap(int, char *, char *, int);
643*a6d42e7dSPeter Dunlap extern char		*utils_map_param(int);
644*a6d42e7dSPeter Dunlap extern boolean_t	parse_addr_port_tpgt(char *in, char **addr,
645*a6d42e7dSPeter Dunlap 			    int *type, char **port, char **tpgt);
646*a6d42e7dSPeter Dunlap 
647*a6d42e7dSPeter Dunlap #ifdef __cplusplus
648*a6d42e7dSPeter Dunlap }
649*a6d42e7dSPeter Dunlap #endif
650*a6d42e7dSPeter Dunlap 
651*a6d42e7dSPeter Dunlap #endif /* _ISCSI_IF_H */