Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
scsi
libiscsi.h
Go to the documentation of this file.
1
/*
2
* iSCSI lib definitions
3
*
4
* Copyright (C) 2006 Red Hat, Inc. All rights reserved.
5
* Copyright (C) 2004 - 2006 Mike Christie
6
* Copyright (C) 2004 - 2005 Dmitry Yusupov
7
* Copyright (C) 2004 - 2005 Alex Aizman
8
*
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation; either version 2 of the License, or
12
* (at your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
*/
23
#ifndef LIBISCSI_H
24
#define LIBISCSI_H
25
26
#include <linux/types.h>
27
#include <linux/wait.h>
28
#include <
linux/mutex.h
>
29
#include <
linux/timer.h
>
30
#include <
linux/workqueue.h
>
31
#include <
linux/kfifo.h
>
32
#include <
scsi/iscsi_proto.h
>
33
#include <
scsi/iscsi_if.h
>
34
#include <
scsi/scsi_transport_iscsi.h
>
35
36
struct
scsi_transport_template
;
37
struct
scsi_host_template
;
38
struct
scsi_device
;
39
struct
Scsi_Host
;
40
struct
scsi_target
;
41
struct
scsi_cmnd
;
42
struct
socket
;
43
struct
iscsi_transport
;
44
struct
iscsi_cls_session
;
45
struct
iscsi_cls_conn
;
46
struct
iscsi_session
;
47
struct
iscsi_nopin
;
48
struct
device
;
49
50
#define ISCSI_DEF_XMIT_CMDS_MAX 128
/* must be power of 2 */
51
#define ISCSI_MGMT_CMDS_MAX 15
52
53
#define ISCSI_DEF_CMD_PER_LUN 32
54
55
/* Task Mgmt states */
56
enum
{
57
TMF_INITIAL
,
58
TMF_QUEUED
,
59
TMF_SUCCESS
,
60
TMF_FAILED
,
61
TMF_TIMEDOUT
,
62
TMF_NOT_FOUND
,
63
};
64
65
/* Connection suspend "bit" */
66
#define ISCSI_SUSPEND_BIT 1
67
68
#define ISCSI_ITT_MASK 0x1fff
69
#define ISCSI_TOTAL_CMDS_MAX 4096
70
/* this must be a power of two greater than ISCSI_MGMT_CMDS_MAX */
71
#define ISCSI_TOTAL_CMDS_MIN 16
72
#define ISCSI_AGE_SHIFT 28
73
#define ISCSI_AGE_MASK 0xf
74
75
#define ISCSI_ADDRESS_BUF_LEN 64
76
77
enum
{
78
/* this is the maximum possible storage for AHSs */
79
ISCSI_MAX_AHS_SIZE
=
sizeof
(
struct
iscsi_ecdb_ahdr
) +
80
sizeof
(
struct
iscsi_rlength_ahdr
),
81
ISCSI_DIGEST_SIZE
=
sizeof
(
__u32
),
82
};
83
84
85
enum
{
86
ISCSI_TASK_FREE
,
87
ISCSI_TASK_COMPLETED
,
88
ISCSI_TASK_PENDING
,
89
ISCSI_TASK_RUNNING
,
90
ISCSI_TASK_ABRT_TMF
,
/* aborted due to TMF */
91
ISCSI_TASK_ABRT_SESS_RECOV
,
/* aborted due to session recovery */
92
ISCSI_TASK_REQUEUE_SCSIQ
,
/* qcmd requeueing to scsi-ml */
93
};
94
95
struct
iscsi_r2t_info
{
96
__be32
ttt
;
/* copied from R2T */
97
__be32
exp_statsn
;
/* copied from R2T */
98
uint32_t
data_length
;
/* copied from R2T */
99
uint32_t
data_offset
;
/* copied from R2T */
100
int
data_count
;
/* DATA-Out payload progress */
101
int
datasn
;
102
/* LLDs should set/update these values */
103
int
sent
;
/* R2T sequence progress */
104
};
105
106
struct
iscsi_task
{
107
/*
108
* Because LLDs allocate their hdr differently, this is a pointer
109
* and length to that storage. It must be setup at session
110
* creation time.
111
*/
112
struct
iscsi_hdr
*
hdr
;
113
unsigned
short
hdr_max
;
114
unsigned
short
hdr_len
;
/* accumulated size of hdr used */
115
/* copied values in case we need to send tmfs */
116
itt_t
hdr_itt
;
117
__be32
cmdsn
;
118
struct
scsi_lun
lun
;
119
120
int
itt
;
/* this ITT */
121
122
unsigned
imm_count
;
/* imm-data (bytes) */
123
/* offset in unsolicited stream (bytes); */
124
struct
iscsi_r2t_info
unsol_r2t
;
125
char
*
data
;
/* mgmt payload */
126
unsigned
data_count
;
127
struct
scsi_cmnd
*
sc
;
/* associated SCSI cmd*/
128
struct
iscsi_conn
*
conn
;
/* used connection */
129
130
/* data processing tracking */
131
unsigned
long
last_xfer
;
132
unsigned
long
last_timeout
;
133
bool
have_checked_conn
;
134
/* state set/tested under session->lock */
135
int
state
;
136
atomic_t
refcount
;
137
struct
list_head
running
;
/* running cmd list */
138
void
*
dd_data
;
/* driver/transport data */
139
};
140
141
static
inline
int
iscsi_task_has_unsol_data(
struct
iscsi_task
*
task
)
142
{
143
return
task->
unsol_r2t
.data_length > task->
unsol_r2t
.sent;
144
}
145
146
static
inline
void
* iscsi_next_hdr(
struct
iscsi_task
*
task
)
147
{
148
return
(
void
*)task->
hdr
+ task->
hdr_len
;
149
}
150
151
/* Connection's states */
152
enum
{
153
ISCSI_CONN_INITIAL_STAGE
,
154
ISCSI_CONN_STARTED
,
155
ISCSI_CONN_STOPPED
,
156
ISCSI_CONN_CLEANUP_WAIT
,
157
};
158
159
struct
iscsi_conn
{
160
struct
iscsi_cls_conn
*
cls_conn
;
/* ptr to class connection */
161
void
*
dd_data
;
/* iscsi_transport data */
162
struct
iscsi_session
*
session
;
/* parent session */
163
/*
164
* conn_stop() flag: stop to recover, stop to terminate
165
*/
166
int
stop_stage
;
167
struct
timer_list
transport_timer
;
168
unsigned
long
last_recv
;
169
unsigned
long
last_ping
;
170
int
ping_timeout
;
171
int
recv_timeout
;
172
struct
iscsi_task
*
ping_task
;
173
174
/* iSCSI connection-wide sequencing */
175
uint32_t
exp_statsn
;
176
177
/* control data */
178
int
id
;
/* CID */
179
int
c_stage
;
/* connection state */
180
/*
181
* Preallocated buffer for pdus that have data but do not
182
* originate from scsi-ml. We never have two pdus using the
183
* buffer at the same time. It is only allocated to
184
* the default max recv size because the pdus we support
185
* should always fit in this buffer
186
*/
187
char
*
data
;
188
struct
iscsi_task
*
login_task
;
/* mtask used for login/text */
189
struct
iscsi_task
*
task
;
/* xmit task in progress */
190
191
/* xmit */
192
struct
list_head
mgmtqueue
;
/* mgmt (control) xmit queue */
193
struct
list_head
cmdqueue
;
/* data-path cmd queue */
194
struct
list_head
requeue
;
/* tasks needing another run */
195
struct
work_struct
xmitwork
;
/* per-conn. xmit workqueue */
196
unsigned
long
suspend_tx
;
/* suspend Tx */
197
unsigned
long
suspend_rx
;
/* suspend Rx */
198
199
/* abort */
200
wait_queue_head_t
ehwait
;
/* used in eh_abort() */
201
struct
iscsi_tm
tmhdr
;
202
struct
timer_list
tmf_timer
;
203
int
tmf_state
;
/* see TMF_INITIAL, etc.*/
204
205
/* negotiated params */
206
unsigned
max_recv_dlength
;
/* initiator_max_recv_dsl*/
207
unsigned
max_xmit_dlength
;
/* target_max_recv_dsl */
208
int
hdrdgst_en
;
209
int
datadgst_en
;
210
int
ifmarker_en
;
211
int
ofmarker_en
;
212
/* values userspace uses to id a conn */
213
int
persistent_port
;
214
char
*
persistent_address
;
215
216
/* MIB-statistics */
217
uint64_t
txdata_octets
;
218
uint64_t
rxdata_octets
;
219
uint32_t
scsicmd_pdus_cnt
;
220
uint32_t
dataout_pdus_cnt
;
221
uint32_t
scsirsp_pdus_cnt
;
222
uint32_t
datain_pdus_cnt
;
223
uint32_t
r2t_pdus_cnt
;
224
uint32_t
tmfcmd_pdus_cnt
;
225
int32_t
tmfrsp_pdus_cnt
;
226
227
/* custom statistics */
228
uint32_t
eh_abort_cnt
;
229
uint32_t
fmr_unalign_cnt
;
230
};
231
232
struct
iscsi_pool
{
233
struct
kfifo
queue
;
/* FIFO Queue */
234
void
**
pool
;
/* Pool of elements */
235
int
max
;
/* Max number of elements */
236
};
237
238
/* Session's states */
239
enum
{
240
ISCSI_STATE_FREE
= 1,
241
ISCSI_STATE_LOGGED_IN
,
242
ISCSI_STATE_FAILED
,
243
ISCSI_STATE_TERMINATE
,
244
ISCSI_STATE_IN_RECOVERY
,
245
ISCSI_STATE_RECOVERY_FAILED
,
246
ISCSI_STATE_LOGGING_OUT
,
247
};
248
249
struct
iscsi_session
{
250
struct
iscsi_cls_session
*
cls_session
;
251
/*
252
* Syncs up the scsi eh thread with the iscsi eh thread when sending
253
* task management functions. This must be taken before the session
254
* and recv lock.
255
*/
256
struct
mutex
eh_mutex
;
257
258
/* iSCSI session-wide sequencing */
259
uint32_t
cmdsn
;
260
uint32_t
exp_cmdsn
;
261
uint32_t
max_cmdsn
;
262
263
/* This tracks the reqs queued into the initiator */
264
uint32_t
queued_cmdsn
;
265
266
/* configuration */
267
int
abort_timeout
;
268
int
lu_reset_timeout
;
269
int
tgt_reset_timeout
;
270
int
initial_r2t_en
;
271
unsigned
short
max_r2t
;
272
int
imm_data_en
;
273
unsigned
first_burst
;
274
unsigned
max_burst
;
275
int
time2wait
;
276
int
time2retain
;
277
int
pdu_inorder_en
;
278
int
dataseq_inorder_en
;
279
int
erl
;
280
int
fast_abort
;
281
int
tpgt
;
282
char
*
username
;
283
char
*
username_in
;
284
char
*
password
;
285
char
*
password_in
;
286
char
*
targetname
;
287
char
*
targetalias
;
288
char
*
ifacename
;
289
char
*
initiatorname
;
290
/* control data */
291
struct
iscsi_transport
*
tt
;
292
struct
Scsi_Host
*
host
;
293
struct
iscsi_conn
*
leadconn
;
/* leading connection */
294
spinlock_t
lock
;
/* protects session state, *
295
* sequence numbers, *
296
* session resources: *
297
* - cmdpool, *
298
* - mgmtpool, *
299
* - r2tpool */
300
int
state
;
/* session state */
301
int
age
;
/* counts session re-opens */
302
303
int
scsi_cmds_max
;
/* max scsi commands */
304
int
cmds_max
;
/* size of cmds array */
305
struct
iscsi_task
**
cmds
;
/* Original Cmds arr */
306
struct
iscsi_pool
cmdpool
;
/* PDU's pool */
307
void
*
dd_data
;
/* LLD private data */
308
};
309
310
enum
{
311
ISCSI_HOST_SETUP
,
312
ISCSI_HOST_REMOVED
,
313
};
314
315
struct
iscsi_host
{
316
char
*
initiatorname
;
317
/* hw address or netdev iscsi connection is bound to */
318
char
*
hwaddress
;
319
char
*
netdev
;
320
321
wait_queue_head_t
session_removal_wq
;
322
/* protects sessions and state */
323
spinlock_t
lock
;
324
int
num_sessions
;
325
int
state
;
326
327
struct
workqueue_struct
*
workq
;
328
char
workq_name
[20];
329
};
330
331
/*
332
* scsi host template
333
*/
334
extern
int
iscsi_change_queue_depth
(
struct
scsi_device
*sdev,
int
depth
,
335
int
reason
);
336
extern
int
iscsi_eh_abort
(
struct
scsi_cmnd
*
sc
);
337
extern
int
iscsi_eh_recover_target
(
struct
scsi_cmnd
*
sc
);
338
extern
int
iscsi_eh_session_reset
(
struct
scsi_cmnd
*
sc
);
339
extern
int
iscsi_eh_device_reset
(
struct
scsi_cmnd
*
sc
);
340
extern
int
iscsi_queuecommand
(
struct
Scsi_Host
*
host
,
struct
scsi_cmnd
*
sc
);
341
342
/*
343
* iSCSI host helpers.
344
*/
345
#define iscsi_host_priv(_shost) \
346
(shost_priv(_shost) + sizeof(struct iscsi_host))
347
348
extern
int
iscsi_host_set_param
(
struct
Scsi_Host
*
shost
,
349
enum
iscsi_host_param
param
,
char
*
buf
,
350
int
buflen
);
351
extern
int
iscsi_host_get_param
(
struct
Scsi_Host
*
shost
,
352
enum
iscsi_host_param
param
,
char
*
buf
);
353
extern
int
iscsi_host_add
(
struct
Scsi_Host
*
shost
,
struct
device
*pdev);
354
extern
struct
Scsi_Host
*
iscsi_host_alloc
(
struct
scsi_host_template
*sht,
355
int
dd_data_size,
356
bool
xmit_can_sleep);
357
extern
void
iscsi_host_remove
(
struct
Scsi_Host
*
shost
);
358
extern
void
iscsi_host_free
(
struct
Scsi_Host
*
shost
);
359
extern
int
iscsi_target_alloc
(
struct
scsi_target
*starget);
360
361
/*
362
* session management
363
*/
364
extern
struct
iscsi_cls_session
*
365
iscsi_session_setup
(
struct
iscsi_transport
*,
struct
Scsi_Host
*
shost
,
366
uint16_t
,
int
,
int
,
uint32_t
,
unsigned
int
);
367
extern
void
iscsi_session_teardown
(
struct
iscsi_cls_session
*);
368
extern
void
iscsi_session_recovery_timedout
(
struct
iscsi_cls_session
*);
369
extern
int
iscsi_set_param
(
struct
iscsi_cls_conn
*cls_conn,
370
enum
iscsi_param
param
,
char
*
buf
,
int
buflen
);
371
extern
int
iscsi_session_get_param
(
struct
iscsi_cls_session
*cls_session,
372
enum
iscsi_param
param
,
char
*
buf
);
373
374
#define iscsi_session_printk(prefix, _sess, fmt, a...) \
375
iscsi_cls_session_printk(prefix, _sess->cls_session, fmt, ##a)
376
377
/*
378
* connection management
379
*/
380
extern
struct
iscsi_cls_conn
*
iscsi_conn_setup
(
struct
iscsi_cls_session
*,
381
int
,
uint32_t
);
382
extern
void
iscsi_conn_teardown
(
struct
iscsi_cls_conn
*);
383
extern
int
iscsi_conn_start
(
struct
iscsi_cls_conn
*);
384
extern
void
iscsi_conn_stop
(
struct
iscsi_cls_conn
*,
int
);
385
extern
int
iscsi_conn_bind
(
struct
iscsi_cls_session
*,
struct
iscsi_cls_conn
*,
386
int
);
387
extern
void
iscsi_conn_failure
(
struct
iscsi_conn
*conn,
enum
iscsi_err
err
);
388
extern
void
iscsi_session_failure
(
struct
iscsi_session
*session,
389
enum
iscsi_err
err
);
390
extern
int
iscsi_conn_get_param
(
struct
iscsi_cls_conn
*cls_conn,
391
enum
iscsi_param
param
,
char
*
buf
);
392
extern
int
iscsi_conn_get_addr_param
(
struct
sockaddr_storage
*
addr
,
393
enum
iscsi_param
param
,
char
*
buf
);
394
extern
void
iscsi_suspend_tx
(
struct
iscsi_conn
*conn);
395
extern
void
iscsi_suspend_queue
(
struct
iscsi_conn
*conn);
396
extern
void
iscsi_conn_queue_work
(
struct
iscsi_conn
*conn);
397
398
#define iscsi_conn_printk(prefix, _c, fmt, a...) \
399
iscsi_cls_conn_printk(prefix, ((struct iscsi_conn *)_c)->cls_conn, \
400
fmt, ##a)
401
402
/*
403
* pdu and task processing
404
*/
405
extern
void
iscsi_update_cmdsn
(
struct
iscsi_session
*,
struct
iscsi_nopin
*);
406
extern
void
iscsi_prep_data_out_pdu
(
struct
iscsi_task
*task,
407
struct
iscsi_r2t_info
*r2t,
408
struct
iscsi_data
*
hdr
);
409
extern
int
iscsi_conn_send_pdu
(
struct
iscsi_cls_conn
*,
struct
iscsi_hdr
*,
410
char
*,
uint32_t
);
411
extern
int
iscsi_complete_pdu
(
struct
iscsi_conn
*,
struct
iscsi_hdr
*,
412
char
*,
int
);
413
extern
int
__iscsi_complete_pdu
(
struct
iscsi_conn
*,
struct
iscsi_hdr
*,
414
char
*,
int
);
415
extern
int
iscsi_verify_itt
(
struct
iscsi_conn
*,
itt_t
);
416
extern
struct
iscsi_task
*
iscsi_itt_to_ctask
(
struct
iscsi_conn
*,
itt_t
);
417
extern
struct
iscsi_task
*
iscsi_itt_to_task
(
struct
iscsi_conn
*,
itt_t
);
418
extern
void
iscsi_requeue_task
(
struct
iscsi_task
*task);
419
extern
void
iscsi_put_task
(
struct
iscsi_task
*task);
420
extern
void
__iscsi_put_task
(
struct
iscsi_task
*task);
421
extern
void
__iscsi_get_task
(
struct
iscsi_task
*task);
422
extern
void
iscsi_complete_scsi_task
(
struct
iscsi_task
*task,
423
uint32_t
exp_cmdsn,
uint32_t
max_cmdsn);
424
425
/*
426
* generic helpers
427
*/
428
extern
void
iscsi_pool_free
(
struct
iscsi_pool
*);
429
extern
int
iscsi_pool_init
(
struct
iscsi_pool
*,
int
,
void
***,
int
);
430
431
/*
432
* inline functions to deal with padding.
433
*/
434
static
inline
unsigned
int
435
iscsi_padded(
unsigned
int
len)
436
{
437
return
(len +
ISCSI_PAD_LEN
- 1) & ~(
ISCSI_PAD_LEN
- 1);
438
}
439
440
static
inline
unsigned
int
441
iscsi_padding(
unsigned
int
len)
442
{
443
len &= (
ISCSI_PAD_LEN
- 1);
444
if
(len)
445
len =
ISCSI_PAD_LEN
- len;
446
return
len;
447
}
448
449
#endif
Generated on Thu Jan 10 2013 14:53:25 for Linux Kernel by
1.8.2