| /* |
| * Modified version of iscsi_tcp.h |
| */ |
| |
| #ifndef ISCSI_TCP_H |
| #define ISCSI_TCP_H |
| |
| struct crypto_hash; |
| struct socket; |
| struct iscsi_tcp_conn; |
| struct iscsi_segment; |
| |
| |
| /* |
| * iSCSI Template Message Header |
| */ |
| struct iscsi_hdr { |
| uint8_t opcode; |
| uint8_t flags; /* Final bit */ |
| uint8_t rsvd2[2]; |
| uint8_t hlength; /* AHSs total length */ |
| uint8_t dlength[3]; /* Data length */ |
| uint8_t lun[8]; |
| __be32 itt; /* Initiator Task Tag */ |
| __be32 ttt; /* Target Task Tag */ |
| __be32 statsn; |
| __be32 exp_statsn; |
| __be32 max_statsn; |
| uint8_t other[12]; |
| }; |
| |
| /* Extended CDB AHS */ |
| struct iscsi_ecdb_ahdr { |
| __be16 ahslength; /* CDB length - 15, including reserved byte */ |
| uint8_t ahstype; |
| uint8_t reserved; |
| uint8_t ecdb[260 - 16]; /* 4-byte aligned extended CDB spillover */ |
| }; |
| |
| struct iscsi_rlength_ahdr { |
| __be16 ahslength; |
| uint8_t ahstype; |
| uint8_t reserved; |
| __be32 read_length; |
| }; |
| |
| enum { |
| /* this is the maximum possible storage for AHSs */ |
| ISCSI_MAX_AHS_SIZE = sizeof(struct iscsi_ecdb_ahdr) + |
| sizeof(struct iscsi_rlength_ahdr), |
| ISCSI_DIGEST_SIZE = sizeof(__u32), |
| }; |
| |
| struct iscsi_segment { |
| unsigned char *data; |
| unsigned int size; |
| unsigned int copied; |
| unsigned int total_size; |
| unsigned int total_copied; |
| |
| //struct hash_desc *hash; |
| void *hash; |
| unsigned char recv_digest[ISCSI_DIGEST_SIZE]; |
| unsigned char digest[ISCSI_DIGEST_SIZE]; |
| unsigned int digest_len; |
| |
| //struct scatterlist *sg; |
| void *sg; |
| void *sg_mapped; |
| unsigned int sg_offset; |
| |
| //iscsi_segment_done_fn_t *done; |
| }; |
| |
| /* Socket connection recieve helper */ |
| struct iscsi_tcp_recv { |
| struct iscsi_hdr *hdr; |
| struct iscsi_segment segment; |
| |
| /* Allocate buffer for BHS + AHS */ |
| uint32_t hdr_buf[64]; |
| |
| /* copied and flipped values */ |
| int datalen; |
| }; |
| |
| struct iscsi_conn { |
| //struct iscsi_cls_conn *cls_conn; /* ptr to class connection */ |
| void *cls_conn; |
| void *dd_data; /* iscsi_transport data */ |
| }; |
| |
| /* Socket connection send helper */ |
| struct iscsi_tcp_send { |
| struct iscsi_hdr *hdr; |
| struct iscsi_segment segment; |
| struct iscsi_segment data_segment; |
| }; |
| |
| struct iscsi_tcp_conn { |
| struct iscsi_conn *iscsi_conn; |
| struct socket *sock; |
| int stop_stage; /* conn_stop() flag: * |
| * stop to recover, * |
| * stop to terminate */ |
| /* control data */ |
| struct iscsi_tcp_recv in; /* TCP receive context */ |
| struct iscsi_tcp_send out; /* TCP send context */ |
| |
| /* old values for socket callbacks */ |
| void (*old_data_ready)(struct sock *, int); |
| void (*old_state_change)(struct sock *); |
| void (*old_write_space)(struct sock *); |
| |
| /* data and header digests */ |
| //struct hash_desc tx_hash; /* CRC32C (Tx) */ |
| //struct hash_desc rx_hash; /* CRC32C (Rx) */ |
| |
| /* MIB custom statistics */ |
| //uint32_t sendpage_failures_cnt; |
| //uint32_t discontiguous_hdr_cnt; |
| |
| //int error; |
| |
| //ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int); |
| }; |
| |
| #endif /* ISCSI_H */ |