iscsi_tcp.c 27.4 KB
Newer Older
1 2 3 4 5
/*
 * iSCSI Initiator over TCP/IP Data-Path
 *
 * Copyright (C) 2004 Dmitry Yusupov
 * Copyright (C) 2004 Alex Aizman
6 7
 * Copyright (C) 2005 - 2006 Mike Christie
 * Copyright (C) 2006 Red Hat, Inc.  All rights reserved.
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 * maintained by open-iscsi@googlegroups.com
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published
 * by the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * See the file COPYING included with this distribution for more details.
 *
 * Credits:
 *	Christoph Hellwig
 *	FUJITA Tomonori
 *	Arne Redlich
 *	Zhenyu Wang
 */

#include <linux/types.h>
#include <linux/inet.h>
31
#include <linux/slab.h>
M
Mike Christie 已提交
32
#include <linux/file.h>
33 34 35 36 37 38 39
#include <linux/blkdev.h>
#include <linux/crypto.h>
#include <linux/delay.h>
#include <linux/kfifo.h>
#include <linux/scatterlist.h>
#include <net/tcp.h>
#include <scsi/scsi_cmnd.h>
40
#include <scsi/scsi_device.h>
41 42 43 44 45 46
#include <scsi/scsi_host.h>
#include <scsi/scsi.h>
#include <scsi/scsi_transport_iscsi.h>

#include "iscsi_tcp.h"

47 48
MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "
	      "Dmitry Yusupov <dmitry_yus@yahoo.com>, "
49 50 51 52
	      "Alex Aizman <itn780@yahoo.com>");
MODULE_DESCRIPTION("iSCSI/TCP data-path");
MODULE_LICENSE("GPL");

53 54 55
static struct scsi_transport_template *iscsi_sw_tcp_scsi_transport;
static struct scsi_host_template iscsi_sw_tcp_sht;
static struct iscsi_transport iscsi_sw_tcp_transport;
56

57 58 59
static unsigned int iscsi_max_lun = 512;
module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);

60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
static int iscsi_sw_tcp_dbg;
module_param_named(debug_iscsi_tcp, iscsi_sw_tcp_dbg, int,
		   S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug_iscsi_tcp, "Turn on debugging for iscsi_tcp module "
		 "Set to 1 to turn on, and zero to turn off. Default is off.");

#define ISCSI_SW_TCP_DBG(_conn, dbg_fmt, arg...)		\
	do {							\
		if (iscsi_sw_tcp_dbg)				\
			iscsi_conn_printk(KERN_INFO, _conn,	\
					     "%s " dbg_fmt,	\
					     __func__, ##arg);	\
	} while (0);


O
Olaf Kirch 已提交
75
/**
76
 * iscsi_sw_tcp_recv - TCP receive in sendfile fashion
77 78 79 80
 * @rd_desc: read descriptor
 * @skb: socket buffer
 * @offset: offset in skb
 * @len: skb->len - offset
81 82 83
 */
static int iscsi_sw_tcp_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
			     unsigned int offset, size_t len)
84 85 86 87 88
{
	struct iscsi_conn *conn = rd_desc->arg.data;
	unsigned int consumed, total_consumed = 0;
	int status;

89
	ISCSI_SW_TCP_DBG(conn, "in %d bytes\n", skb->len - offset);
90 91 92 93 94 95 96 97

	do {
		status = 0;
		consumed = iscsi_tcp_recv_skb(conn, skb, offset, 0, &status);
		offset += consumed;
		total_consumed += consumed;
	} while (consumed != 0 && status != ISCSI_TCP_SKB_DONE);

98 99
	ISCSI_SW_TCP_DBG(conn, "read %d bytes status %d\n",
			 skb->len - offset, status);
100
	return total_consumed;
101 102
}

103 104 105 106 107 108 109
/**
 * iscsi_sw_sk_state_check - check socket state
 * @sk: socket
 *
 * If the socket is in CLOSE or CLOSE_WAIT we should
 * not close the connection if there is still some
 * data pending.
110 111
 *
 * Must be called with sk_callback_lock.
112 113 114
 */
static inline int iscsi_sw_sk_state_check(struct sock *sk)
{
115
	struct iscsi_conn *conn = sk->sk_user_data;
116

117 118 119 120 121 122
	if ((sk->sk_state == TCP_CLOSE_WAIT || sk->sk_state == TCP_CLOSE) &&
	    !atomic_read(&sk->sk_rmem_alloc)) {
		ISCSI_SW_TCP_DBG(conn, "TCP_CLOSE|TCP_CLOSE_WAIT\n");
		iscsi_conn_failure(conn, ISCSI_ERR_TCP_CONN_CLOSE);
		return -ECONNRESET;
	}
123 124 125
	return 0;
}

