diff options
author | Mike Christie <michaelc@cs.wisc.edu> | 2008-12-02 01:32:11 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-12-29 12:24:22 -0500 |
commit | a081c13e39b5c17052a7b46fafa61019c4c110ff (patch) | |
tree | d00093d2e869b825d4e6aea62ff3b69b0c38c7b9 /include/scsi | |
parent | 30b4915015c112547e930cadf734d875aec8438d (diff) |
[SCSI] iscsi_tcp: split module into lib and lld
As explained in the previous mails, cxgb3i needs iscsi_tcp's
r2t/data_out and data_in procesing so this just moves functions
that both drivers want to use to a new module libiscsi_tcp. The
next patch will hook iscsi_tcp in.
Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'include/scsi')
-rw-r--r-- | include/scsi/libiscsi_tcp.h | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/include/scsi/libiscsi_tcp.h b/include/scsi/libiscsi_tcp.h new file mode 100644 index 000000000000..e6bf8ef276bb --- /dev/null +++ b/include/scsi/libiscsi_tcp.h | |||
@@ -0,0 +1,131 @@ | |||
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 open-iscsi@googlegroups.com | ||
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 recv_digest[ISCSI_DIGEST_SIZE]; | ||
43 | unsigned char digest[ISCSI_DIGEST_SIZE]; | ||
44 | unsigned int digest_len; | ||
45 | |||
46 | struct scatterlist *sg; | ||
47 | void *sg_mapped; | ||
48 | unsigned int sg_offset; | ||
49 | |||
50 | iscsi_segment_done_fn_t *done; | ||
51 | }; | ||
52 | |||
53 | /* Socket connection recieve helper */ | ||
54 | struct iscsi_tcp_recv { | ||
55 | struct iscsi_hdr *hdr; | ||
56 | struct iscsi_segment segment; | ||
57 | |||
58 | /* Allocate buffer for BHS + AHS */ | ||
59 | uint32_t hdr_buf[64]; | ||
60 | |||
61 | /* copied and flipped values */ | ||
62 | int datalen; | ||
63 | }; | ||
64 | |||
65 | struct iscsi_tcp_conn { | ||
66 | struct iscsi_conn *iscsi_conn; | ||
67 | void *dd_data; | ||
68 | int stop_stage; /* conn_stop() flag: * | ||
69 | * stop to recover, * | ||
70 | * stop to terminate */ | ||
71 | /* control data */ | ||
72 | struct iscsi_tcp_recv in; /* TCP receive context */ | ||
73 | /* CRC32C (Rx) LLD should set this is they do not offload */ | ||
74 | struct hash_desc *rx_hash; | ||
75 | }; | ||
76 | |||
77 | struct iscsi_tcp_task { | ||
78 | uint32_t exp_datasn; /* expected target's R2TSN/DataSN */ | ||
79 | int data_offset; | ||
80 | struct iscsi_r2t_info *r2t; /* in progress solict R2T */ | ||
81 | struct iscsi_pool r2tpool; | ||
82 | struct kfifo *r2tqueue; | ||
83 | void *dd_data; | ||
84 | }; | ||
85 | |||
86 | enum { | ||
87 | ISCSI_TCP_SEGMENT_DONE, /* curr seg has been processed */ | ||
88 | ISCSI_TCP_SKB_DONE, /* skb is out of data */ | ||
89 | ISCSI_TCP_CONN_ERR, /* iscsi layer has fired a conn err */ | ||
90 | ISCSI_TCP_SUSPENDED, /* conn is suspended */ | ||
91 | }; | ||
92 | |||
93 | extern void iscsi_tcp_hdr_recv_prep(struct iscsi_tcp_conn *tcp_conn); | ||
94 | extern int iscsi_tcp_recv_skb(struct iscsi_conn *conn, struct sk_buff *skb, | ||
95 | unsigned int offset, bool offloaded, int *status); | ||
96 | extern void iscsi_tcp_cleanup_task(struct iscsi_task *task); | ||
97 | extern int iscsi_tcp_task_init(struct iscsi_task *task); | ||
98 | extern int iscsi_tcp_task_xmit(struct iscsi_task *task); | ||
99 | |||
100 | /* segment helpers */ | ||
101 | extern int iscsi_tcp_recv_segment_is_hdr(struct iscsi_tcp_conn *tcp_conn); | ||
102 | extern int iscsi_tcp_segment_done(struct iscsi_segment *segment, int recv, | ||
103 | unsigned copied); | ||
104 | extern void iscsi_tcp_segment_unmap(struct iscsi_segment *segment); | ||
105 | |||
106 | extern void iscsi_segment_init_linear(struct iscsi_segment *segment, | ||
107 | void *data, size_t size, | ||
108 | iscsi_segment_done_fn_t *done, | ||
109 | struct hash_desc *hash); | ||
110 | extern int | ||
111 | iscsi_segment_seek_sg(struct iscsi_segment *segment, | ||
112 | struct scatterlist *sg_list, unsigned int sg_count, | ||
113 | unsigned int offset, size_t size, | ||
114 | iscsi_segment_done_fn_t *done, struct hash_desc *hash); | ||
115 | |||
116 | /* digest helpers */ | ||
117 | extern void iscsi_tcp_dgst_header(struct hash_desc *hash, const void *hdr, | ||
118 | size_t hdrlen, | ||
119 | unsigned char digest[ISCSI_DIGEST_SIZE]); | ||
120 | extern struct iscsi_cls_conn * | ||
121 | iscsi_tcp_conn_setup(struct iscsi_cls_session *cls_session, int dd_data_size, | ||
122 | uint32_t conn_idx); | ||
123 | extern void iscsi_tcp_conn_teardown(struct iscsi_cls_conn *cls_conn); | ||
124 | |||
125 | /* misc helpers */ | ||
126 | extern int iscsi_tcp_r2tpool_alloc(struct iscsi_session *session); | ||
127 | extern void iscsi_tcp_r2tpool_free(struct iscsi_session *session); | ||
128 | |||
129 | extern void iscsi_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn, | ||
130 | struct iscsi_stats *stats); | ||
131 | #endif /* LIBISCSI_TCP_H */ | ||