Annotation of embedaddon/istgt/src/istgt_lu.h, revision 1.1.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>