126
static void iscsi_sw_tcp_data_ready(struct sock *sk, int flag)
127
{
128 129
	struct iscsi_conn *conn;
	struct iscsi_tcp_conn *tcp_conn;
130 131 132
	read_descriptor_t rd_desc;

	read_lock(&sk->sk_callback_lock);
133 134 135 136 137 138
	conn = sk->sk_user_data;
	if (!conn) {
		read_unlock(&sk->sk_callback_lock);
		return;
	}
	tcp_conn = conn->dd_data;
139

140
	/*
O
Olaf Kirch 已提交
141
	 * Use rd_desc to pass 'conn' to iscsi_tcp_recv.
142
	 * We set count to 1 because we want the network layer to
O
Olaf Kirch 已提交
143
	 * hand us all the skbs that are available. iscsi_tcp_recv
144 145
	 * handled pdus that cross buffers or pdus that still need data.
	 */
146
	rd_desc.arg.data = conn;
147
	rd_desc.count = 1;
148
	tcp_read_sock(sk, &rd_desc, iscsi_sw_tcp_recv);
149

150
	iscsi_sw_sk_state_check(sk);
151

O
Olaf Kirch 已提交
152 153
	/* If we had to (atomically) map a highmem page,
	 * unmap it now. */
154
	iscsi_tcp_segment_unmap(&tcp_conn->in.segment);
155
	read_unlock(&sk->sk_callback_lock);
156 157
}

158
static void iscsi_sw_tcp_state_change(struct sock *sk)
159
{
160
	struct iscsi_tcp_conn *tcp_conn;
161
	struct iscsi_sw_tcp_conn *tcp_sw_conn;
162 163 164 165 166
	struct iscsi_conn *conn;
	struct iscsi_session *session;
	void (*old_state_change)(struct sock *);

	read_lock(&sk->sk_callback_lock);
167 168 169 170 171
	conn = sk->sk_user_data;
	if (!conn) {
		read_unlock(&sk->sk_callback_lock);
		return;
	}
172 173
	session = conn->session;

174
	iscsi_sw_sk_state_check(sk);
175

176
	tcp_conn = conn->dd_data;
177 178
	tcp_sw_conn = tcp_conn->dd_data;
	old_state_change = tcp_sw_conn->old_state_change;
179 180 181 182 183 184 185 186 187 188

	read_unlock(&sk->sk_callback_lock);

	old_state_change(sk);
}

/**
 * iscsi_write_space - Called when more output buffer space is available
 * @sk: socket space is available for
 **/
189
static void iscsi_sw_tcp_write_space(struct sock *sk)
190
{
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
	struct iscsi_conn *conn;
	struct iscsi_tcp_conn *tcp_conn;
	struct iscsi_sw_tcp_conn *tcp_sw_conn;
	void (*old_write_space)(struct sock *);

	read_lock_bh(&sk->sk_callback_lock);
	conn = sk->sk_user_data;
	if (!conn) {
		read_unlock_bh(&sk->sk_callback_lock);
		return;
	}

	tcp_conn = conn->dd_data;
	tcp_sw_conn = tcp_conn->dd_data;
	old_write_space = tcp_sw_conn->old_write_space;
	read_unlock_bh(&sk->sk_callback_lock);

	old_write_space(sk);
209

210
	ISCSI_SW_TCP_DBG(conn, "iscsi_write_space\n");
211
	iscsi_conn_queue_work(conn);
212 213
}

214
static void iscsi_sw_tcp_conn_set_callbacks(struct iscsi_conn *conn)
215
{
216
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
217 218
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct sock *sk = tcp_sw_conn->sock->sk;
219 220 221 222

	/* assign new callbacks */
	write_lock_bh(&sk->sk_callback_lock);
	sk->sk_user_data = conn;
223 224 225 226 227 228
	tcp_sw_conn->old_data_ready = sk->sk_data_ready;
	tcp_sw_conn->old_state_change = sk->sk_state_change;
	tcp_sw_conn->old_write_space = sk->sk_write_space;
	sk->sk_data_ready = iscsi_sw_tcp_data_ready;
	sk->sk_state_change = iscsi_sw_tcp_state_change;
	sk->sk_write_space = iscsi_sw_tcp_write_space;
229 230 231
	write_unlock_bh(&sk->sk_callback_lock);
}

232
static void
233
iscsi_sw_tcp_conn_restore_callbacks(struct iscsi_conn *conn)
234
{
235 236
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
237
	struct sock *sk = tcp_sw_conn->sock->sk;
238 239 240 241

	/* restore socket callbacks, see also: iscsi_conn_set_callbacks() */
	write_lock_bh(&sk->sk_callback_lock);
	sk->sk_user_data    = NULL;
242 243 244
	sk->sk_data_ready   = tcp_sw_conn->old_data_ready;
	sk->sk_state_change = tcp_sw_conn->old_state_change;
	sk->sk_write_space  = tcp_sw_conn->old_write_space;
245 246 247 248 249
	sk->sk_no_check	 = 0;
	write_unlock_bh(&sk->sk_callback_lock);
}

