Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * iSCSI over TCP/IP Data-Path lib
0004  *
0005  * Copyright (C) 2008 Mike Christie
0006  * Copyright (C) 2008 Red Hat, Inc.  All rights reserved.
0007  * maintained by open-iscsi@googlegroups.com
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 /* Socket connection receive helper */
0045 struct iscsi_tcp_recv {
0046     struct iscsi_hdr    *hdr;
0047     struct iscsi_segment    segment;
0048 
0049     /* Allocate buffer for BHS + AHS */
0050     uint32_t        hdr_buf[64];
0051 
0052     /* copied and flipped values */
0053     int         datalen;
0054 };
0055 
0056 struct iscsi_tcp_conn {
0057     struct iscsi_conn   *iscsi_conn;
0058     void            *dd_data;
0059     int         stop_stage; /* conn_stop() flag: *
0060                          * stop to recover,  *
0061                          * stop to terminate */
0062     /* control data */
0063     struct iscsi_tcp_recv   in;     /* TCP receive context */
0064     /* CRC32C (Rx) LLD should set this is they do not offload */
0065     struct ahash_request    *rx_hash;
0066 };
0067 
0068 struct iscsi_tcp_task {
0069     uint32_t        exp_datasn; /* expected target's R2TSN/DataSN */
0070     int         data_offset;
0071     struct iscsi_r2t_info   *r2t;       /* in progress solict 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,     /* curr seg has been processed */
0081     ISCSI_TCP_SKB_DONE,     /* skb is out of data */
0082     ISCSI_TCP_CONN_ERR,     /* iscsi layer has fired a conn err */
0083     ISCSI_TCP_SUSPENDED,        /* conn is 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 /* segment helpers */
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 /* digest helpers */
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 /* misc helpers */
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 /* LIBISCSI_TCP_H */