Annotation of embedaddon/istgt/src/istgt_lu.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2008-2011 Daisuke Aoyama <aoyama@peach.ne.jp>.
! 3: * All rights reserved.
! 4: *
! 5: * Redistribution and use in source and binary forms, with or without
! 6: * modification, are permitted provided that the following conditions
! 7: * are met:
! 8: * 1. Redistributions of source code must retain the above copyright
! 9: * notice, this list of conditions and the following disclaimer.
! 10: * 2. Redistributions in binary form must reproduce the above copyright
! 11: * notice, this list of conditions and the following disclaimer in the
! 12: * documentation and/or other materials provided with the distribution.
! 13: *
! 14: * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
! 15: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 16: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 17: * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
! 18: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 19: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 20: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 21: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 22: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 23: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 24: * SUCH DAMAGE.
! 25: *
! 26: */
! 27:
! 28: #ifndef ISTGT_LU_H
! 29: #define ISTGT_LU_H
! 30:
! 31: #include <pthread.h>
! 32: #include <time.h>
! 33: #include "istgt.h"
! 34:
! 35: #define MAX_LU_LUN 16
! 36: #define MAX_LU_LUN_SLOT 8
! 37: #define MAX_LU_TSIH 256
! 38: #define MAX_LU_MAP 256
! 39: #define MAX_LU_SERIAL_STRING 32
! 40: #define MAX_LU_RESERVE 256
! 41: #define MAX_LU_RESERVE_IPT 256
! 42: #define MAX_LU_QUEUE_DEPTH 256
! 43:
! 44: #define USE_LU_TAPE_DLT8000
! 45:
! 46: #define DEFAULT_LU_BLOCKLEN 512
! 47: #define DEFAULT_LU_BLOCKLEN_DISK DEFAULT_LU_BLOCKLEN
! 48: #define DEFAULT_LU_BLOCKLEN_DVD 2048
! 49: #define DEFAULT_LU_BLOCKLEN_TAPE DEFAULT_LU_BLOCKLEN
! 50: #define DEFAULT_LU_QUEUE_DEPTH 32
! 51: #define DEFAULT_LU_ROTATIONRATE 7200 /* 7200 rpm */
! 52: #define DEFAULT_LU_FORMFACTOR 0x02 /* 3.5 inch */
! 53:
! 54: #if defined (__FreeBSD__)
! 55: #define DEFAULT_LU_VENDOR "FreeBSD"
! 56: #elif defined (__NetBSD__)
! 57: #define DEFAULT_LU_VENDOR "NetBSD"
! 58: #elif defined (__OpenBSD__)
! 59: #define DEFAULT_LU_VENDOR "OpenBSD"
! 60: #else
! 61: //#define DEFAULT_LU_VENDOR "PEACHNW"
! 62: #define DEFAULT_LU_VENDOR "FreeBSD"
! 63: #endif
! 64:
! 65: #define DEFAULT_LU_VENDOR_DISK DEFAULT_LU_VENDOR
! 66: #define DEFAULT_LU_VENDOR_DVD DEFAULT_LU_VENDOR
! 67: #ifndef USE_LU_TAPE_DLT8000
! 68: #define DEFAULT_LU_VENDOR_TAPE DEFAULT_LU_VENDOR
! 69: #else
! 70: #define DEFAULT_LU_VENDOR_TAPE "QUANTUM"
! 71: #endif /* !USE_LU_TAPE_DLT8000 */
! 72: #define DEFAULT_LU_PRODUCT "iSCSI UNIT"
! 73: #define DEFAULT_LU_PRODUCT_DISK "iSCSI DISK"
! 74: #define DEFAULT_LU_PRODUCT_DVD "iSCSI DVD"
! 75: #ifndef USE_LU_TAPE_DLT8000
! 76: #define DEFAULT_LU_PRODUCT_TAPE "iSCSI TAPE"
! 77: #else
! 78: #define DEFAULT_LU_PRODUCT_TAPE "DLT8000"
! 79: #endif /* !USE_LU_TAPE_DLT8000 */
! 80: #define DEFAULT_LU_REVISION "0001"
! 81: #define DEFAULT_LU_REVISION_DISK DEFAULT_LU_REVISION
! 82: #define DEFAULT_LU_REVISION_DVD DEFAULT_LU_REVISION
! 83: #ifndef USE_LU_TAPE_DLT8000
! 84: #define DEFAULT_LU_REVISION_TAPE DEFAULT_LU_REVISION
! 85: #else
! 86: #define DEFAULT_LU_REVISION_TAPE "C001"
! 87: #endif /* !USE_LU_TAPE_DLT8000 */
! 88: #define MAX_INQUIRY_SERIAL 16
! 89:
! 90: #define ISTGT_LU_WORK_BLOCK_SIZE (1ULL * 1024ULL * 1024ULL)
! 91: #define ISTGT_LU_MAX_WRITE_CACHE_SIZE (8ULL * 1024ULL * 1024ULL)
! 92: #define ISTGT_LU_MEDIA_SIZE_MIN (1ULL * 1024ULL * 1024ULL)
! 93: #define ISTGT_LU_MEDIA_EXTEND_UNIT (256ULL * 1024ULL * 1024ULL)
! 94: #define ISTGT_LU_1GB (1ULL * 1024ULL * 1024ULL * 1024ULL)
! 95: #define ISTGT_LU_1MB (1ULL * 1024ULL * 1024ULL)
! 96:
! 97: typedef enum {
! 98: ISTGT_LU_FLAG_MEDIA_READONLY = 0x00000001,
! 99: ISTGT_LU_FLAG_MEDIA_AUTOSIZE = 0x00000002,
! 100: ISTGT_LU_FLAG_MEDIA_EXTEND = 0x00000010,
! 101: ISTGT_LU_FLAG_MEDIA_DYNAMIC = 0x00000020,
! 102: } ISTGT_LU_FLAG;
! 103:
! 104: typedef enum {
! 105: ISTGT_LU_TYPE_NONE = 0,
! 106: ISTGT_LU_TYPE_PASS = 1,
! 107: ISTGT_LU_TYPE_DISK = 2,
! 108: ISTGT_LU_TYPE_DVD = 3,
! 109: ISTGT_LU_TYPE_TAPE = 4,
! 110: } ISTGT_LU_TYPE;
! 111:
! 112: typedef enum {
! 113: ISTGT_LU_LUN_TYPE_NONE = 0,
! 114: ISTGT_LU_LUN_TYPE_DEVICE = 1,
! 115: ISTGT_LU_LUN_TYPE_STORAGE = 2,
! 116: ISTGT_LU_LUN_TYPE_REMOVABLE = 3,
! 117: ISTGT_LU_LUN_TYPE_SLOT = 4,
! 118: } ISTGT_LU_LUN_TYPE;
! 119:
! 120: typedef struct istgt_lu_device_t {
! 121: char *file;
! 122: } ISTGT_LU_DEVICE;
! 123:
! 124: typedef struct istgt_lu_storage_t {
! 125: int fd;
! 126: char *file;
! 127: uint64_t size;
! 128: } ISTGT_LU_STORAGE;
! 129:
! 130: typedef struct istgt_lu_removable_t {
! 131: int type;
! 132: int id;
! 133: int flags;
! 134: int fd;
! 135: char *file;
! 136: uint64_t size;
! 137: } ISTGT_LU_REMOVABLE;
! 138:
! 139: typedef struct istgt_lu_slot_t {
! 140: int maxslot;
! 141: int present[MAX_LU_LUN_SLOT];
! 142: int flags[MAX_LU_LUN_SLOT];
! 143: char *file[MAX_LU_LUN_SLOT];
! 144: uint64_t size[MAX_LU_LUN_SLOT];
! 145: } ISTGT_LU_SLOT;
! 146:
! 147: typedef struct istgt_lu_lun_t {
! 148: int type;
! 149: union {
! 150: ISTGT_LU_DEVICE device;
! 151: ISTGT_LU_STORAGE storage;
! 152: ISTGT_LU_REMOVABLE removable;
! 153: ISTGT_LU_SLOT slot;
! 154: } u;
! 155: int rotationrate;
! 156: int formfactor;
! 157: int readcache;
! 158: int writecache;
! 159: char *serial;
! 160: void *spec;
! 161: } ISTGT_LU_LUN;
! 162: typedef ISTGT_LU_LUN *ISTGT_LU_LUN_Ptr;
! 163:
! 164: typedef struct istgt_lu_tsih_t {
! 165: int tag;
! 166: uint16_t tsih;
! 167: char *initiator_port;
! 168: } ISTGT_LU_TSIH;
! 169:
! 170: typedef enum {
! 171: AAS_ACTIVE_OPTIMIZED = 0x00,
! 172: AAS_ACTIVE_NON_OPTIMIZED = 0x01,
! 173: AAS_STANDBY = 0x02,
! 174: AAS_UNAVAILABLE = 0x03,
! 175: AAS_TRANSITIONING = 0x0F,
! 176:
! 177: AAS_STATUS_NO = 0x0000,
! 178: AAS_STATUS_STPG = 0x0100,
! 179: AAS_STATUS_IMPLICIT = 0x0200,
! 180: } ISTGT_LU_AAS;
! 181:
! 182: typedef struct istgt_lu_map_t {
! 183: int pg_tag;
! 184: int pg_aas;
! 185: int ig_tag;
! 186: } ISTGT_LU_MAP;
! 187:
! 188: typedef struct istgt_lu_t {
! 189: int num;
! 190: char *name;
! 191: char *alias;
! 192:
! 193: char *inq_vendor;
! 194: char *inq_product;
! 195: char *inq_revision;
! 196: char *inq_serial;
! 197:
! 198: ISTGT_Ptr istgt;
! 199: ISTGT_STATE state;
! 200: pthread_mutex_t mutex;
! 201: pthread_mutex_t state_mutex;
! 202: pthread_mutex_t queue_mutex;
! 203: pthread_cond_t queue_cond;
! 204: pthread_t thread;
! 205:
! 206: uint16_t last_tsih;
! 207:
! 208: int no_auth_chap;
! 209: int auth_chap;
! 210: int auth_chap_mutual;
! 211: int auth_group;
! 212: int header_digest;
! 213: int data_digest;
! 214:
! 215: int MaxOutstandingR2T;
! 216: int DefaultTime2Wait;
! 217: int DefaultTime2Retain;
! 218: int FirstBurstLength;
! 219: int MaxBurstLength;
! 220: int MaxRecvDataSegmentLength;
! 221: int InitialR2T;
! 222: int ImmediateData;
! 223: int DataPDUInOrder;
! 224: int DataSequenceInOrder;
! 225: int ErrorRecoveryLevel;
! 226:
! 227: int type;
! 228: int online;
! 229: int readonly;
! 230: int blocklen;
! 231: int queue_depth;
! 232:
! 233: int maxlun;
! 234: ISTGT_LU_LUN lun[MAX_LU_LUN];
! 235: int maxtsih;
! 236: ISTGT_LU_TSIH tsih[MAX_LU_TSIH];
! 237: int maxmap;
! 238: ISTGT_LU_MAP map[MAX_LU_MAP];
! 239: } ISTGT_LU;
! 240: typedef ISTGT_LU *ISTGT_LU_Ptr;
! 241:
! 242: typedef struct istgt_lu_cmd_t {
! 243: struct iscsi_pdu_t *pdu;
! 244: ISTGT_LU_Ptr lu;
! 245:
! 246: int I_bit;
! 247: int F_bit;
! 248: int R_bit;
! 249: int W_bit;
! 250: int Attr_bit;
! 251: uint64_t lun;
! 252: uint32_t task_tag;
! 253: uint32_t transfer_len;
! 254: uint32_t CmdSN;
! 255: uint8_t *cdb;
! 256:
! 257: uint8_t *iobuf;
! 258: int iobufsize;
! 259: uint8_t *data;
! 260: int data_len;
! 261: int alloc_len;
! 262:
! 263: int status;
! 264: uint8_t *sense_data;
! 265: int sense_data_len;
! 266: int sense_alloc_len;
! 267: } ISTGT_LU_CMD;
! 268: typedef ISTGT_LU_CMD *ISTGT_LU_CMD_Ptr;
! 269:
! 270: enum {
! 271: ISTGT_LU_TASK_RESULT_IMMEDIATE = 0,
! 272: ISTGT_LU_TASK_RESULT_QUEUE_OK = 1,
! 273: ISTGT_LU_TASK_RESULT_QUEUE_FULL = 2,
! 274: } ISTGT_LU_TASK_RESULT;
! 275:
! 276: enum {
! 277: ISTGT_LU_TASK_RESPONSE = 0,
! 278: ISTGT_LU_TASK_REQPDU = 1,
! 279: } ISTGT_LU_TASK_TYPE;
! 280:
! 281: typedef struct istgt_lu_task_t {
! 282: int type;
! 283:
! 284: struct istgt_conn_t *conn;
! 285: char initiator_name[MAX_INITIATOR_NAME];
! 286: char initiator_port[MAX_INITIATOR_NAME];
! 287: ISTGT_LU_CMD lu_cmd;
! 288: int lun;
! 289: pthread_t thread;
! 290: int use_cond;
! 291: pthread_mutex_t trans_mutex;
! 292: pthread_cond_t trans_cond;
! 293: pthread_cond_t exec_cond;
! 294:
! 295: time_t create_time;
! 296: int condwait;
! 297:
! 298: int dup_iobuf;
! 299: uint8_t *iobuf;
! 300: uint8_t *data;
! 301: uint8_t *sense_data;
! 302:
! 303: int offset;
! 304: int req_execute;
! 305: int req_transfer_out;
! 306: int error;
! 307: int abort;
! 308: int execute;
! 309: int complete;
! 310: int lock;
! 311: } ISTGT_LU_TASK;
! 312: typedef ISTGT_LU_TASK *ISTGT_LU_TASK_Ptr;
! 313:
! 314: #endif /* ISTGT_LU_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>