/**
250
 * iscsi_sw_tcp_xmit_segment - transmit segment
251
 * @tcp_conn: the iSCSI TCP connection
252 253 254 255 256 257 258 259 260 261
 * @segment: the buffer to transmnit
 *
 * This function transmits as much of the buffer as
 * the network layer will accept, and returns the number of
 * bytes transmitted.
 *
 * If CRC hashing is enabled, the function will compute the
 * hash as it goes. When the entire segment has been transmitted,
 * it will retrieve the hash value and send it as well.
 */
262
static int iscsi_sw_tcp_xmit_segment(struct iscsi_tcp_conn *tcp_conn,
263 264
				     struct iscsi_segment *segment)
{
265
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
266 267 268 269
	struct socket *sk = tcp_sw_conn->sock;
	unsigned int copied = 0;
	int r = 0;

270
	while (!iscsi_tcp_segment_done(tcp_conn, segment, 0, r)) {
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
		struct scatterlist *sg;
		unsigned int offset, copy;
		int flags = 0;

		r = 0;
		offset = segment->copied;
		copy = segment->size - offset;

		if (segment->total_copied + segment->size < segment->total_size)
			flags |= MSG_MORE;

		/* Use sendpage if we can; else fall back to sendmsg */
		if (!segment->data) {
			sg = segment->sg;
			offset += segment->sg_offset + sg->offset;
			r = tcp_sw_conn->sendpage(sk, sg_page(sg), offset,
						  copy, flags);
		} else {
			struct msghdr msg = { .msg_flags = flags };
			struct kvec iov = {
				.iov_base = segment->data + offset,
				.iov_len = copy
			};

			r = kernel_sendmsg(sk, &msg, &iov, 1, copy);
		}

		if (r < 0) {
			iscsi_tcp_segment_unmap(segment);
			return r;
		}
		copied += r;
	}
	return copied;
}

/**
 * iscsi_sw_tcp_xmit - TCP transmit
309
 **/
310
static int iscsi_sw_tcp_xmit(struct iscsi_conn *conn)
311
{
312
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
313 314
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct iscsi_segment *segment = &tcp_sw_conn->out.segment;
315 316
	unsigned int consumed = 0;
	int rc = 0;
317

318
	while (1) {
319
		rc = iscsi_sw_tcp_xmit_segment(tcp_conn, segment);
320 321
		/*
		 * We may not have been able to send data because the conn
L
Lucas De Marchi 已提交
322
		 * is getting stopped. libiscsi will know so propagate err
323 324 325 326 327
		 * for it to do the right thing.
		 */
		if (rc == -EAGAIN)
			return rc;
		else if (rc < 0) {
328
			rc = ISCSI_ERR_XMIT_FAILED;
329
			goto error;
330
		} else if (rc == 0)
331 332 333 334 335 336 337
			break;

		consumed += rc;

		if (segment->total_copied >= segment->total_size) {
			if (segment->done != NULL) {
				rc = segment->done(tcp_conn, segment);
338
				if (rc != 0)
339 340 341
					goto error;
			}
		}
342 343
	}

344
	ISCSI_SW_TCP_DBG(conn, "xmit %d bytes\n", consumed);
345 346 347 348 349 350 351

	conn->txdata_octets += consumed;
	return consumed;

error:
	/* Transmit error. We could initiate error recovery
	 * here. */
352
	ISCSI_SW_TCP_DBG(conn, "Error sending PDU, errno=%d\n", rc);
353 354
	iscsi_conn_failure(conn, rc);
	return -EIO;
355 356 357
}

/**
358 359
 * iscsi_tcp_xmit_qlen - return the number of bytes queued for xmit
 */
360
static inline int iscsi_sw_tcp_xmit_qlen(struct iscsi_conn *conn)
361
{
362
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
363 364
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct iscsi_segment *segment = &tcp_sw_conn->out.segment;
365

366
	return segment->total_copied - segment->total_size;
367 368
}

369
static int iscsi_sw_tcp_pdu_xmit(struct iscsi_task *task)
370
{
371
	struct iscsi_conn *conn = task->conn;
372 373
	int rc;

374 375
	while (iscsi_sw_tcp_xmit_qlen(conn)) {
		rc = iscsi_sw_tcp_xmit(conn);
376
		if (rc == 0)
377
			return -EAGAIN;
378 379
		if (rc < 0)
			return rc;
380
	}
381

382
	return 0;
383 384
}

385 386 387 388
/*
 * This is called when we're done sending the header.
 * Simply copy the data_segment to the send segment, and return.
 */
389 390
static int iscsi_sw_tcp_send_hdr_done(struct iscsi_tcp_conn *tcp_conn,
				      struct iscsi_segment *segment)
391
{
392 393 394
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;

	tcp_sw_conn->out.segment = tcp_sw_conn->out.data_segment;
395 396 397 398
	ISCSI_SW_TCP_DBG(tcp_conn->iscsi_conn,
			 "Header done. Next segment size %u total_size %u\n",
			 tcp_sw_conn->out.segment.size,
			 tcp_sw_conn->out.segment.total_size);
399 400 401
	return 0;
}

402 403
static void iscsi_sw_tcp_send_hdr_prep(struct iscsi_conn *conn, void *hdr,
				       size_t hdrlen)
