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