Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/scsi/libiscsi_tcp.h
10820 views
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
31
typedef int iscsi_segment_done_fn_t(struct iscsi_tcp_conn *,
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];
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
bool atomic_mapped;
51
52
iscsi_segment_done_fn_t *done;
53
};
54
55
/* Socket connection receive helper */
56
struct iscsi_tcp_recv {
57
struct iscsi_hdr *hdr;
58
struct iscsi_segment segment;
59
60
/* Allocate buffer for BHS + AHS */
61
uint32_t hdr_buf[64];
62
63
/* copied and flipped values */
64
int datalen;
65
};
66
67
struct iscsi_tcp_conn {
68
struct iscsi_conn *iscsi_conn;
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
79
struct iscsi_tcp_task {
80
uint32_t exp_datasn; /* expected target's R2TSN/DataSN */
81
int data_offset;
82
struct iscsi_r2t_info *r2t; /* in progress solict R2T */
83
struct iscsi_pool r2tpool;
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
109
extern void iscsi_segment_init_linear(struct iscsi_segment *segment,
110
void *data, size_t size,
111
iscsi_segment_done_fn_t *done,
112
struct hash_desc *hash);
113
extern int
114
iscsi_segment_seek_sg(struct iscsi_segment *segment,
115
struct scatterlist *sg_list, unsigned int sg_count,
116
unsigned int offset, size_t size,
117
iscsi_segment_done_fn_t *done, struct hash_desc *hash);
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
132
extern void iscsi_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,
133
struct iscsi_stats *stats);
134
#endif /* LIBISCSI_TCP_H */
135
136