404 405
{
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
406
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
407

408 409
	ISCSI_SW_TCP_DBG(conn, "%s\n", conn->hdrdgst_en ?
			 "digest enabled" : "digest disabled");
410 411 412

	/* Clear the data segment - needs to be filled in by the
	 * caller using iscsi_tcp_send_data_prep() */
413 414
	memset(&tcp_sw_conn->out.data_segment, 0,
	       sizeof(struct iscsi_segment));
415 416 417

	/* If header digest is enabled, compute the CRC and
	 * place the digest into the same buffer. We make
418
	 * sure that both iscsi_tcp_task and mtask have
419 420 421
	 * sufficient room.
	 */
	if (conn->hdrdgst_en) {
422
		iscsi_tcp_dgst_header(&tcp_sw_conn->tx_hash, hdr, hdrlen,
423 424 425 426 427 428 429
				      hdr + hdrlen);
		hdrlen += ISCSI_DIGEST_SIZE;
	}

	/* Remember header pointer for later, when we need
	 * to decide whether there's a payload to go along
	 * with the header. */
430
	tcp_sw_conn->out.hdr = hdr;
431

432 433
	iscsi_segment_init_linear(&tcp_sw_conn->out.segment, hdr, hdrlen,
				  iscsi_sw_tcp_send_hdr_done, NULL);
434 435 436 437 438 439 440 441
}

/*
 * Prepare the send buffer for the payload data.
 * Padding and checksumming will all be taken care
 * of by the iscsi_segment routines.
 */
static int
442 443 444
iscsi_sw_tcp_send_data_prep(struct iscsi_conn *conn, struct scatterlist *sg,
			    unsigned int count, unsigned int offset,
			    unsigned int len)
445 446
{
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
447
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
448 449 450
	struct hash_desc *tx_hash = NULL;
	unsigned int hdr_spec_len;

451 452 453
	ISCSI_SW_TCP_DBG(conn, "offset=%d, datalen=%d %s\n", offset, len,
			 conn->datadgst_en ?
			 "digest enabled" : "digest disabled");
454 455 456

	/* Make sure the datalen matches what the caller
	   said he would send. */
457
	hdr_spec_len = ntoh24(tcp_sw_conn->out.hdr->dlength);
458 459 460
	WARN_ON(iscsi_padded(len) != iscsi_padded(hdr_spec_len));

	if (conn->datadgst_en)
461
		tx_hash = &tcp_sw_conn->tx_hash;
462

463 464 465
	return iscsi_segment_seek_sg(&tcp_sw_conn->out.data_segment,
				     sg, count, offset, len,
				     NULL, tx_hash);
466 467 468
}

static void
469
iscsi_sw_tcp_send_linear_data_prep(struct iscsi_conn *conn, void *data,
470 471 472
				   size_t len)
{
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
473
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
474 475 476
	struct hash_desc *tx_hash = NULL;
	unsigned int hdr_spec_len;

477 478
	ISCSI_SW_TCP_DBG(conn, "datalen=%zd %s\n", len, conn->datadgst_en ?
			 "digest enabled" : "digest disabled");
479 480 481

	/* Make sure the datalen matches what the caller
	   said he would send. */
482
	hdr_spec_len = ntoh24(tcp_sw_conn->out.hdr->dlength);
483 484 485
	WARN_ON(iscsi_padded(len) != iscsi_padded(hdr_spec_len));

	if (conn->datadgst_en)
486
		tx_hash = &tcp_sw_conn->tx_hash;
487

488
	iscsi_segment_init_linear(&tcp_sw_conn->out.data_segment,
489
				data, len, NULL, tx_hash);
490 491
}

492 493
static int iscsi_sw_tcp_pdu_init(struct iscsi_task *task,
				 unsigned int offset, unsigned int count)
494 495 496 497
{
	struct iscsi_conn *conn = task->conn;
	int err = 0;

498
	iscsi_sw_tcp_send_hdr_prep(conn, task->hdr, task->hdr_len);
499 500 501 502 503

	if (!count)
		return 0;

	if (!task->sc)
504
		iscsi_sw_tcp_send_linear_data_prep(conn, task->data, count);
505 506 507
	else {
		struct scsi_data_buffer *sdb = scsi_out(task->sc);

508 509 510
		err = iscsi_sw_tcp_send_data_prep(conn, sdb->table.sgl,
						  sdb->table.nents, offset,
						  count);
511 512 513
	}

	if (err) {
514
		/* got invalid offset/len */
515 516 517 518 519
		return -EIO;
	}
	return 0;
}

520
static int iscsi_sw_tcp_pdu_alloc(struct iscsi_task *task, uint8_t opcode)
521
{
522
	struct iscsi_tcp_task *tcp_task = task->dd_data;
523

524 525
	task->hdr = task->dd_data + sizeof(*tcp_task);
	task->hdr_max = sizeof(struct iscsi_sw_tcp_hdrbuf) - ISCSI_DIGEST_SIZE;
526
	return 0;
527 528
}

