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 */