iscsi_tcp.c 25.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>
M
Mike Christie 已提交
31
#include <linux/file.h>
32 33 34 35 36 37 38
#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>
39
#include <scsi/scsi_device.h>
40 41 42 43 44 45
#include <scsi/scsi_host.h>
#include <scsi/scsi.h>
#include <scsi/scsi_transport_iscsi.h>

#include "iscsi_tcp.h"

46 47
MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "
	      "Dmitry Yusupov <dmitry_yus@yahoo.com>, "
48 49 50
	      "Alex Aizman <itn780@yahoo.com>");
MODULE_DESCRIPTION("iSCSI/TCP data-path");
MODULE_LICENSE("GPL");
O
Olaf Kirch 已提交
51
#undef DEBUG_TCP
52 53

#ifdef DEBUG_TCP
54
#define debug_tcp(fmt...) printk(KERN_INFO "tcp: " fmt)
55 56 57 58
#else
#define debug_tcp(fmt...)
#endif

59 60 61
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;
62

63 64 65
static unsigned int iscsi_max_lun = 512;
module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);

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

	debug_tcp("in %d bytes\n", skb->len - offset);

	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);

	debug_tcp("read %d bytes status %d\n", skb->len - offset, status);
	return total_consumed;
91 92
}

93
static void iscsi_sw_tcp_data_ready(struct sock *sk, int flag)
94 95
{
	struct iscsi_conn *conn = sk->sk_user_data;
O
Olaf Kirch 已提交
96
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
97 98 99 100
	read_descriptor_t rd_desc;

	read_lock(&sk->sk_callback_lock);

101
	/*
O
Olaf Kirch 已提交
102
	 * Use rd_desc to pass 'conn' to iscsi_tcp_recv.
103
	 * We set count to 1 because we want the network layer to
O
Olaf Kirch 已提交
104
	 * hand us all the skbs that are available. iscsi_tcp_recv
105 106
	 * handled pdus that cross buffers or pdus that still need data.
	 */
107
	rd_desc.arg.data = conn;
108
	rd_desc.count = 1;
109
	tcp_read_sock(sk, &rd_desc, iscsi_sw_tcp_recv);
110 111

	read_unlock(&sk->sk_callback_lock);
O
Olaf Kirch 已提交
112 113 114

	/* If we had to (atomically) map a highmem page,
	 * unmap it now. */
115
	iscsi_tcp_segment_unmap(&tcp_conn->in.segment);
116 117
}

118
static void iscsi_sw_tcp_state_change(struct sock *sk)
119
{
120
	struct iscsi_tcp_conn *tcp_conn;
121
	struct iscsi_sw_tcp_conn *tcp_sw_conn;
122 123 124 125 126 127 128 129 130
	struct iscsi_conn *conn;
	struct iscsi_session *session;
	void (*old_state_change)(struct sock *);

	read_lock(&sk->sk_callback_lock);

	conn = (struct iscsi_conn*)sk->sk_user_data;
	session = conn->session;

M
Mike Christie 已提交
131 132 133
	if ((sk->sk_state == TCP_CLOSE_WAIT ||
	     sk->sk_state == TCP_CLOSE) &&
	    !atomic_read(&sk->sk_rmem_alloc)) {
134 135 136 137
		debug_tcp("iscsi_tcp_state_change: TCP_CLOSE|TCP_CLOSE_WAIT\n");
		iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
	}

138
	tcp_conn = conn->dd_data;
139 140
	tcp_sw_conn = tcp_conn->dd_data;
	old_state_change = tcp_sw_conn->old_state_change;
141 142 143 144 145 146 147 148 149 150

	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
 **/
151
static void iscsi_sw_tcp_write_space(struct sock *sk)
152 153
{
	struct iscsi_conn *conn = (struct iscsi_conn*)sk->sk_user_data;
154
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
155
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
156

157
	tcp_sw_conn->old_write_space(sk);
158
	debug_tcp("iscsi_write_space: cid %d\n", conn->id);
159
	scsi_queue_work(conn->session->host, &conn->xmitwork);
160 161
}

162
static void iscsi_sw_tcp_conn_set_callbacks(struct iscsi_conn *conn)
163
{
164
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
165 166
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct sock *sk = tcp_sw_conn->sock->sk;
167 168 169 170

	/* assign new callbacks */
	write_lock_bh(&sk->sk_callback_lock);
	sk->sk_user_data = conn;
171 172 173 174 175 176
	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;
177 178 179
	write_unlock_bh(&sk->sk_callback_lock);
}

180 181
static void
iscsi_sw_tcp_conn_restore_callbacks(struct iscsi_sw_tcp_conn *tcp_sw_conn)
182
{
183
	struct sock *sk = tcp_sw_conn->sock->sk;
184 185 186 187

	/* restore socket callbacks, see also: iscsi_conn_set_callbacks() */
	write_lock_bh(&sk->sk_callback_lock);
	sk->sk_user_data    = NULL;
188 189 190
	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;
191 192 193 194 195
	sk->sk_no_check	 = 0;
	write_unlock_bh(&sk->sk_callback_lock);
}

/**
196
 * iscsi_sw_tcp_xmit_segment - transmit segment
197
 * @tcp_conn: the iSCSI TCP connection
198 199 200 201 202 203 204 205 206 207
 * @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.
 */
208
static int iscsi_sw_tcp_xmit_segment(struct iscsi_tcp_conn *tcp_conn,
209 210
				     struct iscsi_segment *segment)
{
211
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
212 213 214 215
	struct socket *sk = tcp_sw_conn->sock;
	unsigned int copied = 0;
	int r = 0;

216
	while (!iscsi_tcp_segment_done(tcp_conn, segment, 0, r)) {
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
		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);
			if (copied || r == -EAGAIN)
				break;
			return r;
		}
		copied += r;
	}
	return copied;
}