529
static struct iscsi_cls_conn *
530 531
iscsi_sw_tcp_conn_create(struct iscsi_cls_session *cls_session,
			 uint32_t conn_idx)
532
{
533 534 535
	struct iscsi_conn *conn;
	struct iscsi_cls_conn *cls_conn;
	struct iscsi_tcp_conn *tcp_conn;
536
	struct iscsi_sw_tcp_conn *tcp_sw_conn;
537

538 539
	cls_conn = iscsi_tcp_conn_setup(cls_session, sizeof(*tcp_sw_conn),
					conn_idx);
540 541 542
	if (!cls_conn)
		return NULL;
	conn = cls_conn->dd_data;
543
	tcp_conn = conn->dd_data;
544
	tcp_sw_conn = tcp_conn->dd_data;
545

546 547 548 549
	tcp_sw_conn->tx_hash.tfm = crypto_alloc_hash("crc32c", 0,
						     CRYPTO_ALG_ASYNC);
	tcp_sw_conn->tx_hash.flags = 0;
	if (IS_ERR(tcp_sw_conn->tx_hash.tfm))
550
		goto free_conn;
551

552 553 554 555
	tcp_sw_conn->rx_hash.tfm = crypto_alloc_hash("crc32c", 0,
						     CRYPTO_ALG_ASYNC);
	tcp_sw_conn->rx_hash.flags = 0;
	if (IS_ERR(tcp_sw_conn->rx_hash.tfm))
556
		goto free_tx_tfm;
557
	tcp_conn->rx_hash = &tcp_sw_conn->rx_hash;
558

559
	return cls_conn;
560

561
free_tx_tfm:
562
	crypto_free_hash(tcp_sw_conn->tx_hash.tfm);
563
free_conn:
564 565 566 567 568
	iscsi_conn_printk(KERN_ERR, conn,
			  "Could not create connection due to crc32c "
			  "loading error. Make sure the crc32c "
			  "module is built as a module or into the "
			  "kernel\n");
569
	iscsi_tcp_conn_teardown(cls_conn);
570
	return NULL;
571 572
}

573
static void iscsi_sw_tcp_release_conn(struct iscsi_conn *conn)
574
{
575
	struct iscsi_session *session = conn->session;
576
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
577 578
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct socket *sock = tcp_sw_conn->sock;
579

580
	if (!sock)
581 582
		return;

583
	sock_hold(sock->sk);
584
	iscsi_sw_tcp_conn_restore_callbacks(conn);
585
	sock_put(sock->sk);
586

587
	spin_lock_bh(&session->lock);
588
	tcp_sw_conn->sock = NULL;
589 590
	spin_unlock_bh(&session->lock);
	sockfd_put(sock);
591 592
}

593
static void iscsi_sw_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn)
594
{
595 596
	struct iscsi_conn *conn = cls_conn->dd_data;
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
597
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
598

599
	iscsi_sw_tcp_release_conn(conn);
600

601 602 603 604
	if (tcp_sw_conn->tx_hash.tfm)
		crypto_free_hash(tcp_sw_conn->tx_hash.tfm);
	if (tcp_sw_conn->rx_hash.tfm)
		crypto_free_hash(tcp_sw_conn->rx_hash.tfm);
605

606
	iscsi_tcp_conn_teardown(cls_conn);
607
}
608

609
static void iscsi_sw_tcp_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)
610 611
{
	struct iscsi_conn *conn = cls_conn->dd_data;
612
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
613
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
614
	struct socket *sock = tcp_sw_conn->sock;
615 616

	/* userspace may have goofed up and not bound us */
617
	if (!sock)
618
		return;
619

620 621
	sock->sk->sk_err = EIO;
	wake_up_interruptible(sk_sleep(sock->sk));
622

623 624 625 626
	/* stop xmit side */
	iscsi_suspend_tx(conn);

	/* stop recv side and release socket */
627
	iscsi_sw_tcp_release_conn(conn);
628 629

	iscsi_conn_stop(cls_conn, flag);
630 631
}

632
static int
633 634 635
iscsi_sw_tcp_conn_bind(struct iscsi_cls_session *cls_session,
		       struct iscsi_cls_conn *cls_conn, uint64_t transport_eph,
		       int is_leading)
636
{
637
	struct iscsi_session *session = cls_session->dd_data;
638 639
	struct iscsi_conn *conn = cls_conn->dd_data;
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
640
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
641 642 643
	struct sock *sk;
	struct socket *sock;
	int err;
644

645
	/* lookup for existing socket */
646
	sock = sockfd_lookup((int)transport_eph, &err);
647
	if (!sock) {
648 649
		iscsi_conn_printk(KERN_ERR, conn,
				  "sockfd_lookup failed %d\n", err);
650
		return -EEXIST;
651 652
	}

653 654
	err = iscsi_conn_bind(cls_session, cls_conn, is_leading);
	if (err)
655
		goto free_socket;
656

657
	spin_lock_bh(&session->lock);
658
	/* bind iSCSI connection and socket */
659
	tcp_sw_conn->sock = sock;
660
	spin_unlock_bh(&session->lock);
661

662 663 664 665 666
	/* setup Socket parameters */
	sk = sock->sk;
	sk->sk_reuse = 1;
	sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */
	sk->sk_allocation = GFP_ATOMIC;
667

668 669
	iscsi_sw_tcp_conn_set_callbacks(conn);
	tcp_sw_conn->sendpage = tcp_sw_conn->sock->ops->sendpage;
670 671 672
	/*
	 * set receive state machine into initial state
	 */
O
Olaf Kirch 已提交
673
	iscsi_tcp_hdr_recv_prep(tcp_conn);
674
	return 0;
675 676 677 678

free_socket:
	sockfd_put(sock);
	return err;
679 680
}

