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.
25 #include <scsi/libiscsi.h>
29 struct iscsi_tcp_conn
;
32 typedef int iscsi_segment_done_fn_t(struct iscsi_tcp_conn
*,
33 struct iscsi_segment
*);
35 struct iscsi_segment
{
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
;
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 */
62 /* copied and flipped values */
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
;
76 int stop_stage
; /* conn_stop() flag: *
78 * stop to terminate */
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
;
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_r2t_info
{
107 __be32 ttt
; /* copied from R2T */
108 __be32 exp_statsn
; /* copied from R2T */
109 uint32_t data_length
; /* copied from R2T */
110 uint32_t data_offset
; /* copied from R2T */
111 int sent
; /* R2T sequence progress */
112 int data_count
; /* DATA-Out payload progress */
114 struct iscsi_data_task dtask
; /* Data-Out header buf */
117 struct iscsi_tcp_task
{
118 struct iscsi_hdr_buff
{
119 struct iscsi_cmd cmd_hdr
;
120 char hdrextbuf
[ISCSI_MAX_AHS_SIZE
+
125 uint32_t exp_datasn
; /* expected target's R2TSN/DataSN */
127 struct iscsi_r2t_info
*r2t
; /* in progress R2T */
128 struct iscsi_pool r2tpool
;
129 struct kfifo
*r2tqueue
;
130 struct iscsi_data_task unsol_dtask
; /* Data-Out header buf */