/**
 * iscsi_sw_tcp_xmit - TCP transmit
257
 **/
258
static int iscsi_sw_tcp_xmit(struct iscsi_conn *conn)
259
{
260
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
261 262
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct iscsi_segment *segment = &tcp_sw_conn->out.segment;
263 264
	unsigned int consumed = 0;
	int rc = 0;
265

266
	while (1) {
267
		rc = iscsi_sw_tcp_xmit_segment(tcp_conn, segment);
268 269
		if (rc < 0) {
			rc = ISCSI_ERR_XMIT_FAILED;
270
			goto error;
271
		}
272 273 274 275 276 277 278 279
		if (rc == 0)
			break;

		consumed += rc;

		if (segment->total_copied >= segment->total_size) {
			if (segment->done != NULL) {
				rc = segment->done(tcp_conn, segment);
280
				if (rc != 0)
281 282 283
					goto error;
			}
		}
284 285
	}

286 287 288 289 290 291 292 293 294
	debug_tcp("xmit %d bytes\n", consumed);

	conn->txdata_octets += consumed;
	return consumed;

error:
	/* Transmit error. We could initiate error recovery
	 * here. */
	debug_tcp("Error sending PDU, errno=%d\n", rc);
295 296
	iscsi_conn_failure(conn, rc);
	return -EIO;
297 298 299
}

/**
300 301
 * iscsi_tcp_xmit_qlen - return the number of bytes queued for xmit
 */
302
static inline int iscsi_sw_tcp_xmit_qlen(struct iscsi_conn *conn)
303
{
304
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
305 306
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct iscsi_segment *segment = &tcp_sw_conn->out.segment;
307

308
	return segment->total_copied - segment->total_size;
309 310
}

311
static int iscsi_sw_tcp_pdu_xmit(struct iscsi_task *task)
312
{
313
	struct iscsi_conn *conn = task->conn;
314 315
	int rc;

316 317
	while (iscsi_sw_tcp_xmit_qlen(conn)) {
		rc = iscsi_sw_tcp_xmit(conn);
318
		if (rc == 0)
319
			return -EAGAIN;
320 321
		if (rc < 0)
			return rc;
322
	}
323

324
	return 0;
325 326
}

327 328 329 330
/*
 * This is called when we're done sending the header.
 * Simply copy the data_segment to the send segment, and return.
 */
331 332
static int iscsi_sw_tcp_send_hdr_done(struct iscsi_tcp_conn *tcp_conn,
				      struct iscsi_segment *segment)
333
{
334 335 336
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;

	tcp_sw_conn->out.segment = tcp_sw_conn->out.data_segment;
337
	debug_tcp("Header done. Next segment size %u total_size %u\n",
338 339
		  tcp_sw_conn->out.segment.size,
		  tcp_sw_conn->out.segment.total_size);
340 341 342
	return 0;
}