681 682 683
static int iscsi_sw_tcp_conn_set_param(struct iscsi_cls_conn *cls_conn,
				       enum iscsi_param param, char *buf,
				       int buflen)
684
{
685
	struct iscsi_conn *conn = cls_conn->dd_data;
686
	struct iscsi_session *session = conn->session;
687
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
688
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
689
	int value;
690 691 692

	switch(param) {
	case ISCSI_PARAM_HDRDGST_EN:
693
		iscsi_set_param(cls_conn, param, buf, buflen);
694 695
		break;
	case ISCSI_PARAM_DATADGST_EN:
696
		iscsi_set_param(cls_conn, param, buf, buflen);
697 698
		tcp_sw_conn->sendpage = conn->datadgst_en ?
			sock_no_sendpage : tcp_sw_conn->sock->ops->sendpage;
699 700
		break;
	case ISCSI_PARAM_MAX_R2T:
701
		sscanf(buf, "%d", &value);
702 703 704
		if (value <= 0 || !is_power_of_2(value))
			return -EINVAL;
		if (session->max_r2t == value)
705
			break;
706
		iscsi_tcp_r2tpool_free(session);
707
		iscsi_set_param(cls_conn, param, buf, buflen);
708
		if (iscsi_tcp_r2tpool_alloc(session))
709 710 711
			return -ENOMEM;
		break;
	default:
712
		return iscsi_set_param(cls_conn, param, buf, buflen);
713 714 715 716 717
	}

	return 0;
}

718 719
static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
				       enum iscsi_param param, char *buf)
720
{
721
	struct iscsi_conn *conn = cls_conn->dd_data;
722 723 724 725
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct sockaddr_in6 addr;
	int rc, len;
726 727

	switch(param) {
728 729
	case ISCSI_PARAM_CONN_PORT:
	case ISCSI_PARAM_CONN_ADDRESS:
730
		spin_lock_bh(&conn->session->lock);
731 732 733 734 735 736
		if (!tcp_sw_conn || !tcp_sw_conn->sock) {
			spin_unlock_bh(&conn->session->lock);
			return -ENOTCONN;
		}
		rc = kernel_getpeername(tcp_sw_conn->sock,
					(struct sockaddr *)&addr, &len);
737
		spin_unlock_bh(&conn->session->lock);
738 739 740 741 742
		if (rc)
			return rc;

		return iscsi_conn_get_addr_param((struct sockaddr_storage *)
						 &addr, param, buf);
743
	default:
744
		return iscsi_conn_get_param(cls_conn, param, buf);
745 746
	}

747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789
	return 0;
}

static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,
				       enum iscsi_host_param param, char *buf)
{
	struct iscsi_sw_tcp_host *tcp_sw_host = iscsi_host_priv(shost);
	struct iscsi_session *session = tcp_sw_host->session;
	struct iscsi_conn *conn;
	struct iscsi_tcp_conn *tcp_conn;
	struct iscsi_sw_tcp_conn *tcp_sw_conn;
	struct sockaddr_in6 addr;
	int rc, len;

	switch (param) {
	case ISCSI_HOST_PARAM_IPADDRESS:
		spin_lock_bh(&session->lock);
		conn = session->leadconn;
		if (!conn) {
			spin_unlock_bh(&session->lock);
			return -ENOTCONN;
		}
		tcp_conn = conn->dd_data;

		tcp_sw_conn = tcp_conn->dd_data;
		if (!tcp_sw_conn->sock) {
			spin_unlock_bh(&session->lock);
			return -ENOTCONN;
		}

		rc = kernel_getsockname(tcp_sw_conn->sock,
					(struct sockaddr *)&addr, &len);
		spin_unlock_bh(&session->lock);
		if (rc)
			return rc;

		return iscsi_conn_get_addr_param((struct sockaddr_storage *)
						 &addr, param, buf);
	default:
		return iscsi_host_get_param(shost, param, buf);
	}

	return 0;
790 791
}

792
static void
793 794
iscsi_sw_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,
			    struct iscsi_stats *stats)
