Annotation of embedaddon/istgt/src/istgt_iscsi.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_ISCSI_H
29: #define ISTGT_ISCSI_H
30:
31: #include <stdint.h>
32: #include <pthread.h>
33: #include "istgt.h"
34: #include "istgt_iscsi_param.h"
35: #include "istgt_lu.h"
36: #include "istgt_queue.h"
37:
38: #define ISCSI_BHS_LEN 48
39: #define ISCSI_DIGEST_LEN 4
40: #define ISCSI_ALIGNMENT 4
41: /* support version - RFC3720(10.12.4) */
42: #define ISCSI_VERSION 0x00
43:
44: #define ISCSI_ALIGN(SIZE) \
45: (((SIZE) + (ISCSI_ALIGNMENT - 1)) & ~(ISCSI_ALIGNMENT - 1))
46:
47: #define ISCSI_TEXT_MAX_KEY_LEN 64
48: /* for authentication key (non encoded 1024bytes) RFC3720(5.1/11.1.4) */
49: #define ISCSI_TEXT_MAX_VAL_LEN 8192
50:
51: #define SESS_MTX_LOCK(CONN) \
52: do { \
53: if (pthread_mutex_lock(&(CONN)->sess->mutex) != 0) { \
54: ISTGT_ERRLOG("sess lock error\n"); \
55: pthread_exit(NULL); \
56: } \
57: } while (0)
58: #define SESS_MTX_UNLOCK(CONN) \
59: do { \
60: if (pthread_mutex_unlock(&(CONN)->sess->mutex) != 0) { \
61: ISTGT_ERRLOG("sess unlock error\n"); \
62: pthread_exit(NULL); \
63: } \
64: } while (0)
65:
66: typedef enum {
67: /* Initiator opcodes */
68: ISCSI_OP_NOPOUT = 0x00,
69: ISCSI_OP_SCSI = 0x01,
70: ISCSI_OP_TASK = 0x02,
71: ISCSI_OP_LOGIN = 0x03,
72: ISCSI_OP_TEXT = 0x04,
73: ISCSI_OP_SCSI_DATAOUT = 0x05,
74: ISCSI_OP_LOGOUT = 0x06,
75: ISCSI_OP_SNACK = 0x10,
76: ISCSI_OP_VENDOR_1C = 0x1c,
77: ISCSI_OP_VENDOR_1D = 0x1d,
78: ISCSI_OP_VENDOR_1E = 0x1e,
79:
80: /* Target opcodes */
81: ISCSI_OP_NOPIN = 0x20,
82: ISCSI_OP_SCSI_RSP = 0x21,
83: ISCSI_OP_TASK_RSP = 0x22,
84: ISCSI_OP_LOGIN_RSP = 0x23,
85: ISCSI_OP_TEXT_RSP = 0x24,
86: ISCSI_OP_SCSI_DATAIN = 0x25,
87: ISCSI_OP_LOGOUT_RSP = 0x26,
88: ISCSI_OP_R2T = 0x31,
89: ISCSI_OP_ASYNC = 0x32,
90: ISCSI_OP_VENDOR_3C = 0x3c,
91: ISCSI_OP_VENDOR_3D = 0x3d,
92: ISCSI_OP_VENDOR_3E = 0x3e,
93: ISCSI_OP_REJECT = 0x3f,
94: } ISCSI_OP;
95:
96: typedef enum {
97: ISCSI_TASK_FUNC_ABORT_TASK = 1,
98: ISCSI_TASK_FUNC_ABORT_TASK_SET = 2,
99: ISCSI_TASK_FUNC_CLEAR_ACA = 3,
100: ISCSI_TASK_FUNC_CLEAR_TASK_SET = 4,
101: ISCSI_TASK_FUNC_LOGICAL_UNIT_RESET = 5,
102: ISCSI_TASK_FUNC_TARGET_WARM_RESET = 6,
103: ISCSI_TASK_FUNC_TARGET_COLD_RESET = 7,
104: ISCSI_TASK_FUNC_TASK_REASSIGN = 8,
105: } ISCSI_TASK_FUNC;
106:
107: typedef struct iscsi_bhs_t {
108: /* 0-3 */
109: uint8_t opcode;
110: uint8_t opcode_specific1[3];
111: /* 4-7 */
112: uint8_t total_ahs_len;
113: uint8_t data_segment_len[3];
114: /* 8-11 */
115: union {
116: uint8_t lun1[4];
117: uint8_t opcode_specific2[4];
118: } u1;
119: /* 12-15 */
120: union {
121: uint8_t lun2[4];
122: uint8_t opcode_specific3[4];
123: } u2;
124: /* 16-19 */
125: uint8_t inititator_task_tag[4];
126: /* 20-47 */
127: uint8_t opcode_specific4[28];
128: } ISCSI_BHS;
129:
130: typedef struct iscsi_ahs_t {
131: /* 0-3 */
132: uint8_t ahs_len[2];
133: uint8_t ahs_type;
134: uint8_t ahs_specific1;
135: /* 4-x */
136: uint8_t ahs_specific2[];
137: } ISCSI_AHS;
138:
139: typedef struct iscsi_pdu_t {
140: ISCSI_BHS bhs;
141: ISCSI_AHS *ahs;
142: uint8_t header_digest[ISCSI_DIGEST_LEN];
143: uint8_t shortdata[ISTGT_SHORTDATASIZE];
144: uint8_t *data;
145: uint8_t data_digest[ISCSI_DIGEST_LEN];
146: int total_ahs_len;
147: int data_segment_len;
148: int copy_pdu;
149: } ISCSI_PDU;
150: typedef ISCSI_PDU *ISCSI_PDU_Ptr;
151:
152: typedef enum {
153: CONN_STATE_INVALID = 0,
154: CONN_STATE_RUNNING = 1,
155: CONN_STATE_EXITING = 2,
156: CONN_STATE_SHUTDOWN = 3,
157: } CONN_STATE;
158:
159: typedef enum {
160: ISCSI_LOGIN_PHASE_NONE = 0,
161: ISCSI_LOGIN_PHASE_START = 1,
162: ISCSI_LOGIN_PHASE_SECURITY = 2,
163: ISCSI_LOGIN_PHASE_OPERATIONAL = 3,
164: ISCSI_LOGIN_PHASE_FULLFEATURE = 4,
165: } ISCSI_LOGIN_PHASE;
166:
167: typedef enum {
168: ISTGT_CHAP_PHASE_NONE = 0,
169: ISTGT_CHAP_PHASE_WAIT_A = 1,
170: ISTGT_CHAP_PHASE_WAIT_NR = 2,
171: ISTGT_CHAP_PHASE_END = 3,
172: } ISTGT_CHAP_PHASE;
173:
174: #define ISTGT_CHAP_CHALLENGE_LEN 1024
175: typedef struct istgt_chap_auth_t {
176: ISTGT_CHAP_PHASE chap_phase;
177:
178: char *user;
179: char *secret;
180: char *muser;
181: char *msecret;
182:
183: uint8_t chap_id[1];
184: uint8_t chap_mid[1];
185: int chap_challenge_len;
186: uint8_t chap_challenge[ISTGT_CHAP_CHALLENGE_LEN];
187: int chap_mchallenge_len;
188: uint8_t chap_mchallenge[ISTGT_CHAP_CHALLENGE_LEN];
189: } ISTGT_CHAP_AUTH;
190:
191: typedef struct istgt_r2t_task_t {
192: struct istgt_conn_t *conn;
193: ISTGT_LU_Ptr lu;
194: uint64_t lun;
195: uint32_t CmdSN;
196: uint32_t task_tag;
197: uint32_t transfer_len;
198: uint32_t transfer_tag;
199:
200: int iobufsize;
201: uint8_t *iobuf;
202:
203: uint32_t R2TSN;
204: uint32_t DataSN;
205: int F_bit;
206: int offset;
207: } ISTGT_R2T_TASK;
208: typedef ISTGT_R2T_TASK *ISTGT_R2T_TASK_Ptr;
209:
210: typedef struct istgt_conn_t {
211: int id;
212:
213: ISTGT_Ptr istgt;
214: PORTAL portal;
215: int sock;
216: int wsock;
217: #ifdef ISTGT_USE_KQUEUE
218: int kq;
219: #endif /* ISTGT_USE_KQUEUE */
220: int use_sender;
221: pthread_t thread;
222: pthread_t sender_thread;
223: pthread_mutex_t sender_mutex;
224: pthread_cond_t sender_cond;
225: struct istgt_sess_t *sess;
226:
227: CONN_STATE state;
228: int exec_logout;
229:
230: int max_pending;
231: int queue_depth;
232: pthread_mutex_t wpdu_mutex;
233: pthread_cond_t wpdu_cond;
234: ISTGT_QUEUE pending_pdus;
235: ISCSI_PDU pdu;
236:
237: int max_r2t;
238: int pending_r2t;
239: pthread_mutex_t r2t_mutex;
240: ISTGT_R2T_TASK_Ptr *r2t_tasks;
241:
242: int task_pipe[2];
243: int max_task_queue;
244: pthread_mutex_t task_queue_mutex;
245: ISTGT_QUEUE task_queue;
246: pthread_mutex_t result_queue_mutex;
247: pthread_cond_t result_queue_cond;
248: ISTGT_QUEUE result_queue;
249: ISTGT_LU_TASK_Ptr exec_lu_task;
250: int running_tasks;
251:
252: uint16_t cid;
253:
254: /* IP address */
255: int initiator_family;
256: char initiator_addr[MAX_INITIATOR_ADDR];
257: char target_addr[MAX_TARGET_ADDR];
258:
259: /* Initiator/Target port binds */
260: char initiator_name[MAX_INITIATOR_NAME];
261: char target_name[MAX_TARGET_NAME];
262: char initiator_port[MAX_INITIATOR_NAME];
263: char target_port[MAX_TARGET_NAME];
264:
265: /* for fast access */
266: int header_digest;
267: int data_digest;
268: int full_feature;
269:
270: ISCSI_PARAM *params;
271: ISCSI_LOGIN_PHASE login_phase;
272: ISTGT_CHAP_AUTH auth;
273: int authenticated;
274: int req_auth;
275: int req_mutual;
276:
277: int timeout;
278: int nopininterval;
279:
280: int TargetMaxRecvDataSegmentLength;
281: int MaxRecvDataSegmentLength;
282: int MaxOutstandingR2T;
283: int FirstBurstLength;
284: int MaxBurstLength;
285:
286: int shortpdusize;
287: uint8_t *shortpdu;
288:
289: int iobufsize;
290: uint8_t *iobuf;
291: int snsbufsize;
292: uint8_t *snsbuf;
293:
294: int recvbufsize;
295: int sendbufsize;
296: uint8_t *recvbuf;
297: uint8_t *sendbuf;
298:
299: int worksize;
300: uint8_t *workbuf;
301:
302: uint32_t StatSN;
303: } CONN;
304: typedef CONN *CONN_Ptr;
305:
306: typedef struct istgt_sess_t {
307: int connections;
308: int max_conns;
309: CONN_Ptr *conns;
310:
311: pthread_mutex_t mutex;
312: pthread_cond_t mcs_cond;
313: int req_mcs_cond;
314:
315: char *initiator_port;
316: char *target_name;
317: int tag;
318:
319: uint64_t isid;
320: uint16_t tsih;
321: ISTGT_LU_Ptr lu;
322:
323: ISCSI_PARAM *params;
324:
325: int MaxConnections;
326: int MaxOutstandingR2T;
327: int DefaultTime2Wait;
328: int DefaultTime2Retain;
329: int FirstBurstLength;
330: int MaxBurstLength;
331: int InitialR2T;
332: int ImmediateData;
333: int DataPDUInOrder;
334: int DataSequenceInOrder;
335: int ErrorRecoveryLevel;
336:
337: int initial_r2t;
338: int immediate_data;
339:
340: uint32_t ExpCmdSN;
341: uint32_t MaxCmdSN;
342: } SESS;
343: typedef SESS *SESS_Ptr;
344:
345: #endif /* ISTGT_ISCSI_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>