Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/scsi/libiscsi_tcp.h
26285 views
1
/* SPDX-License-Identifier: GPL-2.0-or-later */
2
/*
3
* iSCSI over TCP/IP Data-Path lib
4
*
5
* Copyright (C) 2008 Mike Christie
6
* Copyright (C) 2008 Red Hat, Inc. All rights reserved.
7
* maintained by [email protected]
8
*/
9
10
#ifndef LIBISCSI_TCP_H
11
#define LIBISCSI_TCP_H
12
13
#include <scsi/libiscsi.h>
14
15
struct iscsi_tcp_conn;
16
struct iscsi_segment;
17
struct sk_buff;
18
19
typedef int iscsi_segment_done_fn_t(struct iscsi_tcp_conn *,
20
struct iscsi_segment *);
21
22
struct iscsi_segment {
23
unsigned char *data;
24
unsigned int size;
25
unsigned int copied;
26
unsigned int total_size;
27
unsigned int total_copied;
28
29
u32 *crcp;
30
unsigned char padbuf[ISCSI_PAD_LEN];
31
unsigned char recv_digest[ISCSI_DIGEST_SIZE];
32
unsigned char digest[ISCSI_DIGEST_SIZE];
33
unsigned int digest_len;
34
35
struct scatterlist *sg;
36
void *sg_mapped;
37
unsigned int sg_offset;
38
bool atomic_mapped;
39
40
iscsi_segment_done_fn_t *done;
41
};
42
43
/* Socket connection receive helper */
44
struct iscsi_tcp_recv {
45
struct iscsi_hdr *hdr;
46
struct iscsi_segment segment;
47
48
/* Allocate buffer for BHS + AHS */
49
uint32_t hdr_buf[64];
50
51
/* copied and flipped values */
52
int datalen;
53
};
54
55
struct iscsi_tcp_conn {
56
struct iscsi_conn *iscsi_conn;
57
void *dd_data;
58
int stop_stage; /* conn_stop() flag: *
59
* stop to recover, *
60
* stop to terminate */
61
/* control data */
62
struct iscsi_tcp_recv in; /* TCP receive context */
63
/* CRC32C (Rx) LLD should set this if they do not offload */
64
u32 *rx_crcp;
65
};
66
67
struct iscsi_tcp_task {
68
uint32_t exp_datasn; /* expected target's R2TSN/DataSN */
69
int data_offset;
70
struct iscsi_r2t_info *r2t; /* in progress solict R2T */
71
struct iscsi_pool r2tpool;
72
struct kfifo r2tqueue;
73
void *dd_data;
74
spinlock_t pool2queue;
75
spinlock_t queue2pool;
76
};
77
78
enum {
79
ISCSI_TCP_SEGMENT_DONE, /* curr seg has been processed */
80
ISCSI_TCP_SKB_DONE, /* skb is out of data */
81
ISCSI_TCP_CONN_ERR, /* iscsi layer has fired a conn err */
82
ISCSI_TCP_SUSPENDED, /* conn is suspended */
83
};
84
85
extern void iscsi_tcp_hdr_recv_prep(struct iscsi_tcp_conn *tcp_conn);
86
extern int iscsi_tcp_recv_skb(struct iscsi_conn *conn, struct sk_buff *skb,
87
unsigned int offset, bool offloaded, int *status);
88
extern void iscsi_tcp_cleanup_task(struct iscsi_task *task);
89
extern int iscsi_tcp_task_init(struct iscsi_task *task);
90
extern int iscsi_tcp_task_xmit(struct iscsi_task *task);
91
92
/* segment helpers */
93
extern int iscsi_tcp_recv_segment_is_hdr(struct iscsi_tcp_conn *tcp_conn);
94
extern int iscsi_tcp_segment_done(struct iscsi_tcp_conn *tcp_conn,
95
struct iscsi_segment *segment, int recv,
96
unsigned copied);
97
extern void iscsi_tcp_segment_unmap(struct iscsi_segment *segment);
98
99
extern void iscsi_segment_init_linear(struct iscsi_segment *segment,
100
void *data, size_t size,
101
iscsi_segment_done_fn_t *done, u32 *crcp);
102
extern int
103
iscsi_segment_seek_sg(struct iscsi_segment *segment,
104
struct scatterlist *sg_list, unsigned int sg_count,
105
unsigned int offset, size_t size,
106
iscsi_segment_done_fn_t *done, u32 *crcp);
107
108
/* digest helpers */
109
extern void iscsi_tcp_dgst_header(const void *hdr, size_t hdrlen,
110
unsigned char digest[ISCSI_DIGEST_SIZE]);
111
extern struct iscsi_cls_conn *
112
iscsi_tcp_conn_setup(struct iscsi_cls_session *cls_session, int dd_data_size,
113
uint32_t conn_idx);
114
extern void iscsi_tcp_conn_teardown(struct iscsi_cls_conn *cls_conn);
115
116
/* misc helpers */
117
extern int iscsi_tcp_r2tpool_alloc(struct iscsi_session *session);
118
extern void iscsi_tcp_r2tpool_free(struct iscsi_session *session);
119
extern int iscsi_tcp_set_max_r2t(struct iscsi_conn *conn, char *buf);
120
extern void iscsi_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,
121
struct iscsi_stats *stats);
122
#endif /* LIBISCSI_TCP_H */
123
124