795
{
796
	struct iscsi_conn *conn = cls_conn->dd_data;
797
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
798
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
799 800 801

	stats->custom_length = 3;
	strcpy(stats->custom[0].desc, "tx_sendpage_failures");
802
	stats->custom[0].value = tcp_sw_conn->sendpage_failures_cnt;
803
	strcpy(stats->custom[1].desc, "rx_discontiguous_hdr");
804
	stats->custom[1].value = tcp_sw_conn->discontiguous_hdr_cnt;
805 806
	strcpy(stats->custom[2].desc, "eh_abort_cnt");
	stats->custom[2].value = conn->eh_abort_cnt;
807 808

	iscsi_tcp_conn_get_stats(cls_conn, stats);
809 810
}

811
static struct iscsi_cls_session *
812
iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
813
			    uint16_t qdepth, uint32_t initial_cmdsn)
814
{
815 816
	struct iscsi_cls_session *cls_session;
	struct iscsi_session *session;
817
	struct iscsi_sw_tcp_host *tcp_sw_host;
818
	struct Scsi_Host *shost;
819

820 821
	if (ep) {
		printk(KERN_ERR "iscsi_tcp: invalid ep %p.\n", ep);
822 823 824
		return NULL;
	}

825 826
	shost = iscsi_host_alloc(&iscsi_sw_tcp_sht,
				 sizeof(struct iscsi_sw_tcp_host), 1);
827
	if (!shost)
828
		return NULL;
829
	shost->transportt = iscsi_sw_tcp_scsi_transport;
830
	shost->cmd_per_lun = qdepth;
831 832 833
	shost->max_lun = iscsi_max_lun;
	shost->max_id = 0;
	shost->max_channel = 0;
834
	shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;
835

836
	if (iscsi_host_add(shost, NULL))
837 838
		goto free_host;

839
	cls_session = iscsi_session_setup(&iscsi_sw_tcp_transport, shost,
840
					  cmds_max, 0,
841 842
					  sizeof(struct iscsi_tcp_task) +
					  sizeof(struct iscsi_sw_tcp_hdrbuf),
843
					  initial_cmdsn, 0);
844 845 846
	if (!cls_session)
		goto remove_host;
	session = cls_session->dd_data;
847 848
	tcp_sw_host = iscsi_host_priv(shost);
	tcp_sw_host->session = session;
849

850
	shost->can_queue = session->scsi_cmds_max;
851
	if (iscsi_tcp_r2tpool_alloc(session))
852
		goto remove_session;
853 854
	return cls_session;

855
remove_session:
856
	iscsi_session_teardown(cls_session);
857
remove_host:
858
	iscsi_host_remove(shost);
859
free_host:
860
	iscsi_host_free(shost);
861 862 863
	return NULL;
}

864
static void iscsi_sw_tcp_session_destroy(struct iscsi_cls_session *cls_session)
865
{
866 867
	struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);

868
	iscsi_tcp_r2tpool_free(cls_session->dd_data);
869
	iscsi_session_teardown(cls_session);
870

871 872
	iscsi_host_remove(shost);
	iscsi_host_free(shost);
873 874
}

875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890
static mode_t iscsi_sw_tcp_attr_is_visible(int param_type, int param)
{
	switch (param_type) {
	case ISCSI_PARAM:
		switch (param) {
		case ISCSI_PARAM_MAX_RECV_DLENGTH:
		case ISCSI_PARAM_MAX_XMIT_DLENGTH:
		case ISCSI_PARAM_HDRDGST_EN:
		case ISCSI_PARAM_DATADGST_EN:
		case ISCSI_PARAM_CONN_ADDRESS:
		case ISCSI_PARAM_CONN_PORT:
		case ISCSI_PARAM_EXP_STATSN:
		case ISCSI_PARAM_PERSISTENT_ADDRESS:
		case ISCSI_PARAM_PERSISTENT_PORT:
		case ISCSI_PARAM_PING_TMO:
		case ISCSI_PARAM_RECV_TMO:
891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910
		case ISCSI_PARAM_INITIAL_R2T_EN:
		case ISCSI_PARAM_MAX_R2T:
		case ISCSI_PARAM_IMM_DATA_EN:
		case ISCSI_PARAM_FIRST_BURST:
		case ISCSI_PARAM_MAX_BURST:
		case ISCSI_PARAM_PDU_INORDER_EN:
		case ISCSI_PARAM_DATASEQ_INORDER_EN:
		case ISCSI_PARAM_ERL:
		case ISCSI_PARAM_TARGET_NAME:
		case ISCSI_PARAM_TPGT:
		case ISCSI_PARAM_USERNAME:
		case ISCSI_PARAM_PASSWORD:
		case ISCSI_PARAM_USERNAME_IN:
		case ISCSI_PARAM_PASSWORD_IN:
		case ISCSI_PARAM_FAST_ABORT:
		case ISCSI_PARAM_ABORT_TMO:
		case ISCSI_PARAM_LU_RESET_TMO:
		case ISCSI_PARAM_TGT_RESET_TMO:
		case ISCSI_PARAM_IFACE_NAME:
		case ISCSI_PARAM_INITIATOR_NAME:
911 912 913 914 915 916 917 918 919
			return S_IRUGO;
		default:
			return 0;
		}
	}

	return 0;
}

