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