2005-08-04 19:30:31 -07:00
/*
* iSCSI Initiator TCP Transport
* Copyright ( C ) 2004 Dmitry Yusupov
* Copyright ( C ) 2004 Alex Aizman
2006-04-06 21:26:46 -05:00
* Copyright ( C ) 2005 - 2006 Mike Christie
* Copyright ( C ) 2006 Red Hat , Inc . All rights reserved .
2005-08-04 19:30:31 -07:00
* maintained by open - iscsi @ googlegroups . com
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* See the file COPYING included with this distribution for more details .
*/
# ifndef ISCSI_TCP_H
# define ISCSI_TCP_H
2006-04-06 21:26:46 -05:00
# include <scsi/libiscsi.h>
2005-08-04 19:30:31 -07:00
2006-08-24 18:45:50 +10:00
struct crypto_hash ;
2006-04-06 21:26:46 -05:00
struct socket ;
2007-12-13 12:43:21 -06:00
struct iscsi_tcp_conn ;
2007-12-13 12:43:35 -06:00
struct iscsi_segment ;
2007-12-13 12:43:21 -06:00
2007-12-13 12:43:35 -06:00
typedef int iscsi_segment_done_fn_t ( struct iscsi_tcp_conn * ,
struct iscsi_segment * ) ;
2007-12-13 12:43:21 -06:00
2007-12-13 12:43:35 -06:00
struct iscsi_segment {
2007-12-13 12:43:21 -06:00
unsigned char * data ;
unsigned int size ;
unsigned int copied ;
unsigned int total_size ;
unsigned int total_copied ;
struct hash_desc * hash ;
unsigned char recv_digest [ ISCSI_DIGEST_SIZE ] ;
unsigned char digest [ ISCSI_DIGEST_SIZE ] ;
unsigned int digest_len ;
struct scatterlist * sg ;
void * sg_mapped ;
unsigned int sg_offset ;
2007-12-13 12:43:35 -06:00
iscsi_segment_done_fn_t * done ;
2007-12-13 12:43:21 -06:00
} ;
2005-08-04 19:30:31 -07:00
/* Socket connection recieve helper */
struct iscsi_tcp_recv {
struct iscsi_hdr * hdr ;
2007-12-13 12:43:35 -06:00
struct iscsi_segment segment ;
2007-12-13 12:43:21 -06:00
/* Allocate buffer for BHS + AHS */
uint32_t hdr_buf [ 64 ] ;
2005-08-04 19:30:31 -07:00
/* copied and flipped values */
int datalen ;
2007-12-13 12:43:21 -06:00
} ;
/* Socket connection send helper */
struct iscsi_tcp_send {
struct iscsi_hdr * hdr ;
2007-12-13 12:43:35 -06:00
struct iscsi_segment segment ;
struct iscsi_segment data_segment ;
2005-08-04 19:30:31 -07:00
} ;
2006-04-06 21:26:46 -05:00
struct iscsi_tcp_conn {
struct iscsi_conn * iscsi_conn ;
struct socket * sock ;
2005-08-04 19:30:31 -07:00
int stop_stage ; /* conn_stop() flag: *
* stop to recover , *
* stop to terminate */
/* control data */
struct iscsi_tcp_recv in ; /* TCP receive context */
2007-12-13 12:43:21 -06:00
struct iscsi_tcp_send out ; /* TCP send context */
2005-08-04 19:30:31 -07:00
/* old values for socket callbacks */
void ( * old_data_ready ) ( struct sock * , int ) ;
void ( * old_state_change ) ( struct sock * ) ;
void ( * old_write_space ) ( struct sock * ) ;
2006-08-31 18:09:28 -04:00
/* data and header digests */
2006-09-23 15:33:43 -05:00
struct hash_desc tx_hash ; /* CRC32C (Tx) */
struct hash_desc rx_hash ; /* CRC32C (Rx) */
2005-08-04 19:30:31 -07:00
2006-04-06 21:26:46 -05:00
/* MIB custom statistics */
2005-08-04 19:30:31 -07:00
uint32_t sendpage_failures_cnt ;
uint32_t discontiguous_hdr_cnt ;
2006-01-13 18:05:44 -06:00
2007-12-13 12:43:35 -06:00
int error ;
2005-08-04 19:30:31 -07:00
2007-12-13 12:43:35 -06:00
ssize_t ( * sendpage ) ( struct socket * , struct page * , int , size_t , int ) ;
2005-08-04 19:30:31 -07:00
} ;
struct iscsi_data_task {
struct iscsi_data hdr ; /* PDU */
2007-12-13 12:43:23 -06:00
char hdrext [ ISCSI_DIGEST_SIZE ] ; /* Header-Digest */
2005-08-04 19:30:31 -07:00
} ;
struct iscsi_r2t_info {
__be32 ttt ; /* copied from R2T */
__be32 exp_statsn ; /* copied from R2T */
uint32_t data_length ; /* copied from R2T */
uint32_t data_offset ; /* copied from R2T */
int sent ; /* R2T sequence progress */
int data_count ; /* DATA-Out payload progress */
int solicit_datasn ;
2007-12-13 12:43:35 -06:00
struct iscsi_data_task dtask ; /* Data-Out header buf */
2005-08-04 19:30:31 -07:00
} ;
2008-05-21 15:54:10 -05:00
struct iscsi_tcp_task {
2007-12-13 12:43:23 -06:00
struct iscsi_hdr_buff {
struct iscsi_cmd cmd_hdr ;
char hdrextbuf [ ISCSI_MAX_AHS_SIZE +
ISCSI_DIGEST_SIZE ] ;
} hdr ;
2007-12-13 12:43:35 -06:00
2005-08-04 19:30:31 -07:00
int sent ;
2007-12-13 12:43:35 -06:00
uint32_t exp_datasn ; /* expected target's R2TSN/DataSN */
2005-08-04 19:30:31 -07:00
int data_offset ;
2007-12-13 12:43:35 -06:00
struct iscsi_r2t_info * r2t ; /* in progress R2T */
2007-12-13 12:43:25 -06:00
struct iscsi_pool r2tpool ;
2005-08-04 19:30:31 -07:00
struct kfifo * r2tqueue ;
2007-12-13 12:43:35 -06:00
struct iscsi_data_task unsol_dtask ; /* Data-Out header buf */
2005-08-04 19:30:31 -07:00
} ;
# endif /* ISCSI_H */