P
Pete Wyckoff 已提交
920 921 922 923 924 925
static int iscsi_sw_tcp_slave_alloc(struct scsi_device *sdev)
{
	set_bit(QUEUE_FLAG_BIDI, &sdev->request_queue->queue_flags);
	return 0;
}

926
static int iscsi_sw_tcp_slave_configure(struct scsi_device *sdev)
927
{
928
	blk_queue_bounce_limit(sdev->request_queue, BLK_BOUNCE_ANY);
929 930 931 932
	blk_queue_dma_alignment(sdev->request_queue, 0);
	return 0;
}

933
static struct scsi_host_template iscsi_sw_tcp_sht = {
934
	.module			= THIS_MODULE,
935
	.name			= "iSCSI Initiator over TCP/IP",
936 937
	.queuecommand           = iscsi_queuecommand,
	.change_queue_depth	= iscsi_change_queue_depth,
938
	.can_queue		= ISCSI_DEF_XMIT_CMDS_MAX - 1,
939
	.sg_tablesize		= 4096,
940
	.max_sectors		= 0xFFFF,
941 942
	.cmd_per_lun		= ISCSI_DEF_CMD_PER_LUN,
	.eh_abort_handler       = iscsi_eh_abort,
943
	.eh_device_reset_handler= iscsi_eh_device_reset,
944
	.eh_target_reset_handler = iscsi_eh_recover_target,
945
	.use_clustering         = DISABLE_CLUSTERING,
P
Pete Wyckoff 已提交
946
	.slave_alloc            = iscsi_sw_tcp_slave_alloc,
947
	.slave_configure        = iscsi_sw_tcp_slave_configure,
948
	.target_alloc		= iscsi_target_alloc,
949 950 951 952
	.proc_name		= "iscsi_tcp",
	.this_id		= -1,
};

953
static struct iscsi_transport iscsi_sw_tcp_transport = {
954 955 956 957
	.owner			= THIS_MODULE,
	.name			= "tcp",
	.caps			= CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST
				  | CAP_DATADGST,
958
	.host_param_mask	= ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
959 960
				  ISCSI_HOST_INITIATOR_NAME |
				  ISCSI_HOST_NETDEV_NAME,
961
	/* session management */
962 963
	.create_session		= iscsi_sw_tcp_session_create,
	.destroy_session	= iscsi_sw_tcp_session_destroy,
964
	/* connection management */
965 966 967
	.create_conn		= iscsi_sw_tcp_conn_create,
	.bind_conn		= iscsi_sw_tcp_conn_bind,
	.destroy_conn		= iscsi_sw_tcp_conn_destroy,
968
	.attr_is_visible	= iscsi_sw_tcp_attr_is_visible,
969 970
	.set_param		= iscsi_sw_tcp_conn_set_param,
	.get_conn_param		= iscsi_sw_tcp_conn_get_param,
971
	.get_session_param	= iscsi_session_get_param,
972
	.start_conn		= iscsi_conn_start,
973
	.stop_conn		= iscsi_sw_tcp_conn_stop,
974
	/* iscsi host params */
975
	.get_host_param		= iscsi_sw_tcp_host_get_param,
976
	.set_host_param		= iscsi_host_set_param,
977
	/* IO */
978
	.send_pdu		= iscsi_conn_send_pdu,
979
	.get_stats		= iscsi_sw_tcp_conn_get_stats,
980
	/* iscsi task/cmd helpers */
981 982 983
	.init_task		= iscsi_tcp_task_init,
	.xmit_task		= iscsi_tcp_task_xmit,
	.cleanup_task		= iscsi_tcp_cleanup_task,
984
	/* low level pdu helpers */
985 986 987
	.xmit_pdu		= iscsi_sw_tcp_pdu_xmit,
	.init_pdu		= iscsi_sw_tcp_pdu_init,
	.alloc_pdu		= iscsi_sw_tcp_pdu_alloc,
988
	/* recovery */
M
Mike Christie 已提交
989
	.session_recovery_timedout = iscsi_session_recovery_timedout,
990 991
};

992
static int __init iscsi_sw_tcp_init(void)
993 994
{
	if (iscsi_max_lun < 1) {
O
Or Gerlitz 已提交
995 996
		printk(KERN_ERR "iscsi_tcp: Invalid max_lun value of %u\n",
		       iscsi_max_lun);
997 998 999
		return -EINVAL;
	}

1000 1001 1002
	iscsi_sw_tcp_scsi_transport = iscsi_register_transport(
						&iscsi_sw_tcp_transport);
	if (!iscsi_sw_tcp_scsi_transport)
1003
		return -ENODEV;
1004

1005
	return 0;
1006 1007
}

1008
static void __exit iscsi_sw_tcp_exit(void)
1009
{
1010
	iscsi_unregister_transport(&iscsi_sw_tcp_transport);
1011 1012
}

1013 1014
module_init(iscsi_sw_tcp_init);
module_exit(iscsi_sw_tcp_exit);