The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/cam/ctl/ctl_ioctl.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: d8ce6dac42c268498c950d4acabeddd7


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.