#include <crypto/hash.h>
#include <linux/types.h>
#include <linux/inet.h>
#include <linux/slab.h>
#include <linux/sched/mm.h>
#include <linux/file.h>
#include <linux/blkdev.h>
#include <linux/delay.h>
#include <linux/kfifo.h>
#include <linux/scatterlist.h>
#include <linux/module.h>
#include <linux/backing-dev.h>
#include <net/tcp.h>
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>
#include <scsi/scsi.h>
#include <scsi/scsi_transport_iscsi.h>
#include <trace/events/iscsi.h>
#include <trace/events/sock.h>
#include "iscsi_tcp.h"
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
static struct scsi_transport_template *iscsi_sw_tcp_scsi_transport;
static const struct scsi_host_template iscsi_sw_tcp_sht;
static struct iscsi_transport iscsi_sw_tcp_transport;
static unsigned int iscsi_max_lun = …;
module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);
static bool iscsi_recv_from_iscsi_q;
module_param_named(recv_from_iscsi_q, iscsi_recv_from_iscsi_q, bool, 0644);
MODULE_PARM_DESC(…) …;
static int iscsi_sw_tcp_dbg;
module_param_named(debug_iscsi_tcp, iscsi_sw_tcp_dbg, int,
S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(…) …;
#define ISCSI_SW_TCP_DBG(_conn, dbg_fmt, arg...) …
static int iscsi_sw_tcp_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
unsigned int offset, size_t len)
{ … }
static inline int iscsi_sw_sk_state_check(struct sock *sk)
{ … }
static void iscsi_sw_tcp_recv_data(struct iscsi_conn *conn)
{ … }
static void iscsi_sw_tcp_recv_data_work(struct work_struct *work)
{ … }
static void iscsi_sw_tcp_data_ready(struct sock *sk)
{ … }
static void iscsi_sw_tcp_state_change(struct sock *sk)
{ … }
static void iscsi_sw_tcp_write_space(struct sock *sk)
{ … }
static void iscsi_sw_tcp_conn_set_callbacks(struct iscsi_conn *conn)
{ … }
static void
iscsi_sw_tcp_conn_restore_callbacks(struct iscsi_conn *conn)
{ … }
static int iscsi_sw_tcp_xmit_segment(struct iscsi_tcp_conn *tcp_conn,
struct iscsi_segment *segment)
{ … }
static int iscsi_sw_tcp_xmit(struct iscsi_conn *conn)
{ … }
static inline int iscsi_sw_tcp_xmit_qlen(struct iscsi_conn *conn)
{ … }
static int iscsi_sw_tcp_pdu_xmit(struct iscsi_task *task)
{ … }
static int iscsi_sw_tcp_send_hdr_done(struct iscsi_tcp_conn *tcp_conn,
struct iscsi_segment *segment)
{ … }
static void iscsi_sw_tcp_send_hdr_prep(struct iscsi_conn *conn, void *hdr,
size_t hdrlen)
{ … }
static int
iscsi_sw_tcp_send_data_prep(struct iscsi_conn *conn, struct scatterlist *sg,
unsigned int count, unsigned int offset,
unsigned int len)
{ … }
static void
iscsi_sw_tcp_send_linear_data_prep(struct iscsi_conn *conn, void *data,
size_t len)
{ … }
static int iscsi_sw_tcp_pdu_init(struct iscsi_task *task,
unsigned int offset, unsigned int count)
{ … }
static int iscsi_sw_tcp_pdu_alloc(struct iscsi_task *task, uint8_t opcode)
{ … }
static struct iscsi_cls_conn *
iscsi_sw_tcp_conn_create(struct iscsi_cls_session *cls_session,
uint32_t conn_idx)
{ … }
static void iscsi_sw_tcp_release_conn(struct iscsi_conn *conn)
{ … }
static void iscsi_sw_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn)
{ … }
static void iscsi_sw_tcp_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)
{ … }
static int
iscsi_sw_tcp_conn_bind(struct iscsi_cls_session *cls_session,
struct iscsi_cls_conn *cls_conn, uint64_t transport_eph,
int is_leading)
{ … }
static int iscsi_sw_tcp_conn_set_param(struct iscsi_cls_conn *cls_conn,
enum iscsi_param param, char *buf,
int buflen)
{ … }
static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
enum iscsi_param param, char *buf)
{ … }
static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,
enum iscsi_host_param param, char *buf)
{ … }
static void
iscsi_sw_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,
struct iscsi_stats *stats)
{ … }
static struct iscsi_cls_session *
iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
uint16_t qdepth, uint32_t initial_cmdsn)
{ … }
static void iscsi_sw_tcp_session_destroy(struct iscsi_cls_session *cls_session)
{ … }
static umode_t iscsi_sw_tcp_attr_is_visible(int param_type, int param)
{ … }
static int iscsi_sw_tcp_device_configure(struct scsi_device *sdev,
struct queue_limits *lim)
{ … }
static const struct scsi_host_template iscsi_sw_tcp_sht = …;
static struct iscsi_transport iscsi_sw_tcp_transport = …;
static int __init iscsi_sw_tcp_init(void)
{ … }
static void __exit iscsi_sw_tcp_exit(void)
{ … }
module_init(…) …;
module_exit(iscsi_sw_tcp_exit);