Commit | Line | Data |
---|---|---|
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 | 27 | struct crypto_hash; |
5bb0b55a | 28 | struct socket; |
da32dd68 | 29 | struct iscsi_tcp_conn; |
a8ac6311 | 30 | struct iscsi_segment; |
da32dd68 | 31 | |
a8ac6311 OK |
32 | typedef int iscsi_segment_done_fn_t(struct iscsi_tcp_conn *, |
33 | struct iscsi_segment *); | |
da32dd68 | 34 | |
a8ac6311 | 35 | struct 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 */ | |
55 | struct 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 */ | |
67 | struct 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 |
73 | struct 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 | ||
101 | struct iscsi_data_task { | |
102 | struct iscsi_data hdr; /* PDU */ | |
004d6530 | 103 | char hdrext[ISCSI_DIGEST_SIZE];/* Header-Digest */ |
c213ca07 | 104 | }; |
c213ca07 | 105 | |
5bb0b55a MC |
106 | struct iscsi_tcp_mgmt_task { |
107 | struct iscsi_hdr hdr; | |
004d6530 | 108 | char hdrext[ISCSI_DIGEST_SIZE]; /* Header-Digest */ |
c213ca07 AA |
109 | }; |
110 | ||
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 */ | |
c213ca07 AA |
116 | int sent; /* R2T sequence progress */ |
117 | int data_count; /* DATA-Out payload progress */ | |
c213ca07 | 118 | int solicit_datasn; |
a8ac6311 | 119 | struct iscsi_data_task dtask; /* Data-Out header buf */ |
c213ca07 AA |
120 | }; |
121 | ||
5bb0b55a | 122 | struct iscsi_tcp_cmd_task { |
004d6530 BH |
123 | struct iscsi_hdr_buff { |
124 | struct iscsi_cmd cmd_hdr; | |
125 | char hdrextbuf[ISCSI_MAX_AHS_SIZE + | |
126 | ISCSI_DIGEST_SIZE]; | |
127 | } hdr; | |
a8ac6311 | 128 | |
c213ca07 | 129 | int sent; |
a8ac6311 | 130 | uint32_t exp_datasn; /* expected target's R2TSN/DataSN */ |
c213ca07 | 131 | int data_offset; |
a8ac6311 | 132 | struct iscsi_r2t_info *r2t; /* in progress R2T */ |
6320377f | 133 | struct iscsi_pool r2tpool; |
c213ca07 | 134 | struct kfifo *r2tqueue; |
a8ac6311 | 135 | struct iscsi_data_task unsol_dtask; /* Data-Out header buf */ |
c213ca07 AA |
136 | }; |
137 | ||
138 | #endif /* ISCSI_H */ |