343 344
static void iscsi_sw_tcp_send_hdr_prep(struct iscsi_conn *conn, void *hdr,
				       size_t hdrlen)
345 346
{
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
347
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
348

349
	debug_tcp("%s(%p%s)\n", __func__, tcp_conn,
350 351 352 353
			conn->hdrdgst_en? ", digest enabled" : "");

	/* Clear the data segment - needs to be filled in by the
	 * caller using iscsi_tcp_send_data_prep() */
354 355
	memset(&tcp_sw_conn->out.data_segment, 0,
	       sizeof(struct iscsi_segment));
356 357 358

	/* If header digest is enabled, compute the CRC and
	 * place the digest into the same buffer. We make
359
	 * sure that both iscsi_tcp_task and mtask have
360 361 362
	 * sufficient room.
	 */
	if (conn->hdrdgst_en) {
363
		iscsi_tcp_dgst_header(&tcp_sw_conn->tx_hash, hdr, hdrlen,
364 365 366 367 368 369 370
				      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. */
371
	tcp_sw_conn->out.hdr = hdr;
372

373 374
	iscsi_segment_init_linear(&tcp_sw_conn->out.segment, hdr, hdrlen,
				  iscsi_sw_tcp_send_hdr_done, NULL);
375 376 377 378 379 380 381 382
}

/*
 * Prepare the send buffer for the payload data.
 * Padding and checksumming will all be taken care
 * of by the iscsi_segment routines.
 */
static int
383 384 385
iscsi_sw_tcp_send_data_prep(struct iscsi_conn *conn, struct scatterlist *sg,
			    unsigned int count, unsigned int offset,
			    unsigned int len)
386 387
{
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
388
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
389 390 391
	struct hash_desc *tx_hash = NULL;
	unsigned int hdr_spec_len;

392
	debug_tcp("%s(%p, offset=%d, datalen=%d%s)\n", __func__,
393 394 395 396 397
			tcp_conn, offset, len,
			conn->datadgst_en? ", digest enabled" : "");

	/* Make sure the datalen matches what the caller
	   said he would send. */
398
	hdr_spec_len = ntoh24(tcp_sw_conn->out.hdr->dlength);
399 400 401
	WARN_ON(iscsi_padded(len) != iscsi_padded(hdr_spec_len));

	if (conn->datadgst_en)
402
		tx_hash = &tcp_sw_conn->tx_hash;
403

404 405 406
	return iscsi_segment_seek_sg(&tcp_sw_conn->out.data_segment,
				     sg, count, offset, len,
				     NULL, tx_hash);
407 408 409
}

static void
410
iscsi_sw_tcp_send_linear_data_prep(struct iscsi_conn *conn, void *data,
411 412 413
				   size_t len)
{
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
414
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
415 416 417
	struct hash_desc *tx_hash = NULL;
	unsigned int hdr_spec_len;

418
	debug_tcp("%s(%p, datalen=%d%s)\n", __func__, tcp_conn, len,
419 420 421 422
		  conn->datadgst_en? ", digest enabled" : "");

	/* Make sure the datalen matches what the caller
	   said he would send. */
423
	hdr_spec_len = ntoh24(tcp_sw_conn->out.hdr->dlength);
424 425 426
	WARN_ON(iscsi_padded(len) != iscsi_padded(hdr_spec_len));

	if (conn->datadgst_en)
427
		tx_hash = &tcp_sw_conn->tx_hash;
428

429
	iscsi_segment_init_linear(&tcp_sw_conn->out.data_segment,
430
				data, len, NULL, tx_hash);
431 432
}

433 434
static int iscsi_sw_tcp_pdu_init(struct iscsi_task *task,
				 unsigned int offset, unsigned int count)
435 436 437 438
{
	struct iscsi_conn *conn = task->conn;
	int err = 0;

439
	iscsi_sw_tcp_send_hdr_prep(conn, task->hdr, task->hdr_len);
440 441 442 443 444

	if (!count)
		return 0;

	if (!task->sc)
445
		iscsi_sw_tcp_send_linear_data_prep(conn, task->data, count);
446 447 448
	else {
		struct scsi_data_buffer *sdb = scsi_out(task->sc);

449 450 451
		err = iscsi_sw_tcp_send_data_prep(conn, sdb->table.sgl,
						  sdb->table.nents, offset,
						  count);
452 453 454 455 456 457 458 459 460
	}

	if (err) {
		iscsi_conn_failure(conn, err);
		return -EIO;
	}
	return 0;
}

461
static int iscsi_sw_tcp_pdu_alloc(struct iscsi_task *task, uint8_t opcode)
462
{
463
	struct iscsi_tcp_task *tcp_task = task->dd_data;
464

465 466
	task->hdr = task->dd_data + sizeof(*tcp_task);
	task->hdr_max = sizeof(struct iscsi_sw_tcp_hdrbuf) - ISCSI_DIGEST_SIZE;
467
	return 0;
468 469
}

470
static struct iscsi_cls_conn *
471 472
iscsi_sw_tcp_conn_create(struct iscsi_cls_session *cls_session,
			 uint32_t conn_idx)
473
{
474 475 476
	struct iscsi_conn *conn;
	struct iscsi_cls_conn *cls_conn;
	struct iscsi_tcp_conn *tcp_conn;
477
	struct iscsi_sw_tcp_conn *tcp_sw_conn;
478

479 480
	cls_conn = iscsi_tcp_conn_setup(cls_session, sizeof(*tcp_sw_conn),
					conn_idx);
481 482 483
	if (!cls_conn)
		return NULL;
	conn = cls_conn->dd_data;
484
	tcp_conn = conn->dd_data;
485
	tcp_sw_conn = tcp_conn->dd_data;
486

487 488 489 490
	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))
491
		goto free_conn;
492

493 494 495 496
	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))
