0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef LIBISCSI_TCP_H
0011 #define LIBISCSI_TCP_H
0012
0013 #include <scsi/libiscsi.h>
0014
0015 struct iscsi_tcp_conn;
0016 struct iscsi_segment;
0017 struct sk_buff;
0018 struct ahash_request;
0019
0020 typedef int iscsi_segment_done_fn_t(struct iscsi_tcp_conn *,
0021 struct iscsi_segment *);
0022
0023 struct iscsi_segment {
0024 unsigned char *data;
0025 unsigned int size;
0026 unsigned int copied;
0027 unsigned int total_size;
0028 unsigned int total_copied;
0029
0030 struct ahash_request *hash;
0031 unsigned char padbuf[ISCSI_PAD_LEN];
0032 unsigned char recv_digest[ISCSI_DIGEST_SIZE];
0033 unsigned char digest[ISCSI_DIGEST_SIZE];
0034 unsigned int digest_len;
0035
0036 struct scatterlist *sg;
0037 void *sg_mapped;
0038 unsigned int sg_offset;
0039 bool atomic_mapped;
0040
0041 iscsi_segment_done_fn_t *done;
0042 };
0043
0044
0045 struct iscsi_tcp_recv {
0046 struct iscsi_hdr *hdr;
0047 struct iscsi_segment segment;
0048
0049
0050 uint32_t hdr_buf[64];
0051
0052
0053 int datalen;
0054 };
0055
0056 struct iscsi_tcp_conn {
0057 struct iscsi_conn *iscsi_conn;
0058 void *dd_data;
0059 int stop_stage;
0060
0061
0062
0063 struct iscsi_tcp_recv in;
0064
0065 struct ahash_request *rx_hash;
0066 };
0067
0068 struct iscsi_tcp_task {
0069 uint32_t exp_datasn;
0070 int data_offset;
0071 struct iscsi_r2t_info *r2t;
0072 struct iscsi_pool r2tpool;
0073 struct kfifo r2tqueue;
0074 void *dd_data;
0075 spinlock_t pool2queue;
0076 spinlock_t queue2pool;
0077 };
0078
0079 enum {
0080 ISCSI_TCP_SEGMENT_DONE,
0081 ISCSI_TCP_SKB_DONE,
0082 ISCSI_TCP_CONN_ERR,
0083 ISCSI_TCP_SUSPENDED,
0084 };
0085
0086 extern void iscsi_tcp_hdr_recv_prep(struct iscsi_tcp_conn *tcp_conn);
0087 extern int iscsi_tcp_recv_skb(struct iscsi_conn *conn, struct sk_buff *skb,
0088 unsigned int offset, bool offloaded, int *status);
0089 extern void iscsi_tcp_cleanup_task(struct iscsi_task *task);
0090 extern int iscsi_tcp_task_init(struct iscsi_task *task);
0091 extern int iscsi_tcp_task_xmit(struct iscsi_task *task);
0092
0093
0094 extern int iscsi_tcp_recv_segment_is_hdr(struct iscsi_tcp_conn *tcp_conn);
0095 extern int iscsi_tcp_segment_done(struct iscsi_tcp_conn *tcp_conn,
0096 struct iscsi_segment *segment, int recv,
0097 unsigned copied);
0098 extern void iscsi_tcp_segment_unmap(struct iscsi_segment *segment);
0099
0100 extern void iscsi_segment_init_linear(struct iscsi_segment *segment,
0101 void *data, size_t size,
0102 iscsi_segment_done_fn_t *done,
0103 struct ahash_request *hash);
0104 extern int
0105 iscsi_segment_seek_sg(struct iscsi_segment *segment,
0106 struct scatterlist *sg_list, unsigned int sg_count,
0107 unsigned int offset, size_t size,
0108 iscsi_segment_done_fn_t *done,
0109 struct ahash_request *hash);
0110
0111
0112 extern void iscsi_tcp_dgst_header(struct ahash_request *hash, const void *hdr,
0113 size_t hdrlen,
0114 unsigned char digest[ISCSI_DIGEST_SIZE]);
0115 extern struct iscsi_cls_conn *
0116 iscsi_tcp_conn_setup(struct iscsi_cls_session *cls_session, int dd_data_size,
0117 uint32_t conn_idx);
0118 extern void iscsi_tcp_conn_teardown(struct iscsi_cls_conn *cls_conn);
0119
0120
0121 extern int iscsi_tcp_r2tpool_alloc(struct iscsi_session *session);
0122 extern void iscsi_tcp_r2tpool_free(struct iscsi_session *session);
0123 extern int iscsi_tcp_set_max_r2t(struct iscsi_conn *conn, char *buf);
0124 extern void iscsi_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,
0125 struct iscsi_stats *stats);
0126 #endif