1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2003 Silicon Graphics International Corp.
5 * Copyright (c) 2011 Spectra Logic Corporation
6 * Copyright (c) 2014-2017 Alexander Motin <mav@FreeBSD.org>
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions, and the following disclaimer,
14 *    without modification.
15 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
16 *    substantially similar to the "NO WARRANTY" disclaimer below
17 *    ("Disclaimer") and any redistribution must be conditioned upon
18 *    including a substantially similar Disclaimer requirement for further
19 *    binary redistribution.
20 *
21 * NO WARRANTY
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
31 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGES.
33 *
34 * $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl_ioctl.h#4 $
35 * $FreeBSD$
36 */
37/*
38 * CAM Target Layer ioctl interface.
39 *
40 * Author: Ken Merry <ken@FreeBSD.org>
41 */
42
43#ifndef	_CTL_IOCTL_H_
44#define	_CTL_IOCTL_H_
45
46#ifdef ICL_KERNEL_PROXY
47#include <sys/socket.h>
48#endif
49
50#include <sys/ioccom.h>
51#include <sys/nv.h>
52
53#define	CTL_DEFAULT_DEV		"/dev/cam/ctl"
54/*
55 * Maximum number of targets we support.
56 */
57#define	CTL_MAX_TARGETS		1
58
59/*
60 * Maximum target ID we support.
61 */
62#define	CTL_MAX_TARGID		15
63
64/*
65 * Maximum number of initiators per port.
66 */
67#define	CTL_MAX_INIT_PER_PORT	2048
68
69/* Hopefully this won't conflict with new misc devices that pop up */
70#define	CTL_MINOR	225
71
72typedef enum {
73	CTL_DELAY_TYPE_NONE,
74	CTL_DELAY_TYPE_CONT,
75	CTL_DELAY_TYPE_ONESHOT
76} ctl_delay_type;
77
78typedef enum {
79	CTL_DELAY_LOC_NONE,
80	CTL_DELAY_LOC_DATAMOVE,
81	CTL_DELAY_LOC_DONE,
82} ctl_delay_location;
83
84typedef enum {
85	CTL_DELAY_STATUS_NONE,
86	CTL_DELAY_STATUS_OK,
87	CTL_DELAY_STATUS_INVALID_LUN,
88	CTL_DELAY_STATUS_INVALID_TYPE,
89	CTL_DELAY_STATUS_INVALID_LOC,
90	CTL_DELAY_STATUS_NOT_IMPLEMENTED
91} ctl_delay_status;
92
93struct ctl_io_delay_info {
94	uint32_t		lun_id;
95	ctl_delay_type		delay_type;
96	ctl_delay_location	delay_loc;
97	uint32_t		delay_secs;
98	ctl_delay_status	status;
99};
100
101typedef enum {
102	CTL_STATS_NO_IO,
103	CTL_STATS_READ,
104	CTL_STATS_WRITE
105} ctl_stat_types;
106#define	CTL_STATS_NUM_TYPES	3
107
108typedef enum {
109	CTL_SS_OK,
110	CTL_SS_NEED_MORE_SPACE,
111	CTL_SS_ERROR
112} ctl_stats_status;
113
114typedef enum {
115	CTL_STATS_FLAG_NONE		= 0x00,
116	CTL_STATS_FLAG_TIME_VALID	= 0x01
117} ctl_stats_flags;
118
119struct ctl_io_stats {
120	uint32_t			item;
121	uint64_t			bytes[CTL_STATS_NUM_TYPES];
122	uint64_t			operations[CTL_STATS_NUM_TYPES];
123	uint64_t			dmas[CTL_STATS_NUM_TYPES];
124	struct bintime			time[CTL_STATS_NUM_TYPES];
125	struct bintime			dma_time[CTL_STATS_NUM_TYPES];
126};
127
128struct ctl_get_io_stats {
129	struct ctl_io_stats	*stats;		/* passed to/from kernel */
130	size_t			alloc_len;	/* passed to kernel */
131	size_t			fill_len;	/* passed to userland */
132	int			first_item;	/* passed to kernel */
133	int			num_items;	/* passed to userland */
134	ctl_stats_status	status;		/* passed to userland */
135	ctl_stats_flags		flags;		/* passed to userland */
136	struct timespec		timestamp;	/* passed to userland */
137};
138
139/*
140 * The types of errors that can be injected:
141 *
142 * NONE:	No error specified.
143 * ABORTED:	SSD_KEY_ABORTED_COMMAND, 0x45, 0x00
144 * MEDIUM_ERR:	Medium error, different asc/ascq depending on read/write.
145 * UA:		Unit attention.
146 * CUSTOM:	User specifies the sense data.
147 * TYPE:	Mask to use with error types.
148 *
149 * Flags that affect injection behavior:
150 * CONTINUOUS:	This error will stay around until explicitly cleared.
151 * DESCRIPTOR:	Use descriptor sense instead of fixed sense.
152 */
153typedef enum {
154	CTL_LUN_INJ_NONE		= 0x000,
155	CTL_LUN_INJ_ABORTED		= 0x001,
156	CTL_LUN_INJ_MEDIUM_ERR		= 0x002,
157	CTL_LUN_INJ_UA			= 0x003,
158	CTL_LUN_INJ_CUSTOM		= 0x004,
159	CTL_LUN_INJ_TYPE		= 0x0ff,
160	CTL_LUN_INJ_CONTINUOUS		= 0x100,
161	CTL_LUN_INJ_DESCRIPTOR		= 0x200
162} ctl_lun_error;
163
164/*
165 * Flags to specify what type of command the given error pattern will
166 * execute on.  The first group of types can be ORed together.
167 *
168 * READ:	Any read command.
169 * WRITE:	Any write command.
170 * READWRITE:	Any read or write command.
171 * READCAP:	Any read capacity command.
172 * TUR:		Test Unit Ready.
173 * ANY:		Any command.
174 * MASK:	Mask for basic command patterns.
175 *
176 * Special types:
177 *
178 * CMD:		The CDB to act on is specified in struct ctl_error_desc_cmd.
179 * RANGE:	For read/write commands, act when the LBA is in the
180 *		specified range.
181 */
182typedef enum {
183	CTL_LUN_PAT_NONE	= 0x000,
184	CTL_LUN_PAT_READ	= 0x001,
185	CTL_LUN_PAT_WRITE	= 0x002,
186	CTL_LUN_PAT_READWRITE	= CTL_LUN_PAT_READ | CTL_LUN_PAT_WRITE,
187	CTL_LUN_PAT_READCAP	= 0x004,
188	CTL_LUN_PAT_TUR		= 0x008,
189	CTL_LUN_PAT_ANY		= 0x0ff,
190	CTL_LUN_PAT_MASK	= 0x0ff,
191	CTL_LUN_PAT_CMD		= 0x100,
192	CTL_LUN_PAT_RANGE	= 0x200
193} ctl_lun_error_pattern;
194
195/*
196 * This structure allows the user to specify a particular CDB pattern to
197 * look for.
198 *
199 * cdb_pattern:		Fill in the relevant bytes to look for in the CDB.
200 * cdb_valid_bytes:	Bitmask specifying valid bytes in the cdb_pattern.
201 * flags:		Specify any command flags (see ctl_io_flags) that
202 *			should be set.
203 */
204struct ctl_error_desc_cmd {
205	uint8_t		cdb_pattern[CTL_MAX_CDBLEN];
206	uint32_t	cdb_valid_bytes;
207	uint32_t	flags;
208};
209
210/*
211 * Error injection descriptor.
212 *
213 * lun_id	   LUN to act on.
214 * lun_error:	   The type of error to inject.  See above for descriptions.
215 * error_pattern:  What kind of command to act on.  See above.
216 * cmd_desc:	   For CTL_LUN_PAT_CMD only.
217 * lba_range:	   For CTL_LUN_PAT_RANGE only.
218 * custom_sense:   Specify sense.  For CTL_LUN_INJ_CUSTOM only.
219 * serial:	   Serial number returned by the kernel.  Use for deletion.
220 * links:	   Kernel use only.
221 */
222struct ctl_error_desc {
223	uint32_t			lun_id;		/* To kernel */
224	ctl_lun_error			lun_error;	/* To kernel */
225	ctl_lun_error_pattern		error_pattern;	/* To kernel */
226	struct ctl_error_desc_cmd	cmd_desc;	/* To kernel */
227	struct ctl_lba_len		lba_range;	/* To kernel */
228	struct scsi_sense_data		custom_sense;	/* To kernel */
229	uint64_t			serial;		/* From kernel */
230	STAILQ_ENTRY(ctl_error_desc)	links;		/* Kernel use only */
231};
232
233typedef enum {
234	CTL_OOA_FLAG_NONE	= 0x00,
235	CTL_OOA_FLAG_ALL_LUNS	= 0x01
236} ctl_ooa_flags;
237
238typedef enum {
239	CTL_OOA_OK,
240	CTL_OOA_NEED_MORE_SPACE,
241	CTL_OOA_ERROR
242} ctl_get_ooa_status;
243
244typedef enum {
245	CTL_OOACMD_FLAG_NONE		= 0x00,
246	CTL_OOACMD_FLAG_DMA		= 0x01,
247	CTL_OOACMD_FLAG_BLOCKED		= 0x02,
248	CTL_OOACMD_FLAG_ABORT		= 0x04,
249	CTL_OOACMD_FLAG_RTR		= 0x08,
250	CTL_OOACMD_FLAG_DMA_QUEUED	= 0x10,
251	CTL_OOACMD_FLAG_STATUS_QUEUED	= 0x20,
252	CTL_OOACMD_FLAG_STATUS_SENT	= 0x40
253} ctl_ooa_cmd_flags;
254
255struct ctl_ooa_entry {
256	ctl_ooa_cmd_flags	cmd_flags;
257	uint8_t			cdb[CTL_MAX_CDBLEN];
258	uint8_t			cdb_len;
259	uint32_t		tag_num;
260	uint32_t		lun_num;
261	struct bintime		start_bt;
262};
263
264struct ctl_ooa {
265	ctl_ooa_flags		flags;		/* passed to kernel */
266	uint64_t		lun_num;	/* passed to kernel */
267	uint32_t		alloc_len;	/* passed to kernel */
268	uint32_t		alloc_num;	/* passed to kernel */
269	struct ctl_ooa_entry	*entries;	/* filled in kernel */
270	uint32_t		fill_len;	/* passed to userland */
271	uint32_t		fill_num;	/* passed to userland */
272	uint32_t		dropped_num;	/* passed to userland */
273	struct bintime		cur_bt;		/* passed to userland */
274	ctl_get_ooa_status	status;		/* passed to userland */
275};
276
277typedef enum {
278	CTL_LUN_NOSTATUS,
279	CTL_LUN_OK,
280	CTL_LUN_ERROR,
281	CTL_LUN_WARNING
282} ctl_lun_status;
283
284#define	CTL_ERROR_STR_LEN	160
285
286typedef enum {
287	CTL_LUNREQ_CREATE,
288	CTL_LUNREQ_RM,
289	CTL_LUNREQ_MODIFY,
290} ctl_lunreq_type;
291
292/*
293 * The ID_REQ flag is used to say that the caller has requested a
294 * particular LUN ID in the req_lun_id field.  If we cannot allocate that
295 * LUN ID, the ctl_add_lun() call will fail.
296 *
297 * The STOPPED flag tells us that the LUN should default to the powered
298 * off state.  It will return 0x04,0x02 until it is powered up.  ("Logical
299 * unit not ready, initializing command required.")
300 *
301 * The NO_MEDIA flag tells us that the LUN has no media inserted.
302 *
303 * The PRIMARY flag tells us that this LUN is registered as a Primary LUN
304 * which is accessible via the Master shelf controller in an HA. This flag
305 * being set indicates a Primary LUN. This flag being reset represents a
306 * Secondary LUN controlled by the Secondary controller in an HA
307 * configuration. Flag is applicable at this time to T_DIRECT types.
308 *
309 * The SERIAL_NUM flag tells us that the serial_num field is filled in and
310 * valid for use in SCSI INQUIRY VPD page 0x80.
311 *
312 * The DEVID flag tells us that the device_id field is filled in and
313 * valid for use in SCSI INQUIRY VPD page 0x83.
314 *
315 * The DEV_TYPE flag tells us that the device_type field is filled in.
316 *
317 * The EJECTED flag tells us that the removable LUN has tray open.
318 *
319 * The UNMAP flag tells us that this LUN supports UNMAP.
320 *
321 * The OFFLINE flag tells us that this LUN can not access backing store.
322 */
323typedef enum {
324	CTL_LUN_FLAG_ID_REQ		= 0x01,
325	CTL_LUN_FLAG_STOPPED		= 0x02,
326	CTL_LUN_FLAG_NO_MEDIA		= 0x04,
327	CTL_LUN_FLAG_PRIMARY		= 0x08,
328	CTL_LUN_FLAG_SERIAL_NUM		= 0x10,
329	CTL_LUN_FLAG_DEVID		= 0x20,
330	CTL_LUN_FLAG_DEV_TYPE		= 0x40,
331	CTL_LUN_FLAG_UNMAP		= 0x80,
332	CTL_LUN_FLAG_EJECTED		= 0x100,
333	CTL_LUN_FLAG_READONLY		= 0x200
334} ctl_backend_lun_flags;
335
336/*
337 * LUN creation parameters:
338 *
339 * flags:		Various LUN flags, see above.
340 *
341 * device_type:		The SCSI device type.  e.g. 0 for Direct Access,
342 *			3 for Processor, etc.  Only certain backends may
343 *			support setting this field.  The CTL_LUN_FLAG_DEV_TYPE
344 *			flag should be set in the flags field if the device
345 *			type is set.
346 *
347 * lun_size_bytes:	The size of the LUN in bytes.  For some backends
348 *			this is relevant (e.g. ramdisk), for others, it may
349 *			be ignored in favor of using the properties of the
350 *			backing store.  If specified, this should be a
351 *			multiple of the blocksize.
352 *
353 *			The actual size of the LUN is returned in this
354 *			field.
355 *
356 * blocksize_bytes:	The LUN blocksize in bytes.  For some backends this
357 *			is relevant, for others it may be ignored in
358 *			favor of using the properties of the backing store.
359 *
360 *			The actual blocksize of the LUN is returned in this
361 *			field.
362 *
363 * req_lun_id:		The requested LUN ID.  The CTL_LUN_FLAG_ID_REQ flag
364 *			should be set if this is set.  The request will be
365 *			granted if the LUN number is available, otherwise
366 * 			the LUN addition request will fail.
367 *
368 *			The allocated LUN number is returned in this field.
369 *
370 * serial_num:		This is the value returned in SCSI INQUIRY VPD page
371 *			0x80.  If it is specified, the CTL_LUN_FLAG_SERIAL_NUM
372 *			flag should be set.
373 *
374 *			The serial number value used is returned in this
375 *			field.
376 *
377 * device_id:		This is the value returned in the T10 vendor ID
378 *			based DESIGNATOR field in the SCSI INQUIRY VPD page
379 *			0x83 data.  If it is specified, the CTL_LUN_FLAG_DEVID
380 *			flag should be set.
381 *
382 *			The device id value used is returned in this field.
383 */
384struct ctl_lun_create_params {
385	ctl_backend_lun_flags	flags;
386	uint8_t			device_type;
387	uint64_t		lun_size_bytes;
388	uint32_t		blocksize_bytes;
389	uint32_t		req_lun_id;
390	uint8_t			serial_num[CTL_SN_LEN];
391	uint8_t			device_id[CTL_DEVID_LEN];
392};
393
394/*
395 * LUN removal parameters:
396 *
397 * lun_id:		The number of the LUN to delete.  This must be set.
398 *			The LUN must be backed by the given backend.
399 */
400struct ctl_lun_rm_params {
401	uint32_t		lun_id;
402};
403
404/*
405 * LUN modification parameters:
406 *
407 * lun_id:		The number of the LUN to modify.  This must be set.
408 *			The LUN must be backed by the given backend.
409 *
410 * lun_size_bytes:	The size of the LUN in bytes.  If zero, update
411 * 			the size using the backing file size, if possible.
412 */
413struct ctl_lun_modify_params {
414	uint32_t		lun_id;
415	uint64_t		lun_size_bytes;
416};
417
418/*
419 * Union of request type data.  Fill in the appropriate union member for
420 * the request type.
421 */
422union ctl_lunreq_data {
423	struct ctl_lun_create_params	create;
424	struct ctl_lun_rm_params	rm;
425	struct ctl_lun_modify_params	modify;
426};
427
428/*
429 * LUN request interface:
430 *
431 * backend:		This is required, and is NUL-terminated a string
432 *			that is the name of the backend, like "ramdisk" or
433 *			"block".
434 *
435 * reqtype:		The type of request, CTL_LUNREQ_CREATE to create a
436 *			LUN, CTL_LUNREQ_RM to delete a LUN.
437 *
438 * reqdata:		Request type-specific information.  See the
439 *			description of individual the union members above
440 *			for more information.
441 *
442 * num_be_args:		This is the number of backend-specific arguments
443 *			in the be_args array.
444 *
445 * be_args:		This is an array of backend-specific arguments.
446 *			See above for a description of the fields in this
447 *			structure.
448 *
449 * status:		Status of the LUN request.
450 *
451 * error_str:		If the status is CTL_LUN_ERROR, this will
452 *			contain a string describing the error.
453 *
454 * kern_be_args:	For kernel use only.
455 */
456struct ctl_lun_req {
457#define	CTL_BE_NAME_LEN		32
458	char			backend[CTL_BE_NAME_LEN];
459	ctl_lunreq_type		reqtype;
460	union ctl_lunreq_data	reqdata;
461	void *			args;
462	nvlist_t *		args_nvl;
463	size_t			args_len;
464	void *			result;
465	nvlist_t *		result_nvl;
466	size_t			result_len;
467	ctl_lun_status		status;
468	char			error_str[CTL_ERROR_STR_LEN];
469};
470
471/*
472 * LUN list status:
473 *
474 * NONE:		No status.
475 *
476 * OK:			Request completed successfully.
477 *
478 * NEED_MORE_SPACE:	The allocated length of the entries field is too
479 * 			small for the available data.
480 *
481 * ERROR:		An error occurred, look at the error string for a
482 *			description of the error.
483 */
484typedef enum {
485	CTL_LUN_LIST_NONE,
486	CTL_LUN_LIST_OK,
487	CTL_LUN_LIST_NEED_MORE_SPACE,
488	CTL_LUN_LIST_ERROR
489} ctl_lun_list_status;
490
491/*
492 * LUN list interface
493 *
494 * backend_name:	This is a NUL-terminated string.  If the string
495 *			length is 0, then all LUNs on all backends will
496 *			be enumerated.  Otherwise this is the name of the
497 *			backend to be enumerated, like "ramdisk" or "block".
498 *
499 * alloc_len:		The length of the data buffer allocated for entries.
500 *			In order to properly size the buffer, make one call
501 *			with alloc_len set to 0, and then use the returned
502 *			dropped_len as the buffer length to allocate and
503 *			pass in on a subsequent call.
504 *
505 * lun_xml:		XML-formatted information on the requested LUNs.
506 *
507 * fill_len:		The amount of data filled in the storage for entries.
508 *
509 * status:		The status of the request.  See above for the
510 *			description of the values of this field.
511 *
512 * error_str:		If the status indicates an error, this string will
513 *			be filled in to describe the error.
514 */
515struct ctl_lun_list {
516	char			backend[CTL_BE_NAME_LEN]; /* passed to kernel*/
517	uint32_t		alloc_len;	/* passed to kernel */
518	char			*lun_xml;	/* filled in kernel */
519	uint32_t		fill_len;	/* passed to userland */
520	ctl_lun_list_status	status;		/* passed to userland */
521	char			error_str[CTL_ERROR_STR_LEN];
522						/* passed to userland */
523};
524
525/*
526 * Port request interface:
527 *
528 * driver:		This is required, and is NUL-terminated a string
529 *			that is the name of the frontend, like "iscsi" .
530 *
531 * reqtype:		The type of request, CTL_REQ_CREATE to create a
532 *			port, CTL_REQ_REMOVE to delete a port.
533 *
534 * num_be_args:		This is the number of frontend-specific arguments
535 *			in the be_args array.
536 *
537 * be_args:		This is an array of frontend-specific arguments.
538 *			See above for a description of the fields in this
539 *			structure.
540 *
541 * status:		Status of the request.
542 *
543 * error_str:		If the status is CTL_LUN_ERROR, this will
544 *			contain a string describing the error.
545 *
546 * kern_be_args:	For kernel use only.
547 */
548typedef enum {
549	CTL_REQ_CREATE,
550	CTL_REQ_REMOVE,
551	CTL_REQ_MODIFY,
552} ctl_req_type;
553
554struct ctl_req {
555	char			driver[CTL_DRIVER_NAME_LEN];
556	ctl_req_type		reqtype;
557	void *			args;
558	nvlist_t *		args_nvl;
559	size_t			args_len;
560	void *			result;
561	nvlist_t *		result_nvl;
562	size_t			result_len;
563	ctl_lun_status		status;
564	char			error_str[CTL_ERROR_STR_LEN];
565};
566
567/*
568 * iSCSI status
569 *
570 * OK:			Request completed successfully.
571 *
572 * ERROR:		An error occurred, look at the error string for a
573 *			description of the error.
574 *
575 * CTL_ISCSI_LIST_NEED_MORE_SPACE:
576 * 			User has to pass larger buffer for CTL_ISCSI_LIST ioctl.
577 */
578typedef enum {
579	CTL_ISCSI_OK,
580	CTL_ISCSI_ERROR,
581	CTL_ISCSI_LIST_NEED_MORE_SPACE,
582	CTL_ISCSI_SESSION_NOT_FOUND
583} ctl_iscsi_status;
584
585typedef enum {
586	CTL_ISCSI_HANDOFF,
587	CTL_ISCSI_LIST,
588	CTL_ISCSI_LOGOUT,
589	CTL_ISCSI_TERMINATE,
590	CTL_ISCSI_LIMITS,
591#if defined(ICL_KERNEL_PROXY) || 1
592	/*
593	 * We actually need those in all cases, but leave the ICL_KERNEL_PROXY,
594	 * to remember to remove them along with rest of proxy code, eventually.
595	 */
596	CTL_ISCSI_LISTEN,
597	CTL_ISCSI_ACCEPT,
598	CTL_ISCSI_SEND,
599	CTL_ISCSI_RECEIVE,
600#endif
601} ctl_iscsi_type;
602
603typedef enum {
604	CTL_ISCSI_DIGEST_NONE,
605	CTL_ISCSI_DIGEST_CRC32C
606} ctl_iscsi_digest;
607
608#define	CTL_ISCSI_NAME_LEN	224	/* 223 bytes, by RFC 3720, + '\0' */
609#define	CTL_ISCSI_ADDR_LEN	47	/* INET6_ADDRSTRLEN + '\0' */
610#define	CTL_ISCSI_ALIAS_LEN	128	/* Arbitrary. */
611#define	CTL_ISCSI_OFFLOAD_LEN	8	/* Arbitrary. */
612
613struct ctl_iscsi_handoff_params {
614	char			initiator_name[CTL_ISCSI_NAME_LEN];
615	char			initiator_addr[CTL_ISCSI_ADDR_LEN];
616	char			initiator_alias[CTL_ISCSI_ALIAS_LEN];
617	uint8_t			initiator_isid[6];
618	char			target_name[CTL_ISCSI_NAME_LEN];
619	int			socket;
620	int			portal_group_tag;
621
622	/*
623	 * Connection parameters negotiated by ctld(8).
624	 */
625	ctl_iscsi_digest	header_digest;
626	ctl_iscsi_digest	data_digest;
627	uint32_t		cmdsn;
628	uint32_t		statsn;
629	int			max_recv_data_segment_length;
630	int			max_burst_length;
631	int			first_burst_length;
632	uint32_t		immediate_data;
633	char			offload[CTL_ISCSI_OFFLOAD_LEN];
634#ifdef ICL_KERNEL_PROXY
635	int			connection_id;
636#else
637	int			spare;
638#endif
639	int			max_send_data_segment_length;
640};
641
642struct ctl_iscsi_list_params {
643	uint32_t		alloc_len;	/* passed to kernel */
644	char                   *conn_xml;	/* filled in kernel */
645	uint32_t		fill_len;	/* passed to userland */
646	int			spare[4];
647};
648
649struct ctl_iscsi_logout_params {
650	int			connection_id;	/* passed to kernel */
651	char			initiator_name[CTL_ISCSI_NAME_LEN];
652						/* passed to kernel */
653	char			initiator_addr[CTL_ISCSI_ADDR_LEN];
654						/* passed to kernel */
655	int			all;		/* passed to kernel */
656	int			spare[4];
657};
658
659struct ctl_iscsi_terminate_params {
660	int			connection_id;	/* passed to kernel */
661	char			initiator_name[CTL_ISCSI_NAME_LEN];
662						/* passed to kernel */
663	char			initiator_addr[CTL_ISCSI_NAME_LEN];
664						/* passed to kernel */
665	int			all;		/* passed to kernel */
666	int			spare[4];
667};
668
669struct ctl_iscsi_limits_params {
670	/* passed to kernel */
671	char			offload[CTL_ISCSI_OFFLOAD_LEN];
672
673	/* passed to userland */
674	size_t			spare;
675	int			max_recv_data_segment_length;
676	int			max_send_data_segment_length;
677	int			max_burst_length;
678	int			first_burst_length;
679};
680
681#ifdef ICL_KERNEL_PROXY
682struct ctl_iscsi_listen_params {
683	int			iser;
684	int			domain;
685	int			socktype;
686	int			protocol;
687	struct sockaddr		*addr;
688	socklen_t		addrlen;
689	int			portal_id;
690	int			spare[4];
691};
692
693struct ctl_iscsi_accept_params {
694	int			connection_id;
695	int			portal_id;
696	struct sockaddr		*initiator_addr;
697	socklen_t		initiator_addrlen;
698	int			spare[4];
699};
700
701struct ctl_iscsi_send_params {
702	int			connection_id;
703	void			*bhs;
704	size_t			spare;
705	void			*spare2;
706	size_t			data_segment_len;
707	void			*data_segment;
708	int			spare3[4];
709};
710
711struct ctl_iscsi_receive_params {
712	int			connection_id;
713	void			*bhs;
714	size_t			spare;
715	void			*spare2;
716	size_t			data_segment_len;
717	void			*data_segment;
718	int			spare3[4];
719};
720
721#endif /* ICL_KERNEL_PROXY */
722
723union ctl_iscsi_data {
724	struct ctl_iscsi_handoff_params		handoff;
725	struct ctl_iscsi_list_params		list;
726	struct ctl_iscsi_logout_params		logout;
727	struct ctl_iscsi_terminate_params	terminate;
728	struct ctl_iscsi_limits_params		limits;
729#ifdef ICL_KERNEL_PROXY
730	struct ctl_iscsi_listen_params		listen;
731	struct ctl_iscsi_accept_params		accept;
732	struct ctl_iscsi_send_params		send;
733	struct ctl_iscsi_receive_params		receive;
734#endif
735};
736
737/*
738 * iSCSI interface
739 *
740 * status:		The status of the request.  See above for the
741 *			description of the values of this field.
742 *
743 * error_str:		If the status indicates an error, this string will
744 *			be filled in to describe the error.
745 */
746struct ctl_iscsi {
747	ctl_iscsi_type		type;		/* passed to kernel */
748	union ctl_iscsi_data	data;		/* passed to kernel */
749	ctl_iscsi_status	status;		/* passed to userland */
750	char			error_str[CTL_ERROR_STR_LEN];
751						/* passed to userland */
752};
753
754struct ctl_lun_map {
755	uint32_t		port;
756	uint32_t		plun;
757	uint32_t		lun;
758};
759
760#define	CTL_IO			_IOWR(CTL_MINOR, 0x00, union ctl_io)
761#define	CTL_ENABLE_PORT		_IOW(CTL_MINOR, 0x04, struct ctl_port_entry)
762#define	CTL_DISABLE_PORT	_IOW(CTL_MINOR, 0x05, struct ctl_port_entry)
763#define	CTL_DELAY_IO		_IOWR(CTL_MINOR, 0x10, struct ctl_io_delay_info)
764#define	CTL_ERROR_INJECT	_IOWR(CTL_MINOR, 0x16, struct ctl_error_desc)
765#define	CTL_GET_OOA		_IOWR(CTL_MINOR, 0x18, struct ctl_ooa)
766#define	CTL_DUMP_STRUCTS	_IO(CTL_MINOR, 0x19)
767#define	CTL_LUN_REQ		_IOWR(CTL_MINOR, 0x21, struct ctl_lun_req)
768#define	CTL_LUN_LIST		_IOWR(CTL_MINOR, 0x22, struct ctl_lun_list)
769#define	CTL_ERROR_INJECT_DELETE	_IOW(CTL_MINOR, 0x23, struct ctl_error_desc)
770#define	CTL_SET_PORT_WWNS	_IOW(CTL_MINOR, 0x24, struct ctl_port_entry)
771#define	CTL_ISCSI		_IOWR(CTL_MINOR, 0x25, struct ctl_iscsi)
772#define	CTL_PORT_REQ		_IOWR(CTL_MINOR, 0x26, struct ctl_req)
773#define	CTL_PORT_LIST		_IOWR(CTL_MINOR, 0x27, struct ctl_lun_list)
774#define	CTL_LUN_MAP		_IOW(CTL_MINOR, 0x28, struct ctl_lun_map)
775#define	CTL_GET_LUN_STATS	_IOWR(CTL_MINOR, 0x29, struct ctl_get_io_stats)
776#define	CTL_GET_PORT_STATS	_IOWR(CTL_MINOR, 0x2a, struct ctl_get_io_stats)
777
778#endif /* _CTL_IOCTL_H_ */
779
780/*
781 * vim: ts=8
782 */
783