497
		goto free_tx_tfm;
498
	tcp_conn->rx_hash = &tcp_sw_conn->rx_hash;
499

500
	return cls_conn;
501

502
free_tx_tfm:
503
	crypto_free_hash(tcp_sw_conn->tx_hash.tfm);
504
free_conn:
505 506 507 508 509
	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");
510
	iscsi_tcp_conn_teardown(cls_conn);
511
	return NULL;
512 513
}

514
static void iscsi_sw_tcp_release_conn(struct iscsi_conn *conn)
515
{
516
	struct iscsi_session *session = conn->session;
517
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
518 519
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct socket *sock = tcp_sw_conn->sock;
520

521
	if (!sock)
522 523
		return;

524
	sock_hold(sock->sk);
525
	iscsi_sw_tcp_conn_restore_callbacks(tcp_sw_conn);
526
	sock_put(sock->sk);
527

528
	spin_lock_bh(&session->lock);
529
	tcp_sw_conn->sock = NULL;
530 531
	spin_unlock_bh(&session->lock);
	sockfd_put(sock);
532 533
}

534
static void iscsi_sw_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn)
535
{
536 537
	struct iscsi_conn *conn = cls_conn->dd_data;
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
538
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
539

540
	iscsi_sw_tcp_release_conn(conn);
541

542 543 544 545
	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);
546

547
	iscsi_tcp_conn_teardown(cls_conn);
548
}
549

550
static void iscsi_sw_tcp_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)
551 552
{
	struct iscsi_conn *conn = cls_conn->dd_data;
553
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
554
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
555 556

	/* userspace may have goofed up and not bound us */
557
	if (!tcp_sw_conn->sock)
558 559 560 561 562 563
		return;
	/*
	 * Make sure our recv side is stopped.
	 * Older tools called conn stop before ep_disconnect
	 * so IO could still be coming in.
	 */
564
	write_lock_bh(&tcp_sw_conn->sock->sk->sk_callback_lock);
565
	set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx);
566
	write_unlock_bh(&tcp_sw_conn->sock->sk->sk_callback_lock);
567 568

	iscsi_conn_stop(cls_conn, flag);
569
	iscsi_sw_tcp_release_conn(conn);
570 571
}

572 573 574 575 576
static int iscsi_sw_tcp_get_addr(struct iscsi_conn *conn, struct socket *sock,
				 char *buf, int *port,
				 int (*getname)(struct socket *,
						struct sockaddr *,
						int *addrlen))
