xref: /openbmc/linux/drivers/scsi/iscsi_tcp.h (revision f42b3800)
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
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 
25 #include <scsi/libiscsi.h>
26 
27 struct crypto_hash;
28 struct socket;
29 struct iscsi_tcp_conn;
30 struct iscsi_segment;
31 
32 typedef int iscsi_segment_done_fn_t(struct iscsi_tcp_conn *,
33 				    struct iscsi_segment *);
34 
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;
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;
50 
51 	iscsi_segment_done_fn_t	*done;
52 };
53 
54 /* Socket connection recieve helper */
55 struct iscsi_tcp_recv {
56 	struct iscsi_hdr	*hdr;
57 	struct iscsi_segment	segment;
58 
59 	/* Allocate buffer for BHS + AHS */
60 	uint32_t		hdr_buf[64];
61 
62 	/* copied and flipped values */
63 	int			datalen;
64 };
65 
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;
71 };
72 
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 */
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 
88 	/* data and header digests */
89 	struct hash_desc	tx_hash;	/* CRC32C (Tx) */
90 	struct hash_desc	rx_hash;	/* CRC32C (Rx) */
91 
92 	/* MIB custom statistics */
93 	uint32_t		sendpage_failures_cnt;
94 	uint32_t		discontiguous_hdr_cnt;
95 
96 	int			error;
97 
98 	ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int);
99 };
100 
101 struct iscsi_data_task {
102 	struct iscsi_data	hdr;			/* PDU */
103 	char			hdrext[ISCSI_DIGEST_SIZE];/* Header-Digest */
104 };
105 
106 struct iscsi_tcp_mgmt_task {
107 	struct iscsi_hdr	hdr;
108 	char			hdrext[ISCSI_DIGEST_SIZE]; /* Header-Digest */
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 */
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 */
120 };
121 
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;
128 
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 */
136 };
137 
138 #endif /* ISCSI_H */
139