xref: /freebsd/sys/cam/ctl/ctl_ioctl.h (revision 48000952260469477346c8a89e927af69ebc00e2)
1130f4520SKenneth D. Merry /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3bec9534dSPedro F. Giffuni  *
4130f4520SKenneth D. Merry  * Copyright (c) 2003 Silicon Graphics International Corp.
5130f4520SKenneth D. Merry  * Copyright (c) 2011 Spectra Logic Corporation
6bb8f9017SAlexander Motin  * Copyright (c) 2014-2017 Alexander Motin <mav@FreeBSD.org>
7130f4520SKenneth D. Merry  * All rights reserved.
8130f4520SKenneth D. Merry  *
9130f4520SKenneth D. Merry  * Redistribution and use in source and binary forms, with or without
10130f4520SKenneth D. Merry  * modification, are permitted provided that the following conditions
11130f4520SKenneth D. Merry  * are met:
12130f4520SKenneth D. Merry  * 1. Redistributions of source code must retain the above copyright
13130f4520SKenneth D. Merry  *    notice, this list of conditions, and the following disclaimer,
14130f4520SKenneth D. Merry  *    without modification.
15130f4520SKenneth D. Merry  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
16130f4520SKenneth D. Merry  *    substantially similar to the "NO WARRANTY" disclaimer below
17130f4520SKenneth D. Merry  *    ("Disclaimer") and any redistribution must be conditioned upon
18130f4520SKenneth D. Merry  *    including a substantially similar Disclaimer requirement for further
19130f4520SKenneth D. Merry  *    binary redistribution.
20130f4520SKenneth D. Merry  *
21130f4520SKenneth D. Merry  * NO WARRANTY
22130f4520SKenneth D. Merry  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23130f4520SKenneth D. Merry  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24130f4520SKenneth D. Merry  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
25130f4520SKenneth D. Merry  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26130f4520SKenneth D. Merry  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27130f4520SKenneth D. Merry  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28130f4520SKenneth D. Merry  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29130f4520SKenneth D. Merry  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30130f4520SKenneth D. Merry  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
31130f4520SKenneth D. Merry  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32130f4520SKenneth D. Merry  * POSSIBILITY OF SUCH DAMAGES.
33130f4520SKenneth D. Merry  *
34130f4520SKenneth D. Merry  * $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl_ioctl.h#4 $
35130f4520SKenneth D. Merry  */
36130f4520SKenneth D. Merry /*
37130f4520SKenneth D. Merry  * CAM Target Layer ioctl interface.
38130f4520SKenneth D. Merry  *
39130f4520SKenneth D. Merry  * Author: Ken Merry <ken@FreeBSD.org>
40130f4520SKenneth D. Merry  */
41130f4520SKenneth D. Merry 
42130f4520SKenneth D. Merry #ifndef	_CTL_IOCTL_H_
43130f4520SKenneth D. Merry #define	_CTL_IOCTL_H_
44130f4520SKenneth D. Merry 
45009ea47eSEdward Tomasz Napierala #ifdef ICL_KERNEL_PROXY
46009ea47eSEdward Tomasz Napierala #include <sys/socket.h>
47009ea47eSEdward Tomasz Napierala #endif
48009ea47eSEdward Tomasz Napierala 
49009ea47eSEdward Tomasz Napierala #include <sys/ioccom.h>
508951f055SMarcelo Araujo #include <sys/nv.h>
5125bad5a2SJohn Baldwin #include <dev/nvmf/nvmf.h>
5225bad5a2SJohn Baldwin #include <dev/nvmf/nvmf_proto.h>
53009ea47eSEdward Tomasz Napierala 
54130f4520SKenneth D. Merry #define	CTL_DEFAULT_DEV		"/dev/cam/ctl"
55130f4520SKenneth D. Merry /*
56130f4520SKenneth D. Merry  * Maximum number of targets we support.
57130f4520SKenneth D. Merry  */
58130f4520SKenneth D. Merry #define	CTL_MAX_TARGETS		1
59130f4520SKenneth D. Merry 
60130f4520SKenneth D. Merry /*
61130f4520SKenneth D. Merry  * Maximum target ID we support.
62130f4520SKenneth D. Merry  */
63130f4520SKenneth D. Merry #define	CTL_MAX_TARGID		15
64130f4520SKenneth D. Merry 
65130f4520SKenneth D. Merry /*
66130f4520SKenneth D. Merry  * Maximum number of initiators per port.
67130f4520SKenneth D. Merry  */
68ffe9621cSAlexander Motin #define	CTL_MAX_INIT_PER_PORT	2048
69130f4520SKenneth D. Merry 
70130f4520SKenneth D. Merry /* Hopefully this won't conflict with new misc devices that pop up */
71130f4520SKenneth D. Merry #define	CTL_MINOR	225
72130f4520SKenneth D. Merry 
73130f4520SKenneth D. Merry typedef enum {
74130f4520SKenneth D. Merry 	CTL_DELAY_TYPE_NONE,
75130f4520SKenneth D. Merry 	CTL_DELAY_TYPE_CONT,
76130f4520SKenneth D. Merry 	CTL_DELAY_TYPE_ONESHOT
77130f4520SKenneth D. Merry } ctl_delay_type;
78130f4520SKenneth D. Merry 
79130f4520SKenneth D. Merry typedef enum {
80130f4520SKenneth D. Merry 	CTL_DELAY_LOC_NONE,
81130f4520SKenneth D. Merry 	CTL_DELAY_LOC_DATAMOVE,
82130f4520SKenneth D. Merry 	CTL_DELAY_LOC_DONE,
83130f4520SKenneth D. Merry } ctl_delay_location;
84130f4520SKenneth D. Merry 
85130f4520SKenneth D. Merry typedef enum {
86130f4520SKenneth D. Merry 	CTL_DELAY_STATUS_NONE,
87130f4520SKenneth D. Merry 	CTL_DELAY_STATUS_OK,
88130f4520SKenneth D. Merry 	CTL_DELAY_STATUS_INVALID_LUN,
89130f4520SKenneth D. Merry 	CTL_DELAY_STATUS_INVALID_TYPE,
90130f4520SKenneth D. Merry 	CTL_DELAY_STATUS_INVALID_LOC,
91130f4520SKenneth D. Merry 	CTL_DELAY_STATUS_NOT_IMPLEMENTED
92130f4520SKenneth D. Merry } ctl_delay_status;
93130f4520SKenneth D. Merry 
94130f4520SKenneth D. Merry struct ctl_io_delay_info {
95130f4520SKenneth D. Merry 	uint32_t		lun_id;
96130f4520SKenneth D. Merry 	ctl_delay_type		delay_type;
97130f4520SKenneth D. Merry 	ctl_delay_location	delay_loc;
98130f4520SKenneth D. Merry 	uint32_t		delay_secs;
99130f4520SKenneth D. Merry 	ctl_delay_status	status;
100130f4520SKenneth D. Merry };
101130f4520SKenneth D. Merry 
102130f4520SKenneth D. Merry typedef enum {
103130f4520SKenneth D. Merry 	CTL_STATS_NO_IO,
104130f4520SKenneth D. Merry 	CTL_STATS_READ,
105130f4520SKenneth D. Merry 	CTL_STATS_WRITE
106130f4520SKenneth D. Merry } ctl_stat_types;
107130f4520SKenneth D. Merry #define	CTL_STATS_NUM_TYPES	3
108130f4520SKenneth D. Merry 
109130f4520SKenneth D. Merry typedef enum {
110bb8f9017SAlexander Motin 	CTL_SS_OK,
111bb8f9017SAlexander Motin 	CTL_SS_NEED_MORE_SPACE,
112bb8f9017SAlexander Motin 	CTL_SS_ERROR
113bb8f9017SAlexander Motin } ctl_stats_status;
114bb8f9017SAlexander Motin 
115*48000952SJohn Baldwin typedef u_int ctl_stats_flags;
116*48000952SJohn Baldwin 
117*48000952SJohn Baldwin #define	CTL_STATS_FLAG_NONE		0x00
118*48000952SJohn Baldwin #define	CTL_STATS_FLAG_TIME_VALID	0x01
119bb8f9017SAlexander Motin 
120bb8f9017SAlexander Motin struct ctl_io_stats {
121bb8f9017SAlexander Motin 	uint32_t			item;
122bb8f9017SAlexander Motin 	uint64_t			bytes[CTL_STATS_NUM_TYPES];
123bb8f9017SAlexander Motin 	uint64_t			operations[CTL_STATS_NUM_TYPES];
124bb8f9017SAlexander Motin 	uint64_t			dmas[CTL_STATS_NUM_TYPES];
125bb8f9017SAlexander Motin 	struct bintime			time[CTL_STATS_NUM_TYPES];
126bb8f9017SAlexander Motin 	struct bintime			dma_time[CTL_STATS_NUM_TYPES];
127bb8f9017SAlexander Motin };
128bb8f9017SAlexander Motin 
129bb8f9017SAlexander Motin struct ctl_get_io_stats {
130bb8f9017SAlexander Motin 	struct ctl_io_stats	*stats;		/* passed to/from kernel */
131bb8f9017SAlexander Motin 	size_t			alloc_len;	/* passed to kernel */
132bb8f9017SAlexander Motin 	size_t			fill_len;	/* passed to userland */
133bb8f9017SAlexander Motin 	int			first_item;	/* passed to kernel */
134bb8f9017SAlexander Motin 	int			num_items;	/* passed to userland */
135bb8f9017SAlexander Motin 	ctl_stats_status	status;		/* passed to userland */
136bb8f9017SAlexander Motin 	ctl_stats_flags		flags;		/* passed to userland */
137bb8f9017SAlexander Motin 	struct timespec		timestamp;	/* passed to userland */
138bb8f9017SAlexander Motin };
139130f4520SKenneth D. Merry 
140130f4520SKenneth D. Merry /*
141130f4520SKenneth D. Merry  * The types of errors that can be injected:
142130f4520SKenneth D. Merry  *
143130f4520SKenneth D. Merry  * NONE:	No error specified.
144130f4520SKenneth D. Merry  * ABORTED:	SSD_KEY_ABORTED_COMMAND, 0x45, 0x00
145130f4520SKenneth D. Merry  * MEDIUM_ERR:	Medium error, different asc/ascq depending on read/write.
146130f4520SKenneth D. Merry  * UA:		Unit attention.
147130f4520SKenneth D. Merry  * CUSTOM:	User specifies the sense data.
148130f4520SKenneth D. Merry  * TYPE:	Mask to use with error types.
149130f4520SKenneth D. Merry  *
150130f4520SKenneth D. Merry  * Flags that affect injection behavior:
151130f4520SKenneth D. Merry  * CONTINUOUS:	This error will stay around until explicitly cleared.
152130f4520SKenneth D. Merry  * DESCRIPTOR:	Use descriptor sense instead of fixed sense.
153130f4520SKenneth D. Merry  */
154*48000952SJohn Baldwin typedef u_int ctl_lun_error;
155*48000952SJohn Baldwin 
156*48000952SJohn Baldwin #define	CTL_LUN_INJ_NONE		0x000
157*48000952SJohn Baldwin #define	CTL_LUN_INJ_ABORTED		0x001
158*48000952SJohn Baldwin #define	CTL_LUN_INJ_MEDIUM_ERR		0x002
159*48000952SJohn Baldwin #define	CTL_LUN_INJ_UA			0x003
160*48000952SJohn Baldwin #define	CTL_LUN_INJ_CUSTOM		0x004
161*48000952SJohn Baldwin #define	CTL_LUN_INJ_TYPE		0x0ff
162*48000952SJohn Baldwin #define	CTL_LUN_INJ_CONTINUOUS		0x100
163*48000952SJohn Baldwin #define	CTL_LUN_INJ_DESCRIPTOR		0x200
164130f4520SKenneth D. Merry 
165130f4520SKenneth D. Merry /*
166130f4520SKenneth D. Merry  * Flags to specify what type of command the given error pattern will
167130f4520SKenneth D. Merry  * execute on.  The first group of types can be ORed together.
168130f4520SKenneth D. Merry  *
169130f4520SKenneth D. Merry  * READ:	Any read command.
170130f4520SKenneth D. Merry  * WRITE:	Any write command.
171130f4520SKenneth D. Merry  * READWRITE:	Any read or write command.
172130f4520SKenneth D. Merry  * READCAP:	Any read capacity command.
173130f4520SKenneth D. Merry  * TUR:		Test Unit Ready.
174130f4520SKenneth D. Merry  * ANY:		Any command.
175130f4520SKenneth D. Merry  * MASK:	Mask for basic command patterns.
176130f4520SKenneth D. Merry  *
177130f4520SKenneth D. Merry  * Special types:
178130f4520SKenneth D. Merry  *
179130f4520SKenneth D. Merry  * CMD:		The CDB to act on is specified in struct ctl_error_desc_cmd.
180130f4520SKenneth D. Merry  * RANGE:	For read/write commands, act when the LBA is in the
181130f4520SKenneth D. Merry  *		specified range.
182130f4520SKenneth D. Merry  */
183*48000952SJohn Baldwin typedef u_int ctl_lun_error_pattern;
184*48000952SJohn Baldwin 
185*48000952SJohn Baldwin #define	CTL_LUN_PAT_NONE	0x000
186*48000952SJohn Baldwin #define	CTL_LUN_PAT_READ	0x001
187*48000952SJohn Baldwin #define	CTL_LUN_PAT_WRITE	0x002
188*48000952SJohn Baldwin #define	CTL_LUN_PAT_READWRITE	CTL_LUN_PAT_READ | CTL_LUN_PAT_WRITE
189*48000952SJohn Baldwin #define	CTL_LUN_PAT_READCAP	0x004
190*48000952SJohn Baldwin #define	CTL_LUN_PAT_TUR		0x008
191*48000952SJohn Baldwin #define	CTL_LUN_PAT_ANY		0x0ff
192*48000952SJohn Baldwin #define	CTL_LUN_PAT_MASK	0x0ff
193*48000952SJohn Baldwin #define	CTL_LUN_PAT_CMD		0x100
194*48000952SJohn Baldwin #define	CTL_LUN_PAT_RANGE	0x200
195130f4520SKenneth D. Merry 
196130f4520SKenneth D. Merry /*
197130f4520SKenneth D. Merry  * This structure allows the user to specify a particular CDB pattern to
198130f4520SKenneth D. Merry  * look for.
199130f4520SKenneth D. Merry  *
200130f4520SKenneth D. Merry  * cdb_pattern:		Fill in the relevant bytes to look for in the CDB.
201130f4520SKenneth D. Merry  * cdb_valid_bytes:	Bitmask specifying valid bytes in the cdb_pattern.
202130f4520SKenneth D. Merry  * flags:		Specify any command flags (see ctl_io_flags) that
203130f4520SKenneth D. Merry  *			should be set.
204130f4520SKenneth D. Merry  */
205130f4520SKenneth D. Merry struct ctl_error_desc_cmd {
206130f4520SKenneth D. Merry 	uint8_t		cdb_pattern[CTL_MAX_CDBLEN];
207130f4520SKenneth D. Merry 	uint32_t	cdb_valid_bytes;
208130f4520SKenneth D. Merry 	uint32_t	flags;
209130f4520SKenneth D. Merry };
210130f4520SKenneth D. Merry 
211130f4520SKenneth D. Merry /*
212130f4520SKenneth D. Merry  * Error injection descriptor.
213130f4520SKenneth D. Merry  *
214130f4520SKenneth D. Merry  * lun_id	   LUN to act on.
215130f4520SKenneth D. Merry  * lun_error:	   The type of error to inject.  See above for descriptions.
216130f4520SKenneth D. Merry  * error_pattern:  What kind of command to act on.  See above.
217130f4520SKenneth D. Merry  * cmd_desc:	   For CTL_LUN_PAT_CMD only.
218130f4520SKenneth D. Merry  * lba_range:	   For CTL_LUN_PAT_RANGE only.
219130f4520SKenneth D. Merry  * custom_sense:   Specify sense.  For CTL_LUN_INJ_CUSTOM only.
220130f4520SKenneth D. Merry  * serial:	   Serial number returned by the kernel.  Use for deletion.
221130f4520SKenneth D. Merry  * links:	   Kernel use only.
222130f4520SKenneth D. Merry  */
223130f4520SKenneth D. Merry struct ctl_error_desc {
224130f4520SKenneth D. Merry 	uint32_t			lun_id;		/* To kernel */
225130f4520SKenneth D. Merry 	ctl_lun_error			lun_error;	/* To kernel */
226130f4520SKenneth D. Merry 	ctl_lun_error_pattern		error_pattern;	/* To kernel */
227130f4520SKenneth D. Merry 	struct ctl_error_desc_cmd	cmd_desc;	/* To kernel */
228130f4520SKenneth D. Merry 	struct ctl_lba_len		lba_range;	/* To kernel */
229130f4520SKenneth D. Merry 	struct scsi_sense_data		custom_sense;	/* To kernel */
230130f4520SKenneth D. Merry 	uint64_t			serial;		/* From kernel */
231130f4520SKenneth D. Merry 	STAILQ_ENTRY(ctl_error_desc)	links;		/* Kernel use only */
232130f4520SKenneth D. Merry };
233130f4520SKenneth D. Merry 
234*48000952SJohn Baldwin typedef u_int ctl_ooa_flags;
235*48000952SJohn Baldwin 
236*48000952SJohn Baldwin #define	CTL_OOA_FLAG_NONE	0x00
237*48000952SJohn Baldwin #define	CTL_OOA_FLAG_ALL_LUNS	0x01
238130f4520SKenneth D. Merry 
239130f4520SKenneth D. Merry typedef enum {
240130f4520SKenneth D. Merry 	CTL_OOA_OK,
241130f4520SKenneth D. Merry 	CTL_OOA_NEED_MORE_SPACE,
242130f4520SKenneth D. Merry 	CTL_OOA_ERROR
243130f4520SKenneth D. Merry } ctl_get_ooa_status;
244130f4520SKenneth D. Merry 
245*48000952SJohn Baldwin typedef u_int ctl_ooa_cmd_flags;
246*48000952SJohn Baldwin 
247*48000952SJohn Baldwin #define	CTL_OOACMD_FLAG_NONE		0x00
248*48000952SJohn Baldwin #define	CTL_OOACMD_FLAG_DMA		0x01
249*48000952SJohn Baldwin #define	CTL_OOACMD_FLAG_BLOCKED		0x02
250*48000952SJohn Baldwin #define	CTL_OOACMD_FLAG_ABORT		0x04
251*48000952SJohn Baldwin #define	CTL_OOACMD_FLAG_RTR		0x08
252*48000952SJohn Baldwin #define	CTL_OOACMD_FLAG_DMA_QUEUED	0x10
253*48000952SJohn Baldwin #define	CTL_OOACMD_FLAG_STATUS_QUEUED	0x20
254*48000952SJohn Baldwin #define	CTL_OOACMD_FLAG_STATUS_SENT	0x40
255130f4520SKenneth D. Merry 
256130f4520SKenneth D. Merry struct ctl_ooa_entry {
257130f4520SKenneth D. Merry 	ctl_ooa_cmd_flags	cmd_flags;
258130f4520SKenneth D. Merry 	uint8_t			cdb[CTL_MAX_CDBLEN];
259130f4520SKenneth D. Merry 	uint8_t			cdb_len;
2600acc026dSAlexander Motin 	uint64_t		tag_num;
2610acc026dSAlexander Motin 	ctl_tag_type		tag_type;
262130f4520SKenneth D. Merry 	uint32_t		lun_num;
263130f4520SKenneth D. Merry 	struct bintime		start_bt;
264130f4520SKenneth D. Merry };
265130f4520SKenneth D. Merry 
266130f4520SKenneth D. Merry struct ctl_ooa {
267130f4520SKenneth D. Merry 	ctl_ooa_flags		flags;		/* passed to kernel */
268130f4520SKenneth D. Merry 	uint64_t		lun_num;	/* passed to kernel */
269130f4520SKenneth D. Merry 	uint32_t		alloc_len;	/* passed to kernel */
270130f4520SKenneth D. Merry 	uint32_t		alloc_num;	/* passed to kernel */
271130f4520SKenneth D. Merry 	struct ctl_ooa_entry	*entries;	/* filled in kernel */
272130f4520SKenneth D. Merry 	uint32_t		fill_len;	/* passed to userland */
273130f4520SKenneth D. Merry 	uint32_t		fill_num;	/* passed to userland */
274130f4520SKenneth D. Merry 	uint32_t		dropped_num;	/* passed to userland */
275130f4520SKenneth D. Merry 	struct bintime		cur_bt;		/* passed to userland */
276130f4520SKenneth D. Merry 	ctl_get_ooa_status	status;		/* passed to userland */
277130f4520SKenneth D. Merry };
278130f4520SKenneth D. Merry 
279130f4520SKenneth D. Merry typedef enum {
280130f4520SKenneth D. Merry 	CTL_LUN_NOSTATUS,
281130f4520SKenneth D. Merry 	CTL_LUN_OK,
28219720f41SAlexander Motin 	CTL_LUN_ERROR,
28319720f41SAlexander Motin 	CTL_LUN_WARNING
284130f4520SKenneth D. Merry } ctl_lun_status;
285130f4520SKenneth D. Merry 
286130f4520SKenneth D. Merry #define	CTL_ERROR_STR_LEN	160
287130f4520SKenneth D. Merry 
288130f4520SKenneth D. Merry typedef enum {
289130f4520SKenneth D. Merry 	CTL_LUNREQ_CREATE,
29081177295SEdward Tomasz Napierala 	CTL_LUNREQ_RM,
29181177295SEdward Tomasz Napierala 	CTL_LUNREQ_MODIFY,
292130f4520SKenneth D. Merry } ctl_lunreq_type;
293130f4520SKenneth D. Merry 
294bb8f9017SAlexander Motin /*
295bb8f9017SAlexander Motin  * The ID_REQ flag is used to say that the caller has requested a
296bb8f9017SAlexander Motin  * particular LUN ID in the req_lun_id field.  If we cannot allocate that
297bb8f9017SAlexander Motin  * LUN ID, the ctl_add_lun() call will fail.
298bb8f9017SAlexander Motin  *
299bb8f9017SAlexander Motin  * The STOPPED flag tells us that the LUN should default to the powered
300bb8f9017SAlexander Motin  * off state.  It will return 0x04,0x02 until it is powered up.  ("Logical
301bb8f9017SAlexander Motin  * unit not ready, initializing command required.")
302bb8f9017SAlexander Motin  *
303bb8f9017SAlexander Motin  * The NO_MEDIA flag tells us that the LUN has no media inserted.
304bb8f9017SAlexander Motin  *
305bb8f9017SAlexander Motin  * The PRIMARY flag tells us that this LUN is registered as a Primary LUN
306bb8f9017SAlexander Motin  * which is accessible via the Master shelf controller in an HA. This flag
307bb8f9017SAlexander Motin  * being set indicates a Primary LUN. This flag being reset represents a
308bb8f9017SAlexander Motin  * Secondary LUN controlled by the Secondary controller in an HA
309bb8f9017SAlexander Motin  * configuration. Flag is applicable at this time to T_DIRECT types.
310bb8f9017SAlexander Motin  *
311bb8f9017SAlexander Motin  * The SERIAL_NUM flag tells us that the serial_num field is filled in and
312bb8f9017SAlexander Motin  * valid for use in SCSI INQUIRY VPD page 0x80.
313bb8f9017SAlexander Motin  *
314bb8f9017SAlexander Motin  * The DEVID flag tells us that the device_id field is filled in and
315bb8f9017SAlexander Motin  * valid for use in SCSI INQUIRY VPD page 0x83.
316bb8f9017SAlexander Motin  *
317bb8f9017SAlexander Motin  * The DEV_TYPE flag tells us that the device_type field is filled in.
318bb8f9017SAlexander Motin  *
319bb8f9017SAlexander Motin  * The EJECTED flag tells us that the removable LUN has tray open.
320bb8f9017SAlexander Motin  *
321bb8f9017SAlexander Motin  * The UNMAP flag tells us that this LUN supports UNMAP.
322bb8f9017SAlexander Motin  *
323bb8f9017SAlexander Motin  * The OFFLINE flag tells us that this LUN can not access backing store.
324bb8f9017SAlexander Motin  */
325*48000952SJohn Baldwin typedef u_int ctl_backend_lun_flags;
326*48000952SJohn Baldwin 
327*48000952SJohn Baldwin #define	CTL_LUN_FLAG_ID_REQ		0x01
328*48000952SJohn Baldwin #define	CTL_LUN_FLAG_STOPPED		0x02
329*48000952SJohn Baldwin #define	CTL_LUN_FLAG_NO_MEDIA		0x04
330*48000952SJohn Baldwin #define	CTL_LUN_FLAG_PRIMARY		0x08
331*48000952SJohn Baldwin #define	CTL_LUN_FLAG_SERIAL_NUM		0x10
332*48000952SJohn Baldwin #define	CTL_LUN_FLAG_DEVID		0x20
333*48000952SJohn Baldwin #define	CTL_LUN_FLAG_DEV_TYPE		0x40
334*48000952SJohn Baldwin #define	CTL_LUN_FLAG_UNMAP		0x80
335*48000952SJohn Baldwin #define	CTL_LUN_FLAG_EJECTED		0x100
336*48000952SJohn Baldwin #define	CTL_LUN_FLAG_READONLY		0x200
337130f4520SKenneth D. Merry 
338130f4520SKenneth D. Merry /*
339130f4520SKenneth D. Merry  * LUN creation parameters:
340130f4520SKenneth D. Merry  *
341bb8f9017SAlexander Motin  * flags:		Various LUN flags, see above.
342130f4520SKenneth D. Merry  *
343130f4520SKenneth D. Merry  * device_type:		The SCSI device type.  e.g. 0 for Direct Access,
344130f4520SKenneth D. Merry  *			3 for Processor, etc.  Only certain backends may
345130f4520SKenneth D. Merry  *			support setting this field.  The CTL_LUN_FLAG_DEV_TYPE
346130f4520SKenneth D. Merry  *			flag should be set in the flags field if the device
347130f4520SKenneth D. Merry  *			type is set.
348130f4520SKenneth D. Merry  *
349130f4520SKenneth D. Merry  * lun_size_bytes:	The size of the LUN in bytes.  For some backends
350130f4520SKenneth D. Merry  *			this is relevant (e.g. ramdisk), for others, it may
351130f4520SKenneth D. Merry  *			be ignored in favor of using the properties of the
352130f4520SKenneth D. Merry  *			backing store.  If specified, this should be a
353130f4520SKenneth D. Merry  *			multiple of the blocksize.
354130f4520SKenneth D. Merry  *
355130f4520SKenneth D. Merry  *			The actual size of the LUN is returned in this
356130f4520SKenneth D. Merry  *			field.
357130f4520SKenneth D. Merry  *
358130f4520SKenneth D. Merry  * blocksize_bytes:	The LUN blocksize in bytes.  For some backends this
359130f4520SKenneth D. Merry  *			is relevant, for others it may be ignored in
360130f4520SKenneth D. Merry  *			favor of using the properties of the backing store.
361130f4520SKenneth D. Merry  *
362130f4520SKenneth D. Merry  *			The actual blocksize of the LUN is returned in this
363130f4520SKenneth D. Merry  *			field.
364130f4520SKenneth D. Merry  *
365130f4520SKenneth D. Merry  * req_lun_id:		The requested LUN ID.  The CTL_LUN_FLAG_ID_REQ flag
366130f4520SKenneth D. Merry  *			should be set if this is set.  The request will be
367130f4520SKenneth D. Merry  *			granted if the LUN number is available, otherwise
368130f4520SKenneth D. Merry  * 			the LUN addition request will fail.
369130f4520SKenneth D. Merry  *
370130f4520SKenneth D. Merry  *			The allocated LUN number is returned in this field.
371130f4520SKenneth D. Merry  *
372130f4520SKenneth D. Merry  * serial_num:		This is the value returned in SCSI INQUIRY VPD page
373130f4520SKenneth D. Merry  *			0x80.  If it is specified, the CTL_LUN_FLAG_SERIAL_NUM
374130f4520SKenneth D. Merry  *			flag should be set.
375130f4520SKenneth D. Merry  *
376130f4520SKenneth D. Merry  *			The serial number value used is returned in this
377130f4520SKenneth D. Merry  *			field.
378130f4520SKenneth D. Merry  *
379130f4520SKenneth D. Merry  * device_id:		This is the value returned in the T10 vendor ID
380130f4520SKenneth D. Merry  *			based DESIGNATOR field in the SCSI INQUIRY VPD page
381130f4520SKenneth D. Merry  *			0x83 data.  If it is specified, the CTL_LUN_FLAG_DEVID
382130f4520SKenneth D. Merry  *			flag should be set.
383130f4520SKenneth D. Merry  *
384130f4520SKenneth D. Merry  *			The device id value used is returned in this field.
385130f4520SKenneth D. Merry  */
386130f4520SKenneth D. Merry struct ctl_lun_create_params {
387130f4520SKenneth D. Merry 	ctl_backend_lun_flags	flags;
388130f4520SKenneth D. Merry 	uint8_t			device_type;
389130f4520SKenneth D. Merry 	uint64_t		lun_size_bytes;
390130f4520SKenneth D. Merry 	uint32_t		blocksize_bytes;
391130f4520SKenneth D. Merry 	uint32_t		req_lun_id;
392130f4520SKenneth D. Merry 	uint8_t			serial_num[CTL_SN_LEN];
393130f4520SKenneth D. Merry 	uint8_t			device_id[CTL_DEVID_LEN];
394130f4520SKenneth D. Merry };
395130f4520SKenneth D. Merry 
396130f4520SKenneth D. Merry /*
397130f4520SKenneth D. Merry  * LUN removal parameters:
398130f4520SKenneth D. Merry  *
399130f4520SKenneth D. Merry  * lun_id:		The number of the LUN to delete.  This must be set.
400130f4520SKenneth D. Merry  *			The LUN must be backed by the given backend.
401130f4520SKenneth D. Merry  */
402130f4520SKenneth D. Merry struct ctl_lun_rm_params {
403130f4520SKenneth D. Merry 	uint32_t		lun_id;
404130f4520SKenneth D. Merry };
405130f4520SKenneth D. Merry 
406130f4520SKenneth D. Merry /*
40781177295SEdward Tomasz Napierala  * LUN modification parameters:
40881177295SEdward Tomasz Napierala  *
40981177295SEdward Tomasz Napierala  * lun_id:		The number of the LUN to modify.  This must be set.
41081177295SEdward Tomasz Napierala  *			The LUN must be backed by the given backend.
41181177295SEdward Tomasz Napierala  *
41281177295SEdward Tomasz Napierala  * lun_size_bytes:	The size of the LUN in bytes.  If zero, update
41381177295SEdward Tomasz Napierala  * 			the size using the backing file size, if possible.
41481177295SEdward Tomasz Napierala  */
41581177295SEdward Tomasz Napierala struct ctl_lun_modify_params {
41681177295SEdward Tomasz Napierala 	uint32_t		lun_id;
41781177295SEdward Tomasz Napierala 	uint64_t		lun_size_bytes;
41881177295SEdward Tomasz Napierala };
41981177295SEdward Tomasz Napierala 
42081177295SEdward Tomasz Napierala /*
421130f4520SKenneth D. Merry  * Union of request type data.  Fill in the appropriate union member for
422130f4520SKenneth D. Merry  * the request type.
423130f4520SKenneth D. Merry  */
424130f4520SKenneth D. Merry union ctl_lunreq_data {
425130f4520SKenneth D. Merry 	struct ctl_lun_create_params	create;
426130f4520SKenneth D. Merry 	struct ctl_lun_rm_params	rm;
42781177295SEdward Tomasz Napierala 	struct ctl_lun_modify_params	modify;
428130f4520SKenneth D. Merry };
429130f4520SKenneth D. Merry 
430130f4520SKenneth D. Merry /*
431130f4520SKenneth D. Merry  * LUN request interface:
432130f4520SKenneth D. Merry  *
433130f4520SKenneth D. Merry  * backend:		This is required, and is NUL-terminated a string
434130f4520SKenneth D. Merry  *			that is the name of the backend, like "ramdisk" or
435130f4520SKenneth D. Merry  *			"block".
436130f4520SKenneth D. Merry  *
437130f4520SKenneth D. Merry  * reqtype:		The type of request, CTL_LUNREQ_CREATE to create a
438130f4520SKenneth D. Merry  *			LUN, CTL_LUNREQ_RM to delete a LUN.
439130f4520SKenneth D. Merry  *
440130f4520SKenneth D. Merry  * reqdata:		Request type-specific information.  See the
441130f4520SKenneth D. Merry  *			description of individual the union members above
442130f4520SKenneth D. Merry  *			for more information.
443130f4520SKenneth D. Merry  *
444130f4520SKenneth D. Merry  * num_be_args:		This is the number of backend-specific arguments
445130f4520SKenneth D. Merry  *			in the be_args array.
446130f4520SKenneth D. Merry  *
447130f4520SKenneth D. Merry  * be_args:		This is an array of backend-specific arguments.
448130f4520SKenneth D. Merry  *			See above for a description of the fields in this
449130f4520SKenneth D. Merry  *			structure.
450130f4520SKenneth D. Merry  *
451130f4520SKenneth D. Merry  * status:		Status of the LUN request.
452130f4520SKenneth D. Merry  *
453130f4520SKenneth D. Merry  * error_str:		If the status is CTL_LUN_ERROR, this will
454130f4520SKenneth D. Merry  *			contain a string describing the error.
455130f4520SKenneth D. Merry  *
456130f4520SKenneth D. Merry  * kern_be_args:	For kernel use only.
457130f4520SKenneth D. Merry  */
458130f4520SKenneth D. Merry struct ctl_lun_req {
459bb8f9017SAlexander Motin #define	CTL_BE_NAME_LEN		32
460130f4520SKenneth D. Merry 	char			backend[CTL_BE_NAME_LEN];
461130f4520SKenneth D. Merry 	ctl_lunreq_type		reqtype;
462130f4520SKenneth D. Merry 	union ctl_lunreq_data	reqdata;
4638951f055SMarcelo Araujo 	void *			args;
4648951f055SMarcelo Araujo 	nvlist_t *		args_nvl;
4650586be48SAlexander Motin #define	CTL_MAX_ARGS_LEN	(1024 * 1024)
4668951f055SMarcelo Araujo 	size_t			args_len;
4678951f055SMarcelo Araujo 	void *			result;
4688951f055SMarcelo Araujo 	nvlist_t *		result_nvl;
4698951f055SMarcelo Araujo 	size_t			result_len;
470130f4520SKenneth D. Merry 	ctl_lun_status		status;
471130f4520SKenneth D. Merry 	char			error_str[CTL_ERROR_STR_LEN];
472130f4520SKenneth D. Merry };
473130f4520SKenneth D. Merry 
474130f4520SKenneth D. Merry /*
475130f4520SKenneth D. Merry  * LUN list status:
476130f4520SKenneth D. Merry  *
477130f4520SKenneth D. Merry  * NONE:		No status.
478130f4520SKenneth D. Merry  *
479130f4520SKenneth D. Merry  * OK:			Request completed successfully.
480130f4520SKenneth D. Merry  *
481130f4520SKenneth D. Merry  * NEED_MORE_SPACE:	The allocated length of the entries field is too
482130f4520SKenneth D. Merry  * 			small for the available data.
483130f4520SKenneth D. Merry  *
4841ffe5851SPedro F. Giffuni  * ERROR:		An error occurred, look at the error string for a
485130f4520SKenneth D. Merry  *			description of the error.
486130f4520SKenneth D. Merry  */
487130f4520SKenneth D. Merry typedef enum {
488130f4520SKenneth D. Merry 	CTL_LUN_LIST_NONE,
489130f4520SKenneth D. Merry 	CTL_LUN_LIST_OK,
490130f4520SKenneth D. Merry 	CTL_LUN_LIST_NEED_MORE_SPACE,
491130f4520SKenneth D. Merry 	CTL_LUN_LIST_ERROR
492130f4520SKenneth D. Merry } ctl_lun_list_status;
493130f4520SKenneth D. Merry 
494130f4520SKenneth D. Merry /*
495130f4520SKenneth D. Merry  * LUN list interface
496130f4520SKenneth D. Merry  *
497130f4520SKenneth D. Merry  * backend_name:	This is a NUL-terminated string.  If the string
498130f4520SKenneth D. Merry  *			length is 0, then all LUNs on all backends will
499130f4520SKenneth D. Merry  *			be enumerated.  Otherwise this is the name of the
500130f4520SKenneth D. Merry  *			backend to be enumerated, like "ramdisk" or "block".
501130f4520SKenneth D. Merry  *
502130f4520SKenneth D. Merry  * alloc_len:		The length of the data buffer allocated for entries.
503130f4520SKenneth D. Merry  *			In order to properly size the buffer, make one call
504130f4520SKenneth D. Merry  *			with alloc_len set to 0, and then use the returned
505130f4520SKenneth D. Merry  *			dropped_len as the buffer length to allocate and
506130f4520SKenneth D. Merry  *			pass in on a subsequent call.
507130f4520SKenneth D. Merry  *
508130f4520SKenneth D. Merry  * lun_xml:		XML-formatted information on the requested LUNs.
509130f4520SKenneth D. Merry  *
510130f4520SKenneth D. Merry  * fill_len:		The amount of data filled in the storage for entries.
511130f4520SKenneth D. Merry  *
512130f4520SKenneth D. Merry  * status:		The status of the request.  See above for the
513130f4520SKenneth D. Merry  *			description of the values of this field.
514130f4520SKenneth D. Merry  *
515130f4520SKenneth D. Merry  * error_str:		If the status indicates an error, this string will
516130f4520SKenneth D. Merry  *			be filled in to describe the error.
517130f4520SKenneth D. Merry  */
518130f4520SKenneth D. Merry struct ctl_lun_list {
519130f4520SKenneth D. Merry 	char			backend[CTL_BE_NAME_LEN]; /* passed to kernel*/
520130f4520SKenneth D. Merry 	uint32_t		alloc_len;	/* passed to kernel */
521130f4520SKenneth D. Merry 	char			*lun_xml;	/* filled in kernel */
522130f4520SKenneth D. Merry 	uint32_t		fill_len;	/* passed to userland */
523130f4520SKenneth D. Merry 	ctl_lun_list_status	status;		/* passed to userland */
524130f4520SKenneth D. Merry 	char			error_str[CTL_ERROR_STR_LEN];
525130f4520SKenneth D. Merry 						/* passed to userland */
526130f4520SKenneth D. Merry };
527130f4520SKenneth D. Merry 
528009ea47eSEdward Tomasz Napierala /*
529917d38fbSAlexander Motin  * Port request interface:
530917d38fbSAlexander Motin  *
531917d38fbSAlexander Motin  * driver:		This is required, and is NUL-terminated a string
532917d38fbSAlexander Motin  *			that is the name of the frontend, like "iscsi" .
533917d38fbSAlexander Motin  *
534917d38fbSAlexander Motin  * reqtype:		The type of request, CTL_REQ_CREATE to create a
535917d38fbSAlexander Motin  *			port, CTL_REQ_REMOVE to delete a port.
536917d38fbSAlexander Motin  *
537917d38fbSAlexander Motin  * num_be_args:		This is the number of frontend-specific arguments
538917d38fbSAlexander Motin  *			in the be_args array.
539917d38fbSAlexander Motin  *
540917d38fbSAlexander Motin  * be_args:		This is an array of frontend-specific arguments.
541917d38fbSAlexander Motin  *			See above for a description of the fields in this
542917d38fbSAlexander Motin  *			structure.
543917d38fbSAlexander Motin  *
544917d38fbSAlexander Motin  * status:		Status of the request.
545917d38fbSAlexander Motin  *
546917d38fbSAlexander Motin  * error_str:		If the status is CTL_LUN_ERROR, this will
547917d38fbSAlexander Motin  *			contain a string describing the error.
548917d38fbSAlexander Motin  *
549917d38fbSAlexander Motin  * kern_be_args:	For kernel use only.
550917d38fbSAlexander Motin  */
551917d38fbSAlexander Motin typedef enum {
552917d38fbSAlexander Motin 	CTL_REQ_CREATE,
553917d38fbSAlexander Motin 	CTL_REQ_REMOVE,
554917d38fbSAlexander Motin 	CTL_REQ_MODIFY,
555917d38fbSAlexander Motin } ctl_req_type;
556917d38fbSAlexander Motin 
557917d38fbSAlexander Motin struct ctl_req {
558917d38fbSAlexander Motin 	char			driver[CTL_DRIVER_NAME_LEN];
559917d38fbSAlexander Motin 	ctl_req_type		reqtype;
5608951f055SMarcelo Araujo 	void *			args;
5618951f055SMarcelo Araujo 	nvlist_t *		args_nvl;
5628951f055SMarcelo Araujo 	size_t			args_len;
5638951f055SMarcelo Araujo 	void *			result;
5648951f055SMarcelo Araujo 	nvlist_t *		result_nvl;
5658951f055SMarcelo Araujo 	size_t			result_len;
566917d38fbSAlexander Motin 	ctl_lun_status		status;
567917d38fbSAlexander Motin 	char			error_str[CTL_ERROR_STR_LEN];
568917d38fbSAlexander Motin };
569917d38fbSAlexander Motin 
570917d38fbSAlexander Motin /*
571009ea47eSEdward Tomasz Napierala  * iSCSI status
572009ea47eSEdward Tomasz Napierala  *
573009ea47eSEdward Tomasz Napierala  * OK:			Request completed successfully.
574009ea47eSEdward Tomasz Napierala  *
5751ffe5851SPedro F. Giffuni  * ERROR:		An error occurred, look at the error string for a
576009ea47eSEdward Tomasz Napierala  *			description of the error.
577009ea47eSEdward Tomasz Napierala  *
578009ea47eSEdward Tomasz Napierala  * CTL_ISCSI_LIST_NEED_MORE_SPACE:
579009ea47eSEdward Tomasz Napierala  * 			User has to pass larger buffer for CTL_ISCSI_LIST ioctl.
580009ea47eSEdward Tomasz Napierala  */
581009ea47eSEdward Tomasz Napierala typedef enum {
582009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_OK,
583009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_ERROR,
584009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_LIST_NEED_MORE_SPACE,
585009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_SESSION_NOT_FOUND
586009ea47eSEdward Tomasz Napierala } ctl_iscsi_status;
587009ea47eSEdward Tomasz Napierala 
588009ea47eSEdward Tomasz Napierala typedef enum {
589009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_HANDOFF,
590009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_LIST,
591009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_LOGOUT,
592009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_TERMINATE,
59307b49a3eSEdward Tomasz Napierala 	CTL_ISCSI_LIMITS,
5942ebde326SEdward Tomasz Napierala #if defined(ICL_KERNEL_PROXY) || 1
5952ebde326SEdward Tomasz Napierala 	/*
5962ebde326SEdward Tomasz Napierala 	 * We actually need those in all cases, but leave the ICL_KERNEL_PROXY,
5972ebde326SEdward Tomasz Napierala 	 * to remember to remove them along with rest of proxy code, eventually.
5982ebde326SEdward Tomasz Napierala 	 */
599009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_LISTEN,
600009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_ACCEPT,
601009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_SEND,
602009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_RECEIVE,
603009ea47eSEdward Tomasz Napierala #endif
604009ea47eSEdward Tomasz Napierala } ctl_iscsi_type;
605009ea47eSEdward Tomasz Napierala 
606009ea47eSEdward Tomasz Napierala typedef enum {
607009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_DIGEST_NONE,
608009ea47eSEdward Tomasz Napierala 	CTL_ISCSI_DIGEST_CRC32C
609009ea47eSEdward Tomasz Napierala } ctl_iscsi_digest;
610009ea47eSEdward Tomasz Napierala 
611009ea47eSEdward Tomasz Napierala #define	CTL_ISCSI_NAME_LEN	224	/* 223 bytes, by RFC 3720, + '\0' */
612009ea47eSEdward Tomasz Napierala #define	CTL_ISCSI_ADDR_LEN	47	/* INET6_ADDRSTRLEN + '\0' */
613009ea47eSEdward Tomasz Napierala #define	CTL_ISCSI_ALIAS_LEN	128	/* Arbitrary. */
61407b49a3eSEdward Tomasz Napierala #define	CTL_ISCSI_OFFLOAD_LEN	8	/* Arbitrary. */
615009ea47eSEdward Tomasz Napierala 
616009ea47eSEdward Tomasz Napierala struct ctl_iscsi_handoff_params {
617009ea47eSEdward Tomasz Napierala 	char			initiator_name[CTL_ISCSI_NAME_LEN];
618009ea47eSEdward Tomasz Napierala 	char			initiator_addr[CTL_ISCSI_ADDR_LEN];
619009ea47eSEdward Tomasz Napierala 	char			initiator_alias[CTL_ISCSI_ALIAS_LEN];
6206d81c129SAlexander Motin 	uint8_t			initiator_isid[6];
621009ea47eSEdward Tomasz Napierala 	char			target_name[CTL_ISCSI_NAME_LEN];
622009ea47eSEdward Tomasz Napierala 	int			socket;
623009ea47eSEdward Tomasz Napierala 	int			portal_group_tag;
624009ea47eSEdward Tomasz Napierala 
625009ea47eSEdward Tomasz Napierala 	/*
626009ea47eSEdward Tomasz Napierala 	 * Connection parameters negotiated by ctld(8).
627009ea47eSEdward Tomasz Napierala 	 */
628009ea47eSEdward Tomasz Napierala 	ctl_iscsi_digest	header_digest;
629009ea47eSEdward Tomasz Napierala 	ctl_iscsi_digest	data_digest;
630009ea47eSEdward Tomasz Napierala 	uint32_t		cmdsn;
631009ea47eSEdward Tomasz Napierala 	uint32_t		statsn;
63297b84d34SNavdeep Parhar 	int			max_recv_data_segment_length;
63397b84d34SNavdeep Parhar 	int			max_burst_length;
63497b84d34SNavdeep Parhar 	int			first_burst_length;
635009ea47eSEdward Tomasz Napierala 	uint32_t		immediate_data;
63607b49a3eSEdward Tomasz Napierala 	char			offload[CTL_ISCSI_OFFLOAD_LEN];
637ba3a2d31SEdward Tomasz Napierala #ifdef ICL_KERNEL_PROXY
638ba3a2d31SEdward Tomasz Napierala 	int			connection_id;
639ba3a2d31SEdward Tomasz Napierala #else
64097b84d34SNavdeep Parhar 	int			spare;
641ba3a2d31SEdward Tomasz Napierala #endif
64297b84d34SNavdeep Parhar 	int			max_send_data_segment_length;
643009ea47eSEdward Tomasz Napierala };
644009ea47eSEdward Tomasz Napierala 
645009ea47eSEdward Tomasz Napierala struct ctl_iscsi_list_params {
646009ea47eSEdward Tomasz Napierala 	uint32_t		alloc_len;	/* passed to kernel */
647009ea47eSEdward Tomasz Napierala 	char                   *conn_xml;	/* filled in kernel */
648009ea47eSEdward Tomasz Napierala 	uint32_t		fill_len;	/* passed to userland */
649ac873bb3SEdward Tomasz Napierala 	int			spare[4];
650009ea47eSEdward Tomasz Napierala };
651009ea47eSEdward Tomasz Napierala 
652009ea47eSEdward Tomasz Napierala struct ctl_iscsi_logout_params {
653009ea47eSEdward Tomasz Napierala 	int			connection_id;	/* passed to kernel */
654009ea47eSEdward Tomasz Napierala 	char			initiator_name[CTL_ISCSI_NAME_LEN];
655009ea47eSEdward Tomasz Napierala 						/* passed to kernel */
656009ea47eSEdward Tomasz Napierala 	char			initiator_addr[CTL_ISCSI_ADDR_LEN];
657009ea47eSEdward Tomasz Napierala 						/* passed to kernel */
658009ea47eSEdward Tomasz Napierala 	int			all;		/* passed to kernel */
659ac873bb3SEdward Tomasz Napierala 	int			spare[4];
660009ea47eSEdward Tomasz Napierala };
661009ea47eSEdward Tomasz Napierala 
662009ea47eSEdward Tomasz Napierala struct ctl_iscsi_terminate_params {
663009ea47eSEdward Tomasz Napierala 	int			connection_id;	/* passed to kernel */
664009ea47eSEdward Tomasz Napierala 	char			initiator_name[CTL_ISCSI_NAME_LEN];
665009ea47eSEdward Tomasz Napierala 						/* passed to kernel */
666009ea47eSEdward Tomasz Napierala 	char			initiator_addr[CTL_ISCSI_NAME_LEN];
667009ea47eSEdward Tomasz Napierala 						/* passed to kernel */
668009ea47eSEdward Tomasz Napierala 	int			all;		/* passed to kernel */
669ac873bb3SEdward Tomasz Napierala 	int			spare[4];
670009ea47eSEdward Tomasz Napierala };
671009ea47eSEdward Tomasz Napierala 
67207b49a3eSEdward Tomasz Napierala struct ctl_iscsi_limits_params {
67307b49a3eSEdward Tomasz Napierala 	/* passed to kernel */
67497b84d34SNavdeep Parhar 	char			offload[CTL_ISCSI_OFFLOAD_LEN];
6757b02c1e8SJohn Baldwin 	int			socket;
67697b84d34SNavdeep Parhar 
67707b49a3eSEdward Tomasz Napierala 	/* passed to userland */
6787b02c1e8SJohn Baldwin #ifdef __LP64__
6797b02c1e8SJohn Baldwin 	int			spare;
6807b02c1e8SJohn Baldwin #endif
68197b84d34SNavdeep Parhar 	int			max_recv_data_segment_length;
68297b84d34SNavdeep Parhar 	int			max_send_data_segment_length;
68397b84d34SNavdeep Parhar 	int			max_burst_length;
68497b84d34SNavdeep Parhar 	int			first_burst_length;
68507b49a3eSEdward Tomasz Napierala };
68607b49a3eSEdward Tomasz Napierala 
687009ea47eSEdward Tomasz Napierala #ifdef ICL_KERNEL_PROXY
688009ea47eSEdward Tomasz Napierala struct ctl_iscsi_listen_params {
689009ea47eSEdward Tomasz Napierala 	int			iser;
690009ea47eSEdward Tomasz Napierala 	int			domain;
691009ea47eSEdward Tomasz Napierala 	int			socktype;
692009ea47eSEdward Tomasz Napierala 	int			protocol;
693009ea47eSEdward Tomasz Napierala 	struct sockaddr		*addr;
694009ea47eSEdward Tomasz Napierala 	socklen_t		addrlen;
6958cab2ed4SEdward Tomasz Napierala 	int			portal_id;
696ac873bb3SEdward Tomasz Napierala 	int			spare[4];
697009ea47eSEdward Tomasz Napierala };
698009ea47eSEdward Tomasz Napierala 
699009ea47eSEdward Tomasz Napierala struct ctl_iscsi_accept_params {
700009ea47eSEdward Tomasz Napierala 	int			connection_id;
7018cab2ed4SEdward Tomasz Napierala 	int			portal_id;
7028eab95d6SEdward Tomasz Napierala 	struct sockaddr		*initiator_addr;
7038eab95d6SEdward Tomasz Napierala 	socklen_t		initiator_addrlen;
704ac873bb3SEdward Tomasz Napierala 	int			spare[4];
705009ea47eSEdward Tomasz Napierala };
706009ea47eSEdward Tomasz Napierala 
707009ea47eSEdward Tomasz Napierala struct ctl_iscsi_send_params {
708009ea47eSEdward Tomasz Napierala 	int			connection_id;
709009ea47eSEdward Tomasz Napierala 	void			*bhs;
710009ea47eSEdward Tomasz Napierala 	size_t			spare;
711009ea47eSEdward Tomasz Napierala 	void			*spare2;
712009ea47eSEdward Tomasz Napierala 	size_t			data_segment_len;
713009ea47eSEdward Tomasz Napierala 	void			*data_segment;
714ba3a2d31SEdward Tomasz Napierala 	int			spare3[4];
715009ea47eSEdward Tomasz Napierala };
716009ea47eSEdward Tomasz Napierala 
717009ea47eSEdward Tomasz Napierala struct ctl_iscsi_receive_params {
718009ea47eSEdward Tomasz Napierala 	int			connection_id;
719009ea47eSEdward Tomasz Napierala 	void			*bhs;
720009ea47eSEdward Tomasz Napierala 	size_t			spare;
721009ea47eSEdward Tomasz Napierala 	void			*spare2;
722009ea47eSEdward Tomasz Napierala 	size_t			data_segment_len;
723009ea47eSEdward Tomasz Napierala 	void			*data_segment;
724ba3a2d31SEdward Tomasz Napierala 	int			spare3[4];
725009ea47eSEdward Tomasz Napierala };
726009ea47eSEdward Tomasz Napierala 
727009ea47eSEdward Tomasz Napierala #endif /* ICL_KERNEL_PROXY */
728009ea47eSEdward Tomasz Napierala 
729009ea47eSEdward Tomasz Napierala union ctl_iscsi_data {
730009ea47eSEdward Tomasz Napierala 	struct ctl_iscsi_handoff_params		handoff;
731009ea47eSEdward Tomasz Napierala 	struct ctl_iscsi_list_params		list;
732009ea47eSEdward Tomasz Napierala 	struct ctl_iscsi_logout_params		logout;
733009ea47eSEdward Tomasz Napierala 	struct ctl_iscsi_terminate_params	terminate;
73407b49a3eSEdward Tomasz Napierala 	struct ctl_iscsi_limits_params		limits;
735009ea47eSEdward Tomasz Napierala #ifdef ICL_KERNEL_PROXY
736009ea47eSEdward Tomasz Napierala 	struct ctl_iscsi_listen_params		listen;
737009ea47eSEdward Tomasz Napierala 	struct ctl_iscsi_accept_params		accept;
738009ea47eSEdward Tomasz Napierala 	struct ctl_iscsi_send_params		send;
739009ea47eSEdward Tomasz Napierala 	struct ctl_iscsi_receive_params		receive;
740009ea47eSEdward Tomasz Napierala #endif
741009ea47eSEdward Tomasz Napierala };
742009ea47eSEdward Tomasz Napierala 
743009ea47eSEdward Tomasz Napierala /*
744009ea47eSEdward Tomasz Napierala  * iSCSI interface
745009ea47eSEdward Tomasz Napierala  *
746009ea47eSEdward Tomasz Napierala  * status:		The status of the request.  See above for the
747009ea47eSEdward Tomasz Napierala  *			description of the values of this field.
748009ea47eSEdward Tomasz Napierala  *
749009ea47eSEdward Tomasz Napierala  * error_str:		If the status indicates an error, this string will
750009ea47eSEdward Tomasz Napierala  *			be filled in to describe the error.
751009ea47eSEdward Tomasz Napierala  */
752009ea47eSEdward Tomasz Napierala struct ctl_iscsi {
753009ea47eSEdward Tomasz Napierala 	ctl_iscsi_type		type;		/* passed to kernel */
754009ea47eSEdward Tomasz Napierala 	union ctl_iscsi_data	data;		/* passed to kernel */
755009ea47eSEdward Tomasz Napierala 	ctl_iscsi_status	status;		/* passed to userland */
756009ea47eSEdward Tomasz Napierala 	char			error_str[CTL_ERROR_STR_LEN];
757009ea47eSEdward Tomasz Napierala 						/* passed to userland */
758009ea47eSEdward Tomasz Napierala };
759009ea47eSEdward Tomasz Napierala 
760920c6cbaSAlexander Motin struct ctl_lun_map {
761920c6cbaSAlexander Motin 	uint32_t		port;
762920c6cbaSAlexander Motin 	uint32_t		plun;
763920c6cbaSAlexander Motin 	uint32_t		lun;
764920c6cbaSAlexander Motin };
765920c6cbaSAlexander Motin 
76625bad5a2SJohn Baldwin /*
76725bad5a2SJohn Baldwin  * NVMe over Fabrics status
76825bad5a2SJohn Baldwin  *
76925bad5a2SJohn Baldwin  * OK:			Request completed successfully.
77025bad5a2SJohn Baldwin  *
77125bad5a2SJohn Baldwin  * ERROR:		An error occurred, look at the error string for a
77225bad5a2SJohn Baldwin  *			description of the error.
77325bad5a2SJohn Baldwin  */
77425bad5a2SJohn Baldwin typedef enum {
77525bad5a2SJohn Baldwin 	CTL_NVMF_OK,
77625bad5a2SJohn Baldwin 	CTL_NVMF_ERROR,
77725bad5a2SJohn Baldwin 	CTL_NVMF_LIST_NEED_MORE_SPACE,
77825bad5a2SJohn Baldwin 	CTL_NVMF_ASSOCIATION_NOT_FOUND
77925bad5a2SJohn Baldwin } ctl_nvmf_status;
78025bad5a2SJohn Baldwin 
78125bad5a2SJohn Baldwin typedef enum {
78225bad5a2SJohn Baldwin 	CTL_NVMF_HANDOFF,
78325bad5a2SJohn Baldwin 	CTL_NVMF_LIST,
78425bad5a2SJohn Baldwin 	CTL_NVMF_TERMINATE
78525bad5a2SJohn Baldwin } ctl_nvmf_type;
78625bad5a2SJohn Baldwin 
78725bad5a2SJohn Baldwin struct ctl_nvmf_list_params {
78825bad5a2SJohn Baldwin 	uint32_t		alloc_len;	/* passed to kernel */
78925bad5a2SJohn Baldwin 	char                   *conn_xml;	/* filled in kernel */
79025bad5a2SJohn Baldwin 	uint32_t		fill_len;	/* passed to userland */
79125bad5a2SJohn Baldwin 	int			spare[4];
79225bad5a2SJohn Baldwin };
79325bad5a2SJohn Baldwin 
79425bad5a2SJohn Baldwin struct ctl_nvmf_terminate_params {
79525bad5a2SJohn Baldwin 	int			cntlid;		/* passed to kernel */
79625bad5a2SJohn Baldwin 	char			hostnqn[NVME_NQN_FIELD_SIZE];
79725bad5a2SJohn Baldwin 						/* passed to kernel */
79825bad5a2SJohn Baldwin 	int			all;		/* passed to kernel */
79925bad5a2SJohn Baldwin 	int			spare[4];
80025bad5a2SJohn Baldwin };
80125bad5a2SJohn Baldwin 
80225bad5a2SJohn Baldwin union ctl_nvmf_data {
803365b89e8SJohn Baldwin 	struct nvmf_ioc_nv			handoff;
80425bad5a2SJohn Baldwin 	struct ctl_nvmf_list_params		list;
80525bad5a2SJohn Baldwin 	struct ctl_nvmf_terminate_params	terminate;
80625bad5a2SJohn Baldwin };
80725bad5a2SJohn Baldwin 
80825bad5a2SJohn Baldwin /*
80925bad5a2SJohn Baldwin  * NVMe over Fabrics interface
81025bad5a2SJohn Baldwin  *
81125bad5a2SJohn Baldwin  * status:		The status of the request.  See above for the
81225bad5a2SJohn Baldwin  *			description of the values of this field.
81325bad5a2SJohn Baldwin  *
81425bad5a2SJohn Baldwin  * error_str:		If the status indicates an error, this string will
81525bad5a2SJohn Baldwin  *			be filled in to describe the error.
81625bad5a2SJohn Baldwin  */
81725bad5a2SJohn Baldwin struct ctl_nvmf {
81825bad5a2SJohn Baldwin 	ctl_nvmf_type		type;		/* passed to kernel */
81925bad5a2SJohn Baldwin 	union ctl_nvmf_data	data;		/* passed to kernel */
82025bad5a2SJohn Baldwin 	ctl_nvmf_status		status;		/* passed to userland */
82125bad5a2SJohn Baldwin 	char			error_str[CTL_ERROR_STR_LEN];
82225bad5a2SJohn Baldwin 						/* passed to userland */
82325bad5a2SJohn Baldwin };
82425bad5a2SJohn Baldwin 
825130f4520SKenneth D. Merry #define	CTL_IO			_IOWR(CTL_MINOR, 0x00, union ctl_io)
826130f4520SKenneth D. Merry #define	CTL_ENABLE_PORT		_IOW(CTL_MINOR, 0x04, struct ctl_port_entry)
827130f4520SKenneth D. Merry #define	CTL_DISABLE_PORT	_IOW(CTL_MINOR, 0x05, struct ctl_port_entry)
828130f4520SKenneth D. Merry #define	CTL_DELAY_IO		_IOWR(CTL_MINOR, 0x10, struct ctl_io_delay_info)
829130f4520SKenneth D. Merry #define	CTL_ERROR_INJECT	_IOWR(CTL_MINOR, 0x16, struct ctl_error_desc)
830130f4520SKenneth D. Merry #define	CTL_GET_OOA		_IOWR(CTL_MINOR, 0x18, struct ctl_ooa)
831130f4520SKenneth D. Merry #define	CTL_DUMP_STRUCTS	_IO(CTL_MINOR, 0x19)
832130f4520SKenneth D. Merry #define	CTL_LUN_REQ		_IOWR(CTL_MINOR, 0x21, struct ctl_lun_req)
833130f4520SKenneth D. Merry #define	CTL_LUN_LIST		_IOWR(CTL_MINOR, 0x22, struct ctl_lun_list)
834130f4520SKenneth D. Merry #define	CTL_ERROR_INJECT_DELETE	_IOW(CTL_MINOR, 0x23, struct ctl_error_desc)
835130f4520SKenneth D. Merry #define	CTL_SET_PORT_WWNS	_IOW(CTL_MINOR, 0x24, struct ctl_port_entry)
836009ea47eSEdward Tomasz Napierala #define	CTL_ISCSI		_IOWR(CTL_MINOR, 0x25, struct ctl_iscsi)
837917d38fbSAlexander Motin #define	CTL_PORT_REQ		_IOWR(CTL_MINOR, 0x26, struct ctl_req)
838917d38fbSAlexander Motin #define	CTL_PORT_LIST		_IOWR(CTL_MINOR, 0x27, struct ctl_lun_list)
839920c6cbaSAlexander Motin #define	CTL_LUN_MAP		_IOW(CTL_MINOR, 0x28, struct ctl_lun_map)
840bb8f9017SAlexander Motin #define	CTL_GET_LUN_STATS	_IOWR(CTL_MINOR, 0x29, struct ctl_get_io_stats)
841bb8f9017SAlexander Motin #define	CTL_GET_PORT_STATS	_IOWR(CTL_MINOR, 0x2a, struct ctl_get_io_stats)
84225bad5a2SJohn Baldwin #define	CTL_NVMF		_IOWR(CTL_MINOR, 0x2b, struct ctl_nvmf)
843130f4520SKenneth D. Merry 
844130f4520SKenneth D. Merry #endif /* _CTL_IOCTL_H_ */
845130f4520SKenneth D. Merry 
846130f4520SKenneth D. Merry /*
847130f4520SKenneth D. Merry  * vim: ts=8
848130f4520SKenneth D. Merry  */
849