577 578 579 580 581 582
{
	struct sockaddr_storage *addr;
	struct sockaddr_in6 *sin6;
	struct sockaddr_in *sin;
	int rc = 0, len;

583
	addr = kmalloc(sizeof(*addr), GFP_KERNEL);
584 585 586 587 588 589 590 591 592 593 594 595
	if (!addr)
		return -ENOMEM;

	if (getname(sock, (struct sockaddr *) addr, &len)) {
		rc = -ENODEV;
		goto free_addr;
	}

	switch (addr->ss_family) {
	case AF_INET:
		sin = (struct sockaddr_in *)addr;
		spin_lock_bh(&conn->session->lock);
H
Harvey Harrison 已提交
596
		sprintf(buf, "%pI4", &sin->sin_addr.s_addr);
597 598 599 600 601 602
		*port = be16_to_cpu(sin->sin_port);
		spin_unlock_bh(&conn->session->lock);
		break;
	case AF_INET6:
		sin6 = (struct sockaddr_in6 *)addr;
		spin_lock_bh(&conn->session->lock);
H
Harvey Harrison 已提交
603
		sprintf(buf, "%pI6", &sin6->sin6_addr);
604 605 606 607 608 609 610 611 612
		*port = be16_to_cpu(sin6->sin6_port);
		spin_unlock_bh(&conn->session->lock);
		break;
	}
free_addr:
	kfree(addr);
	return rc;
}

613
static int
614 615 616
iscsi_sw_tcp_conn_bind(struct iscsi_cls_session *cls_session,
		       struct iscsi_cls_conn *cls_conn, uint64_t transport_eph,
		       int is_leading)
617
{
618 619
	struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
	struct iscsi_host *ihost = shost_priv(shost);
620 621
	struct iscsi_conn *conn = cls_conn->dd_data;
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
622
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
623 624 625
	struct sock *sk;
	struct socket *sock;
	int err;
626

627
	/* lookup for existing socket */
628
	sock = sockfd_lookup((int)transport_eph, &err);
629
	if (!sock) {
630 631
		iscsi_conn_printk(KERN_ERR, conn,
				  "sockfd_lookup failed %d\n", err);
632
		return -EEXIST;
633
	}
634 635 636 637 638
	/*
	 * copy these values now because if we drop the session
	 * userspace may still want to query the values since we will
	 * be using them for the reconnect
	 */
639 640
	err = iscsi_sw_tcp_get_addr(conn, sock, conn->portal_address,
				    &conn->portal_port, kernel_getpeername);
641 642 643
	if (err)
		goto free_socket;

644 645
	err = iscsi_sw_tcp_get_addr(conn, sock, ihost->local_address,
				    &ihost->local_port, kernel_getsockname);
646 647
	if (err)
		goto free_socket;
648

649 650
	err = iscsi_conn_bind(cls_session, cls_conn, is_leading);
	if (err)
651
		goto free_socket;
652

653
	/* bind iSCSI connection and socket */
654
	tcp_sw_conn->sock = sock;
655

656 657 658 659 660
	/* setup Socket parameters */
	sk = sock->sk;
	sk->sk_reuse = 1;
	sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */
	sk->sk_allocation = GFP_ATOMIC;
661

662 663
	iscsi_sw_tcp_conn_set_callbacks(conn);
	tcp_sw_conn->sendpage = tcp_sw_conn->sock->ops->sendpage;
664 665 666
	/*
	 * set receive state machine into initial state
	 */
O
Olaf Kirch 已提交
667
	iscsi_tcp_hdr_recv_prep(tcp_conn);
668
	return 0;
669 670 671 672

free_socket:
	sockfd_put(sock);
	return err;
673 674
}

675 676 677
static int iscsi_sw_tcp_conn_set_param(struct iscsi_cls_conn *cls_conn,
				       enum iscsi_param param, char *buf,
				       int buflen)
678
{
679
	struct iscsi_conn *conn = cls_conn->dd_data;
680
	struct iscsi_session *session = conn->session;
681
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
682
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
683
	int value;
684 685 686

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

	return 0;
}

712 713
static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
				       enum iscsi_param param, char *buf)
714
{
715
	struct iscsi_conn *conn = cls_conn->dd_data;
716
	int len;
717 718

	switch(param) {
719
	case ISCSI_PARAM_CONN_PORT:
720 721 722
		spin_lock_bh(&conn->session->lock);
		len = sprintf(buf, "%hu\n", conn->portal_port);
		spin_unlock_bh(&conn->session->lock);
723
		break;
724
	case ISCSI_PARAM_CONN_ADDRESS:
725 726 727
		spin_lock_bh(&conn->session->lock);
		len = sprintf(buf, "%s\n", conn->portal_address);
		spin_unlock_bh(&conn->session->lock);
728 729
		break;
	default:
730
		return iscsi_conn_get_param(cls_conn, param, buf);
731 732 733 734 735
	}

	return len;
}

