cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

iscsi_tcp.c (29248B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * iSCSI Initiator over TCP/IP Data-Path
      4 *
      5 * Copyright (C) 2004 Dmitry Yusupov
      6 * Copyright (C) 2004 Alex Aizman
      7 * Copyright (C) 2005 - 2006 Mike Christie
      8 * Copyright (C) 2006 Red Hat, Inc.  All rights reserved.
      9 * maintained by open-iscsi@googlegroups.com
     10 *
     11 * See the file COPYING included with this distribution for more details.
     12 *
     13 * Credits:
     14 *	Christoph Hellwig
     15 *	FUJITA Tomonori
     16 *	Arne Redlich
     17 *	Zhenyu Wang
     18 */
     19
     20#include <crypto/hash.h>
     21#include <linux/types.h>
     22#include <linux/inet.h>
     23#include <linux/slab.h>
     24#include <linux/sched/mm.h>
     25#include <linux/file.h>
     26#include <linux/blkdev.h>
     27#include <linux/delay.h>
     28#include <linux/kfifo.h>
     29#include <linux/scatterlist.h>
     30#include <linux/module.h>
     31#include <linux/backing-dev.h>
     32#include <net/tcp.h>
     33#include <scsi/scsi_cmnd.h>
     34#include <scsi/scsi_device.h>
     35#include <scsi/scsi_host.h>
     36#include <scsi/scsi.h>
     37#include <scsi/scsi_transport_iscsi.h>
     38#include <trace/events/iscsi.h>
     39
     40#include "iscsi_tcp.h"
     41
     42MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "
     43	      "Dmitry Yusupov <dmitry_yus@yahoo.com>, "
     44	      "Alex Aizman <itn780@yahoo.com>");
     45MODULE_DESCRIPTION("iSCSI/TCP data-path");
     46MODULE_LICENSE("GPL");
     47
     48static struct scsi_transport_template *iscsi_sw_tcp_scsi_transport;
     49static struct scsi_host_template iscsi_sw_tcp_sht;
     50static struct iscsi_transport iscsi_sw_tcp_transport;
     51
     52static unsigned int iscsi_max_lun = ~0;
     53module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);
     54
     55static int iscsi_sw_tcp_dbg;
     56module_param_named(debug_iscsi_tcp, iscsi_sw_tcp_dbg, int,
     57		   S_IRUGO | S_IWUSR);
     58MODULE_PARM_DESC(debug_iscsi_tcp, "Turn on debugging for iscsi_tcp module "
     59		 "Set to 1 to turn on, and zero to turn off. Default is off.");
     60
     61#define ISCSI_SW_TCP_DBG(_conn, dbg_fmt, arg...)		\
     62	do {							\
     63		if (iscsi_sw_tcp_dbg)				\
     64			iscsi_conn_printk(KERN_INFO, _conn,	\
     65					     "%s " dbg_fmt,	\
     66					     __func__, ##arg);	\
     67		iscsi_dbg_trace(trace_iscsi_dbg_sw_tcp,		\
     68				&(_conn)->cls_conn->dev,	\
     69				"%s " dbg_fmt, __func__, ##arg);\
     70	} while (0);
     71
     72
     73/**
     74 * iscsi_sw_tcp_recv - TCP receive in sendfile fashion
     75 * @rd_desc: read descriptor
     76 * @skb: socket buffer
     77 * @offset: offset in skb
     78 * @len: skb->len - offset
     79 */
     80static int iscsi_sw_tcp_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
     81			     unsigned int offset, size_t len)
     82{
     83	struct iscsi_conn *conn = rd_desc->arg.data;
     84	unsigned int consumed, total_consumed = 0;
     85	int status;
     86
     87	ISCSI_SW_TCP_DBG(conn, "in %d bytes\n", skb->len - offset);
     88
     89	do {
     90		status = 0;
     91		consumed = iscsi_tcp_recv_skb(conn, skb, offset, 0, &status);
     92		offset += consumed;
     93		total_consumed += consumed;
     94	} while (consumed != 0 && status != ISCSI_TCP_SKB_DONE);
     95
     96	ISCSI_SW_TCP_DBG(conn, "read %d bytes status %d\n",
     97			 skb->len - offset, status);
     98	return total_consumed;
     99}
    100
    101/**
    102 * iscsi_sw_sk_state_check - check socket state
    103 * @sk: socket
    104 *
    105 * If the socket is in CLOSE or CLOSE_WAIT we should
    106 * not close the connection if there is still some
    107 * data pending.
    108 *
    109 * Must be called with sk_callback_lock.
    110 */
    111static inline int iscsi_sw_sk_state_check(struct sock *sk)
    112{
    113	struct iscsi_conn *conn = sk->sk_user_data;
    114
    115	if ((sk->sk_state == TCP_CLOSE_WAIT || sk->sk_state == TCP_CLOSE) &&
    116	    (conn->session->state != ISCSI_STATE_LOGGING_OUT) &&
    117	    !atomic_read(&sk->sk_rmem_alloc)) {
    118		ISCSI_SW_TCP_DBG(conn, "TCP_CLOSE|TCP_CLOSE_WAIT\n");
    119		iscsi_conn_failure(conn, ISCSI_ERR_TCP_CONN_CLOSE);
    120		return -ECONNRESET;
    121	}
    122	return 0;
    123}
    124
    125static void iscsi_sw_tcp_data_ready(struct sock *sk)
    126{
    127	struct iscsi_conn *conn;
    128	struct iscsi_tcp_conn *tcp_conn;
    129	read_descriptor_t rd_desc;
    130
    131	read_lock_bh(&sk->sk_callback_lock);
    132	conn = sk->sk_user_data;
    133	if (!conn) {
    134		read_unlock_bh(&sk->sk_callback_lock);
    135		return;
    136	}
    137	tcp_conn = conn->dd_data;
    138
    139	/*
    140	 * Use rd_desc to pass 'conn' to iscsi_tcp_recv.
    141	 * We set count to 1 because we want the network layer to
    142	 * hand us all the skbs that are available. iscsi_tcp_recv
    143	 * handled pdus that cross buffers or pdus that still need data.
    144	 */
    145	rd_desc.arg.data = conn;
    146	rd_desc.count = 1;
    147	tcp_read_sock(sk, &rd_desc, iscsi_sw_tcp_recv);
    148
    149	iscsi_sw_sk_state_check(sk);
    150
    151	/* If we had to (atomically) map a highmem page,
    152	 * unmap it now. */
    153	iscsi_tcp_segment_unmap(&tcp_conn->in.segment);
    154	read_unlock_bh(&sk->sk_callback_lock);
    155}
    156
    157static void iscsi_sw_tcp_state_change(struct sock *sk)
    158{
    159	struct iscsi_tcp_conn *tcp_conn;
    160	struct iscsi_sw_tcp_conn *tcp_sw_conn;
    161	struct iscsi_conn *conn;
    162	void (*old_state_change)(struct sock *);
    163
    164	read_lock_bh(&sk->sk_callback_lock);
    165	conn = sk->sk_user_data;
    166	if (!conn) {
    167		read_unlock_bh(&sk->sk_callback_lock);
    168		return;
    169	}
    170
    171	iscsi_sw_sk_state_check(sk);
    172
    173	tcp_conn = conn->dd_data;
    174	tcp_sw_conn = tcp_conn->dd_data;
    175	old_state_change = tcp_sw_conn->old_state_change;
    176
    177	read_unlock_bh(&sk->sk_callback_lock);
    178
    179	old_state_change(sk);
    180}
    181
    182/**
    183 * iscsi_sw_tcp_write_space - Called when more output buffer space is available
    184 * @sk: socket space is available for
    185 **/
    186static void iscsi_sw_tcp_write_space(struct sock *sk)
    187{
    188	struct iscsi_conn *conn;
    189	struct iscsi_tcp_conn *tcp_conn;
    190	struct iscsi_sw_tcp_conn *tcp_sw_conn;
    191	void (*old_write_space)(struct sock *);
    192
    193	read_lock_bh(&sk->sk_callback_lock);
    194	conn = sk->sk_user_data;
    195	if (!conn) {
    196		read_unlock_bh(&sk->sk_callback_lock);
    197		return;
    198	}
    199
    200	tcp_conn = conn->dd_data;
    201	tcp_sw_conn = tcp_conn->dd_data;
    202	old_write_space = tcp_sw_conn->old_write_space;
    203	read_unlock_bh(&sk->sk_callback_lock);
    204
    205	old_write_space(sk);
    206
    207	ISCSI_SW_TCP_DBG(conn, "iscsi_write_space\n");
    208	iscsi_conn_queue_work(conn);
    209}
    210
    211static void iscsi_sw_tcp_conn_set_callbacks(struct iscsi_conn *conn)
    212{
    213	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    214	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    215	struct sock *sk = tcp_sw_conn->sock->sk;
    216
    217	/* assign new callbacks */
    218	write_lock_bh(&sk->sk_callback_lock);
    219	sk->sk_user_data = conn;
    220	tcp_sw_conn->old_data_ready = sk->sk_data_ready;
    221	tcp_sw_conn->old_state_change = sk->sk_state_change;
    222	tcp_sw_conn->old_write_space = sk->sk_write_space;
    223	sk->sk_data_ready = iscsi_sw_tcp_data_ready;
    224	sk->sk_state_change = iscsi_sw_tcp_state_change;
    225	sk->sk_write_space = iscsi_sw_tcp_write_space;
    226	write_unlock_bh(&sk->sk_callback_lock);
    227}
    228
    229static void
    230iscsi_sw_tcp_conn_restore_callbacks(struct iscsi_conn *conn)
    231{
    232	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    233	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    234	struct sock *sk = tcp_sw_conn->sock->sk;
    235
    236	/* restore socket callbacks, see also: iscsi_conn_set_callbacks() */
    237	write_lock_bh(&sk->sk_callback_lock);
    238	sk->sk_user_data    = NULL;
    239	sk->sk_data_ready   = tcp_sw_conn->old_data_ready;
    240	sk->sk_state_change = tcp_sw_conn->old_state_change;
    241	sk->sk_write_space  = tcp_sw_conn->old_write_space;
    242	sk->sk_no_check_tx = 0;
    243	write_unlock_bh(&sk->sk_callback_lock);
    244}
    245
    246/**
    247 * iscsi_sw_tcp_xmit_segment - transmit segment
    248 * @tcp_conn: the iSCSI TCP connection
    249 * @segment: the buffer to transmnit
    250 *
    251 * This function transmits as much of the buffer as
    252 * the network layer will accept, and returns the number of
    253 * bytes transmitted.
    254 *
    255 * If CRC hashing is enabled, the function will compute the
    256 * hash as it goes. When the entire segment has been transmitted,
    257 * it will retrieve the hash value and send it as well.
    258 */
    259static int iscsi_sw_tcp_xmit_segment(struct iscsi_tcp_conn *tcp_conn,
    260				     struct iscsi_segment *segment)
    261{
    262	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    263	struct socket *sk = tcp_sw_conn->sock;
    264	unsigned int copied = 0;
    265	int r = 0;
    266
    267	while (!iscsi_tcp_segment_done(tcp_conn, segment, 0, r)) {
    268		struct scatterlist *sg;
    269		unsigned int offset, copy;
    270		int flags = 0;
    271
    272		r = 0;
    273		offset = segment->copied;
    274		copy = segment->size - offset;
    275
    276		if (segment->total_copied + segment->size < segment->total_size)
    277			flags |= MSG_MORE;
    278
    279		/* Use sendpage if we can; else fall back to sendmsg */
    280		if (!segment->data) {
    281			sg = segment->sg;
    282			offset += segment->sg_offset + sg->offset;
    283			r = tcp_sw_conn->sendpage(sk, sg_page(sg), offset,
    284						  copy, flags);
    285		} else {
    286			struct msghdr msg = { .msg_flags = flags };
    287			struct kvec iov = {
    288				.iov_base = segment->data + offset,
    289				.iov_len = copy
    290			};
    291
    292			r = kernel_sendmsg(sk, &msg, &iov, 1, copy);
    293		}
    294
    295		if (r < 0) {
    296			iscsi_tcp_segment_unmap(segment);
    297			return r;
    298		}
    299		copied += r;
    300	}
    301	return copied;
    302}
    303
    304/**
    305 * iscsi_sw_tcp_xmit - TCP transmit
    306 * @conn: iscsi connection
    307 **/
    308static int iscsi_sw_tcp_xmit(struct iscsi_conn *conn)
    309{
    310	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    311	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    312	struct iscsi_segment *segment = &tcp_sw_conn->out.segment;
    313	unsigned int consumed = 0;
    314	int rc = 0;
    315
    316	while (1) {
    317		rc = iscsi_sw_tcp_xmit_segment(tcp_conn, segment);
    318		/*
    319		 * We may not have been able to send data because the conn
    320		 * is getting stopped. libiscsi will know so propagate err
    321		 * for it to do the right thing.
    322		 */
    323		if (rc == -EAGAIN)
    324			return rc;
    325		else if (rc < 0) {
    326			rc = ISCSI_ERR_XMIT_FAILED;
    327			goto error;
    328		} else if (rc == 0)
    329			break;
    330
    331		consumed += rc;
    332
    333		if (segment->total_copied >= segment->total_size) {
    334			if (segment->done != NULL) {
    335				rc = segment->done(tcp_conn, segment);
    336				if (rc != 0)
    337					goto error;
    338			}
    339		}
    340	}
    341
    342	ISCSI_SW_TCP_DBG(conn, "xmit %d bytes\n", consumed);
    343
    344	conn->txdata_octets += consumed;
    345	return consumed;
    346
    347error:
    348	/* Transmit error. We could initiate error recovery
    349	 * here. */
    350	ISCSI_SW_TCP_DBG(conn, "Error sending PDU, errno=%d\n", rc);
    351	iscsi_conn_failure(conn, rc);
    352	return -EIO;
    353}
    354
    355/**
    356 * iscsi_sw_tcp_xmit_qlen - return the number of bytes queued for xmit
    357 * @conn: iscsi connection
    358 */
    359static inline int iscsi_sw_tcp_xmit_qlen(struct iscsi_conn *conn)
    360{
    361	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    362	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    363	struct iscsi_segment *segment = &tcp_sw_conn->out.segment;
    364
    365	return segment->total_copied - segment->total_size;
    366}
    367
    368static int iscsi_sw_tcp_pdu_xmit(struct iscsi_task *task)
    369{
    370	struct iscsi_conn *conn = task->conn;
    371	unsigned int noreclaim_flag;
    372	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    373	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    374	int rc = 0;
    375
    376	if (!tcp_sw_conn->sock) {
    377		iscsi_conn_printk(KERN_ERR, conn,
    378				  "Transport not bound to socket!\n");
    379		return -EINVAL;
    380	}
    381
    382	noreclaim_flag = memalloc_noreclaim_save();
    383
    384	while (iscsi_sw_tcp_xmit_qlen(conn)) {
    385		rc = iscsi_sw_tcp_xmit(conn);
    386		if (rc == 0) {
    387			rc = -EAGAIN;
    388			break;
    389		}
    390		if (rc < 0)
    391			break;
    392		rc = 0;
    393	}
    394
    395	memalloc_noreclaim_restore(noreclaim_flag);
    396	return rc;
    397}
    398
    399/*
    400 * This is called when we're done sending the header.
    401 * Simply copy the data_segment to the send segment, and return.
    402 */
    403static int iscsi_sw_tcp_send_hdr_done(struct iscsi_tcp_conn *tcp_conn,
    404				      struct iscsi_segment *segment)
    405{
    406	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    407
    408	tcp_sw_conn->out.segment = tcp_sw_conn->out.data_segment;
    409	ISCSI_SW_TCP_DBG(tcp_conn->iscsi_conn,
    410			 "Header done. Next segment size %u total_size %u\n",
    411			 tcp_sw_conn->out.segment.size,
    412			 tcp_sw_conn->out.segment.total_size);
    413	return 0;
    414}
    415
    416static void iscsi_sw_tcp_send_hdr_prep(struct iscsi_conn *conn, void *hdr,
    417				       size_t hdrlen)
    418{
    419	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    420	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    421
    422	ISCSI_SW_TCP_DBG(conn, "%s\n", conn->hdrdgst_en ?
    423			 "digest enabled" : "digest disabled");
    424
    425	/* Clear the data segment - needs to be filled in by the
    426	 * caller using iscsi_tcp_send_data_prep() */
    427	memset(&tcp_sw_conn->out.data_segment, 0,
    428	       sizeof(struct iscsi_segment));
    429
    430	/* If header digest is enabled, compute the CRC and
    431	 * place the digest into the same buffer. We make
    432	 * sure that both iscsi_tcp_task and mtask have
    433	 * sufficient room.
    434	 */
    435	if (conn->hdrdgst_en) {
    436		iscsi_tcp_dgst_header(tcp_sw_conn->tx_hash, hdr, hdrlen,
    437				      hdr + hdrlen);
    438		hdrlen += ISCSI_DIGEST_SIZE;
    439	}
    440
    441	/* Remember header pointer for later, when we need
    442	 * to decide whether there's a payload to go along
    443	 * with the header. */
    444	tcp_sw_conn->out.hdr = hdr;
    445
    446	iscsi_segment_init_linear(&tcp_sw_conn->out.segment, hdr, hdrlen,
    447				  iscsi_sw_tcp_send_hdr_done, NULL);
    448}
    449
    450/*
    451 * Prepare the send buffer for the payload data.
    452 * Padding and checksumming will all be taken care
    453 * of by the iscsi_segment routines.
    454 */
    455static int
    456iscsi_sw_tcp_send_data_prep(struct iscsi_conn *conn, struct scatterlist *sg,
    457			    unsigned int count, unsigned int offset,
    458			    unsigned int len)
    459{
    460	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    461	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    462	struct ahash_request *tx_hash = NULL;
    463	unsigned int hdr_spec_len;
    464
    465	ISCSI_SW_TCP_DBG(conn, "offset=%d, datalen=%d %s\n", offset, len,
    466			 conn->datadgst_en ?
    467			 "digest enabled" : "digest disabled");
    468
    469	/* Make sure the datalen matches what the caller
    470	   said he would send. */
    471	hdr_spec_len = ntoh24(tcp_sw_conn->out.hdr->dlength);
    472	WARN_ON(iscsi_padded(len) != iscsi_padded(hdr_spec_len));
    473
    474	if (conn->datadgst_en)
    475		tx_hash = tcp_sw_conn->tx_hash;
    476
    477	return iscsi_segment_seek_sg(&tcp_sw_conn->out.data_segment,
    478				     sg, count, offset, len,
    479				     NULL, tx_hash);
    480}
    481
    482static void
    483iscsi_sw_tcp_send_linear_data_prep(struct iscsi_conn *conn, void *data,
    484				   size_t len)
    485{
    486	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    487	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    488	struct ahash_request *tx_hash = NULL;
    489	unsigned int hdr_spec_len;
    490
    491	ISCSI_SW_TCP_DBG(conn, "datalen=%zd %s\n", len, conn->datadgst_en ?
    492			 "digest enabled" : "digest disabled");
    493
    494	/* Make sure the datalen matches what the caller
    495	   said he would send. */
    496	hdr_spec_len = ntoh24(tcp_sw_conn->out.hdr->dlength);
    497	WARN_ON(iscsi_padded(len) != iscsi_padded(hdr_spec_len));
    498
    499	if (conn->datadgst_en)
    500		tx_hash = tcp_sw_conn->tx_hash;
    501
    502	iscsi_segment_init_linear(&tcp_sw_conn->out.data_segment,
    503				data, len, NULL, tx_hash);
    504}
    505
    506static int iscsi_sw_tcp_pdu_init(struct iscsi_task *task,
    507				 unsigned int offset, unsigned int count)
    508{
    509	struct iscsi_conn *conn = task->conn;
    510	int err = 0;
    511
    512	iscsi_sw_tcp_send_hdr_prep(conn, task->hdr, task->hdr_len);
    513
    514	if (!count)
    515		return 0;
    516
    517	if (!task->sc)
    518		iscsi_sw_tcp_send_linear_data_prep(conn, task->data, count);
    519	else {
    520		struct scsi_data_buffer *sdb = &task->sc->sdb;
    521
    522		err = iscsi_sw_tcp_send_data_prep(conn, sdb->table.sgl,
    523						  sdb->table.nents, offset,
    524						  count);
    525	}
    526
    527	if (err) {
    528		/* got invalid offset/len */
    529		return -EIO;
    530	}
    531	return 0;
    532}
    533
    534static int iscsi_sw_tcp_pdu_alloc(struct iscsi_task *task, uint8_t opcode)
    535{
    536	struct iscsi_tcp_task *tcp_task = task->dd_data;
    537
    538	task->hdr = task->dd_data + sizeof(*tcp_task);
    539	task->hdr_max = sizeof(struct iscsi_sw_tcp_hdrbuf) - ISCSI_DIGEST_SIZE;
    540	return 0;
    541}
    542
    543static struct iscsi_cls_conn *
    544iscsi_sw_tcp_conn_create(struct iscsi_cls_session *cls_session,
    545			 uint32_t conn_idx)
    546{
    547	struct iscsi_conn *conn;
    548	struct iscsi_cls_conn *cls_conn;
    549	struct iscsi_tcp_conn *tcp_conn;
    550	struct iscsi_sw_tcp_conn *tcp_sw_conn;
    551	struct crypto_ahash *tfm;
    552
    553	cls_conn = iscsi_tcp_conn_setup(cls_session, sizeof(*tcp_sw_conn),
    554					conn_idx);
    555	if (!cls_conn)
    556		return NULL;
    557	conn = cls_conn->dd_data;
    558	tcp_conn = conn->dd_data;
    559	tcp_sw_conn = tcp_conn->dd_data;
    560
    561	tfm = crypto_alloc_ahash("crc32c", 0, CRYPTO_ALG_ASYNC);
    562	if (IS_ERR(tfm))
    563		goto free_conn;
    564
    565	tcp_sw_conn->tx_hash = ahash_request_alloc(tfm, GFP_KERNEL);
    566	if (!tcp_sw_conn->tx_hash)
    567		goto free_tfm;
    568	ahash_request_set_callback(tcp_sw_conn->tx_hash, 0, NULL, NULL);
    569
    570	tcp_sw_conn->rx_hash = ahash_request_alloc(tfm, GFP_KERNEL);
    571	if (!tcp_sw_conn->rx_hash)
    572		goto free_tx_hash;
    573	ahash_request_set_callback(tcp_sw_conn->rx_hash, 0, NULL, NULL);
    574
    575	tcp_conn->rx_hash = tcp_sw_conn->rx_hash;
    576
    577	return cls_conn;
    578
    579free_tx_hash:
    580	ahash_request_free(tcp_sw_conn->tx_hash);
    581free_tfm:
    582	crypto_free_ahash(tfm);
    583free_conn:
    584	iscsi_conn_printk(KERN_ERR, conn,
    585			  "Could not create connection due to crc32c "
    586			  "loading error. Make sure the crc32c "
    587			  "module is built as a module or into the "
    588			  "kernel\n");
    589	iscsi_tcp_conn_teardown(cls_conn);
    590	return NULL;
    591}
    592
    593static void iscsi_sw_tcp_release_conn(struct iscsi_conn *conn)
    594{
    595	struct iscsi_session *session = conn->session;
    596	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    597	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    598	struct socket *sock = tcp_sw_conn->sock;
    599
    600	if (!sock)
    601		return;
    602
    603	/*
    604	 * Make sure we start socket shutdown now in case userspace is up
    605	 * but delayed in releasing the socket.
    606	 */
    607	kernel_sock_shutdown(sock, SHUT_RDWR);
    608
    609	sock_hold(sock->sk);
    610	iscsi_sw_tcp_conn_restore_callbacks(conn);
    611	sock_put(sock->sk);
    612
    613	spin_lock_bh(&session->frwd_lock);
    614	tcp_sw_conn->sock = NULL;
    615	spin_unlock_bh(&session->frwd_lock);
    616	sockfd_put(sock);
    617}
    618
    619static void iscsi_sw_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn)
    620{
    621	struct iscsi_conn *conn = cls_conn->dd_data;
    622	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    623	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    624
    625	iscsi_sw_tcp_release_conn(conn);
    626
    627	ahash_request_free(tcp_sw_conn->rx_hash);
    628	if (tcp_sw_conn->tx_hash) {
    629		struct crypto_ahash *tfm;
    630
    631		tfm = crypto_ahash_reqtfm(tcp_sw_conn->tx_hash);
    632		ahash_request_free(tcp_sw_conn->tx_hash);
    633		crypto_free_ahash(tfm);
    634	}
    635
    636	iscsi_tcp_conn_teardown(cls_conn);
    637}
    638
    639static void iscsi_sw_tcp_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)
    640{
    641	struct iscsi_conn *conn = cls_conn->dd_data;
    642	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    643	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    644	struct socket *sock = tcp_sw_conn->sock;
    645
    646	/* userspace may have goofed up and not bound us */
    647	if (!sock)
    648		return;
    649
    650	sock->sk->sk_err = EIO;
    651	wake_up_interruptible(sk_sleep(sock->sk));
    652
    653	/* stop xmit side */
    654	iscsi_suspend_tx(conn);
    655
    656	/* stop recv side and release socket */
    657	iscsi_sw_tcp_release_conn(conn);
    658
    659	iscsi_conn_stop(cls_conn, flag);
    660}
    661
    662static int
    663iscsi_sw_tcp_conn_bind(struct iscsi_cls_session *cls_session,
    664		       struct iscsi_cls_conn *cls_conn, uint64_t transport_eph,
    665		       int is_leading)
    666{
    667	struct iscsi_session *session = cls_session->dd_data;
    668	struct iscsi_conn *conn = cls_conn->dd_data;
    669	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    670	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    671	struct sock *sk;
    672	struct socket *sock;
    673	int err;
    674
    675	/* lookup for existing socket */
    676	sock = sockfd_lookup((int)transport_eph, &err);
    677	if (!sock) {
    678		iscsi_conn_printk(KERN_ERR, conn,
    679				  "sockfd_lookup failed %d\n", err);
    680		return -EEXIST;
    681	}
    682
    683	err = iscsi_conn_bind(cls_session, cls_conn, is_leading);
    684	if (err)
    685		goto free_socket;
    686
    687	spin_lock_bh(&session->frwd_lock);
    688	/* bind iSCSI connection and socket */
    689	tcp_sw_conn->sock = sock;
    690	spin_unlock_bh(&session->frwd_lock);
    691
    692	/* setup Socket parameters */
    693	sk = sock->sk;
    694	sk->sk_reuse = SK_CAN_REUSE;
    695	sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */
    696	sk->sk_allocation = GFP_ATOMIC;
    697	sk_set_memalloc(sk);
    698	sock_no_linger(sk);
    699
    700	iscsi_sw_tcp_conn_set_callbacks(conn);
    701	tcp_sw_conn->sendpage = tcp_sw_conn->sock->ops->sendpage;
    702	/*
    703	 * set receive state machine into initial state
    704	 */
    705	iscsi_tcp_hdr_recv_prep(tcp_conn);
    706	return 0;
    707
    708free_socket:
    709	sockfd_put(sock);
    710	return err;
    711}
    712
    713static int iscsi_sw_tcp_conn_set_param(struct iscsi_cls_conn *cls_conn,
    714				       enum iscsi_param param, char *buf,
    715				       int buflen)
    716{
    717	struct iscsi_conn *conn = cls_conn->dd_data;
    718	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    719	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    720
    721	switch(param) {
    722	case ISCSI_PARAM_HDRDGST_EN:
    723		iscsi_set_param(cls_conn, param, buf, buflen);
    724		break;
    725	case ISCSI_PARAM_DATADGST_EN:
    726		iscsi_set_param(cls_conn, param, buf, buflen);
    727		tcp_sw_conn->sendpage = conn->datadgst_en ?
    728			sock_no_sendpage : tcp_sw_conn->sock->ops->sendpage;
    729		break;
    730	case ISCSI_PARAM_MAX_R2T:
    731		return iscsi_tcp_set_max_r2t(conn, buf);
    732	default:
    733		return iscsi_set_param(cls_conn, param, buf, buflen);
    734	}
    735
    736	return 0;
    737}
    738
    739static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
    740				       enum iscsi_param param, char *buf)
    741{
    742	struct iscsi_conn *conn = cls_conn->dd_data;
    743	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    744	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    745	struct sockaddr_in6 addr;
    746	struct socket *sock;
    747	int rc;
    748
    749	switch(param) {
    750	case ISCSI_PARAM_CONN_PORT:
    751	case ISCSI_PARAM_CONN_ADDRESS:
    752	case ISCSI_PARAM_LOCAL_PORT:
    753		spin_lock_bh(&conn->session->frwd_lock);
    754		if (!tcp_sw_conn || !tcp_sw_conn->sock) {
    755			spin_unlock_bh(&conn->session->frwd_lock);
    756			return -ENOTCONN;
    757		}
    758		sock = tcp_sw_conn->sock;
    759		sock_hold(sock->sk);
    760		spin_unlock_bh(&conn->session->frwd_lock);
    761
    762		if (param == ISCSI_PARAM_LOCAL_PORT)
    763			rc = kernel_getsockname(sock,
    764						(struct sockaddr *)&addr);
    765		else
    766			rc = kernel_getpeername(sock,
    767						(struct sockaddr *)&addr);
    768		sock_put(sock->sk);
    769		if (rc < 0)
    770			return rc;
    771
    772		return iscsi_conn_get_addr_param((struct sockaddr_storage *)
    773						 &addr, param, buf);
    774	default:
    775		return iscsi_conn_get_param(cls_conn, param, buf);
    776	}
    777
    778	return 0;
    779}
    780
    781static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,
    782				       enum iscsi_host_param param, char *buf)
    783{
    784	struct iscsi_sw_tcp_host *tcp_sw_host = iscsi_host_priv(shost);
    785	struct iscsi_session *session = tcp_sw_host->session;
    786	struct iscsi_conn *conn;
    787	struct iscsi_tcp_conn *tcp_conn;
    788	struct iscsi_sw_tcp_conn *tcp_sw_conn;
    789	struct sockaddr_in6 addr;
    790	struct socket *sock;
    791	int rc;
    792
    793	switch (param) {
    794	case ISCSI_HOST_PARAM_IPADDRESS:
    795		if (!session)
    796			return -ENOTCONN;
    797
    798		spin_lock_bh(&session->frwd_lock);
    799		conn = session->leadconn;
    800		if (!conn) {
    801			spin_unlock_bh(&session->frwd_lock);
    802			return -ENOTCONN;
    803		}
    804		tcp_conn = conn->dd_data;
    805		tcp_sw_conn = tcp_conn->dd_data;
    806		sock = tcp_sw_conn->sock;
    807		if (!sock) {
    808			spin_unlock_bh(&session->frwd_lock);
    809			return -ENOTCONN;
    810		}
    811		sock_hold(sock->sk);
    812		spin_unlock_bh(&session->frwd_lock);
    813
    814		rc = kernel_getsockname(sock,
    815					(struct sockaddr *)&addr);
    816		sock_put(sock->sk);
    817		if (rc < 0)
    818			return rc;
    819
    820		return iscsi_conn_get_addr_param((struct sockaddr_storage *)
    821						 &addr,
    822						 (enum iscsi_param)param, buf);
    823	default:
    824		return iscsi_host_get_param(shost, param, buf);
    825	}
    826
    827	return 0;
    828}
    829
    830static void
    831iscsi_sw_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,
    832			    struct iscsi_stats *stats)
    833{
    834	struct iscsi_conn *conn = cls_conn->dd_data;
    835	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
    836	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
    837
    838	stats->custom_length = 3;
    839	strcpy(stats->custom[0].desc, "tx_sendpage_failures");
    840	stats->custom[0].value = tcp_sw_conn->sendpage_failures_cnt;
    841	strcpy(stats->custom[1].desc, "rx_discontiguous_hdr");
    842	stats->custom[1].value = tcp_sw_conn->discontiguous_hdr_cnt;
    843	strcpy(stats->custom[2].desc, "eh_abort_cnt");
    844	stats->custom[2].value = conn->eh_abort_cnt;
    845
    846	iscsi_tcp_conn_get_stats(cls_conn, stats);
    847}
    848
    849static struct iscsi_cls_session *
    850iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
    851			    uint16_t qdepth, uint32_t initial_cmdsn)
    852{
    853	struct iscsi_cls_session *cls_session;
    854	struct iscsi_session *session;
    855	struct iscsi_sw_tcp_host *tcp_sw_host;
    856	struct Scsi_Host *shost;
    857	int rc;
    858
    859	if (ep) {
    860		printk(KERN_ERR "iscsi_tcp: invalid ep %p.\n", ep);
    861		return NULL;
    862	}
    863
    864	shost = iscsi_host_alloc(&iscsi_sw_tcp_sht,
    865				 sizeof(struct iscsi_sw_tcp_host), 1);
    866	if (!shost)
    867		return NULL;
    868	shost->transportt = iscsi_sw_tcp_scsi_transport;
    869	shost->cmd_per_lun = qdepth;
    870	shost->max_lun = iscsi_max_lun;
    871	shost->max_id = 0;
    872	shost->max_channel = 0;
    873	shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;
    874
    875	rc = iscsi_host_get_max_scsi_cmds(shost, cmds_max);
    876	if (rc < 0)
    877		goto free_host;
    878	shost->can_queue = rc;
    879
    880	if (iscsi_host_add(shost, NULL))
    881		goto free_host;
    882
    883	cls_session = iscsi_session_setup(&iscsi_sw_tcp_transport, shost,
    884					  cmds_max, 0,
    885					  sizeof(struct iscsi_tcp_task) +
    886					  sizeof(struct iscsi_sw_tcp_hdrbuf),
    887					  initial_cmdsn, 0);
    888	if (!cls_session)
    889		goto remove_host;
    890	session = cls_session->dd_data;
    891	tcp_sw_host = iscsi_host_priv(shost);
    892	tcp_sw_host->session = session;
    893
    894	if (iscsi_tcp_r2tpool_alloc(session))
    895		goto remove_session;
    896	return cls_session;
    897
    898remove_session:
    899	iscsi_session_teardown(cls_session);
    900remove_host:
    901	iscsi_host_remove(shost);
    902free_host:
    903	iscsi_host_free(shost);
    904	return NULL;
    905}
    906
    907static void iscsi_sw_tcp_session_destroy(struct iscsi_cls_session *cls_session)
    908{
    909	struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
    910	struct iscsi_session *session = cls_session->dd_data;
    911
    912	if (WARN_ON_ONCE(session->leadconn))
    913		return;
    914
    915	iscsi_tcp_r2tpool_free(cls_session->dd_data);
    916	iscsi_session_teardown(cls_session);
    917
    918	iscsi_host_remove(shost);
    919	iscsi_host_free(shost);
    920}
    921
    922static umode_t iscsi_sw_tcp_attr_is_visible(int param_type, int param)
    923{
    924	switch (param_type) {
    925	case ISCSI_HOST_PARAM:
    926		switch (param) {
    927		case ISCSI_HOST_PARAM_NETDEV_NAME:
    928		case ISCSI_HOST_PARAM_HWADDRESS:
    929		case ISCSI_HOST_PARAM_IPADDRESS:
    930		case ISCSI_HOST_PARAM_INITIATOR_NAME:
    931			return S_IRUGO;
    932		default:
    933			return 0;
    934		}
    935	case ISCSI_PARAM:
    936		switch (param) {
    937		case ISCSI_PARAM_MAX_RECV_DLENGTH:
    938		case ISCSI_PARAM_MAX_XMIT_DLENGTH:
    939		case ISCSI_PARAM_HDRDGST_EN:
    940		case ISCSI_PARAM_DATADGST_EN:
    941		case ISCSI_PARAM_CONN_ADDRESS:
    942		case ISCSI_PARAM_CONN_PORT:
    943		case ISCSI_PARAM_LOCAL_PORT:
    944		case ISCSI_PARAM_EXP_STATSN:
    945		case ISCSI_PARAM_PERSISTENT_ADDRESS:
    946		case ISCSI_PARAM_PERSISTENT_PORT:
    947		case ISCSI_PARAM_PING_TMO:
    948		case ISCSI_PARAM_RECV_TMO:
    949		case ISCSI_PARAM_INITIAL_R2T_EN:
    950		case ISCSI_PARAM_MAX_R2T:
    951		case ISCSI_PARAM_IMM_DATA_EN:
    952		case ISCSI_PARAM_FIRST_BURST:
    953		case ISCSI_PARAM_MAX_BURST:
    954		case ISCSI_PARAM_PDU_INORDER_EN:
    955		case ISCSI_PARAM_DATASEQ_INORDER_EN:
    956		case ISCSI_PARAM_ERL:
    957		case ISCSI_PARAM_TARGET_NAME:
    958		case ISCSI_PARAM_TPGT:
    959		case ISCSI_PARAM_USERNAME:
    960		case ISCSI_PARAM_PASSWORD:
    961		case ISCSI_PARAM_USERNAME_IN:
    962		case ISCSI_PARAM_PASSWORD_IN:
    963		case ISCSI_PARAM_FAST_ABORT:
    964		case ISCSI_PARAM_ABORT_TMO:
    965		case ISCSI_PARAM_LU_RESET_TMO:
    966		case ISCSI_PARAM_TGT_RESET_TMO:
    967		case ISCSI_PARAM_IFACE_NAME:
    968		case ISCSI_PARAM_INITIATOR_NAME:
    969			return S_IRUGO;
    970		default:
    971			return 0;
    972		}
    973	}
    974
    975	return 0;
    976}
    977
    978static int iscsi_sw_tcp_slave_configure(struct scsi_device *sdev)
    979{
    980	struct iscsi_sw_tcp_host *tcp_sw_host = iscsi_host_priv(sdev->host);
    981	struct iscsi_session *session = tcp_sw_host->session;
    982	struct iscsi_conn *conn = session->leadconn;
    983
    984	if (conn->datadgst_en)
    985		blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES,
    986				   sdev->request_queue);
    987	blk_queue_dma_alignment(sdev->request_queue, 0);
    988	return 0;
    989}
    990
    991static struct scsi_host_template iscsi_sw_tcp_sht = {
    992	.module			= THIS_MODULE,
    993	.name			= "iSCSI Initiator over TCP/IP",
    994	.queuecommand           = iscsi_queuecommand,
    995	.change_queue_depth	= scsi_change_queue_depth,
    996	.can_queue		= ISCSI_TOTAL_CMDS_MAX,
    997	.sg_tablesize		= 4096,
    998	.max_sectors		= 0xFFFF,
    999	.cmd_per_lun		= ISCSI_DEF_CMD_PER_LUN,
   1000	.eh_timed_out		= iscsi_eh_cmd_timed_out,
   1001	.eh_abort_handler       = iscsi_eh_abort,
   1002	.eh_device_reset_handler= iscsi_eh_device_reset,
   1003	.eh_target_reset_handler = iscsi_eh_recover_target,
   1004	.dma_boundary		= PAGE_SIZE - 1,
   1005	.slave_configure        = iscsi_sw_tcp_slave_configure,
   1006	.target_alloc		= iscsi_target_alloc,
   1007	.proc_name		= "iscsi_tcp",
   1008	.this_id		= -1,
   1009	.track_queue_depth	= 1,
   1010	.cmd_size		= sizeof(struct iscsi_cmd),
   1011};
   1012
   1013static struct iscsi_transport iscsi_sw_tcp_transport = {
   1014	.owner			= THIS_MODULE,
   1015	.name			= "tcp",
   1016	.caps			= CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST
   1017				  | CAP_DATADGST,
   1018	/* session management */
   1019	.create_session		= iscsi_sw_tcp_session_create,
   1020	.destroy_session	= iscsi_sw_tcp_session_destroy,
   1021	/* connection management */
   1022	.create_conn		= iscsi_sw_tcp_conn_create,
   1023	.bind_conn		= iscsi_sw_tcp_conn_bind,
   1024	.destroy_conn		= iscsi_sw_tcp_conn_destroy,
   1025	.attr_is_visible	= iscsi_sw_tcp_attr_is_visible,
   1026	.set_param		= iscsi_sw_tcp_conn_set_param,
   1027	.get_conn_param		= iscsi_sw_tcp_conn_get_param,
   1028	.get_session_param	= iscsi_session_get_param,
   1029	.start_conn		= iscsi_conn_start,
   1030	.stop_conn		= iscsi_sw_tcp_conn_stop,
   1031	/* iscsi host params */
   1032	.get_host_param		= iscsi_sw_tcp_host_get_param,
   1033	.set_host_param		= iscsi_host_set_param,
   1034	/* IO */
   1035	.send_pdu		= iscsi_conn_send_pdu,
   1036	.get_stats		= iscsi_sw_tcp_conn_get_stats,
   1037	/* iscsi task/cmd helpers */
   1038	.init_task		= iscsi_tcp_task_init,
   1039	.xmit_task		= iscsi_tcp_task_xmit,
   1040	.cleanup_task		= iscsi_tcp_cleanup_task,
   1041	/* low level pdu helpers */
   1042	.xmit_pdu		= iscsi_sw_tcp_pdu_xmit,
   1043	.init_pdu		= iscsi_sw_tcp_pdu_init,
   1044	.alloc_pdu		= iscsi_sw_tcp_pdu_alloc,
   1045	/* recovery */
   1046	.session_recovery_timedout = iscsi_session_recovery_timedout,
   1047};
   1048
   1049static int __init iscsi_sw_tcp_init(void)
   1050{
   1051	if (iscsi_max_lun < 1) {
   1052		printk(KERN_ERR "iscsi_tcp: Invalid max_lun value of %u\n",
   1053		       iscsi_max_lun);
   1054		return -EINVAL;
   1055	}
   1056
   1057	iscsi_sw_tcp_scsi_transport = iscsi_register_transport(
   1058						&iscsi_sw_tcp_transport);
   1059	if (!iscsi_sw_tcp_scsi_transport)
   1060		return -ENODEV;
   1061
   1062	return 0;
   1063}
   1064
   1065static void __exit iscsi_sw_tcp_exit(void)
   1066{
   1067	iscsi_unregister_transport(&iscsi_sw_tcp_transport);
   1068}
   1069
   1070module_init(iscsi_sw_tcp_init);
   1071module_exit(iscsi_sw_tcp_exit);