Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
libiscsi_tcp.h
Go to the documentation of this file.
1 /*
2  * iSCSI over TCP/IP Data-Path lib
3  *
4  * Copyright (C) 2008 Mike Christie
5  * Copyright (C) 2008 Red Hat, Inc. All rights reserved.
6  * maintained by [email protected]
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published
10  * by the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * General Public License for more details.
17  *
18  * See the file COPYING included with this distribution for more details.
19  */
20 
21 #ifndef LIBISCSI_TCP_H
22 #define LIBISCSI_TCP_H
23 
24 #include <scsi/libiscsi.h>
25 
26 struct iscsi_tcp_conn;
27 struct iscsi_segment;
28 struct sk_buff;
29 struct hash_desc;
30 
32  struct iscsi_segment *);
33 
34 struct iscsi_segment {
35  unsigned char *data;
36  unsigned int size;
37  unsigned int copied;
38  unsigned int total_size;
39  unsigned int total_copied;
40 
41  struct hash_desc *hash;
42  unsigned char padbuf[ISCSI_PAD_LEN];
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;
51 
53 };
54 
55 /* Socket connection receive helper */
57  struct iscsi_hdr *hdr;
59 
60  /* Allocate buffer for BHS + AHS */
62 
63  /* copied and flipped values */
64  int datalen;
65 };
66 
69  void *dd_data;
70  int stop_stage; /* conn_stop() flag: *
71  * stop to recover, *
72  * stop to terminate */
73  /* control data */
74  struct iscsi_tcp_recv in; /* TCP receive context */
75  /* CRC32C (Rx) LLD should set this is they do not offload */
76  struct hash_desc *rx_hash;
77 };
78 
80  uint32_t exp_datasn; /* expected target's R2TSN/DataSN */
82  struct iscsi_r2t_info *r2t; /* in progress solict R2T */
84  struct kfifo r2tqueue;
85  void *dd_data;
86 };
87 
88 enum {
89  ISCSI_TCP_SEGMENT_DONE, /* curr seg has been processed */
90  ISCSI_TCP_SKB_DONE, /* skb is out of data */
91  ISCSI_TCP_CONN_ERR, /* iscsi layer has fired a conn err */
92  ISCSI_TCP_SUSPENDED, /* conn is suspended */
93 };
94 
95 extern void iscsi_tcp_hdr_recv_prep(struct iscsi_tcp_conn *tcp_conn);
96 extern int iscsi_tcp_recv_skb(struct iscsi_conn *conn, struct sk_buff *skb,
97  unsigned int offset, bool offloaded, int *status);
98 extern void iscsi_tcp_cleanup_task(struct iscsi_task *task);
99 extern int iscsi_tcp_task_init(struct iscsi_task *task);
100 extern int iscsi_tcp_task_xmit(struct iscsi_task *task);
101 
102 /* segment helpers */
103 extern int iscsi_tcp_recv_segment_is_hdr(struct iscsi_tcp_conn *tcp_conn);
104 extern int iscsi_tcp_segment_done(struct iscsi_tcp_conn *tcp_conn,
105  struct iscsi_segment *segment, int recv,
106  unsigned copied);
107 extern void iscsi_tcp_segment_unmap(struct iscsi_segment *segment);
108 
110  void *data, size_t size,
112  struct hash_desc *hash);
113 extern int
115  struct scatterlist *sg_list, unsigned int sg_count,
116  unsigned int offset, size_t size,
118 
119 /* digest helpers */
120 extern void iscsi_tcp_dgst_header(struct hash_desc *hash, const void *hdr,
121  size_t hdrlen,
122  unsigned char digest[ISCSI_DIGEST_SIZE]);
123 extern struct iscsi_cls_conn *
124 iscsi_tcp_conn_setup(struct iscsi_cls_session *cls_session, int dd_data_size,
125  uint32_t conn_idx);
126 extern void iscsi_tcp_conn_teardown(struct iscsi_cls_conn *cls_conn);
127 
128 /* misc helpers */
129 extern int iscsi_tcp_r2tpool_alloc(struct iscsi_session *session);
130 extern void iscsi_tcp_r2tpool_free(struct iscsi_session *session);
131 extern int iscsi_tcp_set_max_r2t(struct iscsi_conn *conn, char *buf);
132 extern void iscsi_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,
133  struct iscsi_stats *stats);
134 #endif /* LIBISCSI_TCP_H */