xref: /titanic_51/usr/src/lib/libsun_ima/common/ima.c (revision 2c2d21e98a95cba5687ec6574c974a5c6c4a6adb)
1fcf3ce44SJohn Forte /*
2fcf3ce44SJohn Forte  * CDDL HEADER START
3fcf3ce44SJohn Forte  *
4fcf3ce44SJohn Forte  * The contents of this file are subject to the terms of the
5fcf3ce44SJohn Forte  * Common Development and Distribution License (the "License").
6fcf3ce44SJohn Forte  * You may not use this file except in compliance with the License.
7fcf3ce44SJohn Forte  *
8fcf3ce44SJohn Forte  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9fcf3ce44SJohn Forte  * or http://www.opensolaris.org/os/licensing.
10fcf3ce44SJohn Forte  * See the License for the specific language governing permissions
11fcf3ce44SJohn Forte  * and limitations under the License.
12fcf3ce44SJohn Forte  *
13fcf3ce44SJohn Forte  * When distributing Covered Code, include this CDDL HEADER in each
14fcf3ce44SJohn Forte  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15fcf3ce44SJohn Forte  * If applicable, add the following below this CDDL HEADER, with the
16fcf3ce44SJohn Forte  * fields enclosed by brackets "[]" replaced with your own identifying
17fcf3ce44SJohn Forte  * information: Portions Copyright [yyyy] [name of copyright owner]
18fcf3ce44SJohn Forte  *
19fcf3ce44SJohn Forte  * CDDL HEADER END
20fcf3ce44SJohn Forte  */
21fcf3ce44SJohn Forte /*
221a1a84a3SPeter Dunlap  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23fcf3ce44SJohn Forte  * Use is subject to license terms.
24fcf3ce44SJohn Forte  */
25fcf3ce44SJohn Forte 
26fcf3ce44SJohn Forte #include <arpa/inet.h>
27fcf3ce44SJohn Forte #include <sys/socket.h>
28fcf3ce44SJohn Forte #include <sys/types.h>
29fcf3ce44SJohn Forte #include <stdarg.h>
30fcf3ce44SJohn Forte #include <stdlib.h>
31fcf3ce44SJohn Forte #include <string.h>
32fcf3ce44SJohn Forte #include <strings.h>
33fcf3ce44SJohn Forte #include <unistd.h>
34fcf3ce44SJohn Forte #include <syslog.h>
35fcf3ce44SJohn Forte #include <errno.h>
36fcf3ce44SJohn Forte #include <wchar.h>
37fcf3ce44SJohn Forte #include <widec.h>
38fcf3ce44SJohn Forte #include <libsysevent.h>
39fcf3ce44SJohn Forte #include <sys/nvpair.h>
40fcf3ce44SJohn Forte #include <fcntl.h>
41fcf3ce44SJohn Forte #include <stdio.h>
42fcf3ce44SJohn Forte #include <time.h>
43fcf3ce44SJohn Forte #include <libdevinfo.h>
44146832dbSMilos Muzik #include <sys/scsi/generic/commands.h>
45146832dbSMilos Muzik #include <sys/scsi/generic/status.h>
46fcf3ce44SJohn Forte #include <sys/scsi/adapters/iscsi_if.h>
471a1a84a3SPeter Dunlap #include <sys/iscsi_protocol.h>
48fcf3ce44SJohn Forte #include <ima.h>
49aff4bce5Syi zhang - Sun Microsystems - Beijing China #include <libsun_ima.h>
50fcf3ce44SJohn Forte 
51fcf3ce44SJohn Forte #define	LIBRARY_PROPERTY_IMPLEMENTATION_VERSION	L"1.0.0"
52fcf3ce44SJohn Forte #define	LIBRARY_PROPERTY_VENDOR			L"Sun Microsystems, Inc."
53fcf3ce44SJohn Forte #define	OS_DEVICE_NAME 				"/devices/iscsi"
54fcf3ce44SJohn Forte #define	LIBRARY_FILE_NAME			L"libsun_ima.so"
55fcf3ce44SJohn Forte 
56fcf3ce44SJohn Forte #define	OS_DEVICE_NAME_LEN		256
57fcf3ce44SJohn Forte #define	USCSI_TIMEOUT_IN_SEC		10
58fcf3ce44SJohn Forte #define	MAX_AUTHMETHODS			10
59fcf3ce44SJohn Forte #define	NUM_SUPPORTED_AUTH_METHODS	2
60fcf3ce44SJohn Forte #define	SUN_IMA_MAX_DIGEST_ALGORITHMS	2	/* NONE and CRC 32 */
61fcf3ce44SJohn Forte #define	SUN_IMA_IP_ADDRESS_LEN		256
62fcf3ce44SJohn Forte #define	SUN_IMA_IP_PORT_LEN		64
63fcf3ce44SJohn Forte #define	SUN_IMA_MAX_RADIUS_SECRET_LEN	128
64aff4bce5Syi zhang - Sun Microsystems - Beijing China #define	MAX_LONG_LONG_STRING_LEN	10
65146832dbSMilos Muzik #define	MAX_INQUIRY_BUFFER_LEN		0xffff
66146832dbSMilos Muzik #define	MAX_REPORT_LUNS_BUFFER_LEN	0xffffffff
67146832dbSMilos Muzik #define	MAX_READ_CAPACITY16_BUFFER_LEN	0xffffffff
68fcf3ce44SJohn Forte 
69fcf3ce44SJohn Forte /* Forward declaration */
70fcf3ce44SJohn Forte #define	BOOL_PARAM			1
71fcf3ce44SJohn Forte #define	MIN_MAX_PARAM			2
72fcf3ce44SJohn Forte 
73fcf3ce44SJohn Forte /* OK */
74fcf3ce44SJohn Forte #define	DISC_ADDR_OK			0
75fcf3ce44SJohn Forte /* Incorrect IP address */
76fcf3ce44SJohn Forte #define	DISC_ADDR_INTEGRITY_ERROR   	1
77fcf3ce44SJohn Forte /* Error converting text IP address to numeric binary form */
78fcf3ce44SJohn Forte #define	DISC_ADDR_IP_CONV_ERROR		2
79fcf3ce44SJohn Forte 
80fcf3ce44SJohn Forte /* Currently not defined in  IMA_TARGET_DISCOVERY_METHOD enum */
81fcf3ce44SJohn Forte #define	IMA_TARGET_DISCOVERY_METHOD_UNKNOWN  0
82fcf3ce44SJohn Forte 
83fcf3ce44SJohn Forte static IMA_OID		lhbaObjectId;
84fcf3ce44SJohn Forte static IMA_UINT32	pluginOwnerId;
85fcf3ce44SJohn Forte static sysevent_handle_t *shp;
86fcf3ce44SJohn Forte 
87fcf3ce44SJohn Forte 
88fcf3ce44SJohn Forte 
89fcf3ce44SJohn Forte /*
90fcf3ce44SJohn Forte  * Custom struct to allow tgpt to be specified.
91fcf3ce44SJohn Forte  */
92fcf3ce44SJohn Forte typedef struct _SUN_IMA_DISC_ADDRESS_KEY
93fcf3ce44SJohn Forte {
94fcf3ce44SJohn Forte 	IMA_NODE_NAME name;
95fcf3ce44SJohn Forte 	IMA_ADDRESS_KEY	address;
96fcf3ce44SJohn Forte 	IMA_UINT16 tpgt;
97fcf3ce44SJohn Forte } SUN_IMA_DISC_ADDRESS_KEY;
98fcf3ce44SJohn Forte 
99fcf3ce44SJohn Forte /*
100fcf3ce44SJohn Forte  * Custom struct to allow tgpt to be specified.
101fcf3ce44SJohn Forte  */
102fcf3ce44SJohn Forte typedef struct _SUN_IMA_DISC_ADDRESS_KEY_PROPERTIES
103fcf3ce44SJohn Forte {
104fcf3ce44SJohn Forte 	IMA_UINT keyCount;
105fcf3ce44SJohn Forte 	SUN_IMA_DISC_ADDRESS_KEY keys[1];
106fcf3ce44SJohn Forte } SUN_IMA_DISC_ADDRESS_KEY_PROPERTIES;
107fcf3ce44SJohn Forte 
108fcf3ce44SJohn Forte /*
109fcf3ce44SJohn Forte  * Custom struct to allow tgpt to be specified.
110fcf3ce44SJohn Forte  */
111fcf3ce44SJohn Forte typedef struct _SUN_IMA_DISC_ADDR_PROP_LIST
112fcf3ce44SJohn Forte {
113fcf3ce44SJohn Forte 	IMA_UINT discAddrCount;
114fcf3ce44SJohn Forte 	IMA_DISCOVERY_ADDRESS_PROPERTIES props[1];
115fcf3ce44SJohn Forte } SUN_IMA_DISC_ADDR_PROP_LIST;
116fcf3ce44SJohn Forte 
117fcf3ce44SJohn Forte 
118fcf3ce44SJohn Forte static IMA_OBJECT_VISIBILITY_FN pObjectVisibilityCallback = NULL;
119fcf3ce44SJohn Forte static IMA_OBJECT_PROPERTY_FN pObjectPropertyCallback = NULL;
120fcf3ce44SJohn Forte 
121fcf3ce44SJohn Forte static IMA_STATUS getISCSINodeParameter(int paramType, IMA_OID *oid,
122fcf3ce44SJohn Forte     void *pProps, uint32_t paramIndex);
123fcf3ce44SJohn Forte static IMA_STATUS setISCSINodeParameter(int paramType, IMA_OID *oid,
124fcf3ce44SJohn Forte     void *pProps, uint32_t paramIndex);
125fcf3ce44SJohn Forte static IMA_STATUS setAuthMethods(IMA_OID oid, IMA_UINT *pMethodCount,
126fcf3ce44SJohn Forte     const IMA_AUTHMETHOD *pMethodList);
127fcf3ce44SJohn Forte static IMA_STATUS getAuthMethods(IMA_OID oid, IMA_UINT *pMethodCount,
128fcf3ce44SJohn Forte     IMA_AUTHMETHOD *pMethodList);
129fcf3ce44SJohn Forte 
130fcf3ce44SJohn Forte static int prepare_discovery_entry(IMA_TARGET_ADDRESS discoveryAddress,
131fcf3ce44SJohn Forte     entry_t *entry);
132fcf3ce44SJohn Forte static IMA_STATUS configure_discovery_method(IMA_BOOL enable,
133fcf3ce44SJohn Forte     iSCSIDiscoveryMethod_t method);
134fcf3ce44SJohn Forte static IMA_STATUS get_target_oid_list(uint32_t targetListType,
135fcf3ce44SJohn Forte     IMA_OID_LIST **ppList);
136fcf3ce44SJohn Forte static IMA_STATUS get_target_lun_oid_list(IMA_OID * targetOid,
137fcf3ce44SJohn Forte 		iscsi_lun_list_t  **ppLunList);
138fcf3ce44SJohn Forte static int get_lun_devlink(di_devlink_t link, void *osDeviceName);
139fcf3ce44SJohn Forte static IMA_STATUS getDiscoveryAddressPropertiesList(
140fcf3ce44SJohn Forte 	SUN_IMA_DISC_ADDR_PROP_LIST **ppList
141fcf3ce44SJohn Forte );
142fcf3ce44SJohn Forte static IMA_STATUS sendTargets(IMA_TARGET_ADDRESS address,
143fcf3ce44SJohn Forte     SUN_IMA_DISC_ADDRESS_KEY_PROPERTIES **ppList
144fcf3ce44SJohn Forte );
145fcf3ce44SJohn Forte 
146fcf3ce44SJohn Forte static IMA_STATUS getSupportedAuthMethods(IMA_OID lhbaOid,
147fcf3ce44SJohn Forte     IMA_BOOL getSettableMethods, IMA_UINT *pMethodCount,
148fcf3ce44SJohn Forte     IMA_AUTHMETHOD *pMethodList);
149fcf3ce44SJohn Forte static IMA_STATUS getLuProperties(IMA_OID luId, IMA_LU_PROPERTIES *pProps);
150fcf3ce44SJohn Forte static IMA_STATUS getTargetProperties(IMA_OID targetId,
151fcf3ce44SJohn Forte     IMA_TARGET_PROPERTIES *pProps);
152fcf3ce44SJohn Forte 
153fcf3ce44SJohn Forte void InitLibrary();
154fcf3ce44SJohn Forte 
155fcf3ce44SJohn Forte static void libSwprintf(wchar_t *wcs, const wchar_t *lpszFormat, ...)
156fcf3ce44SJohn Forte {
157fcf3ce44SJohn Forte 	va_list args;
158fcf3ce44SJohn Forte 	va_start(args, lpszFormat);
159fcf3ce44SJohn Forte 	(void) vswprintf(wcs, OS_DEVICE_NAME_LEN - 1, lpszFormat, args);
160fcf3ce44SJohn Forte 	va_end(args);
161fcf3ce44SJohn Forte }
162fcf3ce44SJohn Forte 
163fcf3ce44SJohn Forte static void
164fcf3ce44SJohn Forte sysevent_handler(sysevent_t *ev)
165fcf3ce44SJohn Forte {
166fcf3ce44SJohn Forte 	IMA_OID tmpOid;
167fcf3ce44SJohn Forte 	IMA_BOOL becomingVisible = IMA_FALSE;
168fcf3ce44SJohn Forte 	IMA_UINT i;
169fcf3ce44SJohn Forte 
170fcf3ce44SJohn Forte 	const char *visibility_subclasses[] = {
171fcf3ce44SJohn Forte 		ESC_ISCSI_STATIC_START,
172fcf3ce44SJohn Forte 		ESC_ISCSI_STATIC_END,
173fcf3ce44SJohn Forte 		ESC_ISCSI_SEND_TARGETS_START,
174fcf3ce44SJohn Forte 		ESC_ISCSI_SEND_TARGETS_END,
175fcf3ce44SJohn Forte 		ESC_ISCSI_SLP_START,
176fcf3ce44SJohn Forte 		ESC_ISCSI_SLP_END,
177fcf3ce44SJohn Forte 		ESC_ISCSI_ISNS_START,
178fcf3ce44SJohn Forte 		ESC_ISCSI_ISNS_END,
179fcf3ce44SJohn Forte 		NULL
180fcf3ce44SJohn Forte 	};
181fcf3ce44SJohn Forte 
182fcf3ce44SJohn Forte 	tmpOid.ownerId = pluginOwnerId;
183fcf3ce44SJohn Forte 	tmpOid.objectType = IMA_OBJECT_TYPE_TARGET;
184fcf3ce44SJohn Forte 	tmpOid.objectSequenceNumber = 0;
185fcf3ce44SJohn Forte 
186fcf3ce44SJohn Forte 	/* Make sure our event class matches what we are looking for */
187fcf3ce44SJohn Forte 	if (strncmp(EC_ISCSI, sysevent_get_class_name(ev),
188fcf3ce44SJohn Forte 	    strlen(EC_ISCSI)) != 0) {
189fcf3ce44SJohn Forte 		return;
190fcf3ce44SJohn Forte 	}
191fcf3ce44SJohn Forte 
192fcf3ce44SJohn Forte 
193fcf3ce44SJohn Forte 	/* Check for object property changes */
194fcf3ce44SJohn Forte 	if ((strncmp(ESC_ISCSI_PROP_CHANGE,
195fcf3ce44SJohn Forte 	    sysevent_get_subclass_name(ev),
196fcf3ce44SJohn Forte 	    strlen(ESC_ISCSI_PROP_CHANGE)) == 0)) {
197fcf3ce44SJohn Forte 		if (pObjectPropertyCallback != NULL)
198fcf3ce44SJohn Forte 			pObjectPropertyCallback(tmpOid);
199fcf3ce44SJohn Forte 	} else {
200fcf3ce44SJohn Forte 		i = 0;
201fcf3ce44SJohn Forte 		while (visibility_subclasses[i] != NULL) {
202fcf3ce44SJohn Forte 			if ((strncmp(visibility_subclasses[i],
203fcf3ce44SJohn Forte 			    sysevent_get_subclass_name(ev),
204fcf3ce44SJohn Forte 			    strlen(visibility_subclasses[i])) == 0) &&
205fcf3ce44SJohn Forte 			    pObjectVisibilityCallback != NULL) {
206fcf3ce44SJohn Forte 				becomingVisible = IMA_TRUE;
207fcf3ce44SJohn Forte 				pObjectVisibilityCallback(becomingVisible,
208fcf3ce44SJohn Forte 				    tmpOid);
209fcf3ce44SJohn Forte 			}
210fcf3ce44SJohn Forte 			i++;
211fcf3ce44SJohn Forte 		}
212fcf3ce44SJohn Forte 	}
213fcf3ce44SJohn Forte }
214fcf3ce44SJohn Forte 
215fcf3ce44SJohn Forte IMA_STATUS init_sysevents() {
216fcf3ce44SJohn Forte 	const char *subclass_list[] = {
217fcf3ce44SJohn Forte 		ESC_ISCSI_STATIC_START,
218fcf3ce44SJohn Forte 		ESC_ISCSI_STATIC_END,
219fcf3ce44SJohn Forte 		ESC_ISCSI_SEND_TARGETS_START,
220fcf3ce44SJohn Forte 		ESC_ISCSI_SEND_TARGETS_END,
221fcf3ce44SJohn Forte 		ESC_ISCSI_SLP_START,
222fcf3ce44SJohn Forte 		ESC_ISCSI_SLP_END,
223fcf3ce44SJohn Forte 		ESC_ISCSI_ISNS_START,
224fcf3ce44SJohn Forte 		ESC_ISCSI_ISNS_END,
225fcf3ce44SJohn Forte 		ESC_ISCSI_PROP_CHANGE,
226fcf3ce44SJohn Forte 	};
227fcf3ce44SJohn Forte 
228fcf3ce44SJohn Forte 	/* Bind event handler and create subscriber handle */
229fcf3ce44SJohn Forte 	shp = sysevent_bind_handle(sysevent_handler);
230fcf3ce44SJohn Forte 	if (shp == NULL) {
231fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
232fcf3ce44SJohn Forte 	}
233fcf3ce44SJohn Forte 
234fcf3ce44SJohn Forte 	if (sysevent_subscribe_event(shp, EC_ISCSI, subclass_list, 9) != 0) {
235fcf3ce44SJohn Forte 		sysevent_unbind_handle(shp);
236fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
237fcf3ce44SJohn Forte 	}
238fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
239fcf3ce44SJohn Forte }
240fcf3ce44SJohn Forte 
241fcf3ce44SJohn Forte IMA_STATUS Initialize(IMA_UINT32 pluginOid) {
242fcf3ce44SJohn Forte 	pluginOwnerId = pluginOid;
243fcf3ce44SJohn Forte 	return (init_sysevents());
244fcf3ce44SJohn Forte }
245fcf3ce44SJohn Forte 
246fcf3ce44SJohn Forte void Terminate() {
247fcf3ce44SJohn Forte 	if (shp != NULL) {
248fcf3ce44SJohn Forte 		sysevent_unsubscribe_event(shp, EC_ISCSI);
249fcf3ce44SJohn Forte 	}
250fcf3ce44SJohn Forte 
251fcf3ce44SJohn Forte }
252fcf3ce44SJohn Forte 
253fcf3ce44SJohn Forte void InitLibrary() {
254fcf3ce44SJohn Forte }
255fcf3ce44SJohn Forte 
256fcf3ce44SJohn Forte static void GetBuildTime(IMA_DATETIME* pdatetime)
257fcf3ce44SJohn Forte {
258fcf3ce44SJohn Forte 	(void) memset(pdatetime, 0, sizeof (IMA_DATETIME));
259fcf3ce44SJohn Forte }
260fcf3ce44SJohn Forte 
261fcf3ce44SJohn Forte /*ARGSUSED*/
262fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetNodeProperties(
263fcf3ce44SJohn Forte 	IMA_OID nodeOid,
264fcf3ce44SJohn Forte 	IMA_NODE_PROPERTIES *pProps
265fcf3ce44SJohn Forte )
266fcf3ce44SJohn Forte {
267fcf3ce44SJohn Forte 	int fd;
268fcf3ce44SJohn Forte 	iscsi_param_get_t pg;
269fcf3ce44SJohn Forte 
270fcf3ce44SJohn Forte 	pProps->runningInInitiatorMode = IMA_TRUE;
271fcf3ce44SJohn Forte 	pProps->runningInTargetMode = IMA_FALSE;
272fcf3ce44SJohn Forte 	pProps->nameAndAliasSettable = IMA_FALSE;
273fcf3ce44SJohn Forte 
274fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
275fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
276fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
277fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
278fcf3ce44SJohn Forte 	}
279fcf3ce44SJohn Forte 
280fcf3ce44SJohn Forte 	(void) memset(&pg, 0, sizeof (iscsi_param_get_t));
281fcf3ce44SJohn Forte 	pg.g_vers = ISCSI_INTERFACE_VERSION;
282fcf3ce44SJohn Forte 	pg.g_param = ISCSI_LOGIN_PARAM_INITIATOR_NAME;
283fcf3ce44SJohn Forte 
284fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_PARAM_GET, &pg) == -1) {
285fcf3ce44SJohn Forte 		pProps->nameValid = IMA_FALSE;
286fcf3ce44SJohn Forte 	} else {
287fcf3ce44SJohn Forte 		if (strlen((char *)pg.g_value.v_name) > 0) {
288fcf3ce44SJohn Forte 			(void) mbstowcs(pProps->name,
289fcf3ce44SJohn Forte 			    (char *)pg.g_value.v_name,
290fcf3ce44SJohn Forte 			    IMA_NODE_NAME_LEN);
291fcf3ce44SJohn Forte 			pProps->nameValid = IMA_TRUE;
292fcf3ce44SJohn Forte 		} else {
293fcf3ce44SJohn Forte 			pProps->nameValid = IMA_FALSE;
294fcf3ce44SJohn Forte 		}
295fcf3ce44SJohn Forte 	}
296fcf3ce44SJohn Forte 
297fcf3ce44SJohn Forte 	(void) memset(&pg, 0, sizeof (iscsi_param_get_t));
298fcf3ce44SJohn Forte 	pg.g_vers = ISCSI_INTERFACE_VERSION;
299fcf3ce44SJohn Forte 	pg.g_param = ISCSI_LOGIN_PARAM_INITIATOR_ALIAS;
300fcf3ce44SJohn Forte 	(void) memset(pProps->alias, 0,
301fcf3ce44SJohn Forte 	    sizeof (IMA_WCHAR) * IMA_NODE_ALIAS_LEN);
302fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_PARAM_GET, &pg) == -1) {
303fcf3ce44SJohn Forte 		pProps->aliasValid = IMA_FALSE;
304fcf3ce44SJohn Forte 	} else {
305fcf3ce44SJohn Forte 		if (strlen((char *)pg.g_value.v_name) > 0) {
306fcf3ce44SJohn Forte 			(void) mbstowcs(pProps->alias,
307fcf3ce44SJohn Forte 			    (char *)pg.g_value.v_name,
308fcf3ce44SJohn Forte 			    IMA_NODE_ALIAS_LEN);
309fcf3ce44SJohn Forte 			pProps->aliasValid = IMA_TRUE;
310fcf3ce44SJohn Forte 		}
311fcf3ce44SJohn Forte 	}
312fcf3ce44SJohn Forte 
313fcf3ce44SJohn Forte 	(void) close(fd);
314fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
315fcf3ce44SJohn Forte }
316fcf3ce44SJohn Forte 
317fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_SetNodeName(
318fcf3ce44SJohn Forte 	IMA_OID nodeOid,
319fcf3ce44SJohn Forte 	const IMA_NODE_NAME newName
320fcf3ce44SJohn Forte )
321fcf3ce44SJohn Forte {
322fcf3ce44SJohn Forte 	int fd;
323fcf3ce44SJohn Forte 	iscsi_param_set_t ps;
324fcf3ce44SJohn Forte 
325fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
326fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
327fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
328fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
329fcf3ce44SJohn Forte 	}
330fcf3ce44SJohn Forte 
331fcf3ce44SJohn Forte 	(void) memset(&ps, 0, sizeof (iscsi_param_set_t));
332fcf3ce44SJohn Forte 	ps.s_oid = nodeOid.objectSequenceNumber;
333fcf3ce44SJohn Forte 	ps.s_vers = ISCSI_INTERFACE_VERSION;
334fcf3ce44SJohn Forte 	ps.s_param = ISCSI_LOGIN_PARAM_INITIATOR_NAME;
335fcf3ce44SJohn Forte 	(void) wcstombs((char *)ps.s_value.v_name, newName, ISCSI_MAX_NAME_LEN);
336fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_INIT_NODE_NAME_SET, &ps)) {
337fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
338fcf3ce44SJohn Forte 		    "ISCSI_PARAM_SET ioctl failed, errno: %d", errno);
339fcf3ce44SJohn Forte 		(void) close(fd);
340fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
341fcf3ce44SJohn Forte 	}
342fcf3ce44SJohn Forte 
343fcf3ce44SJohn Forte 	(void) close(fd);
344fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
345fcf3ce44SJohn Forte }
346fcf3ce44SJohn Forte 
347fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_SetNodeAlias(
348fcf3ce44SJohn Forte 	IMA_OID nodeOid,
349fcf3ce44SJohn Forte 	const IMA_NODE_ALIAS newAlias
350fcf3ce44SJohn Forte )
351fcf3ce44SJohn Forte {
352fcf3ce44SJohn Forte 	int fd;
353fcf3ce44SJohn Forte 	iscsi_param_set_t ps;
354fcf3ce44SJohn Forte 
355fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
356fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
357fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
358fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
359fcf3ce44SJohn Forte 	}
360fcf3ce44SJohn Forte 
361fcf3ce44SJohn Forte 	(void) memset(&ps, 0, sizeof (iscsi_param_set_t));
362fcf3ce44SJohn Forte 	ps.s_oid = nodeOid.objectSequenceNumber;
363fcf3ce44SJohn Forte 	ps.s_vers = ISCSI_INTERFACE_VERSION;
364fcf3ce44SJohn Forte 	ps.s_param = ISCSI_LOGIN_PARAM_INITIATOR_ALIAS;
365fcf3ce44SJohn Forte 
366fcf3ce44SJohn Forte 	/* newAlias = NULL specifies that the alias should be deleted. */
367fcf3ce44SJohn Forte 	if (newAlias != NULL)
368fcf3ce44SJohn Forte 		(void) wcstombs((char *)ps.s_value.v_name, newAlias,
369fcf3ce44SJohn Forte 		    ISCSI_MAX_NAME_LEN);
370fcf3ce44SJohn Forte 	else
371fcf3ce44SJohn Forte 		(void) wcstombs((char *)ps.s_value.v_name,
372fcf3ce44SJohn Forte 		    L"", ISCSI_MAX_NAME_LEN);
373fcf3ce44SJohn Forte 
374fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_PARAM_SET, &ps)) {
375fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
376fcf3ce44SJohn Forte 		    "ISCSI_PARAM_SET ioctl failed, errno: %d", errno);
377fcf3ce44SJohn Forte 		(void) close(fd);
378fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
379fcf3ce44SJohn Forte 	}
380fcf3ce44SJohn Forte 
381fcf3ce44SJohn Forte 	(void) close(fd);
382fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
383fcf3ce44SJohn Forte }
384fcf3ce44SJohn Forte 
385fcf3ce44SJohn Forte 
386fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetLhbaOidList(
387fcf3ce44SJohn Forte 	IMA_OID_LIST **ppList
388fcf3ce44SJohn Forte )
389fcf3ce44SJohn Forte {
390fcf3ce44SJohn Forte 	/* Always return the same object ID for the lhba */
391fcf3ce44SJohn Forte 	lhbaObjectId.objectType = IMA_OBJECT_TYPE_LHBA;
392fcf3ce44SJohn Forte 	lhbaObjectId.ownerId = pluginOwnerId;
393fcf3ce44SJohn Forte 	lhbaObjectId.objectSequenceNumber = ISCSI_INITIATOR_OID;
394fcf3ce44SJohn Forte 
395fcf3ce44SJohn Forte 	*ppList = (IMA_OID_LIST*)calloc(1, sizeof (IMA_OID_LIST));
396fcf3ce44SJohn Forte 	if (*ppList == NULL) {
397fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
398fcf3ce44SJohn Forte 	}
399fcf3ce44SJohn Forte 
400fcf3ce44SJohn Forte 	(*ppList)->oidCount = 1;
401fcf3ce44SJohn Forte 	(void) memcpy(&(*ppList)->oids[0],
402fcf3ce44SJohn Forte 	    &lhbaObjectId, sizeof (lhbaObjectId));
403fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
404fcf3ce44SJohn Forte }
405fcf3ce44SJohn Forte 
406fcf3ce44SJohn Forte 
407fcf3ce44SJohn Forte /*
408fcf3ce44SJohn Forte  * Get the discovery properties of the LHBA
409fcf3ce44SJohn Forte  */
410fcf3ce44SJohn Forte /*ARGSUSED*/
411fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetDiscoveryProperties(
412fcf3ce44SJohn Forte 	IMA_OID oid,
413fcf3ce44SJohn Forte 	IMA_DISCOVERY_PROPERTIES *pProps
414fcf3ce44SJohn Forte )
415fcf3ce44SJohn Forte {
416fcf3ce44SJohn Forte 	int fd;
417fcf3ce44SJohn Forte 	iSCSIDiscoveryProperties_t discoveryProps;
418fcf3ce44SJohn Forte 
419fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
420fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
421fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
422fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
423fcf3ce44SJohn Forte 	}
424fcf3ce44SJohn Forte 
425fcf3ce44SJohn Forte 	(void) memset(&discoveryProps, 0, sizeof (discoveryProps));
426fcf3ce44SJohn Forte 	discoveryProps.vers = ISCSI_INTERFACE_VERSION;
427fcf3ce44SJohn Forte 
428fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_DISCOVERY_PROPS, &discoveryProps) != 0) {
429fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
430fcf3ce44SJohn Forte 		    "ISCSI_DISCOVERY_PROPS ioctl failed, errno: %d", errno);
431fcf3ce44SJohn Forte 		(void) close(fd);
432fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
433fcf3ce44SJohn Forte 	}
434fcf3ce44SJohn Forte 
435fcf3ce44SJohn Forte 	pProps->iSnsDiscoverySettable = discoveryProps.iSNSDiscoverySettable;
436fcf3ce44SJohn Forte 	pProps->iSnsDiscoveryEnabled = discoveryProps.iSNSDiscoveryEnabled;
437fcf3ce44SJohn Forte 	/*
438fcf3ce44SJohn Forte 	 * Set the iSNS discovery method - The IMA specification indicates
439fcf3ce44SJohn Forte 	 * this field is valid only if iSNS discovery is enabled.
440fcf3ce44SJohn Forte 	 */
441fcf3ce44SJohn Forte 	if (pProps->iSnsDiscoveryEnabled == IMA_TRUE) {
442fcf3ce44SJohn Forte 		switch (discoveryProps.iSNSDiscoveryMethod) {
443fcf3ce44SJohn Forte 			case iSNSDiscoveryMethodStatic:
444fcf3ce44SJohn Forte 				pProps->iSnsDiscoveryMethod =
445fcf3ce44SJohn Forte 				    IMA_ISNS_DISCOVERY_METHOD_STATIC;
446fcf3ce44SJohn Forte 				break;
447fcf3ce44SJohn Forte 			case iSNSDiscoveryMethodDHCP:
448fcf3ce44SJohn Forte 				pProps->iSnsDiscoveryMethod =
449fcf3ce44SJohn Forte 				    IMA_ISNS_DISCOVERY_METHOD_DHCP;
450fcf3ce44SJohn Forte 				break;
451fcf3ce44SJohn Forte 			case iSNSDiscoveryMethodSLP:
452fcf3ce44SJohn Forte 				pProps->iSnsDiscoveryMethod =
453fcf3ce44SJohn Forte 				    IMA_ISNS_DISCOVERY_METHOD_SLP;
454fcf3ce44SJohn Forte 				break;
455fcf3ce44SJohn Forte 			default:
456fcf3ce44SJohn Forte 				(void) close(fd);
457fcf3ce44SJohn Forte 				return (IMA_ERROR_UNEXPECTED_OS_ERROR);
458fcf3ce44SJohn Forte 		}
459fcf3ce44SJohn Forte 	}
460fcf3ce44SJohn Forte 	(void) memcpy(pProps->iSnsHost.id.hostname,
461fcf3ce44SJohn Forte 	    discoveryProps.iSNSDomainName,
462fcf3ce44SJohn Forte 	    sizeof (pProps->iSnsHost.id.hostname));
463fcf3ce44SJohn Forte 	pProps->slpDiscoverySettable = discoveryProps.SLPDiscoverySettable;
464fcf3ce44SJohn Forte 	pProps->slpDiscoveryEnabled = discoveryProps.SLPDiscoveryEnabled;
465fcf3ce44SJohn Forte 	pProps->staticDiscoverySettable =
466fcf3ce44SJohn Forte 	    discoveryProps.StaticDiscoverySettable;
467fcf3ce44SJohn Forte 	pProps->staticDiscoveryEnabled = discoveryProps.StaticDiscoveryEnabled;
468fcf3ce44SJohn Forte 	pProps->sendTargetsDiscoverySettable =
469fcf3ce44SJohn Forte 	    discoveryProps.SendTargetsDiscoverySettable;
470fcf3ce44SJohn Forte 	pProps->sendTargetsDiscoveryEnabled =
471fcf3ce44SJohn Forte 	    discoveryProps.SendTargetsDiscoveryEnabled;
472fcf3ce44SJohn Forte 
473fcf3ce44SJohn Forte 	(void) close(fd);
474fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
475fcf3ce44SJohn Forte }
476fcf3ce44SJohn Forte 
477fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_FreeMemory(
478fcf3ce44SJohn Forte 	void *pMemory
479fcf3ce44SJohn Forte )
480fcf3ce44SJohn Forte {
481fcf3ce44SJohn Forte 	if (pMemory != NULL)
482fcf3ce44SJohn Forte 		free(pMemory);
483fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
484fcf3ce44SJohn Forte }
485fcf3ce44SJohn Forte 
486fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetNonSharedNodeOidList(
487fcf3ce44SJohn Forte 		IMA_OID_LIST **ppList
488fcf3ce44SJohn Forte )
489fcf3ce44SJohn Forte {
490fcf3ce44SJohn Forte 	if (ppList == NULL)
491fcf3ce44SJohn Forte 		return (IMA_ERROR_INVALID_PARAMETER);
492fcf3ce44SJohn Forte 
493fcf3ce44SJohn Forte 	*ppList = (IMA_OID_LIST*) calloc(1, sizeof (IMA_OID_LIST));
494fcf3ce44SJohn Forte 	if (*ppList == NULL) {
495fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
496fcf3ce44SJohn Forte 	}
497fcf3ce44SJohn Forte 	(*ppList)->oidCount = 0;
498fcf3ce44SJohn Forte 
499fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
500fcf3ce44SJohn Forte }
501fcf3ce44SJohn Forte 
502fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetFirstBurstLengthProperties(
503fcf3ce44SJohn Forte 		IMA_OID Oid,
504fcf3ce44SJohn Forte 		IMA_MIN_MAX_VALUE *pProps
505fcf3ce44SJohn Forte )
506fcf3ce44SJohn Forte {
507fcf3ce44SJohn Forte 	return (getISCSINodeParameter(MIN_MAX_PARAM, &Oid, pProps,
508fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_FIRST_BURST_LENGTH));
509fcf3ce44SJohn Forte }
510fcf3ce44SJohn Forte 
511fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetMaxBurstLengthProperties(
512fcf3ce44SJohn Forte 		IMA_OID Oid,
513fcf3ce44SJohn Forte 		IMA_MIN_MAX_VALUE *pProps
514fcf3ce44SJohn Forte )
515fcf3ce44SJohn Forte {
516fcf3ce44SJohn Forte 	return (getISCSINodeParameter(MIN_MAX_PARAM, &Oid, pProps,
517fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_MAX_BURST_LENGTH));
518fcf3ce44SJohn Forte }
519fcf3ce44SJohn Forte 
520fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetMaxRecvDataSegmentLengthProperties(
521fcf3ce44SJohn Forte 		IMA_OID Oid,
522fcf3ce44SJohn Forte 		IMA_MIN_MAX_VALUE *pProps
523fcf3ce44SJohn Forte )
524fcf3ce44SJohn Forte {
525fcf3ce44SJohn Forte 	return (getISCSINodeParameter(MIN_MAX_PARAM, &Oid, pProps,
526fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_MAX_RECV_DATA_SEGMENT_LENGTH));
527fcf3ce44SJohn Forte }
528fcf3ce44SJohn Forte 
529fcf3ce44SJohn Forte /*ARGSUSED*/
530fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_PluginIOCtl(
531fcf3ce44SJohn Forte 		IMA_OID pluginOid,
532fcf3ce44SJohn Forte 		IMA_UINT command,
533fcf3ce44SJohn Forte 		const void *pInputBuffer,
534fcf3ce44SJohn Forte 		IMA_UINT inputBufferLength,
535fcf3ce44SJohn Forte 		void *pOutputBuffer,
536fcf3ce44SJohn Forte 		IMA_UINT *pOutputBufferLength
537fcf3ce44SJohn Forte )
538fcf3ce44SJohn Forte {
539fcf3ce44SJohn Forte 	return (IMA_ERROR_NOT_SUPPORTED);
540fcf3ce44SJohn Forte }
541fcf3ce44SJohn Forte 
542fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetFirstBurstLength(
543fcf3ce44SJohn Forte 		IMA_OID lhbaId,
544fcf3ce44SJohn Forte 		IMA_UINT firstBurstLength
545fcf3ce44SJohn Forte )
546fcf3ce44SJohn Forte {
547fcf3ce44SJohn Forte 	IMA_MIN_MAX_VALUE mv;
548fcf3ce44SJohn Forte 
549fcf3ce44SJohn Forte 	mv.currentValue = firstBurstLength;
550fcf3ce44SJohn Forte 	return (setISCSINodeParameter(MIN_MAX_PARAM, &lhbaId, &mv,
551fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_FIRST_BURST_LENGTH));
552fcf3ce44SJohn Forte }
553fcf3ce44SJohn Forte 
554fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetMaxBurstLength(
555fcf3ce44SJohn Forte 		IMA_OID lhbaId,
556fcf3ce44SJohn Forte 		IMA_UINT maxBurstLength
557fcf3ce44SJohn Forte )
558fcf3ce44SJohn Forte {
559fcf3ce44SJohn Forte 	IMA_MIN_MAX_VALUE mv;
560fcf3ce44SJohn Forte 
561fcf3ce44SJohn Forte 	mv.currentValue = maxBurstLength;
562fcf3ce44SJohn Forte 	return (setISCSINodeParameter(MIN_MAX_PARAM, &lhbaId, &mv,
563fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_MAX_BURST_LENGTH));
564fcf3ce44SJohn Forte }
565fcf3ce44SJohn Forte 
566fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetMaxRecvDataSegmentLength(
567fcf3ce44SJohn Forte 		IMA_OID lhbaId,
568fcf3ce44SJohn Forte 		IMA_UINT maxRecvDataSegmentLength
569fcf3ce44SJohn Forte )
570fcf3ce44SJohn Forte {
571fcf3ce44SJohn Forte 	IMA_MIN_MAX_VALUE mv;
572fcf3ce44SJohn Forte 
573fcf3ce44SJohn Forte 	mv.currentValue = maxRecvDataSegmentLength;
574fcf3ce44SJohn Forte 	return (setISCSINodeParameter(MIN_MAX_PARAM, &lhbaId, &mv,
575fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_MAX_RECV_DATA_SEGMENT_LENGTH));
576fcf3ce44SJohn Forte }
577fcf3ce44SJohn Forte 
578fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetMaxConnectionsProperties(
579fcf3ce44SJohn Forte 		IMA_OID Oid,
580fcf3ce44SJohn Forte 		IMA_MIN_MAX_VALUE *pProps
581fcf3ce44SJohn Forte )
582fcf3ce44SJohn Forte {
583fcf3ce44SJohn Forte 	return (getISCSINodeParameter(MIN_MAX_PARAM, &Oid, pProps,
584fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_MAX_CONNECTIONS));
585fcf3ce44SJohn Forte }
586fcf3ce44SJohn Forte 
587fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetMaxConnections(
588fcf3ce44SJohn Forte 		IMA_OID lhbaId,
589fcf3ce44SJohn Forte 		IMA_UINT maxConnections
590fcf3ce44SJohn Forte )
591fcf3ce44SJohn Forte {
592fcf3ce44SJohn Forte 	IMA_MIN_MAX_VALUE mv;
593fcf3ce44SJohn Forte 
594fcf3ce44SJohn Forte 	mv.currentValue = maxConnections;
595fcf3ce44SJohn Forte 	return (setISCSINodeParameter(MIN_MAX_PARAM, &lhbaId, &mv,
596fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_MAX_CONNECTIONS));
597fcf3ce44SJohn Forte }
598fcf3ce44SJohn Forte 
599fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetDefaultTime2RetainProperties(
600fcf3ce44SJohn Forte 		IMA_OID lhbaId,
601fcf3ce44SJohn Forte 		IMA_MIN_MAX_VALUE *pProps
602fcf3ce44SJohn Forte )
603fcf3ce44SJohn Forte {
604fcf3ce44SJohn Forte 	return (getISCSINodeParameter(MIN_MAX_PARAM, &lhbaId, pProps,
605fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_DEFAULT_TIME_2_RETAIN));
606fcf3ce44SJohn Forte }
607fcf3ce44SJohn Forte 
608fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetDefaultTime2Retain(
609fcf3ce44SJohn Forte 		IMA_OID lhbaId,
610fcf3ce44SJohn Forte 		IMA_UINT defaultTime2Retain
611fcf3ce44SJohn Forte )
612fcf3ce44SJohn Forte {
613fcf3ce44SJohn Forte 	IMA_MIN_MAX_VALUE mv;
614fcf3ce44SJohn Forte 
615fcf3ce44SJohn Forte 	mv.currentValue = defaultTime2Retain;
616fcf3ce44SJohn Forte 	return (setISCSINodeParameter(MIN_MAX_PARAM, &lhbaId, &mv,
617fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_DEFAULT_TIME_2_RETAIN));
618fcf3ce44SJohn Forte }
619fcf3ce44SJohn Forte 
620fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetDefaultTime2WaitProperties(
621fcf3ce44SJohn Forte 		IMA_OID lhbaId,
622fcf3ce44SJohn Forte 		IMA_MIN_MAX_VALUE *pProps
623fcf3ce44SJohn Forte )
624fcf3ce44SJohn Forte {
625fcf3ce44SJohn Forte 	return (getISCSINodeParameter(MIN_MAX_PARAM, &lhbaId, pProps,
626fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_DEFAULT_TIME_2_WAIT));
627fcf3ce44SJohn Forte }
628fcf3ce44SJohn Forte 
629fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetDefaultTime2Wait(
630fcf3ce44SJohn Forte 		IMA_OID lhbaId,
631fcf3ce44SJohn Forte 		IMA_UINT defaultTime2Wait
632fcf3ce44SJohn Forte )
633fcf3ce44SJohn Forte {
634fcf3ce44SJohn Forte 	IMA_MIN_MAX_VALUE mv;
635fcf3ce44SJohn Forte 
636fcf3ce44SJohn Forte 	mv.currentValue = defaultTime2Wait;
637fcf3ce44SJohn Forte 	return (setISCSINodeParameter(MIN_MAX_PARAM, &lhbaId, &mv,
638fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_DEFAULT_TIME_2_WAIT));
639fcf3ce44SJohn Forte }
640fcf3ce44SJohn Forte 
641fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetMaxOutstandingR2TProperties(
642fcf3ce44SJohn Forte 		IMA_OID Oid,
643fcf3ce44SJohn Forte 		IMA_MIN_MAX_VALUE *pProps
644fcf3ce44SJohn Forte )
645fcf3ce44SJohn Forte {
646fcf3ce44SJohn Forte 	return (getISCSINodeParameter(MIN_MAX_PARAM, &Oid, pProps,
647fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_OUTSTANDING_R2T));
648fcf3ce44SJohn Forte }
649fcf3ce44SJohn Forte 
650fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetMaxOutstandingR2T(
651fcf3ce44SJohn Forte 		IMA_OID lhbaId,
652fcf3ce44SJohn Forte 		IMA_UINT maxOutstandingR2T
653fcf3ce44SJohn Forte )
654fcf3ce44SJohn Forte {
655fcf3ce44SJohn Forte 	IMA_MIN_MAX_VALUE mv;
656fcf3ce44SJohn Forte 
657fcf3ce44SJohn Forte 	mv.currentValue = maxOutstandingR2T;
658fcf3ce44SJohn Forte 	return (setISCSINodeParameter(MIN_MAX_PARAM, &lhbaId, &mv,
659fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_OUTSTANDING_R2T));
660fcf3ce44SJohn Forte }
661fcf3ce44SJohn Forte 
662fcf3ce44SJohn Forte 
663fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetErrorRecoveryLevelProperties(
664fcf3ce44SJohn Forte 		IMA_OID Oid,
665fcf3ce44SJohn Forte 		IMA_MIN_MAX_VALUE *pProps
666fcf3ce44SJohn Forte )
667fcf3ce44SJohn Forte {
668fcf3ce44SJohn Forte 	return (getISCSINodeParameter(MIN_MAX_PARAM, &Oid, pProps,
669fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_ERROR_RECOVERY_LEVEL));
670fcf3ce44SJohn Forte }
671fcf3ce44SJohn Forte 
672fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetErrorRecoveryLevel(
673fcf3ce44SJohn Forte 		IMA_OID Oid,
674fcf3ce44SJohn Forte 		IMA_UINT errorRecoveryLevel
675fcf3ce44SJohn Forte )
676fcf3ce44SJohn Forte {
677fcf3ce44SJohn Forte 	IMA_MIN_MAX_VALUE mv;
678fcf3ce44SJohn Forte 
679fcf3ce44SJohn Forte 	mv.currentValue = errorRecoveryLevel;
680fcf3ce44SJohn Forte 	return (setISCSINodeParameter(MIN_MAX_PARAM, &Oid, &mv,
681fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_ERROR_RECOVERY_LEVEL));
682fcf3ce44SJohn Forte }
683fcf3ce44SJohn Forte 
684fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetInitialR2TProperties(
685fcf3ce44SJohn Forte 		IMA_OID Oid,
686fcf3ce44SJohn Forte 		IMA_BOOL_VALUE *pProps
687fcf3ce44SJohn Forte )
688fcf3ce44SJohn Forte {
689fcf3ce44SJohn Forte 	return (getISCSINodeParameter(BOOL_PARAM, &Oid, pProps,
690fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_INITIAL_R2T));
691fcf3ce44SJohn Forte }
692fcf3ce44SJohn Forte 
693fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetInitialR2T(
694fcf3ce44SJohn Forte 		IMA_OID Oid,
695fcf3ce44SJohn Forte 		IMA_BOOL initialR2T
696fcf3ce44SJohn Forte )
697fcf3ce44SJohn Forte {
698fcf3ce44SJohn Forte 	IMA_BOOL_VALUE bv;
699fcf3ce44SJohn Forte 
700fcf3ce44SJohn Forte 	bv.currentValue = initialR2T;
701fcf3ce44SJohn Forte 	return (setISCSINodeParameter(BOOL_PARAM, &Oid, &bv,
702fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_INITIAL_R2T));
703fcf3ce44SJohn Forte }
704fcf3ce44SJohn Forte 
705fcf3ce44SJohn Forte 
706fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetImmediateDataProperties(
707fcf3ce44SJohn Forte 		IMA_OID Oid,
708fcf3ce44SJohn Forte 		IMA_BOOL_VALUE *pProps
709fcf3ce44SJohn Forte )
710fcf3ce44SJohn Forte {
711fcf3ce44SJohn Forte 	return (getISCSINodeParameter(BOOL_PARAM, &Oid, pProps,
712fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_IMMEDIATE_DATA));
713fcf3ce44SJohn Forte }
714fcf3ce44SJohn Forte 
715fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetImmediateData(
716fcf3ce44SJohn Forte 		IMA_OID Oid,
717fcf3ce44SJohn Forte 		IMA_BOOL immediateData
718fcf3ce44SJohn Forte )
719fcf3ce44SJohn Forte {
720fcf3ce44SJohn Forte 	IMA_BOOL_VALUE bv;
721fcf3ce44SJohn Forte 
722fcf3ce44SJohn Forte 	bv.currentValue = immediateData;
723fcf3ce44SJohn Forte 	return (setISCSINodeParameter(BOOL_PARAM, &Oid, &bv,
724fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_IMMEDIATE_DATA));
725fcf3ce44SJohn Forte }
726fcf3ce44SJohn Forte 
727fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetDataPduInOrderProperties(
728fcf3ce44SJohn Forte 		IMA_OID Oid,
729fcf3ce44SJohn Forte 		IMA_BOOL_VALUE *pProps
730fcf3ce44SJohn Forte )
731fcf3ce44SJohn Forte {
732fcf3ce44SJohn Forte 	return (getISCSINodeParameter(BOOL_PARAM, &Oid, pProps,
733fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_DATA_PDU_IN_ORDER));
734fcf3ce44SJohn Forte }
735fcf3ce44SJohn Forte 
736fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetDataPduInOrder(
737fcf3ce44SJohn Forte 		IMA_OID Oid,
738fcf3ce44SJohn Forte 		IMA_BOOL dataPduInOrder
739fcf3ce44SJohn Forte )
740fcf3ce44SJohn Forte {
741fcf3ce44SJohn Forte 	IMA_BOOL_VALUE bv;
742fcf3ce44SJohn Forte 
743fcf3ce44SJohn Forte 	bv.currentValue = dataPduInOrder;
744fcf3ce44SJohn Forte 	return (setISCSINodeParameter(BOOL_PARAM, &Oid, &bv,
745fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_DATA_PDU_IN_ORDER));
746fcf3ce44SJohn Forte }
747fcf3ce44SJohn Forte 
748fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetDataSequenceInOrderProperties(
749fcf3ce44SJohn Forte 		IMA_OID Oid,
750fcf3ce44SJohn Forte 		IMA_BOOL_VALUE *pProps
751fcf3ce44SJohn Forte )
752fcf3ce44SJohn Forte {
753fcf3ce44SJohn Forte 	return (getISCSINodeParameter(BOOL_PARAM, &Oid, pProps,
754fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_DATA_SEQUENCE_IN_ORDER));
755fcf3ce44SJohn Forte }
756fcf3ce44SJohn Forte 
757fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetDataSequenceInOrder(
758fcf3ce44SJohn Forte 		IMA_OID Oid,
759fcf3ce44SJohn Forte 		IMA_BOOL dataSequenceInOrder
760fcf3ce44SJohn Forte )
761fcf3ce44SJohn Forte {
762fcf3ce44SJohn Forte 	IMA_BOOL_VALUE bv;
763fcf3ce44SJohn Forte 
764fcf3ce44SJohn Forte 	bv.currentValue = dataSequenceInOrder;
765fcf3ce44SJohn Forte 	return (setISCSINodeParameter(BOOL_PARAM, &Oid, &bv,
766fcf3ce44SJohn Forte 	    ISCSI_LOGIN_PARAM_DATA_SEQUENCE_IN_ORDER));
767fcf3ce44SJohn Forte }
768fcf3ce44SJohn Forte 
769fcf3ce44SJohn Forte 
770fcf3ce44SJohn Forte /*ARGSUSED*/
771fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetStatisticsCollection(
772fcf3ce44SJohn Forte 		IMA_OID Oid,
773fcf3ce44SJohn Forte 		IMA_BOOL enableStatisticsCollection
774fcf3ce44SJohn Forte )
775fcf3ce44SJohn Forte {
776fcf3ce44SJohn Forte 	return (IMA_ERROR_NOT_SUPPORTED);
777fcf3ce44SJohn Forte }
778fcf3ce44SJohn Forte 
779fcf3ce44SJohn Forte 
780fcf3ce44SJohn Forte /*ARGSUSED*/
781fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetDiscoveryAddressOidList(
782fcf3ce44SJohn Forte 		IMA_OID Oid,
783fcf3ce44SJohn Forte 		IMA_OID_LIST **ppList
784fcf3ce44SJohn Forte )
785fcf3ce44SJohn Forte {
786fcf3ce44SJohn Forte 	int fd, i, addr_list_size;
787fcf3ce44SJohn Forte 	iscsi_addr_list_t *idlp, al_info;
788fcf3ce44SJohn Forte 
789fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
790fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
791fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
792fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
793fcf3ce44SJohn Forte 	}
794fcf3ce44SJohn Forte 
795fcf3ce44SJohn Forte 	(void) memset(&al_info, 0, sizeof (al_info));
796fcf3ce44SJohn Forte 	al_info.al_vers = ISCSI_INTERFACE_VERSION;
797fcf3ce44SJohn Forte 	al_info.al_in_cnt = 0;
798fcf3ce44SJohn Forte 
799fcf3ce44SJohn Forte 	/*
800fcf3ce44SJohn Forte 	 * Issue ioctl to obtain the number of targets.
801fcf3ce44SJohn Forte 	 */
802fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_DISCOVERY_ADDR_LIST_GET, &al_info) != 0) {
803fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
804fcf3ce44SJohn Forte 		    "ISCSI_DISCOVERY_ADDR_LIST_GET ioctl %d failed, errno: %d",
805fcf3ce44SJohn Forte 		    ISCSI_DISCOVERY_ADDR_LIST_GET, errno);
806fcf3ce44SJohn Forte 		(void) close(fd);
807fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
808fcf3ce44SJohn Forte 	}
809fcf3ce44SJohn Forte 
810fcf3ce44SJohn Forte 	addr_list_size = sizeof (iscsi_addr_list_t);
811fcf3ce44SJohn Forte 	if (al_info.al_out_cnt > 1) {
812fcf3ce44SJohn Forte 		addr_list_size += (sizeof (iscsi_addr_list_t) *
813fcf3ce44SJohn Forte 		    al_info.al_out_cnt - 1);
814fcf3ce44SJohn Forte 	}
815fcf3ce44SJohn Forte 
816fcf3ce44SJohn Forte 	idlp = (iscsi_addr_list_t *)calloc(1, addr_list_size);
817fcf3ce44SJohn Forte 	if (idlp == NULL) {
818fcf3ce44SJohn Forte 		(void) close(fd);
819fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
820fcf3ce44SJohn Forte 	}
821fcf3ce44SJohn Forte 
822fcf3ce44SJohn Forte 	idlp->al_vers = ISCSI_INTERFACE_VERSION;
823fcf3ce44SJohn Forte 	idlp->al_in_cnt = al_info.al_out_cnt;
824fcf3ce44SJohn Forte 	/* Issue the same ioctl again to obtain the OIDs. */
825fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_DISCOVERY_ADDR_LIST_GET, idlp) != 0) {
826fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
827fcf3ce44SJohn Forte 		    "ISCSI_TARGET_OID_LIST_GET ioctl %d failed, errno: %d",
828fcf3ce44SJohn Forte 		    ISCSI_DISCOVERY_ADDR_LIST_GET, errno);
829fcf3ce44SJohn Forte 		free(idlp);
830fcf3ce44SJohn Forte 		(void) close(fd);
831fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
832fcf3ce44SJohn Forte 	}
833fcf3ce44SJohn Forte 
834fcf3ce44SJohn Forte 	*ppList = (IMA_OID_LIST *)calloc(1, sizeof (IMA_OID_LIST) +
835fcf3ce44SJohn Forte 	    idlp->al_out_cnt * sizeof (IMA_OID));
836fcf3ce44SJohn Forte 	if (*ppList == NULL) {
837fcf3ce44SJohn Forte 		free(idlp);
838fcf3ce44SJohn Forte 		(void) close(fd);
839fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
840fcf3ce44SJohn Forte 	}
841fcf3ce44SJohn Forte 	(*ppList)->oidCount = idlp->al_out_cnt;
842fcf3ce44SJohn Forte 
843fcf3ce44SJohn Forte 	for (i = 0; i < idlp->al_out_cnt; i++) {
844fcf3ce44SJohn Forte 		(*ppList)->oids[i].objectType =
845fcf3ce44SJohn Forte 		    IMA_OBJECT_TYPE_DISCOVERY_ADDRESS;
846fcf3ce44SJohn Forte 		(*ppList)->oids[i].ownerId = pluginOwnerId;
847fcf3ce44SJohn Forte 		(*ppList)->oids[i].objectSequenceNumber =
848fcf3ce44SJohn Forte 		    idlp->al_addrs[i].a_oid;
849fcf3ce44SJohn Forte 	}
850fcf3ce44SJohn Forte 
851fcf3ce44SJohn Forte 	free(idlp);
852fcf3ce44SJohn Forte 	(void) close(fd);
853fcf3ce44SJohn Forte 
854fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
855fcf3ce44SJohn Forte }
856fcf3ce44SJohn Forte 
857fcf3ce44SJohn Forte 
858fcf3ce44SJohn Forte /* ARGSUSED */
859fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetStaticDiscoveryTargetOidList(
860fcf3ce44SJohn Forte 		IMA_OID Oid,
861fcf3ce44SJohn Forte 		IMA_OID_LIST **ppList
862fcf3ce44SJohn Forte )
863fcf3ce44SJohn Forte {
864fcf3ce44SJohn Forte 	if (Oid.objectType == IMA_OBJECT_TYPE_PNP) {
865fcf3ce44SJohn Forte 		return (IMA_ERROR_OBJECT_NOT_FOUND);
866fcf3ce44SJohn Forte 	}
867fcf3ce44SJohn Forte 
868fcf3ce44SJohn Forte 	return (get_target_oid_list(ISCSI_STATIC_TGT_OID_LIST, ppList));
869fcf3ce44SJohn Forte }
870fcf3ce44SJohn Forte 
871fcf3ce44SJohn Forte /* ARGSUSED */
872fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetTargetOidList(
873fcf3ce44SJohn Forte 		IMA_OID Oid,
874fcf3ce44SJohn Forte 		IMA_OID_LIST **ppList
875fcf3ce44SJohn Forte )
876fcf3ce44SJohn Forte {
877fcf3ce44SJohn Forte 	return (get_target_oid_list(ISCSI_TGT_PARAM_OID_LIST, ppList));
878fcf3ce44SJohn Forte }
879fcf3ce44SJohn Forte 
880fcf3ce44SJohn Forte /*ARGSUSED*/
881fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetIsnsDiscovery(
882fcf3ce44SJohn Forte 		IMA_OID phbaId,
883fcf3ce44SJohn Forte 		IMA_BOOL enableIsnsDiscovery,
884fcf3ce44SJohn Forte 		IMA_ISNS_DISCOVERY_METHOD discoveryMethod,
885fcf3ce44SJohn Forte 		const IMA_HOST_ID *iSnsHost
886fcf3ce44SJohn Forte )
887fcf3ce44SJohn Forte {
888fcf3ce44SJohn Forte 	/* XXX need to set discovery Method and domaineName */
889fcf3ce44SJohn Forte 	return (configure_discovery_method(enableIsnsDiscovery,
890fcf3ce44SJohn Forte 	    iSCSIDiscoveryMethodISNS));
891fcf3ce44SJohn Forte }
892fcf3ce44SJohn Forte 
893fcf3ce44SJohn Forte 
894fcf3ce44SJohn Forte /* ARGSUSED */
895fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetSlpDiscovery(
896fcf3ce44SJohn Forte 		IMA_OID phbaId,
897fcf3ce44SJohn Forte 		IMA_BOOL enableSlpDiscovery
898fcf3ce44SJohn Forte )
899fcf3ce44SJohn Forte {
900fcf3ce44SJohn Forte 	return (configure_discovery_method(enableSlpDiscovery,
901fcf3ce44SJohn Forte 	    iSCSIDiscoveryMethodSLP));
902fcf3ce44SJohn Forte }
903fcf3ce44SJohn Forte 
904fcf3ce44SJohn Forte 
905fcf3ce44SJohn Forte /* ARGSUSED */
906fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetStaticDiscovery(
907fcf3ce44SJohn Forte 		IMA_OID phbaId,
908fcf3ce44SJohn Forte 		IMA_BOOL enableStaticDiscovery
909fcf3ce44SJohn Forte )
910fcf3ce44SJohn Forte {
911fcf3ce44SJohn Forte 	return (configure_discovery_method(enableStaticDiscovery,
912fcf3ce44SJohn Forte 	    iSCSIDiscoveryMethodStatic));
913fcf3ce44SJohn Forte }
914fcf3ce44SJohn Forte 
915fcf3ce44SJohn Forte /* ARGSUSED */
916fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetSendTargetsDiscovery(
917fcf3ce44SJohn Forte 		IMA_OID phbaId,
918fcf3ce44SJohn Forte 		IMA_BOOL enableSendTargetsDiscovery
919fcf3ce44SJohn Forte )
920fcf3ce44SJohn Forte {
921fcf3ce44SJohn Forte 	return (configure_discovery_method(enableSendTargetsDiscovery,
922fcf3ce44SJohn Forte 	    iSCSIDiscoveryMethodSendTargets));
923fcf3ce44SJohn Forte }
924fcf3ce44SJohn Forte 
925fcf3ce44SJohn Forte /*ARGSUSED*/
926fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_RemoveDiscoveryAddress(
927fcf3ce44SJohn Forte 		IMA_OID	discoveryAddressOid
928fcf3ce44SJohn Forte )
929fcf3ce44SJohn Forte {
930fcf3ce44SJohn Forte 	int status, fd, i, addr_list_size;
931fcf3ce44SJohn Forte 	iscsi_addr_list_t *idlp, al_info;
932fcf3ce44SJohn Forte 	iscsi_addr_t *matched_addr = NULL;
933fcf3ce44SJohn Forte 	entry_t	entry;
934fcf3ce44SJohn Forte 
935fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
936fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
937fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
938fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
939fcf3ce44SJohn Forte 	}
940fcf3ce44SJohn Forte 
941fcf3ce44SJohn Forte 	(void) memset(&al_info, 0, sizeof (al_info));
942fcf3ce44SJohn Forte 	al_info.al_vers = ISCSI_INTERFACE_VERSION;
943fcf3ce44SJohn Forte 	al_info.al_in_cnt = 0;
944fcf3ce44SJohn Forte 
945fcf3ce44SJohn Forte 	/*
946fcf3ce44SJohn Forte 	 * Issue ioctl to obtain the number of discovery address.
947fcf3ce44SJohn Forte 	 */
948fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_DISCOVERY_ADDR_LIST_GET, &al_info) != 0) {
949fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
950fcf3ce44SJohn Forte 		    "ISCSI_DISCOVERY_ADDR_LIST_GET ioctl %d failed, errno: %d",
951fcf3ce44SJohn Forte 		    ISCSI_DISCOVERY_ADDR_LIST_GET, errno);
952fcf3ce44SJohn Forte 		(void) close(fd);
953fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
954fcf3ce44SJohn Forte 	}
955fcf3ce44SJohn Forte 
956fcf3ce44SJohn Forte 	if (al_info.al_out_cnt == 0) {
957fcf3ce44SJohn Forte 		return (IMA_ERROR_OBJECT_NOT_FOUND);
958fcf3ce44SJohn Forte 	}
959fcf3ce44SJohn Forte 
960fcf3ce44SJohn Forte 	addr_list_size = sizeof (iscsi_addr_list_t);
961fcf3ce44SJohn Forte 	if (al_info.al_out_cnt > 1) {
962fcf3ce44SJohn Forte 		addr_list_size += (sizeof (iscsi_addr_list_t) *
963fcf3ce44SJohn Forte 		    al_info.al_out_cnt - 1);
964fcf3ce44SJohn Forte 	}
965fcf3ce44SJohn Forte 
966fcf3ce44SJohn Forte 	idlp = (iscsi_addr_list_t *)calloc(1, addr_list_size);
967fcf3ce44SJohn Forte 	if (idlp == NULL) {
968fcf3ce44SJohn Forte 		(void) close(fd);
969fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
970fcf3ce44SJohn Forte 	}
971fcf3ce44SJohn Forte 
972fcf3ce44SJohn Forte 	idlp->al_vers = ISCSI_INTERFACE_VERSION;
973fcf3ce44SJohn Forte 	idlp->al_in_cnt = al_info.al_out_cnt;
974fcf3ce44SJohn Forte 
975fcf3ce44SJohn Forte 	/* Issue the same ioctl again to obtain the OIDs. */
976fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_DISCOVERY_ADDR_LIST_GET, idlp) != 0) {
977fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
978fcf3ce44SJohn Forte 		    "ISCSI_TARGET_OID_LIST_GET ioctl %d failed, errno: %d",
979fcf3ce44SJohn Forte 		    ISCSI_DISCOVERY_ADDR_LIST_GET, errno);
980fcf3ce44SJohn Forte 		free(idlp);
981fcf3ce44SJohn Forte 		(void) close(fd);
982fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
983fcf3ce44SJohn Forte 	}
984fcf3ce44SJohn Forte 
985fcf3ce44SJohn Forte 	for (i = 0; i < idlp->al_out_cnt; i++) {
986fcf3ce44SJohn Forte 		if (discoveryAddressOid.objectSequenceNumber !=
987fcf3ce44SJohn Forte 		    idlp->al_addrs[i].a_oid)
988fcf3ce44SJohn Forte 			continue;
989fcf3ce44SJohn Forte 		matched_addr = &(idlp->al_addrs[i]);
990fcf3ce44SJohn Forte 	}
991fcf3ce44SJohn Forte 
992fcf3ce44SJohn Forte 	if (matched_addr == NULL) {
993fcf3ce44SJohn Forte 		return (IMA_ERROR_OBJECT_NOT_FOUND);
994fcf3ce44SJohn Forte 	}
995fcf3ce44SJohn Forte 
996fcf3ce44SJohn Forte 
997fcf3ce44SJohn Forte 	(void) memset(&entry, 0, sizeof (entry_t));
998fcf3ce44SJohn Forte 	entry.e_vers = ISCSI_INTERFACE_VERSION;
999fcf3ce44SJohn Forte 	entry.e_oid  = discoveryAddressOid.objectSequenceNumber;
1000fcf3ce44SJohn Forte 	if (matched_addr->a_addr.i_insize == sizeof (struct in_addr)) {
1001fcf3ce44SJohn Forte 		bcopy(&matched_addr->a_addr.i_addr.in4,
1002fcf3ce44SJohn Forte 		    &entry.e_u.u_in4, sizeof (entry.e_u.u_in4));
1003fcf3ce44SJohn Forte 		entry.e_insize = sizeof (struct in_addr);
1004fcf3ce44SJohn Forte 	} else if (matched_addr->a_addr.i_insize == sizeof (struct in6_addr)) {
1005fcf3ce44SJohn Forte 		bcopy(&matched_addr->a_addr.i_addr.in6,
1006fcf3ce44SJohn Forte 		    &entry.e_u.u_in6, sizeof (entry.e_u.u_in6));
1007fcf3ce44SJohn Forte 		entry.e_insize = sizeof (struct in6_addr);
1008fcf3ce44SJohn Forte 	} else {
1009fcf3ce44SJohn Forte 		/* Should not happen */
1010fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1011fcf3ce44SJohn Forte 		    "ISCSI_STATIC_GET returned bad address");
1012fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1013fcf3ce44SJohn Forte 	}
1014fcf3ce44SJohn Forte 
1015fcf3ce44SJohn Forte 	entry.e_port = matched_addr->a_port;
1016fcf3ce44SJohn Forte 	entry.e_tpgt = 0;
1017fcf3ce44SJohn Forte 	entry.e_oid = discoveryAddressOid.objectSequenceNumber;
1018fcf3ce44SJohn Forte 
1019fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_DISCOVERY_ADDR_CLEAR, &entry)) {
1020fcf3ce44SJohn Forte 		status = errno;
1021fcf3ce44SJohn Forte 		(void) close(fd);
1022fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1023fcf3ce44SJohn Forte 		    "ISCSI_DISCOVERY_ADDR_CLEAR ioctl failed, errno: %d",
1024fcf3ce44SJohn Forte 		    errno);
1025fcf3ce44SJohn Forte 		if (status == EBUSY) {
1026fcf3ce44SJohn Forte 			return (IMA_ERROR_LU_IN_USE);
1027fcf3ce44SJohn Forte 		} else {
1028fcf3ce44SJohn Forte 			return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1029fcf3ce44SJohn Forte 		}
1030fcf3ce44SJohn Forte 	}
1031fcf3ce44SJohn Forte 
1032fcf3ce44SJohn Forte 	free(idlp);
1033fcf3ce44SJohn Forte 	(void) close(fd);
1034fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
1035fcf3ce44SJohn Forte }
1036fcf3ce44SJohn Forte 
1037fcf3ce44SJohn Forte 
1038fcf3ce44SJohn Forte /*ARGSUSED*/
1039fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_AddDiscoveryAddress(
1040fcf3ce44SJohn Forte 		IMA_OID	oid,
1041fcf3ce44SJohn Forte 		const IMA_TARGET_ADDRESS discoveryAddress,
1042fcf3ce44SJohn Forte 		IMA_OID	*pDiscoveryAddressOid
1043fcf3ce44SJohn Forte )
1044fcf3ce44SJohn Forte {
1045fcf3ce44SJohn Forte 	entry_t	    entry;
1046fcf3ce44SJohn Forte 	int	    fd;
1047fcf3ce44SJohn Forte 
1048fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
1049fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
1050fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
1051fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1052fcf3ce44SJohn Forte 	}
1053fcf3ce44SJohn Forte 
1054fcf3ce44SJohn Forte 	if (prepare_discovery_entry(discoveryAddress, &entry) !=
1055fcf3ce44SJohn Forte 	    DISC_ADDR_OK) {
1056fcf3ce44SJohn Forte 		(void) close(fd);
1057fcf3ce44SJohn Forte 		return (IMA_ERROR_INVALID_PARAMETER);
1058fcf3ce44SJohn Forte 	}
1059fcf3ce44SJohn Forte 
1060fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_DISCOVERY_ADDR_SET, &entry)) {
1061fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1062fcf3ce44SJohn Forte 		    "ISCSI_DISCOVERY_ADDR_SET ioctl failed, errno: %d",
1063fcf3ce44SJohn Forte 		    errno);
1064fcf3ce44SJohn Forte 		(void) close(fd);
1065fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1066fcf3ce44SJohn Forte 	}
1067fcf3ce44SJohn Forte 
1068fcf3ce44SJohn Forte 	pDiscoveryAddressOid->ownerId = pluginOwnerId;
1069fcf3ce44SJohn Forte 	pDiscoveryAddressOid->objectType = IMA_OBJECT_TYPE_DISCOVERY_ADDRESS;
1070fcf3ce44SJohn Forte 	pDiscoveryAddressOid->objectSequenceNumber = entry.e_oid;
1071fcf3ce44SJohn Forte 
1072fcf3ce44SJohn Forte 	(void) close(fd);
1073fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
1074fcf3ce44SJohn Forte }
1075fcf3ce44SJohn Forte 
1076fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetStaticDiscoveryTargetProperties(
1077fcf3ce44SJohn Forte 		IMA_OID	staticTargetOid,
1078fcf3ce44SJohn Forte 		IMA_STATIC_DISCOVERY_TARGET_PROPERTIES *pProps
1079fcf3ce44SJohn Forte )
1080fcf3ce44SJohn Forte {
1081fcf3ce44SJohn Forte 	char static_target_addr_str[SUN_IMA_IP_ADDRESS_LEN];
1082fcf3ce44SJohn Forte 	char static_target_addr_port_str[SUN_IMA_IP_ADDRESS_LEN];
1083fcf3ce44SJohn Forte 	int af, fd, status;
1084fcf3ce44SJohn Forte 	iscsi_static_property_t prop;
1085fcf3ce44SJohn Forte 	/* LINTED */
1086fcf3ce44SJohn Forte 	IMA_HOST_ID *host;
1087fcf3ce44SJohn Forte 
1088fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
1089fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
1090fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
1091fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1092fcf3ce44SJohn Forte 	}
1093fcf3ce44SJohn Forte 
1094fcf3ce44SJohn Forte 	(void) memset(&prop, 0, sizeof (iscsi_static_property_t));
1095fcf3ce44SJohn Forte 	prop.p_vers = ISCSI_INTERFACE_VERSION;
1096fcf3ce44SJohn Forte 	prop.p_oid = (uint32_t)staticTargetOid.objectSequenceNumber;
1097fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_STATIC_GET, &prop) != 0) {
1098fcf3ce44SJohn Forte 		status = errno;
1099fcf3ce44SJohn Forte 		(void) close(fd);
1100fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1101fcf3ce44SJohn Forte 		    "ISCSI_STATIC_GET ioctl failed, errno: %d", status);
1102fcf3ce44SJohn Forte 		if (status == ENOENT) {
1103fcf3ce44SJohn Forte 			return (IMA_ERROR_OBJECT_NOT_FOUND);
1104fcf3ce44SJohn Forte 
1105fcf3ce44SJohn Forte 		} else {
1106fcf3ce44SJohn Forte 			return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1107fcf3ce44SJohn Forte 		}
1108fcf3ce44SJohn Forte 	}
1109fcf3ce44SJohn Forte 	(void) close(fd);
1110fcf3ce44SJohn Forte 
1111fcf3ce44SJohn Forte 	(void) mbstowcs(pProps->staticTarget.targetName, (char *)prop.p_name,
1112fcf3ce44SJohn Forte 	    sizeof (pProps->staticTarget.targetName)/sizeof (IMA_WCHAR));
1113fcf3ce44SJohn Forte 
1114fcf3ce44SJohn Forte 	if (prop.p_addr_list.al_addrs[0].a_addr.i_insize ==
1115fcf3ce44SJohn Forte 	    sizeof (struct in_addr)) {
1116fcf3ce44SJohn Forte 		/* IPv4 */
1117fcf3ce44SJohn Forte 		af = AF_INET;
1118fcf3ce44SJohn Forte 	} else if (prop.p_addr_list.al_addrs[0].a_addr.i_insize ==
1119fcf3ce44SJohn Forte 	    sizeof (struct in6_addr)) {
1120fcf3ce44SJohn Forte 		/* IPv6 */
1121fcf3ce44SJohn Forte 		af = AF_INET6;
1122fcf3ce44SJohn Forte 	} else {
1123fcf3ce44SJohn Forte 		/* Should not happen */
1124fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1125fcf3ce44SJohn Forte 		    "ISCSI_STATIC_GET returned bad address");
1126fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1127fcf3ce44SJohn Forte 	}
1128fcf3ce44SJohn Forte 
1129fcf3ce44SJohn Forte 	if (inet_ntop(af, &prop.p_addr_list.al_addrs[0].a_addr.i_addr,
1130fcf3ce44SJohn Forte 	    static_target_addr_str, sizeof (static_target_addr_str)) == NULL) {
1131fcf3ce44SJohn Forte 		/* Should not happen */
1132fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1133fcf3ce44SJohn Forte 		    "ISCSI_STATIC_GET returned address that cannot "
1134fcf3ce44SJohn Forte 		    "be inet_ntop");
1135fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1136fcf3ce44SJohn Forte 	} else {
1137fcf3ce44SJohn Forte 		if (af == AF_INET) {
1138fcf3ce44SJohn Forte 			(void) snprintf(static_target_addr_port_str,
1139fcf3ce44SJohn Forte 			    SUN_IMA_IP_ADDRESS_LEN,
1140fcf3ce44SJohn Forte 			    "%s:%ld",
1141fcf3ce44SJohn Forte 			    static_target_addr_str,
1142fcf3ce44SJohn Forte 			    prop.p_addr_list.al_addrs[0].a_port);
1143fcf3ce44SJohn Forte 		} else {
1144fcf3ce44SJohn Forte 			(void) snprintf(static_target_addr_port_str,
1145fcf3ce44SJohn Forte 			    SUN_IMA_IP_ADDRESS_LEN,
1146fcf3ce44SJohn Forte 			    "[%s]:%ld",
1147fcf3ce44SJohn Forte 			    static_target_addr_str,
1148fcf3ce44SJohn Forte 			    prop.p_addr_list.al_addrs[0].a_port);
1149fcf3ce44SJohn Forte 		}
1150fcf3ce44SJohn Forte 		host = &pProps->staticTarget.targetAddress.hostnameIpAddress;
1151fcf3ce44SJohn Forte 		(void) mbstowcs(pProps->staticTarget.
1152fcf3ce44SJohn Forte 		    targetAddress.hostnameIpAddress.
1153fcf3ce44SJohn Forte 		    id.hostname, static_target_addr_port_str,
1154fcf3ce44SJohn Forte 		    sizeof (host->id.hostname) / sizeof (IMA_WCHAR));
1155fcf3ce44SJohn Forte 	}
1156fcf3ce44SJohn Forte 
1157fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
1158fcf3ce44SJohn Forte }
1159fcf3ce44SJohn Forte 
1160fcf3ce44SJohn Forte /*ARGSUSED*/
1161fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetDiscoveryAddressProperties(
1162fcf3ce44SJohn Forte 		IMA_OID	discoveryAddressOid,
1163fcf3ce44SJohn Forte 		IMA_DISCOVERY_ADDRESS_PROPERTIES *pProps
1164fcf3ce44SJohn Forte )
1165fcf3ce44SJohn Forte {
1166fcf3ce44SJohn Forte 	int fd;
1167fcf3ce44SJohn Forte 	int i;
1168fcf3ce44SJohn Forte 	int addr_list_size;
1169fcf3ce44SJohn Forte 	iscsi_addr_list_t *idlp, al_info;
1170fcf3ce44SJohn Forte 	iscsi_addr_t *matched_addr = NULL;
1171fcf3ce44SJohn Forte 	/* LINTED */
1172fcf3ce44SJohn Forte 	IMA_TARGET_ADDRESS *addr;
1173fcf3ce44SJohn Forte 
1174fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
1175fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
1176fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
1177fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1178fcf3ce44SJohn Forte 	}
1179fcf3ce44SJohn Forte 
1180fcf3ce44SJohn Forte 	(void) memset(&al_info, 0, sizeof (al_info));
1181fcf3ce44SJohn Forte 	al_info.al_vers = ISCSI_INTERFACE_VERSION;
1182fcf3ce44SJohn Forte 	al_info.al_in_cnt = 0;
1183fcf3ce44SJohn Forte 
1184fcf3ce44SJohn Forte 	/*
1185fcf3ce44SJohn Forte 	 * Issue ioctl to obtain the number of discovery addresses.
1186fcf3ce44SJohn Forte 	 */
1187fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_DISCOVERY_ADDR_LIST_GET, &al_info) != 0) {
1188fcf3ce44SJohn Forte 		(void) close(fd);
1189fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1190fcf3ce44SJohn Forte 		    "ISCSI_DISCOVERY_ADDR_LIST_GET ioctl %d failed, errno: %d",
1191fcf3ce44SJohn Forte 		    ISCSI_DISCOVERY_ADDR_LIST_GET, errno);
1192fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1193fcf3ce44SJohn Forte 	}
1194fcf3ce44SJohn Forte 
1195fcf3ce44SJohn Forte 	if (al_info.al_out_cnt == 0) {
1196fcf3ce44SJohn Forte 		return (IMA_ERROR_OBJECT_NOT_FOUND);
1197fcf3ce44SJohn Forte 	}
1198fcf3ce44SJohn Forte 
1199fcf3ce44SJohn Forte 	addr_list_size = sizeof (iscsi_addr_list_t);
1200fcf3ce44SJohn Forte 	if (al_info.al_out_cnt > 1) {
1201fcf3ce44SJohn Forte 		addr_list_size += (sizeof (iscsi_addr_list_t) *
1202fcf3ce44SJohn Forte 		    al_info.al_out_cnt - 1);
1203fcf3ce44SJohn Forte 	}
1204fcf3ce44SJohn Forte 
1205fcf3ce44SJohn Forte 	idlp = (iscsi_addr_list_t *)calloc(1, addr_list_size);
1206fcf3ce44SJohn Forte 	if (idlp == NULL) {
1207fcf3ce44SJohn Forte 		(void) close(fd);
1208fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
1209fcf3ce44SJohn Forte 	}
1210fcf3ce44SJohn Forte 
1211fcf3ce44SJohn Forte 	idlp->al_vers = ISCSI_INTERFACE_VERSION;
1212fcf3ce44SJohn Forte 	idlp->al_in_cnt = al_info.al_out_cnt;
1213fcf3ce44SJohn Forte 
1214fcf3ce44SJohn Forte 	/* Issue the same ioctl again to obtain the OIDs. */
1215fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_DISCOVERY_ADDR_LIST_GET, idlp) != 0) {
1216fcf3ce44SJohn Forte 		free(idlp);
1217fcf3ce44SJohn Forte 		(void) close(fd);
1218fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1219fcf3ce44SJohn Forte 		    "ISCSI_TARGET_OID_LIST_GET ioctl %d failed, errno: %d",
1220fcf3ce44SJohn Forte 		    ISCSI_DISCOVERY_ADDR_LIST_GET, errno);
1221fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1222fcf3ce44SJohn Forte 	}
1223fcf3ce44SJohn Forte 
1224fcf3ce44SJohn Forte 	for (i = 0; i < idlp->al_out_cnt; i++) {
1225fcf3ce44SJohn Forte 		if (discoveryAddressOid.objectSequenceNumber !=
1226fcf3ce44SJohn Forte 		    idlp->al_addrs[i].a_oid)
1227fcf3ce44SJohn Forte 			continue;
1228fcf3ce44SJohn Forte 		matched_addr = &(idlp->al_addrs[i]);
1229fcf3ce44SJohn Forte 	}
1230fcf3ce44SJohn Forte 
1231fcf3ce44SJohn Forte 	if (matched_addr == NULL) {
1232fcf3ce44SJohn Forte 		return (IMA_ERROR_OBJECT_NOT_FOUND);
1233fcf3ce44SJohn Forte 	}
1234fcf3ce44SJohn Forte 
1235fcf3ce44SJohn Forte 	if (matched_addr->a_addr.i_insize == sizeof (struct in_addr)) {
1236fcf3ce44SJohn Forte 		pProps->discoveryAddress.hostnameIpAddress.id.
1237fcf3ce44SJohn Forte 		    ipAddress.ipv4Address = IMA_TRUE;
1238fcf3ce44SJohn Forte 	} else if (matched_addr->a_addr.i_insize == sizeof (struct in6_addr)) {
1239fcf3ce44SJohn Forte 		pProps->discoveryAddress.hostnameIpAddress.id.
1240fcf3ce44SJohn Forte 		    ipAddress.ipv4Address = IMA_FALSE;
1241fcf3ce44SJohn Forte 	} else {
1242fcf3ce44SJohn Forte 		/* Should not happen */
1243fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1244fcf3ce44SJohn Forte 		    "ISCSI_STATIC_GET returned bad address");
1245fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1246fcf3ce44SJohn Forte 	}
1247fcf3ce44SJohn Forte 
1248fcf3ce44SJohn Forte 	addr = &pProps->discoveryAddress;
1249fcf3ce44SJohn Forte 	bcopy(&(matched_addr->a_addr.i_addr), pProps->discoveryAddress.
1250fcf3ce44SJohn Forte 	    hostnameIpAddress.id.ipAddress.ipAddress,
1251fcf3ce44SJohn Forte 	    sizeof (addr->hostnameIpAddress.id.ipAddress.ipAddress));
1252fcf3ce44SJohn Forte 
1253fcf3ce44SJohn Forte 	pProps->discoveryAddress.portNumber = matched_addr->a_port;
1254fcf3ce44SJohn Forte 
1255fcf3ce44SJohn Forte 	pProps->associatedLhbaOid.objectType = IMA_OBJECT_TYPE_LHBA;
1256fcf3ce44SJohn Forte 	pProps->associatedLhbaOid.ownerId = pluginOwnerId;
1257fcf3ce44SJohn Forte 	pProps->associatedLhbaOid.objectSequenceNumber = ISCSI_INITIATOR_OID;
1258fcf3ce44SJohn Forte 
1259fcf3ce44SJohn Forte 	free(idlp);
1260fcf3ce44SJohn Forte 	(void) close(fd);
1261fcf3ce44SJohn Forte 
1262fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
1263fcf3ce44SJohn Forte }
1264fcf3ce44SJohn Forte 
1265fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_RemoveStaticDiscoveryTarget(
1266fcf3ce44SJohn Forte 		IMA_OID staticTargetOid
1267fcf3ce44SJohn Forte )
1268fcf3ce44SJohn Forte {
1269fcf3ce44SJohn Forte 	entry_t	entry;
1270fcf3ce44SJohn Forte 	int	status, fd;
1271fcf3ce44SJohn Forte 
1272fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
1273fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
1274fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
1275fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1276fcf3ce44SJohn Forte 	}
1277fcf3ce44SJohn Forte 
1278fcf3ce44SJohn Forte 	(void) memset(&entry, 0, sizeof (entry_t));
1279fcf3ce44SJohn Forte 	entry.e_vers = ISCSI_INTERFACE_VERSION;
1280fcf3ce44SJohn Forte 	entry.e_oid = (uint32_t)staticTargetOid.objectSequenceNumber;
1281fcf3ce44SJohn Forte 
1282fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_STATIC_CLEAR, &entry)) {
1283fcf3ce44SJohn Forte 		status = errno;
1284fcf3ce44SJohn Forte 		(void) close(fd);
1285fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1286fcf3ce44SJohn Forte 		    "ISCSI_STATIC_CLEAR ioctl failed, errno: %d", errno);
1287fcf3ce44SJohn Forte 		if (status == EBUSY) {
1288fcf3ce44SJohn Forte 			return (IMA_ERROR_LU_IN_USE);
1289fcf3ce44SJohn Forte 		} else {
1290fcf3ce44SJohn Forte 			return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1291fcf3ce44SJohn Forte 		}
1292fcf3ce44SJohn Forte 	}
1293fcf3ce44SJohn Forte 
1294fcf3ce44SJohn Forte 	(void) close(fd);
1295fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
1296fcf3ce44SJohn Forte }
1297fcf3ce44SJohn Forte 
1298fcf3ce44SJohn Forte /*ARGSUSED*/
1299fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_AddStaticDiscoveryTarget(
1300fcf3ce44SJohn Forte 		IMA_OID lhbaOid,
1301fcf3ce44SJohn Forte 		const IMA_STATIC_DISCOVERY_TARGET staticConfig,
1302fcf3ce44SJohn Forte 		IMA_OID *pTargetOid
1303fcf3ce44SJohn Forte )
1304fcf3ce44SJohn Forte {
1305fcf3ce44SJohn Forte 	char			tmp_target_str[SUN_IMA_IP_ADDRESS_LEN];
1306fcf3ce44SJohn Forte 	char			target_addr_str[SUN_IMA_IP_ADDRESS_LEN];
1307fcf3ce44SJohn Forte 	char			target_port_str[SUN_IMA_IP_PORT_LEN];
1308fcf3ce44SJohn Forte 	iscsi_target_entry_t	target;
1309fcf3ce44SJohn Forte 	int			fd;
1310fcf3ce44SJohn Forte 	int			target_in_addr_size;
1311fcf3ce44SJohn Forte 	int			target_port;
1312fcf3ce44SJohn Forte 	union {
1313fcf3ce44SJohn Forte 		struct in_addr	u_in4;
1314fcf3ce44SJohn Forte 		struct in6_addr	u_in6;
1315fcf3ce44SJohn Forte 	}			target_in;
1316fcf3ce44SJohn Forte 
1317fcf3ce44SJohn Forte 	/*
1318fcf3ce44SJohn Forte 	 * staticConfig.address may come in with port number at its trailer.
1319fcf3ce44SJohn Forte 	 * Parse it to separate the IP address and port number.
1320fcf3ce44SJohn Forte 	 * Also translate the hostname to IP address if needed.
1321fcf3ce44SJohn Forte 	 */
1322fcf3ce44SJohn Forte 	(void) wcstombs(tmp_target_str,
1323fcf3ce44SJohn Forte 	    staticConfig.targetAddress.hostnameIpAddress.
1324fcf3ce44SJohn Forte 	    id.hostname, sizeof (tmp_target_str));
1325fcf3ce44SJohn Forte 
1326fcf3ce44SJohn Forte 	if (tmp_target_str[0] == '[') {
1327fcf3ce44SJohn Forte 		/* IPv6 address */
1328fcf3ce44SJohn Forte 		char *closeBracketPos;
1329fcf3ce44SJohn Forte 		closeBracketPos = strchr(tmp_target_str, ']');
1330fcf3ce44SJohn Forte 		if (!closeBracketPos) {
1331fcf3ce44SJohn Forte 			return (IMA_ERROR_INVALID_PARAMETER);
1332fcf3ce44SJohn Forte 		}
1333fcf3ce44SJohn Forte 
1334fcf3ce44SJohn Forte 		*closeBracketPos = NULL;
1335fcf3ce44SJohn Forte 		(void) strlcpy(target_addr_str, &tmp_target_str[1],
1336fcf3ce44SJohn Forte 		    sizeof (target_addr_str));
1337fcf3ce44SJohn Forte 
1338fcf3ce44SJohn Forte 		if (inet_pton(AF_INET6, target_addr_str,
1339fcf3ce44SJohn Forte 		    &target_in.u_in6) != 1) {
1340fcf3ce44SJohn Forte 			return (IMA_ERROR_INVALID_PARAMETER);
1341fcf3ce44SJohn Forte 		}
1342fcf3ce44SJohn Forte 		target_in_addr_size = sizeof (struct in6_addr);
1343fcf3ce44SJohn Forte 
1344fcf3ce44SJohn Forte 		/* Extract the port number */
1345fcf3ce44SJohn Forte 		closeBracketPos++;
1346fcf3ce44SJohn Forte 		if (*closeBracketPos == ':') {
1347fcf3ce44SJohn Forte 			closeBracketPos++;
1348fcf3ce44SJohn Forte 
1349fcf3ce44SJohn Forte 			if (*closeBracketPos != NULL) {
1350fcf3ce44SJohn Forte 				(void) strlcpy(target_port_str, closeBracketPos,
1351fcf3ce44SJohn Forte 				    sizeof (target_port_str));
1352fcf3ce44SJohn Forte 				target_port = atoi(target_port_str);
1353fcf3ce44SJohn Forte 			} else {
1354fcf3ce44SJohn Forte 				target_port = ISCSI_LISTEN_PORT;
1355fcf3ce44SJohn Forte 			}
1356fcf3ce44SJohn Forte 		} else {
1357fcf3ce44SJohn Forte 			/* No port number specified; use default port */
1358fcf3ce44SJohn Forte 			target_port = ISCSI_LISTEN_PORT;
1359fcf3ce44SJohn Forte 		}
1360fcf3ce44SJohn Forte 	} else {
1361fcf3ce44SJohn Forte 		/* IPv4 address */
1362fcf3ce44SJohn Forte 		char *colonPos;
1363fcf3ce44SJohn Forte 		colonPos = strchr(tmp_target_str, ':');
1364fcf3ce44SJohn Forte 		if (!colonPos) {
1365fcf3ce44SJohn Forte 			/* No port number specified; use default port */
1366fcf3ce44SJohn Forte 			target_port = ISCSI_LISTEN_PORT;
1367fcf3ce44SJohn Forte 			(void) strlcpy(target_addr_str, tmp_target_str,
1368fcf3ce44SJohn Forte 			    sizeof (target_addr_str));
1369fcf3ce44SJohn Forte 		} else {
1370fcf3ce44SJohn Forte 			*colonPos = NULL;
1371fcf3ce44SJohn Forte 			(void) strlcpy(target_addr_str, tmp_target_str,
1372fcf3ce44SJohn Forte 			    sizeof (target_addr_str));
1373fcf3ce44SJohn Forte 			/* Extract the port number */
1374fcf3ce44SJohn Forte 			colonPos++;
1375fcf3ce44SJohn Forte 			if (*colonPos != NULL) {
1376fcf3ce44SJohn Forte 				(void) strlcpy(target_port_str, colonPos,
1377fcf3ce44SJohn Forte 				    sizeof (target_port_str));
1378fcf3ce44SJohn Forte 				target_port = atoi(target_port_str);
1379fcf3ce44SJohn Forte 			} else {
1380fcf3ce44SJohn Forte 				target_port = ISCSI_LISTEN_PORT;
1381fcf3ce44SJohn Forte 			}
1382fcf3ce44SJohn Forte 		}
1383fcf3ce44SJohn Forte 
1384fcf3ce44SJohn Forte 		if (inet_pton(AF_INET, target_addr_str,
1385fcf3ce44SJohn Forte 		    &target_in.u_in4) != 1) {
1386fcf3ce44SJohn Forte 			return (IMA_ERROR_INVALID_PARAMETER);
1387fcf3ce44SJohn Forte 		}
1388fcf3ce44SJohn Forte 
1389fcf3ce44SJohn Forte 		target_in_addr_size = sizeof (struct in_addr);
1390fcf3ce44SJohn Forte 	}
1391fcf3ce44SJohn Forte 
1392fcf3ce44SJohn Forte 
1393fcf3ce44SJohn Forte 	(void) memset(&target, 0, sizeof (iscsi_target_entry_t));
1394fcf3ce44SJohn Forte 	target.te_entry.e_vers = ISCSI_INTERFACE_VERSION;
1395fcf3ce44SJohn Forte 	target.te_entry.e_oid = ISCSI_OID_NOTSET;
1396fcf3ce44SJohn Forte 	target.te_entry.e_tpgt = ISCSI_DEFAULT_TPGT;
1397fcf3ce44SJohn Forte 
1398fcf3ce44SJohn Forte 	(void) wcstombs((char *)target.te_name, staticConfig.targetName,
1399fcf3ce44SJohn Forte 	    ISCSI_MAX_NAME_LEN);
1400fcf3ce44SJohn Forte 
1401fcf3ce44SJohn Forte 	target.te_entry.e_insize = target_in_addr_size;
1402fcf3ce44SJohn Forte 	if (target.te_entry.e_insize == sizeof (struct in_addr)) {
1403fcf3ce44SJohn Forte 		target.te_entry.e_u.u_in4.s_addr = target_in.u_in4.s_addr;
1404fcf3ce44SJohn Forte 	} else if (target.te_entry.e_insize == sizeof (struct in6_addr)) {
1405fcf3ce44SJohn Forte 		bcopy(target_in.u_in6.s6_addr,
1406fcf3ce44SJohn Forte 		    target.te_entry.e_u.u_in6.s6_addr,
1407fcf3ce44SJohn Forte 		    sizeof (struct in6_addr));
1408fcf3ce44SJohn Forte 	} else {
1409fcf3ce44SJohn Forte 		/* Should not happen */
1410fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1411fcf3ce44SJohn Forte 		    "ISCSI_STATIC_GET returned bad address");
1412fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1413fcf3ce44SJohn Forte 	}
1414fcf3ce44SJohn Forte 
1415fcf3ce44SJohn Forte 	target.te_entry.e_port = target_port;
1416fcf3ce44SJohn Forte 
1417fcf3ce44SJohn Forte 	/* No target portal group specified. Default to -1. */
1418fcf3ce44SJohn Forte 	target.te_entry.e_tpgt = ISCSI_DEFAULT_TPGT;
1419fcf3ce44SJohn Forte 
1420fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
1421fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
1422fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
1423fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1424fcf3ce44SJohn Forte 	}
1425fcf3ce44SJohn Forte 
1426fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_STATIC_SET, &target)) {
1427fcf3ce44SJohn Forte 		/*
1428fcf3ce44SJohn Forte 		 * Encountered problem setting the IP address and port for
1429fcf3ce44SJohn Forte 		 * the target just added.
1430fcf3ce44SJohn Forte 		 */
1431fcf3ce44SJohn Forte 		(void) close(fd);
1432fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1433fcf3ce44SJohn Forte 		    "ISCSI_STATIC_SET ioctl failed, errno: %d", errno);
1434fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1435fcf3ce44SJohn Forte 	}
1436fcf3ce44SJohn Forte 
1437fcf3ce44SJohn Forte 	pTargetOid->objectType = IMA_OBJECT_TYPE_TARGET;
1438fcf3ce44SJohn Forte 	pTargetOid->ownerId = pluginOwnerId;
1439fcf3ce44SJohn Forte 	pTargetOid->objectSequenceNumber = target.te_entry.e_oid;
1440fcf3ce44SJohn Forte 
1441fcf3ce44SJohn Forte 	(void) close(fd);
1442fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
1443fcf3ce44SJohn Forte }
1444fcf3ce44SJohn Forte 
1445fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetTargetProperties(
1446fcf3ce44SJohn Forte 		IMA_OID targetId,
1447fcf3ce44SJohn Forte 		IMA_TARGET_PROPERTIES *pProps
1448fcf3ce44SJohn Forte )
1449fcf3ce44SJohn Forte {
1450fcf3ce44SJohn Forte 	return (getTargetProperties(targetId, pProps));
1451fcf3ce44SJohn Forte }
1452fcf3ce44SJohn Forte 
1453fcf3ce44SJohn Forte static IMA_STATUS getTargetProperties(
1454fcf3ce44SJohn Forte 		IMA_OID targetId,
1455fcf3ce44SJohn Forte 		IMA_TARGET_PROPERTIES *pProps
1456fcf3ce44SJohn Forte )
1457fcf3ce44SJohn Forte {
1458fcf3ce44SJohn Forte 	int		    fd;
1459fcf3ce44SJohn Forte 	iscsi_property_t    prop;
1460fcf3ce44SJohn Forte 
1461fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
1462fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
1463fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
1464fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1465fcf3ce44SJohn Forte 	}
1466fcf3ce44SJohn Forte 
1467fcf3ce44SJohn Forte 	(void) memset(&prop, 0, sizeof (iscsi_property_t));
1468fcf3ce44SJohn Forte 	prop.p_vers = ISCSI_INTERFACE_VERSION;
1469fcf3ce44SJohn Forte 	prop.p_oid = (uint32_t)targetId.objectSequenceNumber;
1470fcf3ce44SJohn Forte 
1471fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_TARGET_PROPS_GET, &prop) != 0) {
1472fcf3ce44SJohn Forte 		(void) close(fd);
1473fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1474fcf3ce44SJohn Forte 		    "ISCSI_TARGET_PROPS_GET ioctl failed, errno: %d", errno);
1475fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1476fcf3ce44SJohn Forte 	}
1477fcf3ce44SJohn Forte 
1478fcf3ce44SJohn Forte 	(void) mbstowcs(pProps->name, (char *)prop.p_name, IMA_NODE_NAME_LEN);
1479fcf3ce44SJohn Forte 	(void) memset(pProps->alias, 0,
1480fcf3ce44SJohn Forte 	    sizeof (IMA_WCHAR) * IMA_NODE_ALIAS_LEN);
1481fcf3ce44SJohn Forte 	if (prop.p_alias_len > 0) {
1482fcf3ce44SJohn Forte 		(void) mbstowcs(pProps->alias, (char *)prop.p_alias,
1483fcf3ce44SJohn Forte 		    IMA_NODE_ALIAS_LEN);
1484fcf3ce44SJohn Forte 	}
1485fcf3ce44SJohn Forte 
1486fcf3ce44SJohn Forte 	/* Initialize the discovery method to unknown method. */
1487fcf3ce44SJohn Forte 	pProps->discoveryMethodFlags = IMA_TARGET_DISCOVERY_METHOD_UNKNOWN;
1488fcf3ce44SJohn Forte 	if (!((prop.p_discovery & iSCSIDiscoveryMethodStatic) ^
1489fcf3ce44SJohn Forte 	    iSCSIDiscoveryMethodStatic)) {
1490fcf3ce44SJohn Forte 		pProps->discoveryMethodFlags |=
1491fcf3ce44SJohn Forte 		    IMA_TARGET_DISCOVERY_METHOD_STATIC;
1492fcf3ce44SJohn Forte 	}
1493fcf3ce44SJohn Forte 
1494fcf3ce44SJohn Forte 	if (!((prop.p_discovery & iSCSIDiscoveryMethodSLP) ^
1495fcf3ce44SJohn Forte 	    iSCSIDiscoveryMethodSLP)) {
1496fcf3ce44SJohn Forte 		pProps->discoveryMethodFlags |=	IMA_TARGET_DISCOVERY_METHOD_SLP;
1497fcf3ce44SJohn Forte 	}
1498fcf3ce44SJohn Forte 
1499fcf3ce44SJohn Forte 	if (!((prop.p_discovery & iSCSIDiscoveryMethodISNS) ^
1500fcf3ce44SJohn Forte 	    iSCSIDiscoveryMethodISNS)) {
1501fcf3ce44SJohn Forte 		pProps->discoveryMethodFlags |=	iSCSIDiscoveryMethodISNS;
1502fcf3ce44SJohn Forte 	}
1503fcf3ce44SJohn Forte 
1504fcf3ce44SJohn Forte 	if (!((prop.p_discovery & iSCSIDiscoveryMethodSendTargets) ^
1505fcf3ce44SJohn Forte 	    iSCSIDiscoveryMethodSendTargets)) {
1506fcf3ce44SJohn Forte 		pProps->discoveryMethodFlags |= iSCSIDiscoveryMethodSendTargets;
1507fcf3ce44SJohn Forte 	}
1508fcf3ce44SJohn Forte 
1509fcf3ce44SJohn Forte 	(void) close(fd);
1510fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
1511fcf3ce44SJohn Forte }
1512fcf3ce44SJohn Forte 
1513fcf3ce44SJohn Forte /*ARGSUSED*/
1514fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetTargetErrorStatistics(
1515fcf3ce44SJohn Forte 		IMA_OID targetId,
1516fcf3ce44SJohn Forte 		IMA_TARGET_ERROR_STATISTICS *pStats
1517fcf3ce44SJohn Forte )
1518fcf3ce44SJohn Forte {
1519fcf3ce44SJohn Forte 	return (IMA_ERROR_NOT_SUPPORTED);
1520fcf3ce44SJohn Forte }
1521fcf3ce44SJohn Forte 
1522fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetLuOidList(
1523fcf3ce44SJohn Forte 		IMA_OID oid,
1524fcf3ce44SJohn Forte 		IMA_OID_LIST **ppList
1525fcf3ce44SJohn Forte )
1526fcf3ce44SJohn Forte {
1527fcf3ce44SJohn Forte 	IMA_STATUS		status;
1528fcf3ce44SJohn Forte 	int			i;
1529fcf3ce44SJohn Forte 	iscsi_lun_list_t	*pLunList;
1530fcf3ce44SJohn Forte 
1531fcf3ce44SJohn Forte 	if (oid.objectType == IMA_OBJECT_TYPE_LHBA) {
1532fcf3ce44SJohn Forte 		status = get_target_lun_oid_list(NULL, &pLunList);
1533fcf3ce44SJohn Forte 	} else {
1534fcf3ce44SJohn Forte 		status = get_target_lun_oid_list(&oid, &pLunList);
1535fcf3ce44SJohn Forte 	}
1536fcf3ce44SJohn Forte 
1537fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
1538fcf3ce44SJohn Forte 		return (status);
1539fcf3ce44SJohn Forte 	}
1540fcf3ce44SJohn Forte 
1541fcf3ce44SJohn Forte 	*ppList = (IMA_OID_LIST *) calloc(1, (sizeof (IMA_OID_LIST) +
1542fcf3ce44SJohn Forte 	    (pLunList->ll_out_cnt * sizeof (IMA_OID))));
1543fcf3ce44SJohn Forte 	if (*ppList == NULL) {
1544fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
1545fcf3ce44SJohn Forte 	}
1546fcf3ce44SJohn Forte 	(*ppList)->oidCount = pLunList->ll_out_cnt;
1547fcf3ce44SJohn Forte 	for (i = 0; i < pLunList->ll_out_cnt; i++) {
1548fcf3ce44SJohn Forte 		(*ppList)->oids[i].objectType = IMA_OBJECT_TYPE_LU;
1549fcf3ce44SJohn Forte 		(*ppList)->oids[i].ownerId = pluginOwnerId;
1550fcf3ce44SJohn Forte 		(*ppList)->oids[i].objectSequenceNumber =
1551fcf3ce44SJohn Forte 		    pLunList->ll_luns[i].l_oid;
1552fcf3ce44SJohn Forte 	}
1553fcf3ce44SJohn Forte 
1554fcf3ce44SJohn Forte 	free(pLunList);
1555fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
1556fcf3ce44SJohn Forte }
1557fcf3ce44SJohn Forte 
1558fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetLuOid(
1559fcf3ce44SJohn Forte 		IMA_OID targetId,
1560fcf3ce44SJohn Forte 		IMA_UINT64 lun,
1561fcf3ce44SJohn Forte 		IMA_OID *pluId
1562fcf3ce44SJohn Forte )
1563fcf3ce44SJohn Forte {
1564fcf3ce44SJohn Forte 	IMA_STATUS		status;
1565fcf3ce44SJohn Forte 	int			i;
1566fcf3ce44SJohn Forte 	iscsi_lun_list_t	*pLunList;
1567fcf3ce44SJohn Forte 
1568fcf3ce44SJohn Forte 	status = get_target_lun_oid_list(&targetId, &pLunList);
1569fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
1570fcf3ce44SJohn Forte 		return (status);
1571fcf3ce44SJohn Forte 	}
1572fcf3ce44SJohn Forte 
1573fcf3ce44SJohn Forte 	for (i = 0; i < pLunList->ll_out_cnt; i++) {
1574fcf3ce44SJohn Forte 		if (pLunList->ll_luns[i].l_num == lun) {
1575fcf3ce44SJohn Forte 			pluId->objectType = IMA_OBJECT_TYPE_LU;
1576fcf3ce44SJohn Forte 			pluId->ownerId = pluginOwnerId;
1577fcf3ce44SJohn Forte 			pluId->objectSequenceNumber =
1578fcf3ce44SJohn Forte 			    pLunList->ll_luns[i].l_oid;
1579fcf3ce44SJohn Forte 			free(pLunList);
1580fcf3ce44SJohn Forte 			return (IMA_STATUS_SUCCESS);
1581fcf3ce44SJohn Forte 		}
1582fcf3ce44SJohn Forte 	}
1583fcf3ce44SJohn Forte 
1584fcf3ce44SJohn Forte 	free(pLunList);
1585fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
1586fcf3ce44SJohn Forte }
1587fcf3ce44SJohn Forte 
1588fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetLuProperties(
1589fcf3ce44SJohn Forte 		IMA_OID luId,
1590fcf3ce44SJohn Forte 		IMA_LU_PROPERTIES *pProps
1591fcf3ce44SJohn Forte )
1592fcf3ce44SJohn Forte {
1593fcf3ce44SJohn Forte 	return (getLuProperties(luId, pProps));
1594fcf3ce44SJohn Forte }
1595fcf3ce44SJohn Forte 
1596fcf3ce44SJohn Forte static IMA_STATUS getLuProperties(
1597fcf3ce44SJohn Forte 		IMA_OID luId,
1598fcf3ce44SJohn Forte 		IMA_LU_PROPERTIES *pProps
1599fcf3ce44SJohn Forte )
1600fcf3ce44SJohn Forte {
1601fcf3ce44SJohn Forte 	IMA_STATUS		status;
1602fcf3ce44SJohn Forte 	iscsi_lun_list_t	*pLunList;
1603fcf3ce44SJohn Forte 	int			j;
1604fcf3ce44SJohn Forte 	IMA_BOOL		lunMatch = IMA_FALSE;
1605fcf3ce44SJohn Forte 	int			fd;
1606fcf3ce44SJohn Forte 	iscsi_lun_props_t	lun;
1607fcf3ce44SJohn Forte 	di_devlink_handle_t	hdl;
1608fcf3ce44SJohn Forte 
1609fcf3ce44SJohn Forte 	if (luId.objectType != IMA_OBJECT_TYPE_LU) {
1610fcf3ce44SJohn Forte 		return (IMA_ERROR_INCORRECT_OBJECT_TYPE);
1611fcf3ce44SJohn Forte 	}
1612fcf3ce44SJohn Forte 
1613fcf3ce44SJohn Forte 	/*
1614fcf3ce44SJohn Forte 	 * get list of lun oids for all targets
1615fcf3ce44SJohn Forte 	 */
1616fcf3ce44SJohn Forte 	status = get_target_lun_oid_list(NULL, &pLunList);
1617fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
1618fcf3ce44SJohn Forte 		return (status);
1619fcf3ce44SJohn Forte 	}
1620fcf3ce44SJohn Forte 	for (j = 0; j < pLunList->ll_out_cnt; j++) {
1621fcf3ce44SJohn Forte 		/*
1622fcf3ce44SJohn Forte 		 * for each lun, check if match is found
1623fcf3ce44SJohn Forte 		 */
1624fcf3ce44SJohn Forte 		if (pLunList->ll_luns[j].l_oid == luId.objectSequenceNumber) {
1625fcf3ce44SJohn Forte 			/*
1626fcf3ce44SJohn Forte 			 * match found, break out of lun loop
1627fcf3ce44SJohn Forte 			 */
1628fcf3ce44SJohn Forte 			lunMatch = IMA_TRUE;
1629fcf3ce44SJohn Forte 			break;
1630fcf3ce44SJohn Forte 		}
1631fcf3ce44SJohn Forte 	}
1632fcf3ce44SJohn Forte 
1633fcf3ce44SJohn Forte 	if (lunMatch == IMA_TRUE) {
1634fcf3ce44SJohn Forte 		(void) memset(&lun, 0, sizeof (iscsi_lun_props_t));
1635fcf3ce44SJohn Forte 		lun.lp_vers = ISCSI_INTERFACE_VERSION;
1636fcf3ce44SJohn Forte 		lun.lp_tgt_oid = pLunList->ll_luns[j].l_tgt_oid;
1637fcf3ce44SJohn Forte 		lun.lp_oid = pLunList->ll_luns[j].l_oid;
1638fcf3ce44SJohn Forte 	}
1639fcf3ce44SJohn Forte 
1640fcf3ce44SJohn Forte 	free(pLunList);
1641fcf3ce44SJohn Forte 
1642fcf3ce44SJohn Forte 	if (lunMatch == IMA_FALSE) {
1643fcf3ce44SJohn Forte 		return (IMA_ERROR_OBJECT_NOT_FOUND);
1644fcf3ce44SJohn Forte 	}
1645fcf3ce44SJohn Forte 
1646fcf3ce44SJohn Forte 	/*
1647fcf3ce44SJohn Forte 	 * get lun properties
1648fcf3ce44SJohn Forte 	 */
1649fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
1650fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
1651fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
1652fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1653fcf3ce44SJohn Forte 	}
1654fcf3ce44SJohn Forte 
1655fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_LUN_PROPS_GET, &lun)) {
1656fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1657fcf3ce44SJohn Forte 		    "ISCSI_LUN_PROPS_GET ioctl failed, errno: %d", errno);
1658fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1659fcf3ce44SJohn Forte 	}
1660fcf3ce44SJohn Forte 	(void) close(fd);
1661fcf3ce44SJohn Forte 
1662fcf3ce44SJohn Forte 	/*
1663fcf3ce44SJohn Forte 	 * set property values
1664fcf3ce44SJohn Forte 	 */
1665fcf3ce44SJohn Forte 	pProps->associatedTargetOid.objectType = IMA_OBJECT_TYPE_TARGET;
1666fcf3ce44SJohn Forte 	pProps->associatedTargetOid.ownerId = pluginOwnerId;
1667fcf3ce44SJohn Forte 	pProps->associatedTargetOid.objectSequenceNumber = lun.lp_tgt_oid;
1668fcf3ce44SJohn Forte 	pProps->targetLun = (IMA_UINT64)lun.lp_num;
1669fcf3ce44SJohn Forte 	pProps->exposedToOs = IMA_TRUE;
1670fcf3ce44SJohn Forte 	(void) memset(&pProps->timeExposedToOs, 0,
1671fcf3ce44SJohn Forte 	    sizeof (pProps->timeExposedToOs));
1672fcf3ce44SJohn Forte 
1673fcf3ce44SJohn Forte 	if (lun.lp_status == LunValid) {
1674fcf3ce44SJohn Forte 
1675fcf3ce44SJohn Forte 		/* add minor device delimiter */
1676fcf3ce44SJohn Forte 		(void) strcat(lun.lp_pathname, ":");
1677fcf3ce44SJohn Forte 
1678fcf3ce44SJohn Forte 		if ((strstr(lun.lp_pathname, "sd@") != NULL) ||
1679fcf3ce44SJohn Forte 		    (strstr(lun.lp_pathname, "ssd@") != NULL) ||
1680fcf3ce44SJohn Forte 		    (strstr(lun.lp_pathname, "disk@") != NULL)) {
1681fcf3ce44SJohn Forte 			/*
1682fcf3ce44SJohn Forte 			 * modify returned pathname to obtain the 2nd slice
1683fcf3ce44SJohn Forte 			 * of the raw disk
1684fcf3ce44SJohn Forte 			 */
1685fcf3ce44SJohn Forte 			(void) strcat(lun.lp_pathname, "c,raw");
1686fcf3ce44SJohn Forte 		}
1687fcf3ce44SJohn Forte 
1688fcf3ce44SJohn Forte 		/*
1689fcf3ce44SJohn Forte 		 * Pathname returned by driver is the physical device path.
1690fcf3ce44SJohn Forte 		 * This name needs to be converted to the OS device name.
1691fcf3ce44SJohn Forte 		 */
1692fcf3ce44SJohn Forte 		if (hdl = di_devlink_init(lun.lp_pathname, DI_MAKE_LINK)) {
1693fcf3ce44SJohn Forte 			pProps->osDeviceName[0] = L'\0';
1694fcf3ce44SJohn Forte 			(void) di_devlink_walk(hdl, NULL, lun.lp_pathname,
1695fcf3ce44SJohn Forte 			    DI_PRIMARY_LINK, (void *)pProps->osDeviceName,
1696fcf3ce44SJohn Forte 			    get_lun_devlink);
1697fcf3ce44SJohn Forte 			if (pProps->osDeviceName[0] != L'\0') {
1698fcf3ce44SJohn Forte 				/* OS device name synchronously made */
1699fcf3ce44SJohn Forte 				pProps->osDeviceNameValid = IMA_TRUE;
1700fcf3ce44SJohn Forte 			} else {
1701fcf3ce44SJohn Forte 				pProps->osDeviceNameValid = IMA_FALSE;
1702fcf3ce44SJohn Forte 			}
1703fcf3ce44SJohn Forte 
1704fcf3ce44SJohn Forte 			(void) di_devlink_fini(&hdl);
1705fcf3ce44SJohn Forte 		} else {
1706fcf3ce44SJohn Forte 			pProps->osDeviceNameValid = IMA_FALSE;
1707fcf3ce44SJohn Forte 		}
1708fcf3ce44SJohn Forte 
1709fcf3ce44SJohn Forte 	} else {
1710fcf3ce44SJohn Forte 		pProps->osDeviceNameValid = IMA_FALSE;
1711fcf3ce44SJohn Forte 	}
1712fcf3ce44SJohn Forte 
1713fcf3ce44SJohn Forte 	pProps->osParallelIdsValid = IMA_FALSE;
1714fcf3ce44SJohn Forte 
1715fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
1716fcf3ce44SJohn Forte }
1717fcf3ce44SJohn Forte 
1718fcf3ce44SJohn Forte /*ARGSUSED*/
1719fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetStatisticsProperties(
1720fcf3ce44SJohn Forte 		IMA_OID oid,
1721fcf3ce44SJohn Forte 		IMA_STATISTICS_PROPERTIES *pProps
1722fcf3ce44SJohn Forte )
1723fcf3ce44SJohn Forte {
1724fcf3ce44SJohn Forte 	return (IMA_ERROR_NOT_SUPPORTED);
1725fcf3ce44SJohn Forte }
1726fcf3ce44SJohn Forte 
1727fcf3ce44SJohn Forte /*ARGSUSED*/
1728fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetDeviceStatistics(
1729fcf3ce44SJohn Forte 		IMA_OID luId,
1730fcf3ce44SJohn Forte 		IMA_DEVICE_STATISTICS *pStats
1731fcf3ce44SJohn Forte )
1732fcf3ce44SJohn Forte {
1733fcf3ce44SJohn Forte 	return (IMA_ERROR_NOT_SUPPORTED);
1734fcf3ce44SJohn Forte }
1735fcf3ce44SJohn Forte 
1736fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_LuInquiry(
1737fcf3ce44SJohn Forte 	IMA_OID deviceId,
1738fcf3ce44SJohn Forte 	IMA_BOOL evpd,
1739fcf3ce44SJohn Forte 	IMA_BOOL cmddt,
1740fcf3ce44SJohn Forte 	IMA_BYTE pageCode,
1741fcf3ce44SJohn Forte 	IMA_BYTE *pOutputBuffer,
1742fcf3ce44SJohn Forte 	IMA_UINT *pOutputBufferLength,
1743fcf3ce44SJohn Forte 	IMA_BYTE *pSenseBuffer,
1744fcf3ce44SJohn Forte 	IMA_UINT *pSenseBufferLength
1745fcf3ce44SJohn Forte )
1746fcf3ce44SJohn Forte {
1747fcf3ce44SJohn Forte 	IMA_LU_PROPERTIES luProps;
1748fcf3ce44SJohn Forte 	IMA_STATUS status;
1749146832dbSMilos Muzik 	unsigned char cmdblk[CDB_GROUP0];
1750146832dbSMilos Muzik 	IMA_UINT buflen;
1751fcf3ce44SJohn Forte 	int fd;
1752fcf3ce44SJohn Forte 	iscsi_uscsi_t uscsi;
1753fcf3ce44SJohn Forte 
1754146832dbSMilos Muzik 	(void) memset(&cmdblk[0], 0, CDB_GROUP0);
1755146832dbSMilos Muzik 	cmdblk[0] = SCMD_INQUIRY;
1756146832dbSMilos Muzik 
1757146832dbSMilos Muzik 	if (evpd == IMA_TRUE)
1758146832dbSMilos Muzik 		cmdblk[1] |= 0x01;
1759146832dbSMilos Muzik 	if (cmddt == IMA_TRUE)
1760146832dbSMilos Muzik 		cmdblk[1] |= 0x02;
1761146832dbSMilos Muzik 
1762fcf3ce44SJohn Forte 	cmdblk[2] = pageCode;
1763fcf3ce44SJohn Forte 
1764146832dbSMilos Muzik 	if (*pOutputBufferLength > MAX_INQUIRY_BUFFER_LEN) {
1765146832dbSMilos Muzik 		buflen = MAX_INQUIRY_BUFFER_LEN;
1766146832dbSMilos Muzik 	} else {
1767146832dbSMilos Muzik 		buflen = *pOutputBufferLength;
1768146832dbSMilos Muzik 	}
1769146832dbSMilos Muzik 	cmdblk[3] = (buflen & 0xff00) >> 8;
1770146832dbSMilos Muzik 	cmdblk[4] = (buflen & 0x00ff);
1771146832dbSMilos Muzik 
1772fcf3ce44SJohn Forte 	(void) memset(&uscsi, 0, sizeof (iscsi_uscsi_t));
1773fcf3ce44SJohn Forte 	uscsi.iu_vers 	= ISCSI_INTERFACE_VERSION;
1774fcf3ce44SJohn Forte 
1775fcf3ce44SJohn Forte 	/* iu_oid is a session oid in the driver */
1776fcf3ce44SJohn Forte 	if (deviceId.objectType == IMA_OBJECT_TYPE_TARGET) {
1777fcf3ce44SJohn Forte 		uscsi.iu_oid	= deviceId.objectSequenceNumber;
1778fcf3ce44SJohn Forte 		uscsi.iu_lun	= 0;
1779fcf3ce44SJohn Forte 	} else {
1780fcf3ce44SJohn Forte 		/*
1781fcf3ce44SJohn Forte 		 * Get LU properties and associated session oid
1782fcf3ce44SJohn Forte 		 * for this lun(deviceId) and put in uscsi.iu_oid
1783fcf3ce44SJohn Forte 		 */
1784fcf3ce44SJohn Forte 		status = getLuProperties(deviceId, &luProps);
1785fcf3ce44SJohn Forte 		if (status != IMA_STATUS_SUCCESS) {
1786fcf3ce44SJohn Forte 			return (status);
1787fcf3ce44SJohn Forte 		}
1788fcf3ce44SJohn Forte 		uscsi.iu_oid = (uint32_t)luProps.associatedTargetOid.
1789fcf3ce44SJohn Forte 		    objectSequenceNumber;
1790fcf3ce44SJohn Forte 		uscsi.iu_lun = luProps.targetLun;
1791fcf3ce44SJohn Forte 	}
1792fcf3ce44SJohn Forte 
1793fcf3ce44SJohn Forte 	uscsi.iu_ucmd.uscsi_flags = USCSI_READ;
1794fcf3ce44SJohn Forte 	uscsi.iu_ucmd.uscsi_timeout = USCSI_TIMEOUT_IN_SEC;
1795fcf3ce44SJohn Forte 	uscsi.iu_ucmd.uscsi_bufaddr = (char *)pOutputBuffer;
1796146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_buflen = buflen;
1797fcf3ce44SJohn Forte 	uscsi.iu_ucmd.uscsi_rqbuf = (char *)pSenseBuffer;
1798146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_rqlen = (pSenseBufferLength != NULL) ?
1799146832dbSMilos Muzik 	    *pSenseBufferLength : 0;
1800146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_cdb = (char *)&cmdblk[0];
1801146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_cdblen = CDB_GROUP0;
1802fcf3ce44SJohn Forte 
1803fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
1804fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
1805fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
1806fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1807fcf3ce44SJohn Forte 	}
1808fcf3ce44SJohn Forte 
1809fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_USCSI, &uscsi) != 0) {
1810fcf3ce44SJohn Forte 		(void) close(fd);
1811fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1812fcf3ce44SJohn Forte 		    "ISCSI_TARGET_PROPS_GET ioctl failed, errno: %d", errno);
1813fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1814fcf3ce44SJohn Forte 	}
1815fcf3ce44SJohn Forte 
1816146832dbSMilos Muzik 	if (uscsi.iu_ucmd.uscsi_status == STATUS_CHECK) {
1817146832dbSMilos Muzik 		if (pSenseBufferLength != NULL) {
1818146832dbSMilos Muzik 			*pSenseBufferLength -= uscsi.iu_ucmd.uscsi_rqresid;
1819146832dbSMilos Muzik 		}
1820146832dbSMilos Muzik 		return (IMA_ERROR_SCSI_STATUS_CHECK_CONDITION);
1821146832dbSMilos Muzik 	}
1822146832dbSMilos Muzik 
1823146832dbSMilos Muzik 	*pOutputBufferLength = buflen - uscsi.iu_ucmd.uscsi_resid;
1824fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
1825fcf3ce44SJohn Forte }
1826fcf3ce44SJohn Forte 
1827fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_LuReadCapacity(
1828fcf3ce44SJohn Forte 		IMA_OID deviceId,
1829fcf3ce44SJohn Forte 		IMA_UINT cdbLength,
1830fcf3ce44SJohn Forte 		IMA_BYTE *pOutputBuffer,
1831fcf3ce44SJohn Forte 		IMA_UINT *pOutputBufferLength,
1832fcf3ce44SJohn Forte 
1833fcf3ce44SJohn Forte 		IMA_BYTE *pSenseBuffer,
1834fcf3ce44SJohn Forte 		IMA_UINT *pSenseBufferLength
1835fcf3ce44SJohn Forte )
1836fcf3ce44SJohn Forte {
1837fcf3ce44SJohn Forte 	IMA_LU_PROPERTIES luProps;
1838fcf3ce44SJohn Forte 	IMA_STATUS status;
1839146832dbSMilos Muzik 	/* CDB_GROUP4 size is safe for both 10 and 16 byte CDBs */
1840146832dbSMilos Muzik 	unsigned char cmdblk[CDB_GROUP4];
1841146832dbSMilos Muzik 	IMA_UINT buflen;
1842fcf3ce44SJohn Forte 	int fd;
1843fcf3ce44SJohn Forte 	iscsi_uscsi_t uscsi;
1844fcf3ce44SJohn Forte 
1845146832dbSMilos Muzik 	(void) memset(&cmdblk[0], 0, CDB_GROUP4);
1846fcf3ce44SJohn Forte 
1847146832dbSMilos Muzik 	if (cdbLength == CDB_GROUP1) {
1848146832dbSMilos Muzik 		/* Read Capacity (10) command. */
1849146832dbSMilos Muzik 		cmdblk[0] = SCMD_READ_CAPACITY;
1850146832dbSMilos Muzik 		buflen = *pOutputBufferLength;
1851146832dbSMilos Muzik 	} else if (cdbLength == CDB_GROUP4) {
1852146832dbSMilos Muzik 		/*
1853146832dbSMilos Muzik 		 * Read Capacity (16) is a Service Action In command. One
1854146832dbSMilos Muzik 		 * command byte (0x9E) is overloaded for multiple operations,
1855146832dbSMilos Muzik 		 * with the second CDB byte specifying the desired operation.
1856146832dbSMilos Muzik 		 */
1857146832dbSMilos Muzik 		cmdblk[0] = SCMD_SVC_ACTION_IN_G4;
1858146832dbSMilos Muzik 		cmdblk[1] = SSVC_ACTION_READ_CAPACITY_G4;
1859fcf3ce44SJohn Forte 
1860146832dbSMilos Muzik 		if (*pOutputBufferLength > MAX_READ_CAPACITY16_BUFFER_LEN) {
1861146832dbSMilos Muzik 			buflen = MAX_READ_CAPACITY16_BUFFER_LEN;
1862146832dbSMilos Muzik 		} else {
1863146832dbSMilos Muzik 			buflen = *pOutputBufferLength;
1864146832dbSMilos Muzik 		}
1865146832dbSMilos Muzik 		cmdblk[10] = (buflen & 0xff000000) >> 24;
1866146832dbSMilos Muzik 		cmdblk[11] = (buflen & 0x00ff0000) >> 16;
1867146832dbSMilos Muzik 		cmdblk[12] = (buflen & 0x0000ff00) >> 8;
1868146832dbSMilos Muzik 		cmdblk[13] = (buflen & 0x000000ff);
1869146832dbSMilos Muzik 	} else {
1870146832dbSMilos Muzik 		/* only 10 and 16 byte CDB are supported */
1871146832dbSMilos Muzik 		return (IMA_ERROR_NOT_SUPPORTED);
1872146832dbSMilos Muzik 	}
1873fcf3ce44SJohn Forte 
1874fcf3ce44SJohn Forte 	(void) memset(&uscsi, 0, sizeof (iscsi_uscsi_t));
1875fcf3ce44SJohn Forte 	uscsi.iu_vers 	= ISCSI_INTERFACE_VERSION;
1876fcf3ce44SJohn Forte 
1877fcf3ce44SJohn Forte 	/* iu_oid is a session oid in the driver */
1878fcf3ce44SJohn Forte 	if (deviceId.objectType == IMA_OBJECT_TYPE_TARGET) {
1879fcf3ce44SJohn Forte 		uscsi.iu_oid	= deviceId.objectSequenceNumber;
1880fcf3ce44SJohn Forte 		uscsi.iu_lun	= 0;
1881fcf3ce44SJohn Forte 	} else {
1882fcf3ce44SJohn Forte 		/*
1883fcf3ce44SJohn Forte 		 * Get LU properties and associated session oid
1884fcf3ce44SJohn Forte 		 * for this lun(deviceId) and put in uscsi.iu_oid
1885fcf3ce44SJohn Forte 		 */
1886fcf3ce44SJohn Forte 		status = getLuProperties(deviceId, &luProps);
1887fcf3ce44SJohn Forte 		if (status != IMA_STATUS_SUCCESS) {
1888fcf3ce44SJohn Forte 			return (status);
1889fcf3ce44SJohn Forte 		}
1890fcf3ce44SJohn Forte 		uscsi.iu_oid = (uint32_t)luProps.associatedTargetOid.
1891fcf3ce44SJohn Forte 		    objectSequenceNumber;
1892fcf3ce44SJohn Forte 		uscsi.iu_lun = luProps.targetLun;
1893fcf3ce44SJohn Forte 	}
1894fcf3ce44SJohn Forte 
1895fcf3ce44SJohn Forte 	uscsi.iu_ucmd.uscsi_flags = USCSI_READ;
1896146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_timeout = USCSI_TIMEOUT_IN_SEC;
1897fcf3ce44SJohn Forte 	uscsi.iu_ucmd.uscsi_bufaddr = (char *)pOutputBuffer;
1898146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_buflen = buflen;
1899fcf3ce44SJohn Forte 	uscsi.iu_ucmd.uscsi_rqbuf = (char *)pSenseBuffer;
1900146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_rqlen = (pSenseBufferLength != NULL) ?
1901146832dbSMilos Muzik 	    *pSenseBufferLength : 0;
1902146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_cdb = (char *)&cmdblk[0];
1903146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_cdblen = cdbLength;
1904fcf3ce44SJohn Forte 
1905fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
1906fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
1907fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
1908fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1909fcf3ce44SJohn Forte 	}
1910fcf3ce44SJohn Forte 
1911fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_USCSI, &uscsi) != 0) {
1912fcf3ce44SJohn Forte 		(void) close(fd);
1913fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
1914fcf3ce44SJohn Forte 		    "ISCSI_TARGET_PROPS_GET ioctl failed, errno: %d", errno);
1915fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
1916fcf3ce44SJohn Forte 	}
1917fcf3ce44SJohn Forte 
1918146832dbSMilos Muzik 	if (uscsi.iu_ucmd.uscsi_status == STATUS_CHECK) {
1919146832dbSMilos Muzik 		if (pSenseBufferLength != NULL) {
1920146832dbSMilos Muzik 			*pSenseBufferLength -= uscsi.iu_ucmd.uscsi_rqresid;
1921146832dbSMilos Muzik 		}
1922146832dbSMilos Muzik 		return (IMA_ERROR_SCSI_STATUS_CHECK_CONDITION);
1923146832dbSMilos Muzik 	}
1924146832dbSMilos Muzik 
1925146832dbSMilos Muzik 	*pOutputBufferLength = buflen - uscsi.iu_ucmd.uscsi_resid;
1926fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
1927fcf3ce44SJohn Forte }
1928fcf3ce44SJohn Forte 
1929fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_LuReportLuns(
1930fcf3ce44SJohn Forte 		IMA_OID deviceId,
1931fcf3ce44SJohn Forte 		IMA_BOOL sendToWellKnownLun,
1932fcf3ce44SJohn Forte 		IMA_BYTE selectReport,
1933fcf3ce44SJohn Forte 
1934fcf3ce44SJohn Forte 		IMA_BYTE *pOutputBuffer,
1935fcf3ce44SJohn Forte 		IMA_UINT *pOutputBufferLength,
1936fcf3ce44SJohn Forte 
1937fcf3ce44SJohn Forte 		IMA_BYTE *pSenseBuffer,
1938fcf3ce44SJohn Forte 		IMA_UINT *pSenseBufferLength
1939fcf3ce44SJohn Forte )
1940fcf3ce44SJohn Forte {
1941fcf3ce44SJohn Forte 	IMA_LU_PROPERTIES luProps;
1942fcf3ce44SJohn Forte 	IMA_STATUS status;
1943146832dbSMilos Muzik 	unsigned char cmdblk[CDB_GROUP5];
1944146832dbSMilos Muzik 	IMA_UINT buflen;
1945fcf3ce44SJohn Forte 	int fd;
1946fcf3ce44SJohn Forte 	iscsi_uscsi_t uscsi;
1947fcf3ce44SJohn Forte 
1948146832dbSMilos Muzik 	(void) memset(&cmdblk[0], 0, CDB_GROUP5);
1949146832dbSMilos Muzik 	cmdblk[0] = SCMD_REPORT_LUNS;
1950146832dbSMilos Muzik 	cmdblk[2] = selectReport;
1951146832dbSMilos Muzik 
1952146832dbSMilos Muzik 	if (*pOutputBufferLength > MAX_REPORT_LUNS_BUFFER_LEN) {
1953146832dbSMilos Muzik 		buflen = MAX_REPORT_LUNS_BUFFER_LEN;
1954146832dbSMilos Muzik 	} else {
1955146832dbSMilos Muzik 		buflen = *pOutputBufferLength;
1956146832dbSMilos Muzik 	}
1957146832dbSMilos Muzik 	cmdblk[6] = (buflen & 0xff000000) >> 24;
1958146832dbSMilos Muzik 	cmdblk[7] = (buflen & 0x00ff0000) >> 16;
1959146832dbSMilos Muzik 	cmdblk[8] = (buflen & 0x0000ff00) >> 8;
1960146832dbSMilos Muzik 	cmdblk[9] = (buflen & 0x000000ff);
1961fcf3ce44SJohn Forte 
1962fcf3ce44SJohn Forte 	(void) memset(&uscsi, 0, sizeof (iscsi_uscsi_t));
1963fcf3ce44SJohn Forte 	uscsi.iu_vers 	= ISCSI_INTERFACE_VERSION;
1964fcf3ce44SJohn Forte 
1965fcf3ce44SJohn Forte 	/* iu_oid is a session oid in the driver */
1966fcf3ce44SJohn Forte 	if (deviceId.objectType == IMA_OBJECT_TYPE_TARGET) {
1967146832dbSMilos Muzik 		if (sendToWellKnownLun == IMA_TRUE) {
1968146832dbSMilos Muzik 			/* this optional feature is not supported now */
1969146832dbSMilos Muzik 			return (IMA_ERROR_NOT_SUPPORTED);
1970146832dbSMilos Muzik 		}
1971fcf3ce44SJohn Forte 		uscsi.iu_oid	= deviceId.objectSequenceNumber;
1972fcf3ce44SJohn Forte 		uscsi.iu_lun	= 0;
1973fcf3ce44SJohn Forte 	} else {
1974fcf3ce44SJohn Forte 		/*
1975fcf3ce44SJohn Forte 		 * Get LU properties and associated session oid
1976fcf3ce44SJohn Forte 		 * for this lun(deviceId) and put in uscsi.iu_oid
1977fcf3ce44SJohn Forte 		 */
1978fcf3ce44SJohn Forte 		status = getLuProperties(deviceId, &luProps);
1979fcf3ce44SJohn Forte 		if (status != IMA_STATUS_SUCCESS) {
1980fcf3ce44SJohn Forte 			return (status);
1981fcf3ce44SJohn Forte 		}
1982fcf3ce44SJohn Forte 		uscsi.iu_oid = (uint32_t)luProps.associatedTargetOid.
1983fcf3ce44SJohn Forte 		    objectSequenceNumber;
1984fcf3ce44SJohn Forte 		uscsi.iu_lun = luProps.targetLun;
1985fcf3ce44SJohn Forte 	}
1986fcf3ce44SJohn Forte 
1987fcf3ce44SJohn Forte 	uscsi.iu_ucmd.uscsi_flags = USCSI_READ;
1988146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_timeout = USCSI_TIMEOUT_IN_SEC;
1989fcf3ce44SJohn Forte 	uscsi.iu_ucmd.uscsi_bufaddr = (char *)pOutputBuffer;
1990146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_buflen = buflen;
1991fcf3ce44SJohn Forte 	uscsi.iu_ucmd.uscsi_rqbuf = (char *)pSenseBuffer;
1992146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_rqlen = (pSenseBufferLength != NULL) ?
1993146832dbSMilos Muzik 	    *pSenseBufferLength : 0;
1994146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_cdb = (char *)&cmdblk[0];
1995146832dbSMilos Muzik 	uscsi.iu_ucmd.uscsi_cdblen = CDB_GROUP5;
1996fcf3ce44SJohn Forte 
1997fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
1998fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
1999fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
2000fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2001fcf3ce44SJohn Forte 	}
2002fcf3ce44SJohn Forte 
2003fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_USCSI, &uscsi) != 0) {
2004fcf3ce44SJohn Forte 		(void) close(fd);
2005fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
2006fcf3ce44SJohn Forte 		    "ISCSI_TARGET_PROPS_GET ioctl failed, errno: %d", errno);
2007fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2008fcf3ce44SJohn Forte 	}
2009fcf3ce44SJohn Forte 
2010146832dbSMilos Muzik 	if (uscsi.iu_ucmd.uscsi_status == STATUS_CHECK) {
2011146832dbSMilos Muzik 		if (pSenseBufferLength != NULL) {
2012146832dbSMilos Muzik 			*pSenseBufferLength -= uscsi.iu_ucmd.uscsi_rqresid;
2013146832dbSMilos Muzik 		}
2014146832dbSMilos Muzik 		return (IMA_ERROR_SCSI_STATUS_CHECK_CONDITION);
2015146832dbSMilos Muzik 	}
2016146832dbSMilos Muzik 
2017146832dbSMilos Muzik 	*pOutputBufferLength = buflen - uscsi.iu_ucmd.uscsi_resid;
2018fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2019fcf3ce44SJohn Forte }
2020fcf3ce44SJohn Forte 
2021fcf3ce44SJohn Forte /*ARGSUSED*/
2022fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_ExposeLu(
2023fcf3ce44SJohn Forte 		IMA_OID luId
2024fcf3ce44SJohn Forte )
2025fcf3ce44SJohn Forte {
2026fcf3ce44SJohn Forte 	return (IMA_ERROR_NOT_SUPPORTED);
2027fcf3ce44SJohn Forte }
2028fcf3ce44SJohn Forte 
2029fcf3ce44SJohn Forte /*ARGSUSED*/
2030fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_UnexposeLu(
2031fcf3ce44SJohn Forte 		IMA_OID luId
2032fcf3ce44SJohn Forte )
2033fcf3ce44SJohn Forte {
2034fcf3ce44SJohn Forte 	return (IMA_ERROR_NOT_SUPPORTED);
2035fcf3ce44SJohn Forte }
2036fcf3ce44SJohn Forte 
2037fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetAddressKeys(
2038fcf3ce44SJohn Forte 		IMA_OID targetOid,
2039fcf3ce44SJohn Forte 		IMA_ADDRESS_KEYS **ppKeys
2040fcf3ce44SJohn Forte )
2041fcf3ce44SJohn Forte {
2042fcf3ce44SJohn Forte 	IMA_STATUS status;
2043fcf3ce44SJohn Forte 	IMA_TARGET_PROPERTIES targetProps;
2044fcf3ce44SJohn Forte 	SUN_IMA_DISC_ADDR_PROP_LIST *discAddressList;
2045fcf3ce44SJohn Forte 	SUN_IMA_DISC_ADDRESS_KEY_PROPERTIES *pList;
2046fcf3ce44SJohn Forte 	int i, j, addressKeyCount = 0;
2047fcf3ce44SJohn Forte 	int addressKeyIdx = 0;
2048fcf3ce44SJohn Forte 
2049fcf3ce44SJohn Forte 	status = getTargetProperties(targetOid, &targetProps);
2050fcf3ce44SJohn Forte 	if (status != IMA_STATUS_SUCCESS) {
2051fcf3ce44SJohn Forte 		return (status);
2052fcf3ce44SJohn Forte 	}
2053fcf3ce44SJohn Forte 
2054fcf3ce44SJohn Forte 	status = getDiscoveryAddressPropertiesList(&discAddressList);
2055fcf3ce44SJohn Forte 	if (status != IMA_STATUS_SUCCESS) {
2056fcf3ce44SJohn Forte 		return (status);
2057fcf3ce44SJohn Forte 	}
2058fcf3ce44SJohn Forte 
2059fcf3ce44SJohn Forte 	/* Get the number of addresses to allocate */
2060fcf3ce44SJohn Forte 	for (i = 0; i < discAddressList->discAddrCount; i++) {
2061fcf3ce44SJohn Forte 		(void) sendTargets(discAddressList->props[i].discoveryAddress,
2062fcf3ce44SJohn Forte 		    &pList);
2063fcf3ce44SJohn Forte 		for (j = 0; j < pList->keyCount; j++) {
2064fcf3ce44SJohn Forte 			if (wcsncmp(pList->keys[j].name, targetProps.name,
2065fcf3ce44SJohn Forte 			    wslen(pList->keys[j].name)) == 0) {
2066fcf3ce44SJohn Forte 				addressKeyCount++;
2067fcf3ce44SJohn Forte 			}
2068fcf3ce44SJohn Forte 		}
2069fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(pList);
2070fcf3ce44SJohn Forte 	}
2071fcf3ce44SJohn Forte 
2072fcf3ce44SJohn Forte 	*ppKeys = (IMA_ADDRESS_KEYS *)calloc(1, sizeof (IMA_ADDRESS_KEYS) +
2073fcf3ce44SJohn Forte 	    addressKeyCount * sizeof (IMA_ADDRESS_KEY));
2074fcf3ce44SJohn Forte 	if (*ppKeys == NULL) {
2075fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
2076fcf3ce44SJohn Forte 	}
2077fcf3ce44SJohn Forte 	(*ppKeys)->addressKeyCount = addressKeyCount;
2078fcf3ce44SJohn Forte 	addressKeyIdx = 0;
2079fcf3ce44SJohn Forte 
2080fcf3ce44SJohn Forte 	for (i = 0; i < discAddressList->discAddrCount; i++) {
2081fcf3ce44SJohn Forte 		(void) sendTargets(discAddressList->props[i].discoveryAddress,
2082fcf3ce44SJohn Forte 		    &pList);
2083fcf3ce44SJohn Forte 		for (j = 0; j < pList->keyCount; j++) {
2084fcf3ce44SJohn Forte 			if (wcsncmp(pList->keys[j].name, targetProps.name,
2085fcf3ce44SJohn Forte 			    wslen(pList->keys[j].name)) != 0) {
2086fcf3ce44SJohn Forte 				continue;
2087fcf3ce44SJohn Forte 			}
2088fcf3ce44SJohn Forte 
2089fcf3ce44SJohn Forte 			bcopy(&(pList->keys[j].address.ipAddress),
2090fcf3ce44SJohn Forte 			    &((*ppKeys)->addressKeys[addressKeyIdx].
2091fcf3ce44SJohn Forte 			    ipAddress), sizeof (IMA_IP_ADDRESS));
2092fcf3ce44SJohn Forte 
2093fcf3ce44SJohn Forte 			(*ppKeys)->addressKeys[addressKeyIdx++].portNumber =
2094fcf3ce44SJohn Forte 			    pList->keys[j].address.portNumber;
2095fcf3ce44SJohn Forte 
2096fcf3ce44SJohn Forte 		}
2097fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(pList);
2098fcf3ce44SJohn Forte 	}
2099fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2100fcf3ce44SJohn Forte }
2101fcf3ce44SJohn Forte 
2102fcf3ce44SJohn Forte IMA_BOOL isAuthMethodValid(IMA_OID oid, IMA_AUTHMETHOD method) {
2103fcf3ce44SJohn Forte 	IMA_STATUS status;
2104fcf3ce44SJohn Forte 	IMA_AUTHMETHOD supportedList[MAX_AUTHMETHODS];
2105fcf3ce44SJohn Forte 	IMA_UINT i, supportedCount;
2106fcf3ce44SJohn Forte 	IMA_BOOL supported;
2107fcf3ce44SJohn Forte 	status = getSupportedAuthMethods(oid, IMA_FALSE, &supportedCount,
2108fcf3ce44SJohn Forte 			supportedList);
2109fcf3ce44SJohn Forte 	if (status != IMA_STATUS_SUCCESS)
2110fcf3ce44SJohn Forte 		return (IMA_FALSE);
2111fcf3ce44SJohn Forte 
2112fcf3ce44SJohn Forte 	supported = IMA_FALSE;
2113fcf3ce44SJohn Forte 	for (i = 0; i < supportedCount; i++) {
2114fcf3ce44SJohn Forte 		if (method == supportedList[i]) {
2115fcf3ce44SJohn Forte 			supported = IMA_TRUE;
2116fcf3ce44SJohn Forte 		}
2117fcf3ce44SJohn Forte 	}
2118fcf3ce44SJohn Forte 
2119fcf3ce44SJohn Forte 	return (supported);
2120fcf3ce44SJohn Forte }
2121fcf3ce44SJohn Forte 
2122fcf3ce44SJohn Forte IMA_BOOL isAuthMethodListValid(IMA_OID oid, const IMA_AUTHMETHOD *pMethodList,
2123fcf3ce44SJohn Forte 				IMA_UINT methodCount) {
2124fcf3ce44SJohn Forte 	IMA_UINT i, j;
2125fcf3ce44SJohn Forte 
2126fcf3ce44SJohn Forte 	if (pMethodList == NULL) {
2127fcf3ce44SJohn Forte 		return (IMA_FALSE);
2128fcf3ce44SJohn Forte 	}
2129fcf3ce44SJohn Forte 	/* Check list for duplicates */
2130fcf3ce44SJohn Forte 	for (i = 0; i < methodCount; i++) {
2131fcf3ce44SJohn Forte 		for (j = i + 1; j < methodCount; j++) {
2132fcf3ce44SJohn Forte 			if (pMethodList[i] == pMethodList[j]) {
2133fcf3ce44SJohn Forte 				return (IMA_FALSE);
2134fcf3ce44SJohn Forte 			}
2135fcf3ce44SJohn Forte 		}
2136fcf3ce44SJohn Forte 
2137fcf3ce44SJohn Forte 		if (isAuthMethodValid(oid, pMethodList[i]) == IMA_FALSE) {
2138fcf3ce44SJohn Forte 			return (IMA_FALSE);
2139fcf3ce44SJohn Forte 		}
2140fcf3ce44SJohn Forte 	}
2141fcf3ce44SJohn Forte 	return (IMA_TRUE);
2142fcf3ce44SJohn Forte }
2143fcf3ce44SJohn Forte 
2144fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetSupportedAuthMethods(
2145fcf3ce44SJohn Forte 		IMA_OID lhbaOid,
2146fcf3ce44SJohn Forte 		IMA_BOOL getSettableMethods,
2147fcf3ce44SJohn Forte 		IMA_UINT *pMethodCount,
2148fcf3ce44SJohn Forte 		IMA_AUTHMETHOD *pMethodList
2149fcf3ce44SJohn Forte )
2150fcf3ce44SJohn Forte {
2151fcf3ce44SJohn Forte 	return (getSupportedAuthMethods(lhbaOid, getSettableMethods,
2152fcf3ce44SJohn Forte 	    pMethodCount, pMethodList));
2153fcf3ce44SJohn Forte }
2154fcf3ce44SJohn Forte 
2155fcf3ce44SJohn Forte 
2156fcf3ce44SJohn Forte /*ARGSUSED*/
2157fcf3ce44SJohn Forte static IMA_STATUS getSupportedAuthMethods(
2158fcf3ce44SJohn Forte 		IMA_OID lhbaOid,
2159fcf3ce44SJohn Forte 		IMA_BOOL getSettableMethods,
2160fcf3ce44SJohn Forte 		IMA_UINT *pMethodCount,
2161fcf3ce44SJohn Forte 		IMA_AUTHMETHOD *pMethodList
2162fcf3ce44SJohn Forte )
2163fcf3ce44SJohn Forte {
2164fcf3ce44SJohn Forte 	if (pMethodList == NULL) {
2165fcf3ce44SJohn Forte 		*pMethodCount = 0;
2166fcf3ce44SJohn Forte 		return (IMA_STATUS_SUCCESS);
2167fcf3ce44SJohn Forte 	}
2168fcf3ce44SJohn Forte 
2169fcf3ce44SJohn Forte 	*pMethodCount = NUM_SUPPORTED_AUTH_METHODS;
2170fcf3ce44SJohn Forte 	if (*pMethodCount > 1) {
2171fcf3ce44SJohn Forte 		pMethodList[0] = IMA_AUTHMETHOD_NONE;
2172fcf3ce44SJohn Forte 		pMethodList[1] = IMA_AUTHMETHOD_CHAP;
2173fcf3ce44SJohn Forte 	}
2174fcf3ce44SJohn Forte 
2175fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2176fcf3ce44SJohn Forte }
2177fcf3ce44SJohn Forte 
2178fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetInUseInitiatorAuthMethods(
2179fcf3ce44SJohn Forte 		IMA_OID		lhbaOid,
2180fcf3ce44SJohn Forte 		IMA_UINT	*pMethodCount,
2181fcf3ce44SJohn Forte 		IMA_AUTHMETHOD *pMethodList
2182fcf3ce44SJohn Forte )
2183fcf3ce44SJohn Forte {
2184fcf3ce44SJohn Forte 	return (getAuthMethods(lhbaOid, pMethodCount, pMethodList));
2185fcf3ce44SJohn Forte }
2186fcf3ce44SJohn Forte 
2187fcf3ce44SJohn Forte /*ARGSUSED*/
2188fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_GetInitiatorAuthParms(
2189fcf3ce44SJohn Forte 		IMA_OID lhbaOid,
2190fcf3ce44SJohn Forte 		IMA_AUTHMETHOD method,
2191fcf3ce44SJohn Forte 		IMA_INITIATOR_AUTHPARMS *pParms
2192fcf3ce44SJohn Forte )
2193fcf3ce44SJohn Forte {
2194fcf3ce44SJohn Forte 	int fd;
2195fcf3ce44SJohn Forte 	iscsi_chap_props_t  chap_p;
2196fcf3ce44SJohn Forte 
2197fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
2198fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
2199fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
2200fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2201fcf3ce44SJohn Forte 	}
2202fcf3ce44SJohn Forte 
2203fcf3ce44SJohn Forte 	(void) memset(&chap_p, 0, sizeof (iscsi_chap_props_t));
2204fcf3ce44SJohn Forte 	chap_p.c_vers = ISCSI_INTERFACE_VERSION;
2205fcf3ce44SJohn Forte 	chap_p.c_oid = (uint32_t)lhbaOid.objectSequenceNumber;
2206fcf3ce44SJohn Forte 
2207fcf3ce44SJohn Forte 	if (method == IMA_AUTHMETHOD_CHAP) {
2208fcf3ce44SJohn Forte 		if (ioctl(fd, ISCSI_CHAP_GET, &chap_p) != 0) {
2209fcf3ce44SJohn Forte 			syslog(LOG_USER|LOG_DEBUG,
2210fcf3ce44SJohn Forte 			"ISCSI_CHAP_GET ioctl failed, errno: %d", errno);
2211fcf3ce44SJohn Forte 			(void) close(fd);
2212fcf3ce44SJohn Forte 			return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2213fcf3ce44SJohn Forte 		}
2214fcf3ce44SJohn Forte 	} else {
2215fcf3ce44SJohn Forte 		return (IMA_ERROR_INVALID_PARAMETER);
2216fcf3ce44SJohn Forte 	}
2217fcf3ce44SJohn Forte 
2218fcf3ce44SJohn Forte 	(void) memcpy(pParms->chapParms.name, chap_p.c_user,
2219fcf3ce44SJohn Forte 	    chap_p.c_user_len);
2220fcf3ce44SJohn Forte 	pParms->chapParms.nameLength = chap_p.c_user_len;
2221fcf3ce44SJohn Forte 	(void) memcpy(pParms->chapParms.challengeSecret, chap_p.c_secret,
2222fcf3ce44SJohn Forte 	    chap_p.c_secret_len);
2223fcf3ce44SJohn Forte 	pParms->chapParms.challengeSecretLength = chap_p.c_secret_len;
2224fcf3ce44SJohn Forte 
2225fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2226fcf3ce44SJohn Forte }
2227fcf3ce44SJohn Forte 
2228fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetInitiatorAuthMethods(
2229fcf3ce44SJohn Forte 		IMA_OID lhbaOid,
2230fcf3ce44SJohn Forte 		IMA_UINT methodCount,
2231fcf3ce44SJohn Forte 		const IMA_AUTHMETHOD *pMethodList
2232fcf3ce44SJohn Forte )
2233fcf3ce44SJohn Forte {
2234fcf3ce44SJohn Forte 	if (isAuthMethodListValid(lhbaOid, pMethodList,
2235fcf3ce44SJohn Forte 	    methodCount) == IMA_FALSE)
2236fcf3ce44SJohn Forte 		return (IMA_ERROR_INVALID_PARAMETER);
2237fcf3ce44SJohn Forte 	return (setAuthMethods(lhbaOid, &methodCount, pMethodList));
2238fcf3ce44SJohn Forte }
2239fcf3ce44SJohn Forte 
2240fcf3ce44SJohn Forte /*
2241fcf3ce44SJohn Forte  * This function only sets CHAP params since we only support CHAP for now.
2242fcf3ce44SJohn Forte  */
2243fcf3ce44SJohn Forte IMA_API	IMA_STATUS IMA_SetInitiatorAuthParms(
2244fcf3ce44SJohn Forte 		IMA_OID lhbaOid,
2245fcf3ce44SJohn Forte 		IMA_AUTHMETHOD method,
2246fcf3ce44SJohn Forte 		const IMA_INITIATOR_AUTHPARMS *pParms
2247fcf3ce44SJohn Forte )
2248fcf3ce44SJohn Forte {
2249fcf3ce44SJohn Forte 	int fd;
2250fcf3ce44SJohn Forte 	iscsi_chap_props_t  chap_p;
2251fcf3ce44SJohn Forte 
2252fcf3ce44SJohn Forte 	if (method != IMA_AUTHMETHOD_CHAP)
2253fcf3ce44SJohn Forte 		return (IMA_ERROR_INVALID_PARAMETER);
2254fcf3ce44SJohn Forte 
2255fcf3ce44SJohn Forte 	if (isAuthMethodValid(lhbaOid, method) == IMA_FALSE) {
2256fcf3ce44SJohn Forte 		return (IMA_ERROR_INVALID_PARAMETER);
2257fcf3ce44SJohn Forte 	}
2258fcf3ce44SJohn Forte 
2259fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
2260fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
2261fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
2262fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2263fcf3ce44SJohn Forte 	}
2264fcf3ce44SJohn Forte 
2265fcf3ce44SJohn Forte 	(void) memset(&chap_p, 0, sizeof (iscsi_chap_props_t));
2266fcf3ce44SJohn Forte 	chap_p.c_vers = ISCSI_INTERFACE_VERSION;
2267fcf3ce44SJohn Forte 	chap_p.c_oid = (uint32_t)lhbaOid.objectSequenceNumber;
2268fcf3ce44SJohn Forte 
2269fcf3ce44SJohn Forte 	chap_p.c_user_len = pParms->chapParms.nameLength;
2270fcf3ce44SJohn Forte 	(void) memcpy(chap_p.c_user, pParms->chapParms.name, chap_p.c_user_len);
2271fcf3ce44SJohn Forte 
2272fcf3ce44SJohn Forte 	chap_p.c_secret_len = pParms->chapParms.challengeSecretLength;
2273fcf3ce44SJohn Forte 	(void) memcpy(chap_p.c_secret, pParms->chapParms.challengeSecret,
2274fcf3ce44SJohn Forte 	    chap_p.c_secret_len);
2275fcf3ce44SJohn Forte 
2276fcf3ce44SJohn Forte 	if (method == IMA_AUTHMETHOD_CHAP) {
2277fcf3ce44SJohn Forte 		if (ioctl(fd, ISCSI_CHAP_SET, &chap_p) != 0) {
2278fcf3ce44SJohn Forte 			(void) close(fd);
2279fcf3ce44SJohn Forte 			syslog(LOG_USER|LOG_DEBUG,
2280fcf3ce44SJohn Forte 			    "ISCSI_CHAP_SET ioctl failed, errno: %d", errno);
2281fcf3ce44SJohn Forte 			return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2282fcf3ce44SJohn Forte 		}
2283fcf3ce44SJohn Forte 	}
2284fcf3ce44SJohn Forte 
2285fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2286fcf3ce44SJohn Forte }
2287fcf3ce44SJohn Forte 
2288fcf3ce44SJohn Forte /* A helper function to obtain iSCSI node parameters. */
2289fcf3ce44SJohn Forte static IMA_STATUS
2290fcf3ce44SJohn Forte getISCSINodeParameter(
2291fcf3ce44SJohn Forte     int paramType,
2292fcf3ce44SJohn Forte     IMA_OID *oid,
2293fcf3ce44SJohn Forte     void *pProps,
2294fcf3ce44SJohn Forte     uint32_t paramIndex
2295fcf3ce44SJohn Forte )
2296fcf3ce44SJohn Forte {
2297fcf3ce44SJohn Forte 	int		    fd;
2298fcf3ce44SJohn Forte 	iscsi_param_get_t   pg;
2299fcf3ce44SJohn Forte 
2300fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
2301fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
2302fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
2303fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2304fcf3ce44SJohn Forte 	}
2305fcf3ce44SJohn Forte 
2306fcf3ce44SJohn Forte 	(void) memset(&pg, 0, sizeof (iscsi_param_get_t));
2307fcf3ce44SJohn Forte 	pg.g_vers = ISCSI_INTERFACE_VERSION;
2308fcf3ce44SJohn Forte 	pg.g_oid = (uint32_t)oid->objectSequenceNumber;
2309fcf3ce44SJohn Forte 	pg.g_param = paramIndex;
2310fcf3ce44SJohn Forte 	pg.g_param_type = ISCSI_SESS_PARAM;
2311fcf3ce44SJohn Forte 
2312fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_PARAM_GET, &pg) != 0) {
2313fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
2314fcf3ce44SJohn Forte 		    "ISCSI_PARAM_GET ioctl failed, errno: %d", errno);
2315fcf3ce44SJohn Forte 		(void) close(fd);
2316fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2317fcf3ce44SJohn Forte 	}
2318fcf3ce44SJohn Forte 
2319fcf3ce44SJohn Forte 	switch (paramType) {
2320fcf3ce44SJohn Forte 		IMA_BOOL_VALUE *bp;
2321fcf3ce44SJohn Forte 		IMA_MIN_MAX_VALUE *mp;
2322fcf3ce44SJohn Forte 
2323fcf3ce44SJohn Forte 		case MIN_MAX_PARAM:
2324fcf3ce44SJohn Forte 			mp = (IMA_MIN_MAX_VALUE *)pProps;
2325fcf3ce44SJohn Forte 
2326fcf3ce44SJohn Forte 			mp->currentValueValid =
2327fcf3ce44SJohn Forte 			    (pg.g_value.v_valid == B_TRUE) ?
2328fcf3ce44SJohn Forte 			    IMA_TRUE : IMA_FALSE;
2329fcf3ce44SJohn Forte 			mp->currentValue = pg.g_value.v_integer.i_current;
2330fcf3ce44SJohn Forte 			mp->defaultValue = pg.g_value.v_integer.i_default;
2331fcf3ce44SJohn Forte 			mp->minimumValue = pg.g_value.v_integer.i_min;
2332fcf3ce44SJohn Forte 			mp->maximumValue = pg.g_value.v_integer.i_max;
2333fcf3ce44SJohn Forte 			mp->incrementValue = pg.g_value.v_integer.i_incr;
2334fcf3ce44SJohn Forte 			break;
2335fcf3ce44SJohn Forte 
2336fcf3ce44SJohn Forte 		case BOOL_PARAM:
2337fcf3ce44SJohn Forte 			bp = (IMA_BOOL_VALUE *)pProps;
2338fcf3ce44SJohn Forte 			bp->currentValueValid =
2339fcf3ce44SJohn Forte 			    (pg.g_value.v_valid == B_TRUE) ?
2340fcf3ce44SJohn Forte 			    IMA_TRUE : IMA_FALSE;
2341fcf3ce44SJohn Forte 			bp->currentValue = pg.g_value.v_bool.b_current;
2342fcf3ce44SJohn Forte 			bp->defaultValue = pg.g_value.v_bool.b_default;
2343fcf3ce44SJohn Forte 			break;
2344fcf3ce44SJohn Forte 
2345fcf3ce44SJohn Forte 		default:
2346fcf3ce44SJohn Forte 			break;
2347fcf3ce44SJohn Forte 	}
2348fcf3ce44SJohn Forte 
2349fcf3ce44SJohn Forte 	(void) close(fd);
2350fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2351fcf3ce44SJohn Forte }
2352fcf3ce44SJohn Forte 
2353fcf3ce44SJohn Forte /* A helper function to set iSCSI node parameters. */
2354fcf3ce44SJohn Forte static IMA_STATUS
2355fcf3ce44SJohn Forte setISCSINodeParameter(
2356fcf3ce44SJohn Forte     int paramType,
2357fcf3ce44SJohn Forte     IMA_OID *oid,
2358fcf3ce44SJohn Forte     void *pProp,
2359fcf3ce44SJohn Forte     uint32_t paramIndex
2360fcf3ce44SJohn Forte )
2361fcf3ce44SJohn Forte {
2362fcf3ce44SJohn Forte 	int		    fd;
2363fcf3ce44SJohn Forte 	iscsi_param_set_t   ps;
2364fcf3ce44SJohn Forte 
2365fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
2366fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
2367fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
2368fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2369fcf3ce44SJohn Forte 	}
2370fcf3ce44SJohn Forte 
2371fcf3ce44SJohn Forte 	(void) memset(&ps, 0, sizeof (iscsi_param_set_t));
2372fcf3ce44SJohn Forte 	ps.s_vers = ISCSI_INTERFACE_VERSION;
2373fcf3ce44SJohn Forte 	ps.s_oid = (uint32_t)oid->objectSequenceNumber;
2374fcf3ce44SJohn Forte 	ps.s_param = paramIndex;
2375fcf3ce44SJohn Forte 
2376fcf3ce44SJohn Forte 	switch (paramType) {
2377fcf3ce44SJohn Forte 		IMA_BOOL_VALUE *bp;
2378fcf3ce44SJohn Forte 		IMA_MIN_MAX_VALUE *mp;
2379fcf3ce44SJohn Forte 
2380fcf3ce44SJohn Forte 		case MIN_MAX_PARAM:
2381fcf3ce44SJohn Forte 			mp = (IMA_MIN_MAX_VALUE *)pProp;
2382fcf3ce44SJohn Forte 			ps.s_value.v_integer = mp->currentValue;
2383fcf3ce44SJohn Forte 			break;
2384fcf3ce44SJohn Forte 		case BOOL_PARAM:
2385fcf3ce44SJohn Forte 			bp = (IMA_BOOL_VALUE *)pProp;
2386fcf3ce44SJohn Forte 			ps.s_value.v_bool =
2387fcf3ce44SJohn Forte 			    (bp->currentValue == IMA_TRUE) ?
2388fcf3ce44SJohn Forte 			    B_TRUE : B_FALSE;
2389fcf3ce44SJohn Forte 			break;
2390fcf3ce44SJohn Forte 
2391fcf3ce44SJohn Forte 		default:
2392fcf3ce44SJohn Forte 			break;
2393fcf3ce44SJohn Forte 	}
2394fcf3ce44SJohn Forte 
2395fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_PARAM_SET, &ps)) {
2396fcf3ce44SJohn Forte 		int tmpErrno = errno;
2397fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
2398fcf3ce44SJohn Forte 		    "ISCSI_PARAM_SET ioctl failed, errno: %d", errno);
2399fcf3ce44SJohn Forte 		(void) close(fd);
2400fcf3ce44SJohn Forte 		switch (tmpErrno) {
2401fcf3ce44SJohn Forte 			case ENOTSUP :
2402fcf3ce44SJohn Forte 				return (IMA_ERROR_NOT_SUPPORTED);
2403fcf3ce44SJohn Forte 			default :
2404fcf3ce44SJohn Forte 				return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2405fcf3ce44SJohn Forte 		}
2406fcf3ce44SJohn Forte 	}
2407fcf3ce44SJohn Forte 
2408fcf3ce44SJohn Forte 	(void) close(fd);
2409fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2410fcf3ce44SJohn Forte }
2411fcf3ce44SJohn Forte 
2412fcf3ce44SJohn Forte static int
2413fcf3ce44SJohn Forte prepare_discovery_entry(
2414fcf3ce44SJohn Forte     IMA_TARGET_ADDRESS discoveryAddress,
2415fcf3ce44SJohn Forte     entry_t *entry
2416fcf3ce44SJohn Forte )
2417fcf3ce44SJohn Forte {
2418fcf3ce44SJohn Forte 	(void) memset(entry, 0, sizeof (entry_t));
2419fcf3ce44SJohn Forte 	entry->e_vers = ISCSI_INTERFACE_VERSION;
2420fcf3ce44SJohn Forte 	entry->e_oid = ISCSI_OID_NOTSET;
2421fcf3ce44SJohn Forte 
2422fcf3ce44SJohn Forte 	if (discoveryAddress.hostnameIpAddress.id.ipAddress.ipv4Address ==
2423fcf3ce44SJohn Forte 	    IMA_FALSE) {
2424fcf3ce44SJohn Forte 		bcopy(discoveryAddress.hostnameIpAddress.id.ipAddress.ipAddress,
2425fcf3ce44SJohn Forte 		    entry->e_u.u_in6.s6_addr,
2426fcf3ce44SJohn Forte 		    sizeof (entry->e_u.u_in6.s6_addr));
2427fcf3ce44SJohn Forte 		entry->e_insize = sizeof (struct in6_addr);
2428fcf3ce44SJohn Forte 	} else {
2429fcf3ce44SJohn Forte 		bcopy(discoveryAddress.hostnameIpAddress.id.ipAddress.ipAddress,
2430fcf3ce44SJohn Forte 		    &entry->e_u.u_in4.s_addr,
2431fcf3ce44SJohn Forte 		    sizeof (entry->e_u.u_in4.s_addr));
2432fcf3ce44SJohn Forte 		entry->e_insize = sizeof (struct in_addr);
2433fcf3ce44SJohn Forte 	}
2434fcf3ce44SJohn Forte 
2435fcf3ce44SJohn Forte 	entry->e_port = discoveryAddress.portNumber;
2436fcf3ce44SJohn Forte 	entry->e_tpgt = 0;
2437fcf3ce44SJohn Forte 	return (DISC_ADDR_OK);
2438fcf3ce44SJohn Forte }
2439fcf3ce44SJohn Forte 
2440fcf3ce44SJohn Forte static IMA_STATUS configure_discovery_method(
2441fcf3ce44SJohn Forte     IMA_BOOL enable,
2442fcf3ce44SJohn Forte     iSCSIDiscoveryMethod_t method
2443fcf3ce44SJohn Forte )
2444fcf3ce44SJohn Forte {
2445fcf3ce44SJohn Forte 	int fd, status;
2446fcf3ce44SJohn Forte 
2447fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
2448fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
2449fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
2450fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2451fcf3ce44SJohn Forte 	}
2452fcf3ce44SJohn Forte 
2453fcf3ce44SJohn Forte 	if (enable == IMA_FALSE) {
2454fcf3ce44SJohn Forte 		if (ioctl(fd, ISCSI_DISCOVERY_CLEAR, &method)) {
2455fcf3ce44SJohn Forte 			status = errno;
2456fcf3ce44SJohn Forte 			(void) close(fd);
2457fcf3ce44SJohn Forte 			syslog(LOG_USER|LOG_DEBUG,
2458fcf3ce44SJohn Forte 			    "ISCSI_DISCOVERY_CLEAR ioctl failed, errno: %d",
2459fcf3ce44SJohn Forte 			    status);
2460fcf3ce44SJohn Forte 			if (status == EBUSY) {
2461fcf3ce44SJohn Forte 				return (IMA_ERROR_LU_IN_USE);
2462fcf3ce44SJohn Forte 			} else {
2463fcf3ce44SJohn Forte 				return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2464fcf3ce44SJohn Forte 			}
2465fcf3ce44SJohn Forte 		}
2466fcf3ce44SJohn Forte 
2467fcf3ce44SJohn Forte 		(void) close(fd);
2468fcf3ce44SJohn Forte 		return (IMA_STATUS_SUCCESS);
2469fcf3ce44SJohn Forte 	} else {
2470fcf3ce44SJohn Forte 		/* Set the discovery method */
2471fcf3ce44SJohn Forte 		if (ioctl(fd, ISCSI_DISCOVERY_SET, &method)) {
2472fcf3ce44SJohn Forte 			(void) close(fd);
2473fcf3ce44SJohn Forte 			syslog(LOG_USER|LOG_DEBUG,
2474fcf3ce44SJohn Forte 			    "ISCSI_DISCOVERY_SET ioctl failed, errno: %d",
2475fcf3ce44SJohn Forte 			    errno);
2476fcf3ce44SJohn Forte 			return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2477fcf3ce44SJohn Forte 		}
2478fcf3ce44SJohn Forte 
2479fcf3ce44SJohn Forte 		(void) close(fd);
2480fcf3ce44SJohn Forte 		return (IMA_STATUS_SUCCESS);
2481fcf3ce44SJohn Forte 	}
2482fcf3ce44SJohn Forte }
2483fcf3ce44SJohn Forte 
2484fcf3ce44SJohn Forte static IMA_STATUS get_target_oid_list(
2485fcf3ce44SJohn Forte     uint32_t targetListType,
2486fcf3ce44SJohn Forte     IMA_OID_LIST **ppList)
2487fcf3ce44SJohn Forte {
2488fcf3ce44SJohn Forte 	int		    fd;
2489fcf3ce44SJohn Forte 	int		    i;
2490fcf3ce44SJohn Forte 	int		    target_list_size;
2491fcf3ce44SJohn Forte 	iscsi_target_list_t *idlp, tl_info;
2492fcf3ce44SJohn Forte 
2493fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
2494fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
2495fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
2496fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2497fcf3ce44SJohn Forte 	}
2498fcf3ce44SJohn Forte 
2499fcf3ce44SJohn Forte 	(void) memset(&tl_info, 0, sizeof (tl_info));
2500fcf3ce44SJohn Forte 	tl_info.tl_vers = ISCSI_INTERFACE_VERSION;
2501fcf3ce44SJohn Forte 	tl_info.tl_in_cnt = 0;
2502fcf3ce44SJohn Forte 	tl_info.tl_tgt_list_type = targetListType;
2503fcf3ce44SJohn Forte 
2504fcf3ce44SJohn Forte 	/*
2505fcf3ce44SJohn Forte 	 * Issue ioctl to obtain the number of targets.
2506fcf3ce44SJohn Forte 	 */
2507fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_TARGET_OID_LIST_GET, &tl_info) != 0) {
2508fcf3ce44SJohn Forte 		(void) close(fd);
2509fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
2510fcf3ce44SJohn Forte 		    "ISCSI_TARGET_OID_LIST_GET ioctl %d failed, errno: %d",
2511fcf3ce44SJohn Forte 		    targetListType, errno);
2512fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2513fcf3ce44SJohn Forte 	}
2514fcf3ce44SJohn Forte 
2515fcf3ce44SJohn Forte 	target_list_size = sizeof (iscsi_target_list_t);
2516fcf3ce44SJohn Forte 	if (tl_info.tl_out_cnt > 1) {
2517fcf3ce44SJohn Forte 		target_list_size += (sizeof (uint32_t) *
2518fcf3ce44SJohn Forte 		    tl_info.tl_out_cnt - 1);
2519fcf3ce44SJohn Forte 	}
2520fcf3ce44SJohn Forte 
2521fcf3ce44SJohn Forte 	idlp = (iscsi_target_list_t *)calloc(1, target_list_size);
2522fcf3ce44SJohn Forte 	if (idlp == NULL) {
2523fcf3ce44SJohn Forte 		(void) close(fd);
2524fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
2525fcf3ce44SJohn Forte 	}
2526fcf3ce44SJohn Forte 
2527fcf3ce44SJohn Forte 	idlp->tl_vers = ISCSI_INTERFACE_VERSION;
2528fcf3ce44SJohn Forte 	idlp->tl_in_cnt = tl_info.tl_out_cnt;
2529fcf3ce44SJohn Forte 	idlp->tl_tgt_list_type = targetListType;
2530fcf3ce44SJohn Forte 
2531fcf3ce44SJohn Forte 	/* Issue the same ioctl again to obtain the OIDs. */
2532fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_TARGET_OID_LIST_GET, idlp) != 0) {
2533fcf3ce44SJohn Forte 		free(idlp);
2534fcf3ce44SJohn Forte 		(void) close(fd);
2535fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
2536fcf3ce44SJohn Forte 		    "ISCSI_TARGET_OID_LIST_GET ioctl %d failed, errno: %d",
2537fcf3ce44SJohn Forte 		    targetListType, errno);
2538fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2539fcf3ce44SJohn Forte 	}
2540fcf3ce44SJohn Forte 
2541fcf3ce44SJohn Forte 	*ppList = (IMA_OID_LIST *)calloc(1, sizeof (IMA_OID_LIST) +
2542fcf3ce44SJohn Forte 	    idlp->tl_out_cnt * sizeof (IMA_OID));
2543fcf3ce44SJohn Forte 	if (*ppList == NULL) {
2544fcf3ce44SJohn Forte 		free(idlp);
2545fcf3ce44SJohn Forte 		(void) close(fd);
2546fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
2547fcf3ce44SJohn Forte 	}
2548fcf3ce44SJohn Forte 	(*ppList)->oidCount = idlp->tl_out_cnt;
2549fcf3ce44SJohn Forte 
2550fcf3ce44SJohn Forte 	for (i = 0; i < idlp->tl_out_cnt; i++) {
2551fcf3ce44SJohn Forte 
2552fcf3ce44SJohn Forte 		if (targetListType == ISCSI_STATIC_TGT_OID_LIST)
2553fcf3ce44SJohn Forte 			(*ppList)->oids[i].objectType =
2554fcf3ce44SJohn Forte 			    IMA_OBJECT_TYPE_STATIC_DISCOVERY_TARGET;
2555fcf3ce44SJohn Forte 		else
2556fcf3ce44SJohn Forte 			(*ppList)->oids[i].objectType = IMA_OBJECT_TYPE_TARGET;
2557fcf3ce44SJohn Forte 
2558fcf3ce44SJohn Forte 		(*ppList)->oids[i].ownerId = pluginOwnerId;
2559fcf3ce44SJohn Forte 		(*ppList)->oids[i].objectSequenceNumber = idlp->tl_oid_list[i];
2560fcf3ce44SJohn Forte 	}
2561fcf3ce44SJohn Forte 
2562fcf3ce44SJohn Forte 	free(idlp);
2563fcf3ce44SJohn Forte 	(void) close(fd);
2564fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2565fcf3ce44SJohn Forte }
2566fcf3ce44SJohn Forte 
2567fcf3ce44SJohn Forte static IMA_STATUS get_target_lun_oid_list(
2568fcf3ce44SJohn Forte     IMA_OID * targetOid,
2569fcf3ce44SJohn Forte     iscsi_lun_list_t  **ppLunList)
2570fcf3ce44SJohn Forte {
2571fcf3ce44SJohn Forte 	int			fd;
2572fcf3ce44SJohn Forte 	iscsi_lun_list_t	*illp, ll_info;
2573fcf3ce44SJohn Forte 	int			lun_list_size;
2574fcf3ce44SJohn Forte 
2575fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
2576fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
2577fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
2578fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2579fcf3ce44SJohn Forte 	}
2580fcf3ce44SJohn Forte 
2581fcf3ce44SJohn Forte 	(void) memset(&ll_info, 0, sizeof (ll_info));
2582fcf3ce44SJohn Forte 	ll_info.ll_vers = ISCSI_INTERFACE_VERSION;
2583fcf3ce44SJohn Forte 	if (targetOid == NULL) {
2584fcf3ce44SJohn Forte 		/* get lun oid list for all targets */
2585fcf3ce44SJohn Forte 		ll_info.ll_all_tgts = B_TRUE;
2586fcf3ce44SJohn Forte 	} else {
2587fcf3ce44SJohn Forte 		/* get lun oid list for single target */
2588fcf3ce44SJohn Forte 		ll_info.ll_all_tgts = B_FALSE;
2589fcf3ce44SJohn Forte 		ll_info.ll_tgt_oid = (uint32_t)targetOid->objectSequenceNumber;
2590fcf3ce44SJohn Forte 	}
2591fcf3ce44SJohn Forte 	ll_info.ll_in_cnt = 0;
2592fcf3ce44SJohn Forte 
2593fcf3ce44SJohn Forte 	/*
2594fcf3ce44SJohn Forte 	 * Issue ioctl to obtain the number of target LUNs.
2595fcf3ce44SJohn Forte 	 */
2596fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_LUN_OID_LIST_GET, &ll_info) != 0) {
2597fcf3ce44SJohn Forte 		(void) close(fd);
2598fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
2599fcf3ce44SJohn Forte 		    "ISCSI_LUN_LIST_GET ioctl failed, errno: %d", errno);
2600fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2601fcf3ce44SJohn Forte 	}
2602fcf3ce44SJohn Forte 
2603fcf3ce44SJohn Forte 	lun_list_size = sizeof (iscsi_lun_list_t);
2604fcf3ce44SJohn Forte 	if (ll_info.ll_out_cnt > 1) {
2605fcf3ce44SJohn Forte 		lun_list_size += (sizeof (iscsi_if_lun_t) *
2606fcf3ce44SJohn Forte 		    (ll_info.ll_out_cnt - 1));
2607fcf3ce44SJohn Forte 	}
2608fcf3ce44SJohn Forte 
2609fcf3ce44SJohn Forte 	illp = (iscsi_lun_list_t *)calloc(1, lun_list_size);
2610fcf3ce44SJohn Forte 	if (illp == NULL) {
2611fcf3ce44SJohn Forte 		(void) close(fd);
2612fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
2613fcf3ce44SJohn Forte 	}
2614fcf3ce44SJohn Forte 	illp->ll_vers = ISCSI_INTERFACE_VERSION;
2615fcf3ce44SJohn Forte 	illp->ll_all_tgts = ll_info.ll_all_tgts;
2616fcf3ce44SJohn Forte 	illp->ll_tgt_oid = ll_info.ll_tgt_oid;
2617fcf3ce44SJohn Forte 	illp->ll_in_cnt = ll_info.ll_out_cnt;
2618fcf3ce44SJohn Forte 
2619fcf3ce44SJohn Forte 	/* Issue the same ioctl again to get the target LUN list */
2620fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_LUN_OID_LIST_GET, illp) != 0) {
2621fcf3ce44SJohn Forte 		free(illp);
2622fcf3ce44SJohn Forte 		(void) close(fd);
2623fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
2624fcf3ce44SJohn Forte 		    "ISCSI_LUN_LIST_GET ioctl failed, errno: %d", errno);
2625fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2626fcf3ce44SJohn Forte 	}
2627fcf3ce44SJohn Forte 
2628fcf3ce44SJohn Forte 	*ppLunList = illp;
2629fcf3ce44SJohn Forte 
2630fcf3ce44SJohn Forte 	(void) close(fd);
2631fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2632fcf3ce44SJohn Forte }
2633fcf3ce44SJohn Forte 
2634fcf3ce44SJohn Forte 
2635fcf3ce44SJohn Forte /* A helper function to set authentication method. */
2636fcf3ce44SJohn Forte static IMA_STATUS
2637fcf3ce44SJohn Forte setAuthMethods(
2638fcf3ce44SJohn Forte     IMA_OID oid,
2639fcf3ce44SJohn Forte     IMA_UINT *pMethodCount,
2640fcf3ce44SJohn Forte     const IMA_AUTHMETHOD *pMethodList
2641fcf3ce44SJohn Forte )
2642fcf3ce44SJohn Forte {
2643fcf3ce44SJohn Forte 	int fd;
2644fcf3ce44SJohn Forte 	int i;
2645fcf3ce44SJohn Forte 	iscsi_auth_props_t auth;
2646fcf3ce44SJohn Forte 
2647fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
2648fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
2649fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
2650fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2651fcf3ce44SJohn Forte 	}
2652fcf3ce44SJohn Forte 	(void) memset(&auth, 0, sizeof (iscsi_auth_props_t));
2653fcf3ce44SJohn Forte 	auth.a_vers = ISCSI_INTERFACE_VERSION;
2654fcf3ce44SJohn Forte 	auth.a_oid = (uint32_t)oid.objectSequenceNumber;
2655fcf3ce44SJohn Forte 	/* First do a get because other data fields may exist */
2656fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_AUTH_GET, &auth) != 0) {
2657fcf3ce44SJohn Forte 		/* EMPTY */
2658fcf3ce44SJohn Forte 		/* It is fine if there is no other data fields. */
2659fcf3ce44SJohn Forte 	}
2660fcf3ce44SJohn Forte 	auth.a_auth_method = authMethodNone;
2661fcf3ce44SJohn Forte 
2662fcf3ce44SJohn Forte 	for (i = 0; i < *pMethodCount; i++) {
2663fcf3ce44SJohn Forte 		switch (pMethodList[i]) {
2664fcf3ce44SJohn Forte 			case IMA_AUTHMETHOD_CHAP:
2665fcf3ce44SJohn Forte 				auth.a_auth_method |= authMethodCHAP;
2666fcf3ce44SJohn Forte 				break;
2667fcf3ce44SJohn Forte 			default:
2668fcf3ce44SJohn Forte 				break;
2669fcf3ce44SJohn Forte 		}
2670fcf3ce44SJohn Forte 	}
2671fcf3ce44SJohn Forte 
2672fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_AUTH_SET, &auth) != 0) {
2673fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
2674fcf3ce44SJohn Forte 		    "ISCSI_AUTH_SET failed, errno: %d", errno);
2675fcf3ce44SJohn Forte 		(void) close(fd);
2676fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2677fcf3ce44SJohn Forte 	}
2678fcf3ce44SJohn Forte 
2679fcf3ce44SJohn Forte 	(void) close(fd);
2680fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2681fcf3ce44SJohn Forte }
2682fcf3ce44SJohn Forte 
2683fcf3ce44SJohn Forte /* A helper function to get authentication method. */
2684fcf3ce44SJohn Forte static IMA_STATUS
2685fcf3ce44SJohn Forte getAuthMethods(
2686fcf3ce44SJohn Forte     IMA_OID oid,
2687fcf3ce44SJohn Forte     IMA_UINT	*pMethodCount,
2688fcf3ce44SJohn Forte     IMA_AUTHMETHOD *pMethodList
2689fcf3ce44SJohn Forte )
2690fcf3ce44SJohn Forte {
2691fcf3ce44SJohn Forte 	int fd, i;
2692fcf3ce44SJohn Forte 	iscsi_auth_props_t auth;
2693fcf3ce44SJohn Forte 
2694fcf3ce44SJohn Forte 	if (pMethodList == NULL) {
2695fcf3ce44SJohn Forte 		*pMethodCount = 0;
2696fcf3ce44SJohn Forte 		return (IMA_STATUS_SUCCESS);
2697fcf3ce44SJohn Forte 	}
2698fcf3ce44SJohn Forte 
2699fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
2700fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
2701fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
2702fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2703fcf3ce44SJohn Forte 	}
2704fcf3ce44SJohn Forte 
2705fcf3ce44SJohn Forte 	(void) memset(&auth, 0, sizeof (iscsi_auth_props_t));
2706fcf3ce44SJohn Forte 	auth.a_vers = ISCSI_INTERFACE_VERSION;
2707fcf3ce44SJohn Forte 	auth.a_oid = (uint32_t)oid.objectSequenceNumber;
2708fcf3ce44SJohn Forte 
2709fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_AUTH_GET, &auth) != 0) {
2710fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
2711fcf3ce44SJohn Forte 		    "ISCSI_AUTH_GET failed, errno: %d", errno);
2712fcf3ce44SJohn Forte 		(void) close(fd);
2713fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
2714fcf3ce44SJohn Forte 	}
2715fcf3ce44SJohn Forte 
2716fcf3ce44SJohn Forte 	i = 0;
2717*2c2d21e9SRichard Lowe 	if (auth.a_auth_method == authMethodNone) {
2718fcf3ce44SJohn Forte 		pMethodList[i++] = IMA_AUTHMETHOD_NONE;
2719fcf3ce44SJohn Forte 	} else if (auth.a_auth_method & authMethodCHAP) {
2720fcf3ce44SJohn Forte 		pMethodList[i++] = IMA_AUTHMETHOD_CHAP;
2721fcf3ce44SJohn Forte 	}
2722fcf3ce44SJohn Forte 	*pMethodCount = i;
2723fcf3ce44SJohn Forte 
2724fcf3ce44SJohn Forte 	(void) close(fd);
2725fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2726fcf3ce44SJohn Forte }
2727fcf3ce44SJohn Forte 
2728fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetPhbaOidList(
2729fcf3ce44SJohn Forte 		IMA_OID_LIST **ppList
2730fcf3ce44SJohn Forte )
2731fcf3ce44SJohn Forte {
2732fcf3ce44SJohn Forte 	*ppList = (IMA_OID_LIST*)calloc(1, sizeof (IMA_OID_LIST));
2733fcf3ce44SJohn Forte 	if (*ppList == NULL) {
2734fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
2735fcf3ce44SJohn Forte 	}
2736fcf3ce44SJohn Forte 	(*ppList)->oidCount = 0;
2737fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2738fcf3ce44SJohn Forte }
2739fcf3ce44SJohn Forte 
2740fcf3ce44SJohn Forte /* ARGSUSED */
2741fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetPhbaProperties(
2742fcf3ce44SJohn Forte 		IMA_OID phbaOid,
2743fcf3ce44SJohn Forte 		IMA_PHBA_PROPERTIES *pProps
2744fcf3ce44SJohn Forte )
2745fcf3ce44SJohn Forte {
2746fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2747fcf3ce44SJohn Forte }
2748fcf3ce44SJohn Forte 
2749fcf3ce44SJohn Forte /* ARGSUSED */
2750fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetPhbaStatus(
2751fcf3ce44SJohn Forte 		IMA_OID phbaOid,
2752fcf3ce44SJohn Forte 		IMA_PHBA_STATUS *pStatus
2753fcf3ce44SJohn Forte )
2754fcf3ce44SJohn Forte {
2755fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2756fcf3ce44SJohn Forte }
2757fcf3ce44SJohn Forte 
2758fcf3ce44SJohn Forte /* ARGSUSED */
2759fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetPhbaDownloadProperties(
2760fcf3ce44SJohn Forte 		IMA_OID phbaOid,
2761fcf3ce44SJohn Forte 		IMA_PHBA_DOWNLOAD_PROPERTIES *pProps
2762fcf3ce44SJohn Forte )
2763fcf3ce44SJohn Forte {
2764fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2765fcf3ce44SJohn Forte }
2766fcf3ce44SJohn Forte 
2767fcf3ce44SJohn Forte /* ARGSUSED */
2768fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_IsPhbaDownloadFile(
2769fcf3ce44SJohn Forte 		IMA_OID phbaOid,
2770fcf3ce44SJohn Forte 		const IMA_WCHAR *pFileName,
2771fcf3ce44SJohn Forte 		IMA_PHBA_DOWNLOAD_IMAGE_PROPERTIES *pProps
2772fcf3ce44SJohn Forte )
2773fcf3ce44SJohn Forte {
2774fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2775fcf3ce44SJohn Forte }
2776fcf3ce44SJohn Forte 
2777fcf3ce44SJohn Forte /* ARGSUSED */
2778fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_PhbaDownload(
2779fcf3ce44SJohn Forte 		IMA_OID phbaOid,
2780fcf3ce44SJohn Forte 		IMA_PHBA_DOWNLOAD_IMAGE_TYPE imageType,
2781fcf3ce44SJohn Forte 		const IMA_WCHAR *pFileName
2782fcf3ce44SJohn Forte )
2783fcf3ce44SJohn Forte {
2784fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2785fcf3ce44SJohn Forte }
2786fcf3ce44SJohn Forte 
2787fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetPnpOidList(
2788fcf3ce44SJohn Forte 		IMA_OID pnpOid,
2789fcf3ce44SJohn Forte 		IMA_OID_LIST **ppList
2790fcf3ce44SJohn Forte )
2791fcf3ce44SJohn Forte {
2792fcf3ce44SJohn Forte 	/*
2793fcf3ce44SJohn Forte 	 * Always return the same object ID for the pnp as the spec
2794fcf3ce44SJohn Forte 	 * states that this function will always return a list of at least
2795fcf3ce44SJohn Forte 	 * one element
2796fcf3ce44SJohn Forte 	 */
2797fcf3ce44SJohn Forte 	pnpOid.objectType = IMA_OBJECT_TYPE_PNP;
2798fcf3ce44SJohn Forte 	pnpOid.ownerId = pluginOwnerId;
2799fcf3ce44SJohn Forte 	pnpOid.objectSequenceNumber = ISCSI_INITIATOR_OID;
2800fcf3ce44SJohn Forte 
2801fcf3ce44SJohn Forte 	*ppList = (IMA_OID_LIST*)calloc(1, sizeof (IMA_OID_LIST) +
2802fcf3ce44SJohn Forte 	    (1* sizeof (IMA_OID)));
2803fcf3ce44SJohn Forte 
2804fcf3ce44SJohn Forte 	if (*ppList == NULL) {
2805fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
2806fcf3ce44SJohn Forte 	}
2807fcf3ce44SJohn Forte 
2808fcf3ce44SJohn Forte 	(*ppList)->oidCount = 1;
2809fcf3ce44SJohn Forte 	(void) memcpy(&(*ppList)->oids[0], &pnpOid, sizeof (pnpOid));
2810fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2811fcf3ce44SJohn Forte }
2812fcf3ce44SJohn Forte 
2813fcf3ce44SJohn Forte /* ARGSUSED */
2814fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetPnpProperties(
2815fcf3ce44SJohn Forte 		IMA_OID pnpOid,
2816fcf3ce44SJohn Forte 		IMA_PNP_PROPERTIES *pProps
2817fcf3ce44SJohn Forte )
2818fcf3ce44SJohn Forte {
2819fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2820fcf3ce44SJohn Forte }
2821fcf3ce44SJohn Forte 
2822fcf3ce44SJohn Forte /* ARGSUSED */
2823fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetPnpStatistics(
2824fcf3ce44SJohn Forte 		IMA_OID pnpOid,
2825fcf3ce44SJohn Forte 		IMA_PNP_STATISTICS *pStats
2826fcf3ce44SJohn Forte )
2827fcf3ce44SJohn Forte {
2828fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2829fcf3ce44SJohn Forte }
2830fcf3ce44SJohn Forte 
2831fcf3ce44SJohn Forte /* ARGSUSED */
2832fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetIpProperties(
2833fcf3ce44SJohn Forte 		IMA_OID oid,
2834fcf3ce44SJohn Forte 		IMA_IP_PROPERTIES *pProps
2835fcf3ce44SJohn Forte )
2836fcf3ce44SJohn Forte {
2837fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2838fcf3ce44SJohn Forte }
2839fcf3ce44SJohn Forte 
2840fcf3ce44SJohn Forte /* ARGSUSED */
2841fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_SetDefaultGateway(
2842fcf3ce44SJohn Forte 		IMA_OID oid,
2843fcf3ce44SJohn Forte 		IMA_IP_ADDRESS defaultGateway
2844fcf3ce44SJohn Forte )
2845fcf3ce44SJohn Forte {
2846fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2847fcf3ce44SJohn Forte }
2848fcf3ce44SJohn Forte 
2849fcf3ce44SJohn Forte /* ARGSUSED */
2850fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_SetDnsServerAddress(
2851fcf3ce44SJohn Forte 		IMA_OID oid,
2852fcf3ce44SJohn Forte 		const IMA_IP_ADDRESS *pPrimaryDnsServerAddress,
2853fcf3ce44SJohn Forte 		const IMA_IP_ADDRESS *pAlternateDnsServerAddress
2854fcf3ce44SJohn Forte )
2855fcf3ce44SJohn Forte {
2856fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2857fcf3ce44SJohn Forte }
2858fcf3ce44SJohn Forte 
2859fcf3ce44SJohn Forte /* ARGSUSED */
2860fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_SetSubnetMask(
2861fcf3ce44SJohn Forte 		IMA_OID oid,
2862fcf3ce44SJohn Forte 		IMA_IP_ADDRESS subnetMask
2863fcf3ce44SJohn Forte )
2864fcf3ce44SJohn Forte {
2865fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2866fcf3ce44SJohn Forte }
2867fcf3ce44SJohn Forte 
2868fcf3ce44SJohn Forte /* ARGSUSED */
2869fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_SetIpConfigMethod(
2870fcf3ce44SJohn Forte 		IMA_OID oid,
2871fcf3ce44SJohn Forte 		IMA_BOOL enableDhcpIpConfiguration
2872fcf3ce44SJohn Forte )
2873fcf3ce44SJohn Forte {
2874fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2875fcf3ce44SJohn Forte }
2876fcf3ce44SJohn Forte 
2877fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_RegisterForObjectPropertyChanges(
2878fcf3ce44SJohn Forte 		IMA_OBJECT_PROPERTY_FN pClientFn
2879fcf3ce44SJohn Forte )
2880fcf3ce44SJohn Forte {
2881fcf3ce44SJohn Forte 	pObjectPropertyCallback = pClientFn;
2882fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2883fcf3ce44SJohn Forte }
2884fcf3ce44SJohn Forte 
2885fcf3ce44SJohn Forte /* ARGSUSED */
2886fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_DeregisterForObjectPropertyChanges(
2887fcf3ce44SJohn Forte 		IMA_OBJECT_PROPERTY_FN pClientFn
2888fcf3ce44SJohn Forte )
2889fcf3ce44SJohn Forte {
2890fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2891fcf3ce44SJohn Forte }
2892fcf3ce44SJohn Forte 
2893fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_RegisterForObjectVisibilityChanges(
2894fcf3ce44SJohn Forte 		IMA_OBJECT_VISIBILITY_FN pClientFn
2895fcf3ce44SJohn Forte )
2896fcf3ce44SJohn Forte {
2897fcf3ce44SJohn Forte 	pObjectVisibilityCallback = pClientFn;
2898fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2899fcf3ce44SJohn Forte }
2900fcf3ce44SJohn Forte 
2901fcf3ce44SJohn Forte /* ARGSUSED */
2902fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_DeregisterForObjectVisibilityChanges(
2903fcf3ce44SJohn Forte 		IMA_OBJECT_VISIBILITY_FN pClientFn
2904fcf3ce44SJohn Forte )
2905fcf3ce44SJohn Forte {
2906fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2907fcf3ce44SJohn Forte }
2908fcf3ce44SJohn Forte 
2909fcf3ce44SJohn Forte /* ARGSUSED */
2910fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetNetworkPortStatus(
2911fcf3ce44SJohn Forte 		IMA_OID portOid,
2912fcf3ce44SJohn Forte 		IMA_NETWORK_PORT_STATUS *pStaus
2913fcf3ce44SJohn Forte )
2914fcf3ce44SJohn Forte {
2915fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2916fcf3ce44SJohn Forte }
2917fcf3ce44SJohn Forte 
2918fcf3ce44SJohn Forte /* ARGSUSED */
2919fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetNetworkPortalOidList(
2920fcf3ce44SJohn Forte 		IMA_OID pnpOid,
2921fcf3ce44SJohn Forte 		IMA_OID_LIST **ppList
2922fcf3ce44SJohn Forte )
2923fcf3ce44SJohn Forte {
2924fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2925fcf3ce44SJohn Forte }
2926fcf3ce44SJohn Forte 
2927fcf3ce44SJohn Forte /* ARGSUSED */
2928fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetNetworkPortalProperties(
2929fcf3ce44SJohn Forte 		IMA_OID networkPortalOid,
2930fcf3ce44SJohn Forte 		IMA_NETWORK_PORTAL_PROPERTIES *pProps
2931fcf3ce44SJohn Forte )
2932fcf3ce44SJohn Forte {
2933fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2934fcf3ce44SJohn Forte }
2935fcf3ce44SJohn Forte 
2936fcf3ce44SJohn Forte /* ARGSUSED */
2937fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_SetNetworkPortalIpAddress(
2938fcf3ce44SJohn Forte 		IMA_OID networkPortalOid,
2939fcf3ce44SJohn Forte 		const IMA_IP_ADDRESS NewIpAddress
2940fcf3ce44SJohn Forte )
2941fcf3ce44SJohn Forte {
2942fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
2943fcf3ce44SJohn Forte }
2944fcf3ce44SJohn Forte 
2945fcf3ce44SJohn Forte /* ARGSUSED */
2946fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_RemoveStaleData(
2947fcf3ce44SJohn Forte 		IMA_OID lhbaOid
2948fcf3ce44SJohn Forte )
2949fcf3ce44SJohn Forte {
2950fcf3ce44SJohn Forte 	return (IMA_ERROR_NOT_SUPPORTED);
2951fcf3ce44SJohn Forte }
2952fcf3ce44SJohn Forte 
2953fcf3ce44SJohn Forte /* ARGSUSED */
2954fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetIpsecProperties(
2955fcf3ce44SJohn Forte 		IMA_OID oid,
2956fcf3ce44SJohn Forte 		IMA_IPSEC_PROPERTIES *pProps
2957fcf3ce44SJohn Forte )
2958fcf3ce44SJohn Forte {
2959fcf3ce44SJohn Forte 	pProps->ipsecSupported = IMA_TRUE;
2960fcf3ce44SJohn Forte 	pProps->implementedInHardware = IMA_FALSE;
2961fcf3ce44SJohn Forte 	pProps->implementedInSoftware = IMA_TRUE;
2962fcf3ce44SJohn Forte 
2963fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2964fcf3ce44SJohn Forte }
2965fcf3ce44SJohn Forte 
2966fcf3ce44SJohn Forte /* ARGSUSED */
2967fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetLhbaProperties(
2968fcf3ce44SJohn Forte 		IMA_OID lhbaOid,
2969fcf3ce44SJohn Forte 		IMA_LHBA_PROPERTIES *pProps
2970fcf3ce44SJohn Forte )
2971fcf3ce44SJohn Forte {
2972fcf3ce44SJohn Forte 
2973fcf3ce44SJohn Forte 	if (pProps == NULL) {
2974fcf3ce44SJohn Forte 		return (IMA_ERROR_INVALID_PARAMETER);
2975fcf3ce44SJohn Forte 	}
2976fcf3ce44SJohn Forte 
2977fcf3ce44SJohn Forte 	if (lhbaObjectId.objectSequenceNumber != ISCSI_INITIATOR_OID) {
2978fcf3ce44SJohn Forte 		return (IMA_ERROR_OBJECT_NOT_FOUND);
2979fcf3ce44SJohn Forte 	}
2980fcf3ce44SJohn Forte 
2981fcf3ce44SJohn Forte 	(void) memset(pProps, 0, sizeof (IMA_LHBA_PROPERTIES));
2982fcf3ce44SJohn Forte 	(void) mbstowcs(pProps->osDeviceName, OS_DEVICE_NAME,
2983fcf3ce44SJohn Forte 	    OS_DEVICE_NAME_LEN);
2984fcf3ce44SJohn Forte 	pProps->luExposingSupported = IMA_FALSE;
2985fcf3ce44SJohn Forte 	pProps->isDestroyable = IMA_FALSE;
2986fcf3ce44SJohn Forte 	pProps->staleDataRemovable = IMA_FALSE;
2987fcf3ce44SJohn Forte 	pProps->staleDataSize = 0;
2988fcf3ce44SJohn Forte 	pProps->initiatorAuthMethodsSettable = IMA_TRUE;
2989fcf3ce44SJohn Forte 	pProps->targetAuthMethodsSettable = IMA_FALSE;
2990fcf3ce44SJohn Forte 
2991fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
2992fcf3ce44SJohn Forte }
2993fcf3ce44SJohn Forte 
2994fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetLnpOidList(
2995fcf3ce44SJohn Forte 		IMA_OID_LIST **ppList
2996fcf3ce44SJohn Forte )
2997fcf3ce44SJohn Forte {
2998fcf3ce44SJohn Forte 	*ppList = (IMA_OID_LIST *) calloc(1, (sizeof (IMA_OID_LIST)));
2999fcf3ce44SJohn Forte 	if (*ppList == NULL) {
3000fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
3001fcf3ce44SJohn Forte 	}
3002fcf3ce44SJohn Forte 	(*ppList)->oidCount = 0;
3003fcf3ce44SJohn Forte 
3004fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
3005fcf3ce44SJohn Forte }
3006fcf3ce44SJohn Forte 
3007fcf3ce44SJohn Forte /* ARGSUSED */
3008fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetLnpProperties(
3009fcf3ce44SJohn Forte 		IMA_OID lnpOid,
3010fcf3ce44SJohn Forte 		IMA_LNP_PROPERTIES *pProps
3011fcf3ce44SJohn Forte )
3012fcf3ce44SJohn Forte {
3013fcf3ce44SJohn Forte 	return (IMA_ERROR_OBJECT_NOT_FOUND);
3014fcf3ce44SJohn Forte }
3015fcf3ce44SJohn Forte 
3016fcf3ce44SJohn Forte #define	IMA_DISK_DEVICE_NAME_PREFIX	"/dev/rdsk/"
3017fcf3ce44SJohn Forte #define	IMA_TAPE_DEVICE_NAME_PREFIX	"/dev/rmt/"
3018fcf3ce44SJohn Forte static int
3019fcf3ce44SJohn Forte get_lun_devlink(di_devlink_t link, void *osDeviceName)
3020fcf3ce44SJohn Forte {
3021fcf3ce44SJohn Forte 	if ((strncmp(IMA_DISK_DEVICE_NAME_PREFIX, di_devlink_path(link),
3022fcf3ce44SJohn Forte 	    strlen(IMA_DISK_DEVICE_NAME_PREFIX)) == 0) ||
3023fcf3ce44SJohn Forte 	    (strncmp(IMA_TAPE_DEVICE_NAME_PREFIX, di_devlink_path(link),
3024fcf3ce44SJohn Forte 	    strlen(IMA_TAPE_DEVICE_NAME_PREFIX)) == 0)) {
3025fcf3ce44SJohn Forte 		(void) mbstowcs((wchar_t *)osDeviceName, di_devlink_path(link),
3026fcf3ce44SJohn Forte 		    MAXPATHLEN);
3027fcf3ce44SJohn Forte 		return (DI_WALK_TERMINATE);
3028fcf3ce44SJohn Forte 	}
3029fcf3ce44SJohn Forte 
3030fcf3ce44SJohn Forte 	return (DI_WALK_CONTINUE);
3031fcf3ce44SJohn Forte }
3032fcf3ce44SJohn Forte 
3033fcf3ce44SJohn Forte /* ARGSUSED */
3034fcf3ce44SJohn Forte IMA_API IMA_STATUS IMA_GetPluginProperties(
3035fcf3ce44SJohn Forte 	IMA_OID pluginOid,
3036fcf3ce44SJohn Forte 	IMA_PLUGIN_PROPERTIES *pProps
3037fcf3ce44SJohn Forte )
3038fcf3ce44SJohn Forte {
3039fcf3ce44SJohn Forte 	pProps->supportedImaVersion = 1;
3040fcf3ce44SJohn Forte 	libSwprintf(pProps->vendor, L"%ls", LIBRARY_PROPERTY_VENDOR);
3041fcf3ce44SJohn Forte 	libSwprintf(pProps->implementationVersion, L"%ls",
3042fcf3ce44SJohn Forte 	    LIBRARY_PROPERTY_IMPLEMENTATION_VERSION);
3043fcf3ce44SJohn Forte 	libSwprintf(pProps->fileName, L"%ls", LIBRARY_FILE_NAME);
3044fcf3ce44SJohn Forte 	GetBuildTime(&(pProps->buildTime));
3045fcf3ce44SJohn Forte 	pProps->lhbasCanBeCreatedAndDestroyed = IMA_FALSE;
3046fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
3047fcf3ce44SJohn Forte }
3048fcf3ce44SJohn Forte 
3049fcf3ce44SJohn Forte IMA_STATUS getDiscoveryAddressPropertiesList(
3050fcf3ce44SJohn Forte     SUN_IMA_DISC_ADDR_PROP_LIST **ppList
3051fcf3ce44SJohn Forte )
3052fcf3ce44SJohn Forte {
3053fcf3ce44SJohn Forte 	int		    fd;
3054fcf3ce44SJohn Forte 	int		    i;
3055fcf3ce44SJohn Forte 	int		    discovery_addr_list_size;
3056fcf3ce44SJohn Forte 	iscsi_addr_list_t   *ialp, al_info;
3057fcf3ce44SJohn Forte 
3058fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
3059fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
3060fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
3061fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
3062fcf3ce44SJohn Forte 	}
3063fcf3ce44SJohn Forte 
3064fcf3ce44SJohn Forte 	(void) memset(&al_info, 0, sizeof (al_info));
3065fcf3ce44SJohn Forte 	al_info.al_vers = ISCSI_INTERFACE_VERSION;
3066fcf3ce44SJohn Forte 	al_info.al_in_cnt = 0;
3067fcf3ce44SJohn Forte 
3068fcf3ce44SJohn Forte 	/*
3069fcf3ce44SJohn Forte 	 * Issue ISCSI_DISCOVERY_ADDR_LIST_GET ioctl to obtain the number of
3070fcf3ce44SJohn Forte 	 * discovery addresses.
3071fcf3ce44SJohn Forte 	 */
3072fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_DISCOVERY_ADDR_LIST_GET, &al_info) != 0) {
3073fcf3ce44SJohn Forte 		(void) close(fd);
3074fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
3075fcf3ce44SJohn Forte 		    "ISCSI_DISCOVERY_ADDR_LIST_GET ioctl failed, errno: %d",
3076fcf3ce44SJohn Forte 		    errno);
3077fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
3078fcf3ce44SJohn Forte 	}
3079fcf3ce44SJohn Forte 
3080fcf3ce44SJohn Forte 	discovery_addr_list_size = sizeof (iscsi_addr_list_t);
3081fcf3ce44SJohn Forte 	if (al_info.al_out_cnt > 1) {
3082fcf3ce44SJohn Forte 		discovery_addr_list_size += (sizeof (iscsi_addr_t) *
3083fcf3ce44SJohn Forte 		    al_info.al_out_cnt - 1);
3084fcf3ce44SJohn Forte 	}
3085fcf3ce44SJohn Forte 
3086fcf3ce44SJohn Forte 	ialp = (iscsi_addr_list_t *)calloc(1, discovery_addr_list_size);
3087fcf3ce44SJohn Forte 	if (ialp == NULL) {
3088fcf3ce44SJohn Forte 		(void) close(fd);
3089fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
3090fcf3ce44SJohn Forte 	}
3091fcf3ce44SJohn Forte 	ialp->al_vers = ISCSI_INTERFACE_VERSION;
3092fcf3ce44SJohn Forte 	ialp->al_in_cnt = al_info.al_out_cnt;
3093fcf3ce44SJohn Forte 
3094fcf3ce44SJohn Forte 	/*
3095fcf3ce44SJohn Forte 	 * Issue ISCSI_DISCOVERY_ADDR_LIST_GET ioctl again to obtain the
3096fcf3ce44SJohn Forte 	 * discovery addresses.
3097fcf3ce44SJohn Forte 	 */
3098fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_DISCOVERY_ADDR_LIST_GET, ialp) != 0) {
3099fcf3ce44SJohn Forte 		free(ialp);
3100fcf3ce44SJohn Forte 		(void) close(fd);
3101fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
3102fcf3ce44SJohn Forte 		    "ISCSI_DISCOVERY_ADDR_LIST_GET ioctl failed, errno: %d",
3103fcf3ce44SJohn Forte 		    errno);
3104fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
3105fcf3ce44SJohn Forte 	}
3106fcf3ce44SJohn Forte 
3107fcf3ce44SJohn Forte 	*ppList = (SUN_IMA_DISC_ADDR_PROP_LIST *)
3108fcf3ce44SJohn Forte 	    calloc(1, sizeof (SUN_IMA_DISC_ADDR_PROP_LIST) +
3109fcf3ce44SJohn Forte 	    ialp->al_out_cnt * sizeof (IMA_DISCOVERY_ADDRESS_PROPERTIES));
3110fcf3ce44SJohn Forte 
3111fcf3ce44SJohn Forte 	if (*ppList == NULL) {
3112fcf3ce44SJohn Forte 		free(ialp);
3113fcf3ce44SJohn Forte 		(void) close(fd);
3114fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
3115fcf3ce44SJohn Forte 	}
3116fcf3ce44SJohn Forte 	(*ppList)->discAddrCount = ialp->al_out_cnt;
3117fcf3ce44SJohn Forte 
3118fcf3ce44SJohn Forte 	for (i = 0; i < ialp->al_out_cnt; i++) {
3119fcf3ce44SJohn Forte 		if (ialp->al_addrs[i].a_addr.i_insize ==
3120fcf3ce44SJohn Forte 		    sizeof (struct in_addr)) {
3121fcf3ce44SJohn Forte 			(*ppList)->props[i].discoveryAddress.hostnameIpAddress.
3122fcf3ce44SJohn Forte 			id.ipAddress.ipv4Address = IMA_TRUE;
3123fcf3ce44SJohn Forte 		} else if (ialp->al_addrs[i].a_addr.i_insize ==
3124fcf3ce44SJohn Forte 		    sizeof (struct in6_addr)) {
3125fcf3ce44SJohn Forte 			(*ppList)->props[i].discoveryAddress.
3126fcf3ce44SJohn Forte 			hostnameIpAddress.id.ipAddress.ipv4Address = IMA_FALSE;
3127fcf3ce44SJohn Forte 		} else {
3128fcf3ce44SJohn Forte 			/* Should not happen */
3129fcf3ce44SJohn Forte 			syslog(LOG_USER|LOG_DEBUG,
3130fcf3ce44SJohn Forte 			"ISCSI_STATIC_GET returned bad address");
3131fcf3ce44SJohn Forte 			return (IMA_ERROR_UNEXPECTED_OS_ERROR);
3132fcf3ce44SJohn Forte 		}
3133fcf3ce44SJohn Forte 
3134fcf3ce44SJohn Forte 		bcopy(&ialp->al_addrs[i].a_addr.i_addr,	(*ppList)->props[i].
3135fcf3ce44SJohn Forte 		    discoveryAddress.hostnameIpAddress.id.ipAddress.ipAddress,
3136fcf3ce44SJohn Forte 		    sizeof ((*ppList)->props[i].discoveryAddress.
3137fcf3ce44SJohn Forte 		    hostnameIpAddress.id.ipAddress.ipAddress));
3138fcf3ce44SJohn Forte 
3139fcf3ce44SJohn Forte 		(*ppList)->props[i].discoveryAddress.portNumber =
3140fcf3ce44SJohn Forte 		    ialp->al_addrs[i].a_port;
3141fcf3ce44SJohn Forte 	}
3142fcf3ce44SJohn Forte 
3143fcf3ce44SJohn Forte 	free(ialp);
3144fcf3ce44SJohn Forte 	(void) close(fd);
3145fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
3146fcf3ce44SJohn Forte }
3147fcf3ce44SJohn Forte 
3148fcf3ce44SJohn Forte 
3149fcf3ce44SJohn Forte /* ARGSUSED */
3150fcf3ce44SJohn Forte IMA_STATUS sendTargets(
3151fcf3ce44SJohn Forte     IMA_TARGET_ADDRESS address,
3152fcf3ce44SJohn Forte     SUN_IMA_DISC_ADDRESS_KEY_PROPERTIES **ppList
3153fcf3ce44SJohn Forte )
3154fcf3ce44SJohn Forte {
3155fcf3ce44SJohn Forte 	char	*colonPos;
3156fcf3ce44SJohn Forte 	char	discAddrStr[SUN_IMA_IP_ADDRESS_LEN];
3157fcf3ce44SJohn Forte 	int	fd;
3158fcf3ce44SJohn Forte 	int	ctr;
3159fcf3ce44SJohn Forte 	int	stl_sz;
3160fcf3ce44SJohn Forte 	iscsi_sendtgts_list_t	*stl_hdr = NULL;
3161fcf3ce44SJohn Forte 	IMA_BOOL		retry = IMA_TRUE;
3162fcf3ce44SJohn Forte 
3163fcf3ce44SJohn Forte #define	SENDTGTS_DEFAULT_NUM_TARGETS	10
3164fcf3ce44SJohn Forte 
3165fcf3ce44SJohn Forte 	stl_sz = sizeof (*stl_hdr) + ((SENDTGTS_DEFAULT_NUM_TARGETS - 1) *
3166fcf3ce44SJohn Forte 	    sizeof (iscsi_sendtgts_entry_t));
3167fcf3ce44SJohn Forte 	stl_hdr = (iscsi_sendtgts_list_t *)calloc(1, stl_sz);
3168fcf3ce44SJohn Forte 	if (stl_hdr == NULL) {
3169fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
3170fcf3ce44SJohn Forte 	}
3171fcf3ce44SJohn Forte 	stl_hdr->stl_entry.e_vers = ISCSI_INTERFACE_VERSION;
3172fcf3ce44SJohn Forte 	stl_hdr->stl_in_cnt = SENDTGTS_DEFAULT_NUM_TARGETS;
3173fcf3ce44SJohn Forte 
3174fcf3ce44SJohn Forte 	colonPos = strchr(discAddrStr, ':');
3175fcf3ce44SJohn Forte 	if (colonPos == NULL) {
3176fcf3ce44SJohn Forte 		/* IPv4 */
3177fcf3ce44SJohn Forte 		stl_hdr->stl_entry.e_insize = sizeof (struct in_addr);
3178fcf3ce44SJohn Forte 	} else {
3179fcf3ce44SJohn Forte 		/* IPv6 */
3180fcf3ce44SJohn Forte 		stl_hdr->stl_entry.e_insize = sizeof (struct in6_addr);
3181fcf3ce44SJohn Forte 	}
3182fcf3ce44SJohn Forte 
3183fcf3ce44SJohn Forte 
3184fcf3ce44SJohn Forte 	bcopy(address.hostnameIpAddress.id.ipAddress.ipAddress,
3185fcf3ce44SJohn Forte 	    &stl_hdr->stl_entry.e_u,
3186fcf3ce44SJohn Forte 	    sizeof (address.hostnameIpAddress.id.ipAddress.ipAddress));
3187fcf3ce44SJohn Forte 	stl_hdr->stl_entry.e_port = address.portNumber;
3188fcf3ce44SJohn Forte 
3189fcf3ce44SJohn Forte 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
3190fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
3191fcf3ce44SJohn Forte 		    ISCSI_DRIVER_DEVCTL, errno);
3192fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
3193fcf3ce44SJohn Forte 	}
3194fcf3ce44SJohn Forte 
3195fcf3ce44SJohn Forte retry_sendtgts:
3196fcf3ce44SJohn Forte 	/*
3197fcf3ce44SJohn Forte 	 * Issue ioctl to obtain the SendTargets list
3198fcf3ce44SJohn Forte 	 */
3199fcf3ce44SJohn Forte 	if (ioctl(fd, ISCSI_SENDTGTS_GET, stl_hdr) != 0) {
3200fcf3ce44SJohn Forte 		syslog(LOG_USER|LOG_DEBUG,
3201fcf3ce44SJohn Forte 		    "ISCSI_SENDTGTS_GET ioctl failed, errno: %d", errno);
3202fcf3ce44SJohn Forte 		(void) close(fd);
3203fcf3ce44SJohn Forte 		free(stl_hdr);
3204fcf3ce44SJohn Forte 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
3205fcf3ce44SJohn Forte 	}
3206fcf3ce44SJohn Forte 
3207fcf3ce44SJohn Forte 	/* check if all targets received */
3208fcf3ce44SJohn Forte 	if (stl_hdr->stl_in_cnt < stl_hdr->stl_out_cnt) {
3209fcf3ce44SJohn Forte 		if (retry == IMA_TRUE) {
3210fcf3ce44SJohn Forte 			stl_sz = sizeof (*stl_hdr) +
3211fcf3ce44SJohn Forte 			    ((stl_hdr->stl_out_cnt - 1) *
3212fcf3ce44SJohn Forte 			    sizeof (iscsi_sendtgts_entry_t));
3213fcf3ce44SJohn Forte 			stl_hdr = (iscsi_sendtgts_list_t *)
3214fcf3ce44SJohn Forte 			    realloc(stl_hdr, stl_sz);
3215fcf3ce44SJohn Forte 			if (stl_hdr == NULL) {
3216fcf3ce44SJohn Forte 				(void) close(fd);
3217fcf3ce44SJohn Forte 				return (IMA_ERROR_INSUFFICIENT_MEMORY);
3218fcf3ce44SJohn Forte 			}
3219fcf3ce44SJohn Forte 			stl_hdr->stl_in_cnt = stl_hdr->stl_out_cnt;
3220fcf3ce44SJohn Forte 			retry = IMA_FALSE;
3221fcf3ce44SJohn Forte 			goto retry_sendtgts;
3222fcf3ce44SJohn Forte 		} else {
3223fcf3ce44SJohn Forte 			/*
3224fcf3ce44SJohn Forte 			 * don't retry after 2 attempts.  The target list
3225fcf3ce44SJohn Forte 			 * shouldn't continue to growing. Justs continue
3226fcf3ce44SJohn Forte 			 * on and display what was found.
3227fcf3ce44SJohn Forte 			 */
3228fcf3ce44SJohn Forte 			syslog(LOG_USER|LOG_DEBUG,
3229fcf3ce44SJohn Forte 			    "ISCSI_SENDTGTS_GET overflow: "
3230fcf3ce44SJohn Forte 			    "failed to obtain all targets");
3231fcf3ce44SJohn Forte 			stl_hdr->stl_out_cnt = stl_hdr->stl_in_cnt;
3232fcf3ce44SJohn Forte 		}
3233fcf3ce44SJohn Forte 	}
3234fcf3ce44SJohn Forte 
3235fcf3ce44SJohn Forte 	(void) close(fd);
3236fcf3ce44SJohn Forte 
3237fcf3ce44SJohn Forte 	/* allocate for caller return buffer */
3238fcf3ce44SJohn Forte 	*ppList = (SUN_IMA_DISC_ADDRESS_KEY_PROPERTIES *)calloc(1,
3239fcf3ce44SJohn Forte 	    sizeof (SUN_IMA_DISC_ADDRESS_KEY_PROPERTIES) +
3240fcf3ce44SJohn Forte 	    stl_hdr->stl_out_cnt * sizeof (SUN_IMA_DISC_ADDRESS_KEY));
3241fcf3ce44SJohn Forte 	if (*ppList == NULL) {
3242fcf3ce44SJohn Forte 		free(stl_hdr);
3243fcf3ce44SJohn Forte 		return (IMA_ERROR_INSUFFICIENT_MEMORY);
3244fcf3ce44SJohn Forte 	}
3245fcf3ce44SJohn Forte 
3246fcf3ce44SJohn Forte 	(*ppList)->keyCount = stl_hdr->stl_out_cnt;
3247fcf3ce44SJohn Forte 
3248fcf3ce44SJohn Forte 	for (ctr = 0; ctr < stl_hdr->stl_out_cnt; ctr++) {
3249fcf3ce44SJohn Forte 		(void) mbstowcs((*ppList)->keys[ctr].name,
3250fcf3ce44SJohn Forte 		    (char *)stl_hdr->stl_list[ctr].ste_name,
3251fcf3ce44SJohn Forte 		    IMA_NODE_NAME_LEN);
3252fcf3ce44SJohn Forte 
3253fcf3ce44SJohn Forte 		(*ppList)->keys[ctr].tpgt = stl_hdr->stl_list[ctr].ste_tpgt;
3254fcf3ce44SJohn Forte 
3255fcf3ce44SJohn Forte 		(*ppList)->keys[ctr].address.portNumber =
3256fcf3ce44SJohn Forte 		    stl_hdr->stl_list[ctr].ste_ipaddr.a_port;
3257fcf3ce44SJohn Forte 
3258fcf3ce44SJohn Forte 		if (stl_hdr->stl_list[ctr].ste_ipaddr.a_addr.i_insize ==
3259fcf3ce44SJohn Forte 		    sizeof (struct in_addr)) {
3260fcf3ce44SJohn Forte 			(*ppList)->keys[ctr].address.ipAddress.ipv4Address =
3261fcf3ce44SJohn Forte 			    IMA_TRUE;
3262fcf3ce44SJohn Forte 		} else if (stl_hdr->stl_list[ctr].ste_ipaddr.a_addr.i_insize ==
3263fcf3ce44SJohn Forte 		    sizeof (struct in6_addr)) {
3264fcf3ce44SJohn Forte 			(*ppList)->keys[ctr].address.ipAddress.ipv4Address =
3265fcf3ce44SJohn Forte 			    IMA_FALSE;
3266fcf3ce44SJohn Forte 		} else {
3267fcf3ce44SJohn Forte 			free(stl_hdr);
3268fcf3ce44SJohn Forte 			syslog(LOG_USER|LOG_DEBUG,
3269fcf3ce44SJohn Forte 			"ISCSI_STATIC_GET returned bad address");
3270fcf3ce44SJohn Forte 			return (IMA_ERROR_UNEXPECTED_OS_ERROR);
3271fcf3ce44SJohn Forte 		}
3272fcf3ce44SJohn Forte 
3273fcf3ce44SJohn Forte 
3274fcf3ce44SJohn Forte 		(void) memcpy(&(*ppList)->keys[ctr].address.ipAddress.ipAddress,
3275fcf3ce44SJohn Forte 		    &(stl_hdr->stl_list[ctr].ste_ipaddr.a_addr.i_addr),
3276fcf3ce44SJohn Forte 		    stl_hdr->stl_list[ctr].ste_ipaddr.a_addr.i_insize);
3277fcf3ce44SJohn Forte 	}
3278fcf3ce44SJohn Forte 	free(stl_hdr);
3279fcf3ce44SJohn Forte 
3280fcf3ce44SJohn Forte 	return (IMA_STATUS_SUCCESS);
3281fcf3ce44SJohn Forte }
3282aff4bce5Syi zhang - Sun Microsystems - Beijing China 
3283aff4bce5Syi zhang - Sun Microsystems - Beijing China IMA_API IMA_STATUS SUN_IMA_GetTunableProperties(
3284aff4bce5Syi zhang - Sun Microsystems - Beijing China 	IMA_OID oid,
3285aff4bce5Syi zhang - Sun Microsystems - Beijing China 	ISCSI_TUNABLE_PARAM *param)
3286aff4bce5Syi zhang - Sun Microsystems - Beijing China {
3287aff4bce5Syi zhang - Sun Microsystems - Beijing China 	int fd;
3288aff4bce5Syi zhang - Sun Microsystems - Beijing China 	iscsi_tunable_object_t pg;
3289aff4bce5Syi zhang - Sun Microsystems - Beijing China 
3290aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
3291aff4bce5Syi zhang - Sun Microsystems - Beijing China 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
3292aff4bce5Syi zhang - Sun Microsystems - Beijing China 		    ISCSI_DRIVER_DEVCTL, errno);
3293aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
3294aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
3295aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) memset(&pg, 0, sizeof (iscsi_tunable_object_t));
3296aff4bce5Syi zhang - Sun Microsystems - Beijing China 	pg.t_param = param->tunable_objectType;
3297aff4bce5Syi zhang - Sun Microsystems - Beijing China 	pg.t_oid = (uint32_t)oid.objectSequenceNumber;
3298aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (ioctl(fd, ISCSI_TUNABLE_PARAM_GET, &pg) == -1) {
3299aff4bce5Syi zhang - Sun Microsystems - Beijing China 		syslog(LOG_USER|LOG_DEBUG,
3300aff4bce5Syi zhang - Sun Microsystems - Beijing China 		    "ISCSI_TUNABLE_PARAM_GET ioctl failed, errno: %d", errno);
3301aff4bce5Syi zhang - Sun Microsystems - Beijing China 		(void) close(fd);
3302aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
3303aff4bce5Syi zhang - Sun Microsystems - Beijing China 	} else {
3304aff4bce5Syi zhang - Sun Microsystems - Beijing China 		long long value;
3305aff4bce5Syi zhang - Sun Microsystems - Beijing China 		char tmp[MAX_LONG_LONG_STRING_LEN], *ptr = NULL;
3306aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (pg.t_set == B_FALSE) {
3307aff4bce5Syi zhang - Sun Microsystems - Beijing China 			/* default value */
3308aff4bce5Syi zhang - Sun Microsystems - Beijing China 			(void) close(fd);
3309aff4bce5Syi zhang - Sun Microsystems - Beijing China 			return (IMA_STATUS_SUCCESS);
3310aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
3311aff4bce5Syi zhang - Sun Microsystems - Beijing China 		value = (long long)pg.t_value.v_integer;
33120f79c548Syi zhang - Sun Microsystems - Beijing China 		ptr = lltostr(value, &tmp[MAX_LONG_LONG_STRING_LEN -1]);
3313aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if ((ptr != NULL) && (ptr != tmp)) {
33140f79c548Syi zhang - Sun Microsystems - Beijing China 			tmp[MAX_LONG_LONG_STRING_LEN - 1] = '\0';
3315aff4bce5Syi zhang - Sun Microsystems - Beijing China 		} else {
3316aff4bce5Syi zhang - Sun Microsystems - Beijing China 			(void) close(fd);
3317aff4bce5Syi zhang - Sun Microsystems - Beijing China 			return (IMA_ERROR_UNEXPECTED_OS_ERROR);
3318aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
3319aff4bce5Syi zhang - Sun Microsystems - Beijing China 		switch (param->tunable_objectType) {
3320aff4bce5Syi zhang - Sun Microsystems - Beijing China 			case ISCSI_RX_TIMEOUT_VALUE:
3321aff4bce5Syi zhang - Sun Microsystems - Beijing China 				(void) strlcpy(param->tunable_objectValue,
33220f79c548Syi zhang - Sun Microsystems - Beijing China 				    ptr, strlen(ptr) + 1);
3323aff4bce5Syi zhang - Sun Microsystems - Beijing China 				break;
3324aff4bce5Syi zhang - Sun Microsystems - Beijing China 			case ISCSI_CONN_DEFAULT_LOGIN_MAX:
3325aff4bce5Syi zhang - Sun Microsystems - Beijing China 				(void) strlcpy(param->tunable_objectValue,
33260f79c548Syi zhang - Sun Microsystems - Beijing China 				    ptr, strlen(ptr) + 1);
3327aff4bce5Syi zhang - Sun Microsystems - Beijing China 				break;
3328aff4bce5Syi zhang - Sun Microsystems - Beijing China 			case ISCSI_LOGIN_POLLING_DELAY:
3329aff4bce5Syi zhang - Sun Microsystems - Beijing China 				(void) strlcpy(param->tunable_objectValue,
33300f79c548Syi zhang - Sun Microsystems - Beijing China 				    ptr, strlen(ptr) + 1);
3331aff4bce5Syi zhang - Sun Microsystems - Beijing China 				break;
3332aff4bce5Syi zhang - Sun Microsystems - Beijing China 			default:
3333aff4bce5Syi zhang - Sun Microsystems - Beijing China 				break;
3334aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
3335aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
3336aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) close(fd);
3337aff4bce5Syi zhang - Sun Microsystems - Beijing China 	return (IMA_STATUS_SUCCESS);
3338aff4bce5Syi zhang - Sun Microsystems - Beijing China }
3339aff4bce5Syi zhang - Sun Microsystems - Beijing China 
3340aff4bce5Syi zhang - Sun Microsystems - Beijing China IMA_API IMA_STATUS SUN_IMA_SetTunableProperties(
3341aff4bce5Syi zhang - Sun Microsystems - Beijing China 	IMA_OID oid,
3342aff4bce5Syi zhang - Sun Microsystems - Beijing China 	ISCSI_TUNABLE_PARAM *param)
3343aff4bce5Syi zhang - Sun Microsystems - Beijing China {
3344aff4bce5Syi zhang - Sun Microsystems - Beijing China 	int fd;
3345aff4bce5Syi zhang - Sun Microsystems - Beijing China 	iscsi_tunable_object_t	ps;
3346aff4bce5Syi zhang - Sun Microsystems - Beijing China 
3347aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if ((fd = open(ISCSI_DRIVER_DEVCTL, O_RDONLY)) == -1) {
3348aff4bce5Syi zhang - Sun Microsystems - Beijing China 		syslog(LOG_USER|LOG_DEBUG, "Cannot open %s (%d)",
3349aff4bce5Syi zhang - Sun Microsystems - Beijing China 		    ISCSI_DRIVER_DEVCTL, errno);
3350aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (IMA_ERROR_UNEXPECTED_OS_ERROR);
3351aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
3352aff4bce5Syi zhang - Sun Microsystems - Beijing China 
3353aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) memset(&ps, 0, sizeof (iscsi_tunable_object_t));
3354aff4bce5Syi zhang - Sun Microsystems - Beijing China 	ps.t_oid = oid.objectSequenceNumber;
3355aff4bce5Syi zhang - Sun Microsystems - Beijing China 	ps.t_param = param->tunable_objectType;
3356aff4bce5Syi zhang - Sun Microsystems - Beijing China 	switch (param->tunable_objectType) {
3357aff4bce5Syi zhang - Sun Microsystems - Beijing China 		long tmp;
3358aff4bce5Syi zhang - Sun Microsystems - Beijing China 		case ISCSI_RX_TIMEOUT_VALUE:
3359aff4bce5Syi zhang - Sun Microsystems - Beijing China 		case ISCSI_CONN_DEFAULT_LOGIN_MAX:
3360aff4bce5Syi zhang - Sun Microsystems - Beijing China 		case ISCSI_LOGIN_POLLING_DELAY:
3361aff4bce5Syi zhang - Sun Microsystems - Beijing China 			tmp = strtol(param->tunable_objectValue,
3362aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    NULL, 10);
3363aff4bce5Syi zhang - Sun Microsystems - Beijing China 			if (((tmp == 0) && (errno == EINVAL)) ||
3364aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    ((tmp == LONG_MAX) && (errno == ERANGE)) ||
3365aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    ((tmp == LONG_MIN) && (errno == ERANGE))) {
3366aff4bce5Syi zhang - Sun Microsystems - Beijing China 				(void) close(fd);
3367aff4bce5Syi zhang - Sun Microsystems - Beijing China 				return (IMA_ERROR_INVALID_PARAMETER);
3368aff4bce5Syi zhang - Sun Microsystems - Beijing China 			}
3369aff4bce5Syi zhang - Sun Microsystems - Beijing China 			ps.t_value.v_integer = (uint32_t)tmp;
3370aff4bce5Syi zhang - Sun Microsystems - Beijing China 			break;
3371aff4bce5Syi zhang - Sun Microsystems - Beijing China 		default:
3372aff4bce5Syi zhang - Sun Microsystems - Beijing China 			break;
3373aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
3374aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (ioctl(fd, ISCSI_TUNABLE_PARAM_SET, &ps)) {
3375aff4bce5Syi zhang - Sun Microsystems - Beijing China 		int tmpErrno = errno;
3376aff4bce5Syi zhang - Sun Microsystems - Beijing China 		syslog(LOG_USER|LOG_DEBUG,
3377aff4bce5Syi zhang - Sun Microsystems - Beijing China 		    "ISCSI_TUNABLE_PARAM_SET ioctl failed, errno: %d", errno);
3378aff4bce5Syi zhang - Sun Microsystems - Beijing China 		(void) close(fd);
3379aff4bce5Syi zhang - Sun Microsystems - Beijing China 		switch (tmpErrno) {
3380aff4bce5Syi zhang - Sun Microsystems - Beijing China 			case ENOTSUP :
3381aff4bce5Syi zhang - Sun Microsystems - Beijing China 				return (IMA_ERROR_NOT_SUPPORTED);
3382aff4bce5Syi zhang - Sun Microsystems - Beijing China 			default:
3383aff4bce5Syi zhang - Sun Microsystems - Beijing China 				return (IMA_ERROR_UNEXPECTED_OS_ERROR);
3384aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
3385aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
3386aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) close(fd);
3387aff4bce5Syi zhang - Sun Microsystems - Beijing China 	return (IMA_STATUS_SUCCESS);
3388aff4bce5Syi zhang - Sun Microsystems - Beijing China }
3389