736
static void
737 738
iscsi_sw_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,
			    struct iscsi_stats *stats)
739
{
740
	struct iscsi_conn *conn = cls_conn->dd_data;
741
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
742
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
743 744 745

	stats->custom_length = 3;
	strcpy(stats->custom[0].desc, "tx_sendpage_failures");
746
	stats->custom[0].value = tcp_sw_conn->sendpage_failures_cnt;
747
	strcpy(stats->custom[1].desc, "rx_discontiguous_hdr");
748
	stats->custom[1].value = tcp_sw_conn->discontiguous_hdr_cnt;
749 750
	strcpy(stats->custom[2].desc, "eh_abort_cnt");
	stats->custom[2].value = conn->eh_abort_cnt;
751 752

	iscsi_tcp_conn_get_stats(cls_conn, stats);
753 754
}

755
static struct iscsi_cls_session *
756 757 758
iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
			    uint16_t qdepth, uint32_t initial_cmdsn,
			    uint32_t *hostno)
759
{
760 761
	struct iscsi_cls_session *cls_session;
	struct iscsi_session *session;
762
	struct Scsi_Host *shost;
763

764 765
	if (ep) {
		printk(KERN_ERR "iscsi_tcp: invalid ep %p.\n", ep);
766 767 768
		return NULL;
	}

769
	shost = iscsi_host_alloc(&iscsi_sw_tcp_sht, 0, qdepth);
770
	if (!shost)
771
		return NULL;
772
	shost->transportt = iscsi_sw_tcp_scsi_transport;
773 774 775
	shost->max_lun = iscsi_max_lun;
	shost->max_id = 0;
	shost->max_channel = 0;
776
	shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;
777

778
	if (iscsi_host_add(shost, NULL))
779 780 781
		goto free_host;
	*hostno = shost->host_no;

782 783 784 785
	cls_session = iscsi_session_setup(&iscsi_sw_tcp_transport, shost,
					  cmds_max,
					  sizeof(struct iscsi_tcp_task) +
					  sizeof(struct iscsi_sw_tcp_hdrbuf),
786
					  initial_cmdsn, 0);
787 788 789
	if (!cls_session)
		goto remove_host;
	session = cls_session->dd_data;
790

791
	shost->can_queue = session->scsi_cmds_max;
792
	if (iscsi_tcp_r2tpool_alloc(session))
793
		goto remove_session;
794 795
	return cls_session;

796
remove_session:
797
	iscsi_session_teardown(cls_session);
798
remove_host:
799
	iscsi_host_remove(shost);
800
free_host:
801
	iscsi_host_free(shost);
802 803 804
	return NULL;
}

805
static void iscsi_sw_tcp_session_destroy(struct iscsi_cls_session *cls_session)
806
{
807 808
	struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);

809
	iscsi_tcp_r2tpool_free(cls_session->dd_data);
810
	iscsi_session_teardown(cls_session);
811

812 813
	iscsi_host_remove(shost);
	iscsi_host_free(shost);
814 815
}

816
static int iscsi_sw_tcp_slave_configure(struct scsi_device *sdev)
817
{
818
	blk_queue_bounce_limit(sdev->request_queue, BLK_BOUNCE_ANY);
819 820 821 822
	blk_queue_dma_alignment(sdev->request_queue, 0);
	return 0;
}

823
static struct scsi_host_template iscsi_sw_tcp_sht = {
824
	.module			= THIS_MODULE,
825
	.name			= "iSCSI Initiator over TCP/IP",
826 827
	.queuecommand           = iscsi_queuecommand,
	.change_queue_depth	= iscsi_change_queue_depth,
828
	.can_queue		= ISCSI_DEF_XMIT_CMDS_MAX - 1,
829
	.sg_tablesize		= 4096,
830
	.max_sectors		= 0xFFFF,
831 832
	.cmd_per_lun		= ISCSI_DEF_CMD_PER_LUN,
	.eh_abort_handler       = iscsi_eh_abort,
833
	.eh_device_reset_handler= iscsi_eh_device_reset,
834
	.eh_target_reset_handler= iscsi_eh_target_reset,
835
	.use_clustering         = DISABLE_CLUSTERING,
836
	.slave_configure        = iscsi_sw_tcp_slave_configure,
837 838 839 840
	.proc_name		= "iscsi_tcp",
	.this_id		= -1,
};

