]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/scsi/iscsi_tcp.h
[SCSI] iscsi_tcp: split module into lib and lld
[net-next-2.6.git] / drivers / scsi / iscsi_tcp.h
CommitLineData
c213ca07
AA
1/*
2 * iSCSI Initiator TCP Transport
3 * Copyright (C) 2004 Dmitry Yusupov
4 * Copyright (C) 2004 Alex Aizman
5bb0b55a
MC
5 * Copyright (C) 2005 - 2006 Mike Christie
6 * Copyright (C) 2006 Red Hat, Inc. All rights reserved.
c213ca07
AA
7 * maintained by open-iscsi@googlegroups.com
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
11 * by 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, 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.
18 *
19 * See the file COPYING included with this distribution for more details.
20 */
21
22#ifndef ISCSI_TCP_H
23#define ISCSI_TCP_H
24
5bb0b55a 25#include <scsi/libiscsi.h>
c213ca07 26
dc64ddf4 27struct crypto_hash;
5bb0b55a 28struct socket;
da32dd68 29struct iscsi_tcp_conn;
a8ac6311 30struct iscsi_segment;
da32dd68 31
a8ac6311
OK
32typedef int iscsi_segment_done_fn_t(struct iscsi_tcp_conn *,
33 struct iscsi_segment *);
da32dd68 34
a8ac6311 35struct iscsi_segment {
da32dd68
OK
36 unsigned char *data;
37 unsigned int size;
38 unsigned int copied;
39 unsigned int total_size;
40 unsigned int total_copied;
41
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;
46
47 struct scatterlist *sg;
48 void *sg_mapped;
49 unsigned int sg_offset;
da32dd68 50
a8ac6311 51 iscsi_segment_done_fn_t *done;
da32dd68 52};
c213ca07
AA
53
54/* Socket connection recieve helper */
55struct iscsi_tcp_recv {
56 struct iscsi_hdr *hdr;
a8ac6311 57 struct iscsi_segment segment;
da32dd68
OK
58
59 /* Allocate buffer for BHS + AHS */
60 uint32_t hdr_buf[64];
c213ca07
AA
61
62 /* copied and flipped values */
c213ca07 63 int datalen;
da32dd68
OK
64};
65
66/* Socket connection send helper */
67struct iscsi_tcp_send {
68 struct iscsi_hdr *hdr;
a8ac6311
OK
69 struct iscsi_segment segment;
70 struct iscsi_segment data_segment;
c213ca07
AA
71};
72
5bb0b55a
MC
73struct iscsi_tcp_conn {
74 struct iscsi_conn *iscsi_conn;
75 struct socket *sock;
c213ca07
AA
76 int stop_stage; /* conn_stop() flag: *
77 * stop to recover, *
78 * stop to terminate */
c213ca07 79 /* control data */
c213ca07 80 struct iscsi_tcp_recv in; /* TCP receive context */
da32dd68 81 struct iscsi_tcp_send out; /* TCP send context */
c213ca07
AA
82
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 *);
87
dd8c0d95 88 /* data and header digests */
c9802cd9
JB
89 struct hash_desc tx_hash; /* CRC32C (Tx) */
90 struct hash_desc rx_hash; /* CRC32C (Rx) */
c213ca07 91
5bb0b55a 92 /* MIB custom statistics */
c213ca07
AA
93 uint32_t sendpage_failures_cnt;
94 uint32_t discontiguous_hdr_cnt;
56851698 95
a8ac6311 96 int error;
c213ca07 97
a8ac6311 98 ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int);
c213ca07
AA
99};
100
135a8ad4 101struct iscsi_tcp_task {
004d6530 102 struct iscsi_hdr_buff {
e5a7efef 103 struct iscsi_hdr hdrbuf;
004d6530
BH
104 char hdrextbuf[ISCSI_MAX_AHS_SIZE +
105 ISCSI_DIGEST_SIZE];
106 } hdr;
a8ac6311 107
c213ca07 108 int sent;
a8ac6311 109 uint32_t exp_datasn; /* expected target's R2TSN/DataSN */
c213ca07 110 int data_offset;
e5a7efef 111 struct iscsi_r2t_info *r2t; /* in progress solict R2T */
6320377f 112 struct iscsi_pool r2tpool;
c213ca07 113 struct kfifo *r2tqueue;
c213ca07
AA
114};
115
116#endif /* ISCSI_H */