Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[wrt350n-kernel.git] / drivers / scsi / iscsi_tcp.h
blobed0b991d1e720b50e25897ac74642ce7c5530375
1 /*
2 * iSCSI Initiator TCP Transport
3 * Copyright (C) 2004 Dmitry Yusupov
4 * Copyright (C) 2004 Alex Aizman
5 * Copyright (C) 2005 - 2006 Mike Christie
6 * Copyright (C) 2006 Red Hat, Inc. All rights reserved.
7 * maintained by open-iscsi@googlegroups.com
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
11 * by the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
19 * See the file COPYING included with this distribution for more details.
22 #ifndef ISCSI_TCP_H
23 #define ISCSI_TCP_H
25 #include <scsi/libiscsi.h>
27 struct crypto_hash;
28 struct socket;
29 struct iscsi_tcp_conn;
30 struct iscsi_segment;
32 typedef int iscsi_segment_done_fn_t(struct iscsi_tcp_conn *,
33 struct iscsi_segment *);
35 struct iscsi_segment {
36 unsigned char *data;
37 unsigned int size;
38 unsigned int copied;
39 unsigned int total_size;
40 unsigned int total_copied;
42 struct hash_desc *hash;
43 unsigned char recv_digest[ISCSI_DIGEST_SIZE];
44 unsigned char digest[ISCSI_DIGEST_SIZE];
45 unsigned int digest_len;
47 struct scatterlist *sg;
48 void *sg_mapped;
49 unsigned int sg_offset;
51 iscsi_segment_done_fn_t *done;
54 /* Socket connection recieve helper */
55 struct iscsi_tcp_recv {
56 struct iscsi_hdr *hdr;
57 struct iscsi_segment segment;
59 /* Allocate buffer for BHS + AHS */
60 uint32_t hdr_buf[64];
62 /* copied and flipped values */
63 int datalen;
66 /* Socket connection send helper */
67 struct iscsi_tcp_send {
68 struct iscsi_hdr *hdr;
69 struct iscsi_segment segment;
70 struct iscsi_segment data_segment;
73 struct iscsi_tcp_conn {
74 struct iscsi_conn *iscsi_conn;
75 struct socket *sock;
76 int stop_stage; /* conn_stop() flag: *
77 * stop to recover, *
78 * stop to terminate */
79 /* control data */
80 struct iscsi_tcp_recv in; /* TCP receive context */
81 struct iscsi_tcp_send out; /* TCP send context */
83 /* old values for socket callbacks */
84 void (*old_data_ready)(struct sock *, int);
85 void (*old_state_change)(struct sock *);
86 void (*old_write_space)(struct sock *);
88 /* data and header digests */
89 struct hash_desc tx_hash; /* CRC32C (Tx) */
90 struct hash_desc rx_hash; /* CRC32C (Rx) */
92 /* MIB custom statistics */
93 uint32_t sendpage_failures_cnt;
94 uint32_t discontiguous_hdr_cnt;
96 int error;
98 ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int);
101 struct iscsi_data_task {
102 struct iscsi_data hdr; /* PDU */
103 char hdrext[ISCSI_DIGEST_SIZE];/* Header-Digest */
106 struct iscsi_tcp_mgmt_task {
107 struct iscsi_hdr hdr;
108 char hdrext[ISCSI_DIGEST_SIZE]; /* Header-Digest */
111 struct iscsi_r2t_info {
112 __be32 ttt; /* copied from R2T */
113 __be32 exp_statsn; /* copied from R2T */
114 uint32_t data_length; /* copied from R2T */
115 uint32_t data_offset; /* copied from R2T */
116 int sent; /* R2T sequence progress */
117 int data_count; /* DATA-Out payload progress */
118 int solicit_datasn;
119 struct iscsi_data_task dtask; /* Data-Out header buf */
122 struct iscsi_tcp_cmd_task {
123 struct iscsi_hdr_buff {
124 struct iscsi_cmd cmd_hdr;
125 char hdrextbuf[ISCSI_MAX_AHS_SIZE +
126 ISCSI_DIGEST_SIZE];
127 } hdr;
129 int sent;
130 uint32_t exp_datasn; /* expected target's R2TSN/DataSN */
131 int data_offset;
132 struct iscsi_r2t_info *r2t; /* in progress R2T */
133 struct iscsi_pool r2tpool;
134 struct kfifo *r2tqueue;
135 struct iscsi_data_task unsol_dtask; /* Data-Out header buf */
138 #endif /* ISCSI_H */