841
static struct iscsi_transport iscsi_sw_tcp_transport = {
842 843 844 845
	.owner			= THIS_MODULE,
	.name			= "tcp",
	.caps			= CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST
				  | CAP_DATADGST,
846 847 848 849 850 851 852 853 854 855 856 857 858
	.param_mask		= ISCSI_MAX_RECV_DLENGTH |
				  ISCSI_MAX_XMIT_DLENGTH |
				  ISCSI_HDRDGST_EN |
				  ISCSI_DATADGST_EN |
				  ISCSI_INITIAL_R2T_EN |
				  ISCSI_MAX_R2T |
				  ISCSI_IMM_DATA_EN |
				  ISCSI_FIRST_BURST |
				  ISCSI_MAX_BURST |
				  ISCSI_PDU_INORDER_EN |
				  ISCSI_DATASEQ_INORDER_EN |
				  ISCSI_ERL |
				  ISCSI_CONN_PORT |
859
				  ISCSI_CONN_ADDRESS |
860 861 862
				  ISCSI_EXP_STATSN |
				  ISCSI_PERSISTENT_PORT |
				  ISCSI_PERSISTENT_ADDRESS |
863 864
				  ISCSI_TARGET_NAME | ISCSI_TPGT |
				  ISCSI_USERNAME | ISCSI_PASSWORD |
865
				  ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN |
866 867
				  ISCSI_FAST_ABORT | ISCSI_ABORT_TMO |
				  ISCSI_LU_RESET_TMO |
868 869
				  ISCSI_PING_TMO | ISCSI_RECV_TMO |
				  ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME,
870
	.host_param_mask	= ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
871 872
				  ISCSI_HOST_INITIATOR_NAME |
				  ISCSI_HOST_NETDEV_NAME,
873
	/* session management */
874 875
	.create_session		= iscsi_sw_tcp_session_create,
	.destroy_session	= iscsi_sw_tcp_session_destroy,
876
	/* connection management */
877 878 879 880 881
	.create_conn		= iscsi_sw_tcp_conn_create,
	.bind_conn		= iscsi_sw_tcp_conn_bind,
	.destroy_conn		= iscsi_sw_tcp_conn_destroy,
	.set_param		= iscsi_sw_tcp_conn_set_param,
	.get_conn_param		= iscsi_sw_tcp_conn_get_param,
882
	.get_session_param	= iscsi_session_get_param,
883
	.start_conn		= iscsi_conn_start,
884
	.stop_conn		= iscsi_sw_tcp_conn_stop,
885
	/* iscsi host params */
886
	.get_host_param		= iscsi_host_get_param,
887
	.set_host_param		= iscsi_host_set_param,
888
	/* IO */
889
	.send_pdu		= iscsi_conn_send_pdu,
890
	.get_stats		= iscsi_sw_tcp_conn_get_stats,
891
	/* iscsi task/cmd helpers */
892 893 894
	.init_task		= iscsi_tcp_task_init,
	.xmit_task		= iscsi_tcp_task_xmit,
	.cleanup_task		= iscsi_tcp_cleanup_task,
895
	/* low level pdu helpers */
896 897 898
	.xmit_pdu		= iscsi_sw_tcp_pdu_xmit,
	.init_pdu		= iscsi_sw_tcp_pdu_init,
	.alloc_pdu		= iscsi_sw_tcp_pdu_alloc,
899
	/* recovery */
M
Mike Christie 已提交
900
	.session_recovery_timedout = iscsi_session_recovery_timedout,
901 902
};

903
static int __init iscsi_sw_tcp_init(void)
904 905
{
	if (iscsi_max_lun < 1) {
O
Or Gerlitz 已提交
906 907
		printk(KERN_ERR "iscsi_tcp: Invalid max_lun value of %u\n",
		       iscsi_max_lun);
908 909 910
		return -EINVAL;
	}

911 912 913
	iscsi_sw_tcp_scsi_transport = iscsi_register_transport(
						&iscsi_sw_tcp_transport);
	if (!iscsi_sw_tcp_scsi_transport)
914
		return -ENODEV;
915

916
	return 0;
917 918
}

919
static void __exit iscsi_sw_tcp_exit(void)
920
{
921
	iscsi_unregister_transport(&iscsi_sw_tcp_transport);
922 923
}

924 925
module_init(iscsi_sw_tcp_init);
module_exit(iscsi_sw_tcp_exit);