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_tcp.h
Go to the documentation of this file.
1
/*
2
* iSCSI over TCP/IP Data-Path lib
3
*
4
* Copyright (C) 2008 Mike Christie
5
* Copyright (C) 2008 Red Hat, Inc. All rights reserved.
6
* maintained by
[email protected]
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published
10
* by the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version.
12
*
13
* This program is distributed in the hope that it will be useful, but
14
* WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* General Public License for more details.
17
*
18
* See the file COPYING included with this distribution for more details.
19
*/
20
21
#ifndef LIBISCSI_TCP_H
22
#define LIBISCSI_TCP_H
23
24
#include <
scsi/libiscsi.h
>
25
26
struct
iscsi_tcp_conn
;
27
struct
iscsi_segment
;
28
struct
sk_buff
;
29
struct
hash_desc
;
30
31
typedef
int
iscsi_segment_done_fn_t
(
struct
iscsi_tcp_conn
*,
32
struct
iscsi_segment
*);
33
34
struct
iscsi_segment
{
35
unsigned
char
*
data
;
36
unsigned
int
size
;
37
unsigned
int
copied
;
38
unsigned
int
total_size
;
39
unsigned
int
total_copied
;
40
41
struct
hash_desc
*
hash
;
42
unsigned
char
padbuf
[
ISCSI_PAD_LEN
];
43
unsigned
char
recv_digest
[
ISCSI_DIGEST_SIZE
];
44
unsigned
char
digest
[
ISCSI_DIGEST_SIZE
];
45
unsigned
int
digest_len
;
46
47
struct
scatterlist
*
sg
;
48
void
*
sg_mapped
;
49
unsigned
int
sg_offset
;
50
bool
atomic_mapped
;
51
52
iscsi_segment_done_fn_t
*
done
;
53
};
54
55
/* Socket connection receive helper */
56
struct
iscsi_tcp_recv
{
57
struct
iscsi_hdr
*
hdr
;
58
struct
iscsi_segment
segment
;
59
60
/* Allocate buffer for BHS + AHS */
61
uint32_t
hdr_buf
[64];
62
63
/* copied and flipped values */
64
int
datalen
;
65
};
66
67
struct
iscsi_tcp_conn
{
68
struct
iscsi_conn
*
iscsi_conn
;
69
void
*
dd_data
;
70
int
stop_stage
;
/* conn_stop() flag: *
71
* stop to recover, *
72
* stop to terminate */
73
/* control data */
74
struct
iscsi_tcp_recv
in
;
/* TCP receive context */
75
/* CRC32C (Rx) LLD should set this is they do not offload */
76
struct
hash_desc
*
rx_hash
;
77
};
78
79
struct
iscsi_tcp_task
{
80
uint32_t
exp_datasn
;
/* expected target's R2TSN/DataSN */
81
int
data_offset
;
82
struct
iscsi_r2t_info
*
r2t
;
/* in progress solict R2T */
83
struct
iscsi_pool
r2tpool
;
84
struct
kfifo
r2tqueue
;
85
void
*
dd_data
;
86
};
87
88
enum
{
89
ISCSI_TCP_SEGMENT_DONE
,
/* curr seg has been processed */
90
ISCSI_TCP_SKB_DONE
,
/* skb is out of data */
91
ISCSI_TCP_CONN_ERR
,
/* iscsi layer has fired a conn err */
92
ISCSI_TCP_SUSPENDED
,
/* conn is suspended */
93
};
94
95
extern
void
iscsi_tcp_hdr_recv_prep
(
struct
iscsi_tcp_conn
*tcp_conn);
96
extern
int
iscsi_tcp_recv_skb
(
struct
iscsi_conn
*conn,
struct
sk_buff
*
skb
,
97
unsigned
int
offset
,
bool
offloaded,
int
*
status
);
98
extern
void
iscsi_tcp_cleanup_task
(
struct
iscsi_task
*
task
);
99
extern
int
iscsi_tcp_task_init
(
struct
iscsi_task
*
task
);
100
extern
int
iscsi_tcp_task_xmit
(
struct
iscsi_task
*
task
);
101
102
/* segment helpers */
103
extern
int
iscsi_tcp_recv_segment_is_hdr
(
struct
iscsi_tcp_conn
*tcp_conn);
104
extern
int
iscsi_tcp_segment_done
(
struct
iscsi_tcp_conn
*tcp_conn,
105
struct
iscsi_segment
*
segment
,
int
recv,
106
unsigned
copied);
107
extern
void
iscsi_tcp_segment_unmap
(
struct
iscsi_segment
*
segment
);
108
109
extern
void
iscsi_segment_init_linear
(
struct
iscsi_segment
*
segment
,
110
void
*
data
,
size_t
size
,
111
iscsi_segment_done_fn_t
*
done
,
112
struct
hash_desc
*
hash
);
113
extern
int
114
iscsi_segment_seek_sg
(
struct
iscsi_segment
*
segment
,
115
struct
scatterlist
*
sg_list
,
unsigned
int
sg_count
,
116
unsigned
int
offset
,
size_t
size
,
117
iscsi_segment_done_fn_t
*
done
,
struct
hash_desc
*
hash
);
118
119
/* digest helpers */
120
extern
void
iscsi_tcp_dgst_header
(
struct
hash_desc
*
hash
,
const
void
*
hdr
,
121
size_t
hdrlen
,
122
unsigned
char
digest
[
ISCSI_DIGEST_SIZE
]);
123
extern
struct
iscsi_cls_conn
*
124
iscsi_tcp_conn_setup
(
struct
iscsi_cls_session
*cls_session,
int
dd_data_size,
125
uint32_t
conn_idx);
126
extern
void
iscsi_tcp_conn_teardown
(
struct
iscsi_cls_conn
*cls_conn);
127
128
/* misc helpers */
129
extern
int
iscsi_tcp_r2tpool_alloc
(
struct
iscsi_session
*session);
130
extern
void
iscsi_tcp_r2tpool_free
(
struct
iscsi_session
*session);
131
extern
int
iscsi_tcp_set_max_r2t
(
struct
iscsi_conn
*conn,
char
*
buf
);
132
extern
void
iscsi_tcp_conn_get_stats
(
struct
iscsi_cls_conn
*cls_conn,
133
struct
iscsi_stats
*
stats
);
134
#endif
/* LIBISCSI_TCP_H */
Generated on Thu Jan 10 2013 14:53:25 for Linux Kernel by
1.8.2