Linux Audio

Check our new training course

Loading...
v6.8
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*******************************************************************************
   3 * This file contains the login functions used by the iSCSI Target driver.
   4 *
   5 * (c) Copyright 2007-2013 Datera, Inc.
   6 *
   7 * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
   8 *
   9 ******************************************************************************/
  10
  11#include <crypto/hash.h>
  12#include <linux/module.h>
  13#include <linux/string.h>
  14#include <linux/kthread.h>
  15#include <linux/sched/signal.h>
  16#include <linux/idr.h>
  17#include <linux/tcp.h>        /* TCP_NODELAY */
  18#include <net/ip.h>
  19#include <net/ipv6.h>         /* ipv6_addr_v4mapped() */
  20#include <scsi/iscsi_proto.h>
  21#include <target/target_core_base.h>
  22#include <target/target_core_fabric.h>
  23
  24#include <target/iscsi/iscsi_target_core.h>
  25#include <target/iscsi/iscsi_target_stat.h>
  26#include "iscsi_target_device.h"
  27#include "iscsi_target_nego.h"
  28#include "iscsi_target_erl0.h"
  29#include "iscsi_target_erl2.h"
  30#include "iscsi_target_login.h"
  31#include "iscsi_target_tpg.h"
  32#include "iscsi_target_util.h"
  33#include "iscsi_target.h"
  34#include "iscsi_target_parameters.h"
  35
  36#include <target/iscsi/iscsi_transport.h>
  37
  38static struct iscsi_login *iscsi_login_init_conn(struct iscsit_conn *conn)
  39{
  40	struct iscsi_login *login;
  41
  42	login = kzalloc(sizeof(struct iscsi_login), GFP_KERNEL);
  43	if (!login) {
  44		pr_err("Unable to allocate memory for struct iscsi_login.\n");
  45		return NULL;
  46	}
  47	conn->login = login;
  48	login->conn = conn;
  49	login->first_request = 1;
  50
  51	login->req_buf = kzalloc(MAX_KEY_VALUE_PAIRS, GFP_KERNEL);
  52	if (!login->req_buf) {
  53		pr_err("Unable to allocate memory for response buffer.\n");
  54		goto out_login;
  55	}
  56
  57	login->rsp_buf = kzalloc(MAX_KEY_VALUE_PAIRS, GFP_KERNEL);
  58	if (!login->rsp_buf) {
  59		pr_err("Unable to allocate memory for request buffer.\n");
  60		goto out_req_buf;
  61	}
  62
  63	conn->conn_login = login;
  64
  65	return login;
  66
  67out_req_buf:
  68	kfree(login->req_buf);
  69out_login:
  70	kfree(login);
  71	return NULL;
  72}
  73
  74/*
  75 * Used by iscsi_target_nego.c:iscsi_target_locate_portal() to setup
  76 * per struct iscsit_conn libcrypto contexts for crc32c and crc32-intel
  77 */
  78int iscsi_login_setup_crypto(struct iscsit_conn *conn)
  79{
  80	struct crypto_ahash *tfm;
  81
  82	/*
  83	 * Setup slicing by CRC32C algorithm for RX and TX libcrypto contexts
  84	 * which will default to crc32c_intel.ko for cpu_has_xmm4_2, or fallback
  85	 * to software 1x8 byte slicing from crc32c.ko
  86	 */
  87	tfm = crypto_alloc_ahash("crc32c", 0, CRYPTO_ALG_ASYNC);
  88	if (IS_ERR(tfm)) {
  89		pr_err("crypto_alloc_ahash() failed\n");
  90		return -ENOMEM;
  91	}
  92
  93	conn->conn_rx_hash = ahash_request_alloc(tfm, GFP_KERNEL);
  94	if (!conn->conn_rx_hash) {
  95		pr_err("ahash_request_alloc() failed for conn_rx_hash\n");
  96		crypto_free_ahash(tfm);
  97		return -ENOMEM;
  98	}
  99	ahash_request_set_callback(conn->conn_rx_hash, 0, NULL, NULL);
 100
 101	conn->conn_tx_hash = ahash_request_alloc(tfm, GFP_KERNEL);
 102	if (!conn->conn_tx_hash) {
 103		pr_err("ahash_request_alloc() failed for conn_tx_hash\n");
 104		ahash_request_free(conn->conn_rx_hash);
 105		conn->conn_rx_hash = NULL;
 106		crypto_free_ahash(tfm);
 107		return -ENOMEM;
 108	}
 109	ahash_request_set_callback(conn->conn_tx_hash, 0, NULL, NULL);
 110
 111	return 0;
 112}
 113
 114static int iscsi_login_check_initiator_version(
 115	struct iscsit_conn *conn,
 116	u8 version_max,
 117	u8 version_min)
 118{
 119	if ((version_max != 0x00) || (version_min != 0x00)) {
 120		pr_err("Unsupported iSCSI IETF Pre-RFC Revision,"
 121			" version Min/Max 0x%02x/0x%02x, rejecting login.\n",
 122			version_min, version_max);
 123		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
 124				ISCSI_LOGIN_STATUS_NO_VERSION);
 125		return -1;
 126	}
 127
 128	return 0;
 129}
 130
 131int iscsi_check_for_session_reinstatement(struct iscsit_conn *conn)
 132{
 133	int sessiontype;
 134	struct iscsi_param *initiatorname_param = NULL, *sessiontype_param = NULL;
 135	struct iscsi_portal_group *tpg = conn->tpg;
 136	struct iscsit_session *sess = NULL, *sess_p = NULL;
 137	struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
 138	struct se_session *se_sess, *se_sess_tmp;
 139
 140	initiatorname_param = iscsi_find_param_from_key(
 141			INITIATORNAME, conn->param_list);
 142	sessiontype_param = iscsi_find_param_from_key(
 143			SESSIONTYPE, conn->param_list);
 144	if (!initiatorname_param || !sessiontype_param) {
 145		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
 146			ISCSI_LOGIN_STATUS_MISSING_FIELDS);
 147		return -1;
 148	}
 149
 150	sessiontype = (strncmp(sessiontype_param->value, NORMAL, 6)) ? 1 : 0;
 151
 152	spin_lock_bh(&se_tpg->session_lock);
 153	list_for_each_entry_safe(se_sess, se_sess_tmp, &se_tpg->tpg_sess_list,
 154			sess_list) {
 155
 156		sess_p = se_sess->fabric_sess_ptr;
 157		spin_lock(&sess_p->conn_lock);
 158		if (atomic_read(&sess_p->session_fall_back_to_erl0) ||
 159		    atomic_read(&sess_p->session_logout) ||
 160		    atomic_read(&sess_p->session_close) ||
 161		    (sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED)) {
 162			spin_unlock(&sess_p->conn_lock);
 163			continue;
 164		}
 165		if (!memcmp(sess_p->isid, conn->sess->isid, 6) &&
 166		   (!strcmp(sess_p->sess_ops->InitiatorName,
 167			    initiatorname_param->value) &&
 168		   (sess_p->sess_ops->SessionType == sessiontype))) {
 169			atomic_set(&sess_p->session_reinstatement, 1);
 170			atomic_set(&sess_p->session_fall_back_to_erl0, 1);
 171			atomic_set(&sess_p->session_close, 1);
 172			spin_unlock(&sess_p->conn_lock);
 173			iscsit_inc_session_usage_count(sess_p);
 174			iscsit_stop_time2retain_timer(sess_p);
 175			sess = sess_p;
 176			break;
 177		}
 178		spin_unlock(&sess_p->conn_lock);
 179	}
 180	spin_unlock_bh(&se_tpg->session_lock);
 181	/*
 182	 * If the Time2Retain handler has expired, the session is already gone.
 183	 */
 184	if (!sess)
 185		return 0;
 186
 187	pr_debug("%s iSCSI Session SID %u is still active for %s,"
 188		" performing session reinstatement.\n", (sessiontype) ?
 189		"Discovery" : "Normal", sess->sid,
 190		sess->sess_ops->InitiatorName);
 191
 192	spin_lock_bh(&sess->conn_lock);
 193	if (sess->session_state == TARG_SESS_STATE_FAILED) {
 194		spin_unlock_bh(&sess->conn_lock);
 195		iscsit_dec_session_usage_count(sess);
 
 196		return 0;
 197	}
 198	spin_unlock_bh(&sess->conn_lock);
 199
 200	iscsit_stop_session(sess, 1, 1);
 201	iscsit_dec_session_usage_count(sess);
 202
 
 203	return 0;
 204}
 205
 206static int iscsi_login_set_conn_values(
 207	struct iscsit_session *sess,
 208	struct iscsit_conn *conn,
 209	__be16 cid)
 210{
 211	int ret;
 212	conn->sess		= sess;
 213	conn->cid		= be16_to_cpu(cid);
 214	/*
 215	 * Generate a random Status sequence number (statsn) for the new
 216	 * iSCSI connection.
 217	 */
 218	ret = get_random_bytes_wait(&conn->stat_sn, sizeof(u32));
 219	if (unlikely(ret))
 220		return ret;
 221
 222	mutex_lock(&auth_id_lock);
 223	conn->auth_id		= iscsit_global->auth_id++;
 224	mutex_unlock(&auth_id_lock);
 225	return 0;
 226}
 227
 228__printf(2, 3) int iscsi_change_param_sprintf(
 229	struct iscsit_conn *conn,
 230	const char *fmt, ...)
 231{
 232	va_list args;
 233	unsigned char buf[64];
 234
 235	memset(buf, 0, sizeof buf);
 236
 237	va_start(args, fmt);
 238	vsnprintf(buf, sizeof buf, fmt, args);
 239	va_end(args);
 240
 241	if (iscsi_change_param_value(buf, conn->param_list, 0) < 0) {
 242		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 243				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 244		return -1;
 245	}
 246
 247	return 0;
 248}
 249EXPORT_SYMBOL(iscsi_change_param_sprintf);
 250
 251/*
 252 *	This is the leading connection of a new session,
 253 *	or session reinstatement.
 254 */
 255static int iscsi_login_zero_tsih_s1(
 256	struct iscsit_conn *conn,
 257	unsigned char *buf)
 258{
 259	struct iscsit_session *sess = NULL;
 260	struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf;
 261	int ret;
 262
 263	sess = kzalloc(sizeof(struct iscsit_session), GFP_KERNEL);
 264	if (!sess) {
 265		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 266				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 267		pr_err("Could not allocate memory for session\n");
 268		return -ENOMEM;
 269	}
 270
 271	if (iscsi_login_set_conn_values(sess, conn, pdu->cid))
 272		goto free_sess;
 273
 274	sess->init_task_tag	= pdu->itt;
 275	memcpy(&sess->isid, pdu->isid, 6);
 276	sess->exp_cmd_sn	= be32_to_cpu(pdu->cmdsn);
 277	INIT_LIST_HEAD(&sess->sess_conn_list);
 278	INIT_LIST_HEAD(&sess->sess_ooo_cmdsn_list);
 279	INIT_LIST_HEAD(&sess->cr_active_list);
 280	INIT_LIST_HEAD(&sess->cr_inactive_list);
 281	init_completion(&sess->async_msg_comp);
 282	init_completion(&sess->reinstatement_comp);
 283	init_completion(&sess->session_wait_comp);
 284	init_completion(&sess->session_waiting_on_uc_comp);
 285	mutex_init(&sess->cmdsn_mutex);
 286	spin_lock_init(&sess->conn_lock);
 287	spin_lock_init(&sess->cr_a_lock);
 288	spin_lock_init(&sess->cr_i_lock);
 289	spin_lock_init(&sess->session_usage_lock);
 290	spin_lock_init(&sess->ttt_lock);
 291
 292	timer_setup(&sess->time2retain_timer,
 293		    iscsit_handle_time2retain_timeout, 0);
 294
 295	ret = ida_alloc(&sess_ida, GFP_KERNEL);
 296	if (ret < 0) {
 297		pr_err("Session ID allocation failed %d\n", ret);
 298		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 299				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 300		goto free_sess;
 301	}
 302
 303	sess->session_index = ret;
 304	sess->creation_time = get_jiffies_64();
 305	/*
 306	 * The FFP CmdSN window values will be allocated from the TPG's
 307	 * Initiator Node's ACL once the login has been successfully completed.
 308	 */
 309	atomic_set(&sess->max_cmd_sn, be32_to_cpu(pdu->cmdsn));
 310
 311	sess->sess_ops = kzalloc(sizeof(struct iscsi_sess_ops), GFP_KERNEL);
 312	if (!sess->sess_ops) {
 313		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 314				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 315		pr_err("Unable to allocate memory for"
 316				" struct iscsi_sess_ops.\n");
 317		goto free_id;
 318	}
 319
 320	sess->se_sess = transport_alloc_session(TARGET_PROT_NORMAL);
 321	if (IS_ERR(sess->se_sess)) {
 322		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 323				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 324		goto free_ops;
 325	}
 326
 327	return 0;
 328
 329free_ops:
 330	kfree(sess->sess_ops);
 331free_id:
 332	ida_free(&sess_ida, sess->session_index);
 333free_sess:
 334	kfree(sess);
 335	conn->sess = NULL;
 336	return -ENOMEM;
 337}
 338
 339static int iscsi_login_zero_tsih_s2(
 340	struct iscsit_conn *conn)
 341{
 342	struct iscsi_node_attrib *na;
 343	struct iscsit_session *sess = conn->sess;
 344	struct iscsi_param *param;
 345	bool iser = false;
 346
 347	sess->tpg = conn->tpg;
 348
 349	/*
 350	 * Assign a new TPG Session Handle.  Note this is protected with
 351	 * struct iscsi_portal_group->np_login_sem from iscsit_access_np().
 352	 */
 353	sess->tsih = ++sess->tpg->ntsih;
 354	if (!sess->tsih)
 355		sess->tsih = ++sess->tpg->ntsih;
 356
 357	/*
 358	 * Create the default params from user defined values..
 359	 */
 360	if (iscsi_copy_param_list(&conn->param_list,
 361				conn->tpg->param_list, 1) < 0) {
 362		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 363				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 364		return -1;
 365	}
 366
 367	if (conn->conn_transport->transport_type == ISCSI_INFINIBAND)
 368		iser = true;
 369
 370	iscsi_set_keys_to_negotiate(conn->param_list, iser);
 371
 372	if (sess->sess_ops->SessionType)
 373		return iscsi_set_keys_irrelevant_for_discovery(
 374				conn->param_list);
 375
 376	na = iscsit_tpg_get_node_attrib(sess);
 377
 378	/*
 379	 * If ACL allows non-authorized access in TPG with CHAP,
 380	 * then set None to AuthMethod.
 381	 */
 382	param = iscsi_find_param_from_key(AUTHMETHOD, conn->param_list);
 383	if (param && !strstr(param->value, NONE)) {
 384		if (!iscsi_conn_auth_required(conn))
 385			if (iscsi_change_param_sprintf(conn, "AuthMethod=%s",
 386						       NONE))
 387				return -1;
 388	}
 389
 390	/*
 391	 * Need to send TargetPortalGroupTag back in first login response
 392	 * on any iSCSI connection where the Initiator provides TargetName.
 393	 * See 5.3.1.  Login Phase Start
 394	 *
 395	 * In our case, we have already located the struct iscsi_tiqn at this point.
 396	 */
 397	if (iscsi_change_param_sprintf(conn, "TargetPortalGroupTag=%hu", sess->tpg->tpgt))
 398		return -1;
 399
 400	/*
 401	 * Workaround for Initiators that have broken connection recovery logic.
 402	 *
 403	 * "We would really like to get rid of this." Linux-iSCSI.org team
 404	 */
 405	if (iscsi_change_param_sprintf(conn, "ErrorRecoveryLevel=%d", na->default_erl))
 406		return -1;
 407
 408	/*
 409	 * Set RDMAExtensions=Yes by default for iSER enabled network portals
 410	 */
 411	if (iser) {
 412		struct iscsi_param *param;
 413		unsigned long mrdsl, off;
 414		int rc;
 415
 416		if (iscsi_change_param_sprintf(conn, "RDMAExtensions=Yes"))
 417			return -1;
 418
 419		/*
 420		 * Make MaxRecvDataSegmentLength PAGE_SIZE aligned for
 421		 * Immediate Data + Unsolicited Data-OUT if necessary..
 422		 */
 423		param = iscsi_find_param_from_key("MaxRecvDataSegmentLength",
 424						  conn->param_list);
 425		if (!param) {
 426			iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 427				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 428			return -1;
 429		}
 430		rc = kstrtoul(param->value, 0, &mrdsl);
 431		if (rc < 0) {
 432			iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 433				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 434			return -1;
 435		}
 436		off = mrdsl % PAGE_SIZE;
 437		if (!off)
 438			goto check_prot;
 439
 440		if (mrdsl < PAGE_SIZE)
 441			mrdsl = PAGE_SIZE;
 442		else
 443			mrdsl -= off;
 444
 445		pr_warn("Aligning ISER MaxRecvDataSegmentLength: %lu down"
 446			" to PAGE_SIZE\n", mrdsl);
 447
 448		if (iscsi_change_param_sprintf(conn, "MaxRecvDataSegmentLength=%lu\n", mrdsl))
 449			return -1;
 450		/*
 451		 * ISER currently requires that ImmediateData + Unsolicited
 452		 * Data be disabled when protection / signature MRs are enabled.
 453		 */
 454check_prot:
 455		if (sess->se_sess->sup_prot_ops &
 456		   (TARGET_PROT_DOUT_STRIP | TARGET_PROT_DOUT_PASS |
 457		    TARGET_PROT_DOUT_INSERT)) {
 458
 459			if (iscsi_change_param_sprintf(conn, "ImmediateData=No"))
 460				return -1;
 461
 462			if (iscsi_change_param_sprintf(conn, "InitialR2T=Yes"))
 463				return -1;
 464
 465			pr_debug("Forcing ImmediateData=No + InitialR2T=Yes for"
 466				 " T10-PI enabled ISER session\n");
 467		}
 468	}
 469
 470	return 0;
 471}
 472
 473static int iscsi_login_non_zero_tsih_s1(
 474	struct iscsit_conn *conn,
 475	unsigned char *buf)
 476{
 477	struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf;
 478
 479	return iscsi_login_set_conn_values(NULL, conn, pdu->cid);
 480}
 481
 482/*
 483 *	Add a new connection to an existing session.
 484 */
 485static int iscsi_login_non_zero_tsih_s2(
 486	struct iscsit_conn *conn,
 487	unsigned char *buf)
 488{
 489	struct iscsi_portal_group *tpg = conn->tpg;
 490	struct iscsit_session *sess = NULL, *sess_p = NULL;
 491	struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
 492	struct se_session *se_sess, *se_sess_tmp;
 493	struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf;
 494	bool iser = false;
 495
 496	spin_lock_bh(&se_tpg->session_lock);
 497	list_for_each_entry_safe(se_sess, se_sess_tmp, &se_tpg->tpg_sess_list,
 498			sess_list) {
 499
 500		sess_p = (struct iscsit_session *)se_sess->fabric_sess_ptr;
 501		if (atomic_read(&sess_p->session_fall_back_to_erl0) ||
 502		    atomic_read(&sess_p->session_logout) ||
 503		    atomic_read(&sess_p->session_close) ||
 504		   (sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED))
 505			continue;
 506		if (!memcmp(sess_p->isid, pdu->isid, 6) &&
 507		     (sess_p->tsih == be16_to_cpu(pdu->tsih))) {
 508			iscsit_inc_session_usage_count(sess_p);
 509			iscsit_stop_time2retain_timer(sess_p);
 510			sess = sess_p;
 511			break;
 512		}
 513	}
 514	spin_unlock_bh(&se_tpg->session_lock);
 515
 516	/*
 517	 * If the Time2Retain handler has expired, the session is already gone.
 518	 */
 519	if (!sess) {
 520		pr_err("Initiator attempting to add a connection to"
 521			" a non-existent session, rejecting iSCSI Login.\n");
 522		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
 523				ISCSI_LOGIN_STATUS_NO_SESSION);
 524		return -1;
 525	}
 526
 527	/*
 528	 * Stop the Time2Retain timer if this is a failed session, we restart
 529	 * the timer if the login is not successful.
 530	 */
 531	spin_lock_bh(&sess->conn_lock);
 532	if (sess->session_state == TARG_SESS_STATE_FAILED)
 533		atomic_set(&sess->session_continuation, 1);
 534	spin_unlock_bh(&sess->conn_lock);
 535
 536	if (iscsi_login_set_conn_values(sess, conn, pdu->cid) < 0 ||
 537	    iscsi_copy_param_list(&conn->param_list,
 538			conn->tpg->param_list, 0) < 0) {
 539		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 540				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 541		return -1;
 542	}
 543
 544	if (conn->conn_transport->transport_type == ISCSI_INFINIBAND)
 545		iser = true;
 546
 547	iscsi_set_keys_to_negotiate(conn->param_list, iser);
 548	/*
 549	 * Need to send TargetPortalGroupTag back in first login response
 550	 * on any iSCSI connection where the Initiator provides TargetName.
 551	 * See 5.3.1.  Login Phase Start
 552	 *
 553	 * In our case, we have already located the struct iscsi_tiqn at this point.
 554	 */
 555	if (iscsi_change_param_sprintf(conn, "TargetPortalGroupTag=%hu", sess->tpg->tpgt))
 556		return -1;
 557
 558	return 0;
 559}
 560
 561int iscsi_login_post_auth_non_zero_tsih(
 562	struct iscsit_conn *conn,
 563	u16 cid,
 564	u32 exp_statsn)
 565{
 566	struct iscsit_conn *conn_ptr = NULL;
 567	struct iscsi_conn_recovery *cr = NULL;
 568	struct iscsit_session *sess = conn->sess;
 569
 570	/*
 571	 * By following item 5 in the login table,  if we have found
 572	 * an existing ISID and a valid/existing TSIH and an existing
 573	 * CID we do connection reinstatement.  Currently we dont not
 574	 * support it so we send back an non-zero status class to the
 575	 * initiator and release the new connection.
 576	 */
 577	conn_ptr = iscsit_get_conn_from_cid_rcfr(sess, cid);
 578	if (conn_ptr) {
 579		pr_err("Connection exists with CID %hu for %s,"
 580			" performing connection reinstatement.\n",
 581			conn_ptr->cid, sess->sess_ops->InitiatorName);
 582
 583		iscsit_connection_reinstatement_rcfr(conn_ptr);
 584		iscsit_dec_conn_usage_count(conn_ptr);
 585	}
 586
 587	/*
 588	 * Check for any connection recovery entries containing CID.
 589	 * We use the original ExpStatSN sent in the first login request
 590	 * to acknowledge commands for the failed connection.
 591	 *
 592	 * Also note that an explict logout may have already been sent,
 593	 * but the response may not be sent due to additional connection
 594	 * loss.
 595	 */
 596	if (sess->sess_ops->ErrorRecoveryLevel == 2) {
 597		cr = iscsit_get_inactive_connection_recovery_entry(
 598				sess, cid);
 599		if (cr) {
 600			pr_debug("Performing implicit logout"
 601				" for connection recovery on CID: %hu\n",
 602					conn->cid);
 603			iscsit_discard_cr_cmds_by_expstatsn(cr, exp_statsn);
 604		}
 605	}
 606
 607	/*
 608	 * Else we follow item 4 from the login table in that we have
 609	 * found an existing ISID and a valid/existing TSIH and a new
 610	 * CID we go ahead and continue to add a new connection to the
 611	 * session.
 612	 */
 613	pr_debug("Adding CID %hu to existing session for %s.\n",
 614			cid, sess->sess_ops->InitiatorName);
 615
 616	if ((atomic_read(&sess->nconn) + 1) > sess->sess_ops->MaxConnections) {
 617		pr_err("Adding additional connection to this session"
 618			" would exceed MaxConnections %d, login failed.\n",
 619				sess->sess_ops->MaxConnections);
 620		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
 621				ISCSI_LOGIN_STATUS_ISID_ERROR);
 622		return -1;
 623	}
 624
 625	return 0;
 626}
 627
 628static void iscsi_post_login_start_timers(struct iscsit_conn *conn)
 629{
 630	struct iscsit_session *sess = conn->sess;
 631	/*
 632	 * FIXME: Unsolicited NopIN support for ISER
 633	 */
 634	if (conn->conn_transport->transport_type == ISCSI_INFINIBAND)
 635		return;
 636
 637	if (!sess->sess_ops->SessionType)
 638		iscsit_start_nopin_timer(conn);
 639}
 640
 641int iscsit_start_kthreads(struct iscsit_conn *conn)
 642{
 643	int ret = 0;
 644
 645	spin_lock(&iscsit_global->ts_bitmap_lock);
 646	conn->bitmap_id = bitmap_find_free_region(iscsit_global->ts_bitmap,
 647					ISCSIT_BITMAP_BITS, get_order(1));
 648	spin_unlock(&iscsit_global->ts_bitmap_lock);
 649
 650	if (conn->bitmap_id < 0) {
 651		pr_err("bitmap_find_free_region() failed for"
 652		       " iscsit_start_kthreads()\n");
 653		return -ENOMEM;
 654	}
 655
 656	conn->tx_thread = kthread_run(iscsi_target_tx_thread, conn,
 657				      "%s", ISCSI_TX_THREAD_NAME);
 658	if (IS_ERR(conn->tx_thread)) {
 659		pr_err("Unable to start iscsi_target_tx_thread\n");
 660		ret = PTR_ERR(conn->tx_thread);
 661		goto out_bitmap;
 662	}
 663	conn->tx_thread_active = true;
 664
 665	conn->rx_thread = kthread_run(iscsi_target_rx_thread, conn,
 666				      "%s", ISCSI_RX_THREAD_NAME);
 667	if (IS_ERR(conn->rx_thread)) {
 668		pr_err("Unable to start iscsi_target_rx_thread\n");
 669		ret = PTR_ERR(conn->rx_thread);
 670		goto out_tx;
 671	}
 672	conn->rx_thread_active = true;
 673
 674	return 0;
 675out_tx:
 676	send_sig(SIGINT, conn->tx_thread, 1);
 677	kthread_stop(conn->tx_thread);
 678	conn->tx_thread_active = false;
 679out_bitmap:
 680	spin_lock(&iscsit_global->ts_bitmap_lock);
 681	bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id,
 682			      get_order(1));
 683	spin_unlock(&iscsit_global->ts_bitmap_lock);
 684	return ret;
 685}
 686
 687void iscsi_post_login_handler(
 688	struct iscsi_np *np,
 689	struct iscsit_conn *conn,
 690	u8 zero_tsih)
 691{
 692	int stop_timer = 0;
 693	struct iscsit_session *sess = conn->sess;
 694	struct se_session *se_sess = sess->se_sess;
 695	struct iscsi_portal_group *tpg = sess->tpg;
 696	struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
 697
 698	iscsit_inc_conn_usage_count(conn);
 699
 700	iscsit_collect_login_stats(conn, ISCSI_STATUS_CLS_SUCCESS,
 701			ISCSI_LOGIN_STATUS_ACCEPT);
 702
 703	pr_debug("Moving to TARG_CONN_STATE_LOGGED_IN.\n");
 704	conn->conn_state = TARG_CONN_STATE_LOGGED_IN;
 705
 706	iscsi_set_connection_parameters(conn->conn_ops, conn->param_list);
 707	/*
 708	 * SCSI Initiator -> SCSI Target Port Mapping
 709	 */
 710	if (!zero_tsih) {
 711		iscsi_set_session_parameters(sess->sess_ops,
 712				conn->param_list, 0);
 713		iscsi_release_param_list(conn->param_list);
 714		conn->param_list = NULL;
 715
 716		spin_lock_bh(&sess->conn_lock);
 717		atomic_set(&sess->session_continuation, 0);
 718		if (sess->session_state == TARG_SESS_STATE_FAILED) {
 719			pr_debug("Moving to"
 720					" TARG_SESS_STATE_LOGGED_IN.\n");
 721			sess->session_state = TARG_SESS_STATE_LOGGED_IN;
 722			stop_timer = 1;
 723		}
 724
 725		pr_debug("iSCSI Login successful on CID: %hu from %pISpc to"
 726			" %pISpc,%hu\n", conn->cid, &conn->login_sockaddr,
 727			&conn->local_sockaddr, tpg->tpgt);
 728
 729		list_add_tail(&conn->conn_list, &sess->sess_conn_list);
 730		atomic_inc(&sess->nconn);
 731		pr_debug("Incremented iSCSI Connection count to %d"
 732			" from node: %s\n", atomic_read(&sess->nconn),
 733			sess->sess_ops->InitiatorName);
 734		spin_unlock_bh(&sess->conn_lock);
 735
 736		iscsi_post_login_start_timers(conn);
 737		/*
 738		 * Determine CPU mask to ensure connection's RX and TX kthreads
 739		 * are scheduled on the same CPU.
 740		 */
 741		iscsit_thread_get_cpumask(conn);
 742		conn->conn_rx_reset_cpumask = 1;
 743		conn->conn_tx_reset_cpumask = 1;
 744		/*
 745		 * Wakeup the sleeping iscsi_target_rx_thread() now that
 746		 * iscsit_conn is in TARG_CONN_STATE_LOGGED_IN state.
 747		 */
 748		complete(&conn->rx_login_comp);
 749		iscsit_dec_conn_usage_count(conn);
 750
 751		if (stop_timer) {
 752			spin_lock_bh(&se_tpg->session_lock);
 753			iscsit_stop_time2retain_timer(sess);
 754			spin_unlock_bh(&se_tpg->session_lock);
 755		}
 756		iscsit_dec_session_usage_count(sess);
 757		return;
 758	}
 759
 760	iscsi_set_session_parameters(sess->sess_ops, conn->param_list, 1);
 761	iscsi_release_param_list(conn->param_list);
 762	conn->param_list = NULL;
 763
 764	iscsit_determine_maxcmdsn(sess);
 765
 766	spin_lock_bh(&se_tpg->session_lock);
 767	__transport_register_session(&sess->tpg->tpg_se_tpg,
 768			se_sess->se_node_acl, se_sess, sess);
 769	pr_debug("Moving to TARG_SESS_STATE_LOGGED_IN.\n");
 770	sess->session_state = TARG_SESS_STATE_LOGGED_IN;
 771
 772	pr_debug("iSCSI Login successful on CID: %hu from %pISpc to %pISpc,%hu\n",
 773		conn->cid, &conn->login_sockaddr, &conn->local_sockaddr,
 774		tpg->tpgt);
 775
 776	spin_lock_bh(&sess->conn_lock);
 777	list_add_tail(&conn->conn_list, &sess->sess_conn_list);
 778	atomic_inc(&sess->nconn);
 779	pr_debug("Incremented iSCSI Connection count to %d from node:"
 780		" %s\n", atomic_read(&sess->nconn),
 781		sess->sess_ops->InitiatorName);
 782	spin_unlock_bh(&sess->conn_lock);
 783
 784	sess->sid = tpg->sid++;
 785	if (!sess->sid)
 786		sess->sid = tpg->sid++;
 787	pr_debug("Established iSCSI session from node: %s\n",
 788			sess->sess_ops->InitiatorName);
 789
 790	tpg->nsessions++;
 791	if (tpg->tpg_tiqn)
 792		tpg->tpg_tiqn->tiqn_nsessions++;
 793
 794	pr_debug("Incremented number of active iSCSI sessions to %u on"
 795		" iSCSI Target Portal Group: %hu\n", tpg->nsessions, tpg->tpgt);
 796	spin_unlock_bh(&se_tpg->session_lock);
 797
 798	iscsi_post_login_start_timers(conn);
 799	/*
 800	 * Determine CPU mask to ensure connection's RX and TX kthreads
 801	 * are scheduled on the same CPU.
 802	 */
 803	iscsit_thread_get_cpumask(conn);
 804	conn->conn_rx_reset_cpumask = 1;
 805	conn->conn_tx_reset_cpumask = 1;
 806	/*
 807	 * Wakeup the sleeping iscsi_target_rx_thread() now that
 808	 * iscsit_conn is in TARG_CONN_STATE_LOGGED_IN state.
 809	 */
 810	complete(&conn->rx_login_comp);
 811	iscsit_dec_conn_usage_count(conn);
 812}
 813
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 814int iscsit_setup_np(
 815	struct iscsi_np *np,
 816	struct sockaddr_storage *sockaddr)
 817{
 818	struct socket *sock = NULL;
 819	int backlog = ISCSIT_TCP_BACKLOG, ret, len;
 820
 821	switch (np->np_network_transport) {
 822	case ISCSI_TCP:
 823		np->np_ip_proto = IPPROTO_TCP;
 824		np->np_sock_type = SOCK_STREAM;
 825		break;
 826	case ISCSI_SCTP_TCP:
 827		np->np_ip_proto = IPPROTO_SCTP;
 828		np->np_sock_type = SOCK_STREAM;
 829		break;
 830	case ISCSI_SCTP_UDP:
 831		np->np_ip_proto = IPPROTO_SCTP;
 832		np->np_sock_type = SOCK_SEQPACKET;
 833		break;
 834	default:
 835		pr_err("Unsupported network_transport: %d\n",
 836				np->np_network_transport);
 837		return -EINVAL;
 838	}
 839
 840	ret = sock_create(sockaddr->ss_family, np->np_sock_type,
 841			np->np_ip_proto, &sock);
 842	if (ret < 0) {
 843		pr_err("sock_create() failed.\n");
 844		return ret;
 845	}
 846	np->np_socket = sock;
 847	/*
 848	 * Setup the np->np_sockaddr from the passed sockaddr setup
 849	 * in iscsi_target_configfs.c code..
 850	 */
 851	memcpy(&np->np_sockaddr, sockaddr,
 852			sizeof(struct sockaddr_storage));
 853
 854	if (sockaddr->ss_family == AF_INET6)
 855		len = sizeof(struct sockaddr_in6);
 856	else
 857		len = sizeof(struct sockaddr_in);
 858	/*
 859	 * Set SO_REUSEADDR, and disable Nagle Algorithm with TCP_NODELAY.
 860	 */
 861	if (np->np_network_transport == ISCSI_TCP)
 862		tcp_sock_set_nodelay(sock->sk);
 863	sock_set_reuseaddr(sock->sk);
 864	ip_sock_set_freebind(sock->sk);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 865
 866	ret = kernel_bind(sock, (struct sockaddr *)&np->np_sockaddr, len);
 867	if (ret < 0) {
 868		pr_err("kernel_bind() failed: %d\n", ret);
 869		goto fail;
 870	}
 871
 872	ret = kernel_listen(sock, backlog);
 873	if (ret != 0) {
 874		pr_err("kernel_listen() failed: %d\n", ret);
 875		goto fail;
 876	}
 877
 878	return 0;
 879fail:
 880	np->np_socket = NULL;
 881	sock_release(sock);
 882	return ret;
 883}
 884
 885int iscsi_target_setup_login_socket(
 886	struct iscsi_np *np,
 887	struct sockaddr_storage *sockaddr)
 888{
 889	struct iscsit_transport *t;
 890	int rc;
 891
 892	t = iscsit_get_transport(np->np_network_transport);
 893	if (!t)
 894		return -EINVAL;
 895
 896	rc = t->iscsit_setup_np(np, sockaddr);
 897	if (rc < 0) {
 898		iscsit_put_transport(t);
 899		return rc;
 900	}
 901
 902	np->np_transport = t;
 903	np->enabled = true;
 904	return 0;
 905}
 906
 907int iscsit_accept_np(struct iscsi_np *np, struct iscsit_conn *conn)
 908{
 909	struct socket *new_sock, *sock = np->np_socket;
 910	struct sockaddr_in sock_in;
 911	struct sockaddr_in6 sock_in6;
 912	int rc;
 913
 914	rc = kernel_accept(sock, &new_sock, 0);
 915	if (rc < 0)
 916		return rc;
 917
 918	conn->sock = new_sock;
 919	conn->login_family = np->np_sockaddr.ss_family;
 920
 921	if (np->np_sockaddr.ss_family == AF_INET6) {
 922		memset(&sock_in6, 0, sizeof(struct sockaddr_in6));
 923
 924		rc = conn->sock->ops->getname(conn->sock,
 925				(struct sockaddr *)&sock_in6, 1);
 926		if (rc >= 0) {
 927			if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) {
 928				memcpy(&conn->login_sockaddr, &sock_in6, sizeof(sock_in6));
 929			} else {
 930				/* Pretend to be an ipv4 socket */
 931				sock_in.sin_family = AF_INET;
 932				sock_in.sin_port = sock_in6.sin6_port;
 933				memcpy(&sock_in.sin_addr, &sock_in6.sin6_addr.s6_addr32[3], 4);
 934				memcpy(&conn->login_sockaddr, &sock_in, sizeof(sock_in));
 935			}
 936		}
 937
 938		rc = conn->sock->ops->getname(conn->sock,
 939				(struct sockaddr *)&sock_in6, 0);
 940		if (rc >= 0) {
 941			if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) {
 942				memcpy(&conn->local_sockaddr, &sock_in6, sizeof(sock_in6));
 943			} else {
 944				/* Pretend to be an ipv4 socket */
 945				sock_in.sin_family = AF_INET;
 946				sock_in.sin_port = sock_in6.sin6_port;
 947				memcpy(&sock_in.sin_addr, &sock_in6.sin6_addr.s6_addr32[3], 4);
 948				memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in));
 949			}
 950		}
 951	} else {
 952		memset(&sock_in, 0, sizeof(struct sockaddr_in));
 953
 954		rc = conn->sock->ops->getname(conn->sock,
 955				(struct sockaddr *)&sock_in, 1);
 956		if (rc >= 0)
 957			memcpy(&conn->login_sockaddr, &sock_in, sizeof(sock_in));
 958
 959		rc = conn->sock->ops->getname(conn->sock,
 960				(struct sockaddr *)&sock_in, 0);
 961		if (rc >= 0)
 962			memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in));
 963	}
 964
 965	return 0;
 966}
 967
 968int iscsit_get_login_rx(struct iscsit_conn *conn, struct iscsi_login *login)
 969{
 970	struct iscsi_login_req *login_req;
 971	u32 padding = 0, payload_length;
 972
 973	if (iscsi_login_rx_data(conn, login->req, ISCSI_HDR_LEN) < 0)
 974		return -1;
 975
 976	login_req = (struct iscsi_login_req *)login->req;
 977	payload_length	= ntoh24(login_req->dlength);
 978	padding = ((-payload_length) & 3);
 979
 980	pr_debug("Got Login Command, Flags 0x%02x, ITT: 0x%08x,"
 981		" CmdSN: 0x%08x, ExpStatSN: 0x%08x, CID: %hu, Length: %u\n",
 982		login_req->flags, login_req->itt, login_req->cmdsn,
 983		login_req->exp_statsn, login_req->cid, payload_length);
 984	/*
 985	 * Setup the initial iscsi_login values from the leading
 986	 * login request PDU.
 987	 */
 988	if (login->first_request) {
 989		login_req = (struct iscsi_login_req *)login->req;
 990		login->leading_connection = (!login_req->tsih) ? 1 : 0;
 991		login->current_stage	= ISCSI_LOGIN_CURRENT_STAGE(login_req->flags);
 992		login->version_min	= login_req->min_version;
 993		login->version_max	= login_req->max_version;
 994		memcpy(login->isid, login_req->isid, 6);
 995		login->cmd_sn		= be32_to_cpu(login_req->cmdsn);
 996		login->init_task_tag	= login_req->itt;
 997		login->initial_exp_statsn = be32_to_cpu(login_req->exp_statsn);
 998		login->cid		= be16_to_cpu(login_req->cid);
 999		login->tsih		= be16_to_cpu(login_req->tsih);
1000	}
1001
1002	if (iscsi_target_check_login_request(conn, login) < 0)
1003		return -1;
1004
1005	memset(login->req_buf, 0, MAX_KEY_VALUE_PAIRS);
1006	if (iscsi_login_rx_data(conn, login->req_buf,
1007				payload_length + padding) < 0)
1008		return -1;
1009
1010	return 0;
1011}
1012
1013int iscsit_put_login_tx(struct iscsit_conn *conn, struct iscsi_login *login,
1014			u32 length)
1015{
1016	if (iscsi_login_tx_data(conn, login->rsp, login->rsp_buf, length) < 0)
1017		return -1;
1018
1019	return 0;
1020}
1021
1022static int
1023iscsit_conn_set_transport(struct iscsit_conn *conn, struct iscsit_transport *t)
1024{
1025	int rc;
1026
1027	if (!t->owner) {
1028		conn->conn_transport = t;
1029		return 0;
1030	}
1031
1032	rc = try_module_get(t->owner);
1033	if (!rc) {
1034		pr_err("try_module_get() failed for %s\n", t->name);
1035		return -EINVAL;
1036	}
1037
1038	conn->conn_transport = t;
1039	return 0;
1040}
1041
1042static struct iscsit_conn *iscsit_alloc_conn(struct iscsi_np *np)
1043{
1044	struct iscsit_conn *conn;
1045
1046	conn = kzalloc(sizeof(struct iscsit_conn), GFP_KERNEL);
1047	if (!conn) {
1048		pr_err("Could not allocate memory for new connection\n");
1049		return NULL;
1050	}
1051	pr_debug("Moving to TARG_CONN_STATE_FREE.\n");
1052	conn->conn_state = TARG_CONN_STATE_FREE;
1053
1054	init_waitqueue_head(&conn->queues_wq);
1055	INIT_LIST_HEAD(&conn->conn_list);
1056	INIT_LIST_HEAD(&conn->conn_cmd_list);
1057	INIT_LIST_HEAD(&conn->immed_queue_list);
1058	INIT_LIST_HEAD(&conn->response_queue_list);
1059	init_completion(&conn->conn_post_wait_comp);
1060	init_completion(&conn->conn_wait_comp);
1061	init_completion(&conn->conn_wait_rcfr_comp);
1062	init_completion(&conn->conn_waiting_on_uc_comp);
1063	init_completion(&conn->conn_logout_comp);
1064	init_completion(&conn->rx_half_close_comp);
1065	init_completion(&conn->tx_half_close_comp);
1066	init_completion(&conn->rx_login_comp);
1067	spin_lock_init(&conn->cmd_lock);
1068	spin_lock_init(&conn->conn_usage_lock);
1069	spin_lock_init(&conn->immed_queue_lock);
1070	spin_lock_init(&conn->nopin_timer_lock);
1071	spin_lock_init(&conn->response_queue_lock);
1072	spin_lock_init(&conn->state_lock);
1073	spin_lock_init(&conn->login_worker_lock);
1074	spin_lock_init(&conn->login_timer_lock);
1075
1076	timer_setup(&conn->nopin_response_timer,
1077		    iscsit_handle_nopin_response_timeout, 0);
1078	timer_setup(&conn->nopin_timer, iscsit_handle_nopin_timeout, 0);
1079	timer_setup(&conn->login_timer, iscsit_login_timeout, 0);
1080
1081	if (iscsit_conn_set_transport(conn, np->np_transport) < 0)
1082		goto free_conn;
1083
1084	conn->conn_ops = kzalloc(sizeof(struct iscsi_conn_ops), GFP_KERNEL);
1085	if (!conn->conn_ops) {
1086		pr_err("Unable to allocate memory for struct iscsi_conn_ops.\n");
1087		goto put_transport;
1088	}
1089
1090	if (!zalloc_cpumask_var(&conn->conn_cpumask, GFP_KERNEL)) {
1091		pr_err("Unable to allocate conn->conn_cpumask\n");
1092		goto free_conn_ops;
1093	}
1094
1095	if (!zalloc_cpumask_var(&conn->allowed_cpumask, GFP_KERNEL)) {
1096		pr_err("Unable to allocate conn->allowed_cpumask\n");
1097		goto free_conn_cpumask;
1098	}
1099
1100	conn->cmd_cnt = target_alloc_cmd_counter();
1101	if (!conn->cmd_cnt)
1102		goto free_conn_allowed_cpumask;
1103
1104	return conn;
1105
1106free_conn_allowed_cpumask:
1107	free_cpumask_var(conn->allowed_cpumask);
1108free_conn_cpumask:
1109	free_cpumask_var(conn->conn_cpumask);
1110free_conn_ops:
1111	kfree(conn->conn_ops);
1112put_transport:
1113	iscsit_put_transport(conn->conn_transport);
1114free_conn:
1115	kfree(conn);
1116	return NULL;
1117}
1118
1119void iscsit_free_conn(struct iscsit_conn *conn)
1120{
1121	target_free_cmd_counter(conn->cmd_cnt);
1122	free_cpumask_var(conn->allowed_cpumask);
1123	free_cpumask_var(conn->conn_cpumask);
1124	kfree(conn->conn_ops);
1125	iscsit_put_transport(conn->conn_transport);
1126	kfree(conn);
1127}
1128
1129void iscsi_target_login_sess_out(struct iscsit_conn *conn,
1130				 bool zero_tsih, bool new_sess)
1131{
1132	if (!new_sess)
1133		goto old_sess_out;
1134
1135	pr_err("iSCSI Login negotiation failed.\n");
1136	iscsit_collect_login_stats(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
1137				   ISCSI_LOGIN_STATUS_INIT_ERR);
1138	if (!zero_tsih || !conn->sess)
1139		goto old_sess_out;
1140
1141	transport_free_session(conn->sess->se_sess);
1142	ida_free(&sess_ida, conn->sess->session_index);
1143	kfree(conn->sess->sess_ops);
1144	kfree(conn->sess);
1145	conn->sess = NULL;
1146
1147old_sess_out:
 
1148	/*
1149	 * If login negotiation fails check if the Time2Retain timer
1150	 * needs to be restarted.
1151	 */
1152	if (!zero_tsih && conn->sess) {
1153		spin_lock_bh(&conn->sess->conn_lock);
1154		if (conn->sess->session_state == TARG_SESS_STATE_FAILED) {
1155			struct se_portal_group *se_tpg =
1156					&conn->tpg->tpg_se_tpg;
1157
1158			atomic_set(&conn->sess->session_continuation, 0);
1159			spin_unlock_bh(&conn->sess->conn_lock);
1160			spin_lock_bh(&se_tpg->session_lock);
1161			iscsit_start_time2retain_handler(conn->sess);
1162			spin_unlock_bh(&se_tpg->session_lock);
1163		} else
1164			spin_unlock_bh(&conn->sess->conn_lock);
1165		iscsit_dec_session_usage_count(conn->sess);
1166	}
1167
1168	ahash_request_free(conn->conn_tx_hash);
1169	if (conn->conn_rx_hash) {
1170		struct crypto_ahash *tfm;
1171
1172		tfm = crypto_ahash_reqtfm(conn->conn_rx_hash);
1173		ahash_request_free(conn->conn_rx_hash);
1174		crypto_free_ahash(tfm);
1175	}
1176
1177	if (conn->param_list) {
1178		iscsi_release_param_list(conn->param_list);
1179		conn->param_list = NULL;
1180	}
1181	iscsi_target_nego_release(conn);
1182
1183	if (conn->sock) {
1184		sock_release(conn->sock);
1185		conn->sock = NULL;
1186	}
1187
1188	if (conn->conn_transport->iscsit_wait_conn)
1189		conn->conn_transport->iscsit_wait_conn(conn);
1190
1191	if (conn->conn_transport->iscsit_free_conn)
1192		conn->conn_transport->iscsit_free_conn(conn);
1193
1194	iscsit_free_conn(conn);
1195}
1196
1197static int __iscsi_target_login_thread(struct iscsi_np *np)
1198{
1199	u8 *buffer, zero_tsih = 0;
1200	int ret = 0, rc;
1201	struct iscsit_conn *conn = NULL;
1202	struct iscsi_login *login;
1203	struct iscsi_portal_group *tpg = NULL;
1204	struct iscsi_login_req *pdu;
1205	struct iscsi_tpg_np *tpg_np;
1206	bool new_sess = false;
1207
1208	flush_signals(current);
1209
1210	spin_lock_bh(&np->np_thread_lock);
1211	if (atomic_dec_if_positive(&np->np_reset_count) >= 0) {
1212		np->np_thread_state = ISCSI_NP_THREAD_ACTIVE;
1213		spin_unlock_bh(&np->np_thread_lock);
1214		complete(&np->np_restart_comp);
1215		return 1;
1216	} else if (np->np_thread_state == ISCSI_NP_THREAD_SHUTDOWN) {
1217		spin_unlock_bh(&np->np_thread_lock);
1218		goto exit;
1219	} else {
1220		np->np_thread_state = ISCSI_NP_THREAD_ACTIVE;
1221	}
1222	spin_unlock_bh(&np->np_thread_lock);
1223
1224	conn = iscsit_alloc_conn(np);
1225	if (!conn) {
1226		/* Get another socket */
1227		return 1;
1228	}
1229
1230	rc = np->np_transport->iscsit_accept_np(np, conn);
1231	if (rc == -ENOSYS) {
1232		complete(&np->np_restart_comp);
1233		iscsit_free_conn(conn);
1234		goto exit;
1235	} else if (rc < 0) {
1236		spin_lock_bh(&np->np_thread_lock);
1237		if (atomic_dec_if_positive(&np->np_reset_count) >= 0) {
1238			np->np_thread_state = ISCSI_NP_THREAD_ACTIVE;
1239			spin_unlock_bh(&np->np_thread_lock);
1240			complete(&np->np_restart_comp);
1241			iscsit_free_conn(conn);
1242			/* Get another socket */
1243			return 1;
1244		}
1245		spin_unlock_bh(&np->np_thread_lock);
1246		iscsit_free_conn(conn);
1247		return 1;
1248	}
1249	/*
1250	 * Perform the remaining iSCSI connection initialization items..
1251	 */
1252	login = iscsi_login_init_conn(conn);
1253	if (!login) {
1254		goto new_sess_out;
1255	}
1256
1257	iscsit_start_login_timer(conn, current);
1258
1259	pr_debug("Moving to TARG_CONN_STATE_XPT_UP.\n");
1260	conn->conn_state = TARG_CONN_STATE_XPT_UP;
1261	/*
1262	 * This will process the first login request + payload..
1263	 */
1264	rc = np->np_transport->iscsit_get_login_rx(conn, login);
1265	if (rc == 1)
1266		return 1;
1267	else if (rc < 0)
1268		goto new_sess_out;
1269
1270	buffer = &login->req[0];
1271	pdu = (struct iscsi_login_req *)buffer;
1272	/*
1273	 * Used by iscsit_tx_login_rsp() for Login Resonses PDUs
1274	 * when Status-Class != 0.
1275	*/
1276	conn->login_itt	= pdu->itt;
1277
1278	spin_lock_bh(&np->np_thread_lock);
1279	if (np->np_thread_state != ISCSI_NP_THREAD_ACTIVE) {
1280		spin_unlock_bh(&np->np_thread_lock);
1281		pr_err("iSCSI Network Portal on %pISpc currently not"
1282			" active.\n", &np->np_sockaddr);
1283		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
1284				ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE);
1285		goto new_sess_out;
1286	}
1287	spin_unlock_bh(&np->np_thread_lock);
1288
1289	conn->network_transport = np->np_network_transport;
1290
1291	pr_debug("Received iSCSI login request from %pISpc on %s Network"
1292		" Portal %pISpc\n", &conn->login_sockaddr, np->np_transport->name,
1293		&conn->local_sockaddr);
1294
1295	pr_debug("Moving to TARG_CONN_STATE_IN_LOGIN.\n");
1296	conn->conn_state	= TARG_CONN_STATE_IN_LOGIN;
1297
1298	if (iscsi_login_check_initiator_version(conn, pdu->max_version,
1299			pdu->min_version) < 0)
1300		goto new_sess_out;
1301
1302	zero_tsih = (pdu->tsih == 0x0000);
1303	if (zero_tsih) {
1304		/*
1305		 * This is the leading connection of a new session.
1306		 * We wait until after authentication to check for
1307		 * session reinstatement.
1308		 */
1309		if (iscsi_login_zero_tsih_s1(conn, buffer) < 0)
1310			goto new_sess_out;
1311	} else {
1312		/*
1313		 * Add a new connection to an existing session.
1314		 * We check for a non-existant session in
1315		 * iscsi_login_non_zero_tsih_s2() below based
1316		 * on ISID/TSIH, but wait until after authentication
1317		 * to check for connection reinstatement, etc.
1318		 */
1319		if (iscsi_login_non_zero_tsih_s1(conn, buffer) < 0)
1320			goto new_sess_out;
1321	}
1322	/*
1323	 * SessionType: Discovery
1324	 *
1325	 * 	Locates Default Portal
1326	 *
1327	 * SessionType: Normal
1328	 *
1329	 * 	Locates Target Portal from NP -> Target IQN
1330	 */
1331	rc = iscsi_target_locate_portal(np, conn, login);
1332	if (rc < 0) {
1333		tpg = conn->tpg;
1334		goto new_sess_out;
1335	}
1336	login->zero_tsih = zero_tsih;
1337
1338	if (conn->sess)
1339		conn->sess->se_sess->sup_prot_ops =
1340			conn->conn_transport->iscsit_get_sup_prot_ops(conn);
1341
1342	tpg = conn->tpg;
1343	if (!tpg) {
1344		pr_err("Unable to locate struct iscsit_conn->tpg\n");
1345		goto new_sess_out;
1346	}
1347
1348	if (zero_tsih) {
1349		if (iscsi_login_zero_tsih_s2(conn) < 0)
1350			goto new_sess_out;
1351	} else {
1352		if (iscsi_login_non_zero_tsih_s2(conn, buffer) < 0)
1353			goto old_sess_out;
1354	}
1355
1356	if (conn->conn_transport->iscsit_validate_params) {
1357		ret = conn->conn_transport->iscsit_validate_params(conn);
1358		if (ret < 0) {
1359			if (zero_tsih)
1360				goto new_sess_out;
1361			else
1362				goto old_sess_out;
1363		}
1364	}
1365
1366	ret = iscsi_target_start_negotiation(login, conn);
1367	if (ret < 0)
1368		goto new_sess_out;
1369
 
 
1370	if (ret == 1) {
1371		tpg_np = conn->tpg_np;
1372
1373		iscsi_post_login_handler(np, conn, zero_tsih);
1374		iscsit_deaccess_np(np, tpg, tpg_np);
1375	}
1376
1377	tpg = NULL;
1378	tpg_np = NULL;
1379	/* Get another socket */
1380	return 1;
1381
1382new_sess_out:
1383	new_sess = true;
1384old_sess_out:
1385	iscsit_stop_login_timer(conn);
1386	tpg_np = conn->tpg_np;
1387	iscsi_target_login_sess_out(conn, zero_tsih, new_sess);
1388	new_sess = false;
1389
1390	if (tpg) {
1391		iscsit_deaccess_np(np, tpg, tpg_np);
1392		tpg = NULL;
1393		tpg_np = NULL;
1394	}
1395
1396	return 1;
1397
1398exit:
 
1399	spin_lock_bh(&np->np_thread_lock);
1400	np->np_thread_state = ISCSI_NP_THREAD_EXIT;
1401	spin_unlock_bh(&np->np_thread_lock);
1402
1403	return 0;
1404}
1405
1406int iscsi_target_login_thread(void *arg)
1407{
1408	struct iscsi_np *np = arg;
1409	int ret;
1410
1411	allow_signal(SIGINT);
1412
1413	while (1) {
1414		ret = __iscsi_target_login_thread(np);
1415		/*
1416		 * We break and exit here unless another sock_accept() call
1417		 * is expected.
1418		 */
1419		if (ret != 1)
1420			break;
1421	}
1422
1423	while (!kthread_should_stop()) {
1424		msleep(100);
1425	}
1426
1427	return 0;
1428}
v5.4
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*******************************************************************************
   3 * This file contains the login functions used by the iSCSI Target driver.
   4 *
   5 * (c) Copyright 2007-2013 Datera, Inc.
   6 *
   7 * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
   8 *
   9 ******************************************************************************/
  10
  11#include <crypto/hash.h>
  12#include <linux/module.h>
  13#include <linux/string.h>
  14#include <linux/kthread.h>
  15#include <linux/sched/signal.h>
  16#include <linux/idr.h>
  17#include <linux/tcp.h>        /* TCP_NODELAY */
 
  18#include <net/ipv6.h>         /* ipv6_addr_v4mapped() */
  19#include <scsi/iscsi_proto.h>
  20#include <target/target_core_base.h>
  21#include <target/target_core_fabric.h>
  22
  23#include <target/iscsi/iscsi_target_core.h>
  24#include <target/iscsi/iscsi_target_stat.h>
  25#include "iscsi_target_device.h"
  26#include "iscsi_target_nego.h"
  27#include "iscsi_target_erl0.h"
  28#include "iscsi_target_erl2.h"
  29#include "iscsi_target_login.h"
  30#include "iscsi_target_tpg.h"
  31#include "iscsi_target_util.h"
  32#include "iscsi_target.h"
  33#include "iscsi_target_parameters.h"
  34
  35#include <target/iscsi/iscsi_transport.h>
  36
  37static struct iscsi_login *iscsi_login_init_conn(struct iscsi_conn *conn)
  38{
  39	struct iscsi_login *login;
  40
  41	login = kzalloc(sizeof(struct iscsi_login), GFP_KERNEL);
  42	if (!login) {
  43		pr_err("Unable to allocate memory for struct iscsi_login.\n");
  44		return NULL;
  45	}
  46	conn->login = login;
  47	login->conn = conn;
  48	login->first_request = 1;
  49
  50	login->req_buf = kzalloc(MAX_KEY_VALUE_PAIRS, GFP_KERNEL);
  51	if (!login->req_buf) {
  52		pr_err("Unable to allocate memory for response buffer.\n");
  53		goto out_login;
  54	}
  55
  56	login->rsp_buf = kzalloc(MAX_KEY_VALUE_PAIRS, GFP_KERNEL);
  57	if (!login->rsp_buf) {
  58		pr_err("Unable to allocate memory for request buffer.\n");
  59		goto out_req_buf;
  60	}
  61
  62	conn->conn_login = login;
  63
  64	return login;
  65
  66out_req_buf:
  67	kfree(login->req_buf);
  68out_login:
  69	kfree(login);
  70	return NULL;
  71}
  72
  73/*
  74 * Used by iscsi_target_nego.c:iscsi_target_locate_portal() to setup
  75 * per struct iscsi_conn libcrypto contexts for crc32c and crc32-intel
  76 */
  77int iscsi_login_setup_crypto(struct iscsi_conn *conn)
  78{
  79	struct crypto_ahash *tfm;
  80
  81	/*
  82	 * Setup slicing by CRC32C algorithm for RX and TX libcrypto contexts
  83	 * which will default to crc32c_intel.ko for cpu_has_xmm4_2, or fallback
  84	 * to software 1x8 byte slicing from crc32c.ko
  85	 */
  86	tfm = crypto_alloc_ahash("crc32c", 0, CRYPTO_ALG_ASYNC);
  87	if (IS_ERR(tfm)) {
  88		pr_err("crypto_alloc_ahash() failed\n");
  89		return -ENOMEM;
  90	}
  91
  92	conn->conn_rx_hash = ahash_request_alloc(tfm, GFP_KERNEL);
  93	if (!conn->conn_rx_hash) {
  94		pr_err("ahash_request_alloc() failed for conn_rx_hash\n");
  95		crypto_free_ahash(tfm);
  96		return -ENOMEM;
  97	}
  98	ahash_request_set_callback(conn->conn_rx_hash, 0, NULL, NULL);
  99
 100	conn->conn_tx_hash = ahash_request_alloc(tfm, GFP_KERNEL);
 101	if (!conn->conn_tx_hash) {
 102		pr_err("ahash_request_alloc() failed for conn_tx_hash\n");
 103		ahash_request_free(conn->conn_rx_hash);
 104		conn->conn_rx_hash = NULL;
 105		crypto_free_ahash(tfm);
 106		return -ENOMEM;
 107	}
 108	ahash_request_set_callback(conn->conn_tx_hash, 0, NULL, NULL);
 109
 110	return 0;
 111}
 112
 113static int iscsi_login_check_initiator_version(
 114	struct iscsi_conn *conn,
 115	u8 version_max,
 116	u8 version_min)
 117{
 118	if ((version_max != 0x00) || (version_min != 0x00)) {
 119		pr_err("Unsupported iSCSI IETF Pre-RFC Revision,"
 120			" version Min/Max 0x%02x/0x%02x, rejecting login.\n",
 121			version_min, version_max);
 122		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
 123				ISCSI_LOGIN_STATUS_NO_VERSION);
 124		return -1;
 125	}
 126
 127	return 0;
 128}
 129
 130int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn)
 131{
 132	int sessiontype;
 133	struct iscsi_param *initiatorname_param = NULL, *sessiontype_param = NULL;
 134	struct iscsi_portal_group *tpg = conn->tpg;
 135	struct iscsi_session *sess = NULL, *sess_p = NULL;
 136	struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
 137	struct se_session *se_sess, *se_sess_tmp;
 138
 139	initiatorname_param = iscsi_find_param_from_key(
 140			INITIATORNAME, conn->param_list);
 141	sessiontype_param = iscsi_find_param_from_key(
 142			SESSIONTYPE, conn->param_list);
 143	if (!initiatorname_param || !sessiontype_param) {
 144		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
 145			ISCSI_LOGIN_STATUS_MISSING_FIELDS);
 146		return -1;
 147	}
 148
 149	sessiontype = (strncmp(sessiontype_param->value, NORMAL, 6)) ? 1 : 0;
 150
 151	spin_lock_bh(&se_tpg->session_lock);
 152	list_for_each_entry_safe(se_sess, se_sess_tmp, &se_tpg->tpg_sess_list,
 153			sess_list) {
 154
 155		sess_p = se_sess->fabric_sess_ptr;
 156		spin_lock(&sess_p->conn_lock);
 157		if (atomic_read(&sess_p->session_fall_back_to_erl0) ||
 158		    atomic_read(&sess_p->session_logout) ||
 
 159		    (sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED)) {
 160			spin_unlock(&sess_p->conn_lock);
 161			continue;
 162		}
 163		if (!memcmp(sess_p->isid, conn->sess->isid, 6) &&
 164		   (!strcmp(sess_p->sess_ops->InitiatorName,
 165			    initiatorname_param->value) &&
 166		   (sess_p->sess_ops->SessionType == sessiontype))) {
 167			atomic_set(&sess_p->session_reinstatement, 1);
 168			atomic_set(&sess_p->session_fall_back_to_erl0, 1);
 
 169			spin_unlock(&sess_p->conn_lock);
 170			iscsit_inc_session_usage_count(sess_p);
 171			iscsit_stop_time2retain_timer(sess_p);
 172			sess = sess_p;
 173			break;
 174		}
 175		spin_unlock(&sess_p->conn_lock);
 176	}
 177	spin_unlock_bh(&se_tpg->session_lock);
 178	/*
 179	 * If the Time2Retain handler has expired, the session is already gone.
 180	 */
 181	if (!sess)
 182		return 0;
 183
 184	pr_debug("%s iSCSI Session SID %u is still active for %s,"
 185		" performing session reinstatement.\n", (sessiontype) ?
 186		"Discovery" : "Normal", sess->sid,
 187		sess->sess_ops->InitiatorName);
 188
 189	spin_lock_bh(&sess->conn_lock);
 190	if (sess->session_state == TARG_SESS_STATE_FAILED) {
 191		spin_unlock_bh(&sess->conn_lock);
 192		iscsit_dec_session_usage_count(sess);
 193		iscsit_close_session(sess);
 194		return 0;
 195	}
 196	spin_unlock_bh(&sess->conn_lock);
 197
 198	iscsit_stop_session(sess, 1, 1);
 199	iscsit_dec_session_usage_count(sess);
 200
 201	iscsit_close_session(sess);
 202	return 0;
 203}
 204
 205static int iscsi_login_set_conn_values(
 206	struct iscsi_session *sess,
 207	struct iscsi_conn *conn,
 208	__be16 cid)
 209{
 210	int ret;
 211	conn->sess		= sess;
 212	conn->cid		= be16_to_cpu(cid);
 213	/*
 214	 * Generate a random Status sequence number (statsn) for the new
 215	 * iSCSI connection.
 216	 */
 217	ret = get_random_bytes_wait(&conn->stat_sn, sizeof(u32));
 218	if (unlikely(ret))
 219		return ret;
 220
 221	mutex_lock(&auth_id_lock);
 222	conn->auth_id		= iscsit_global->auth_id++;
 223	mutex_unlock(&auth_id_lock);
 224	return 0;
 225}
 226
 227__printf(2, 3) int iscsi_change_param_sprintf(
 228	struct iscsi_conn *conn,
 229	const char *fmt, ...)
 230{
 231	va_list args;
 232	unsigned char buf[64];
 233
 234	memset(buf, 0, sizeof buf);
 235
 236	va_start(args, fmt);
 237	vsnprintf(buf, sizeof buf, fmt, args);
 238	va_end(args);
 239
 240	if (iscsi_change_param_value(buf, conn->param_list, 0) < 0) {
 241		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 242				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 243		return -1;
 244	}
 245
 246	return 0;
 247}
 248EXPORT_SYMBOL(iscsi_change_param_sprintf);
 249
 250/*
 251 *	This is the leading connection of a new session,
 252 *	or session reinstatement.
 253 */
 254static int iscsi_login_zero_tsih_s1(
 255	struct iscsi_conn *conn,
 256	unsigned char *buf)
 257{
 258	struct iscsi_session *sess = NULL;
 259	struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf;
 260	int ret;
 261
 262	sess = kzalloc(sizeof(struct iscsi_session), GFP_KERNEL);
 263	if (!sess) {
 264		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 265				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 266		pr_err("Could not allocate memory for session\n");
 267		return -ENOMEM;
 268	}
 269
 270	if (iscsi_login_set_conn_values(sess, conn, pdu->cid))
 271		goto free_sess;
 272
 273	sess->init_task_tag	= pdu->itt;
 274	memcpy(&sess->isid, pdu->isid, 6);
 275	sess->exp_cmd_sn	= be32_to_cpu(pdu->cmdsn);
 276	INIT_LIST_HEAD(&sess->sess_conn_list);
 277	INIT_LIST_HEAD(&sess->sess_ooo_cmdsn_list);
 278	INIT_LIST_HEAD(&sess->cr_active_list);
 279	INIT_LIST_HEAD(&sess->cr_inactive_list);
 280	init_completion(&sess->async_msg_comp);
 281	init_completion(&sess->reinstatement_comp);
 282	init_completion(&sess->session_wait_comp);
 283	init_completion(&sess->session_waiting_on_uc_comp);
 284	mutex_init(&sess->cmdsn_mutex);
 285	spin_lock_init(&sess->conn_lock);
 286	spin_lock_init(&sess->cr_a_lock);
 287	spin_lock_init(&sess->cr_i_lock);
 288	spin_lock_init(&sess->session_usage_lock);
 289	spin_lock_init(&sess->ttt_lock);
 290
 291	timer_setup(&sess->time2retain_timer,
 292		    iscsit_handle_time2retain_timeout, 0);
 293
 294	ret = ida_alloc(&sess_ida, GFP_KERNEL);
 295	if (ret < 0) {
 296		pr_err("Session ID allocation failed %d\n", ret);
 297		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 298				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 299		goto free_sess;
 300	}
 301
 302	sess->session_index = ret;
 303	sess->creation_time = get_jiffies_64();
 304	/*
 305	 * The FFP CmdSN window values will be allocated from the TPG's
 306	 * Initiator Node's ACL once the login has been successfully completed.
 307	 */
 308	atomic_set(&sess->max_cmd_sn, be32_to_cpu(pdu->cmdsn));
 309
 310	sess->sess_ops = kzalloc(sizeof(struct iscsi_sess_ops), GFP_KERNEL);
 311	if (!sess->sess_ops) {
 312		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 313				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 314		pr_err("Unable to allocate memory for"
 315				" struct iscsi_sess_ops.\n");
 316		goto free_id;
 317	}
 318
 319	sess->se_sess = transport_alloc_session(TARGET_PROT_NORMAL);
 320	if (IS_ERR(sess->se_sess)) {
 321		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 322				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 323		goto free_ops;
 324	}
 325
 326	return 0;
 327
 328free_ops:
 329	kfree(sess->sess_ops);
 330free_id:
 331	ida_free(&sess_ida, sess->session_index);
 332free_sess:
 333	kfree(sess);
 334	conn->sess = NULL;
 335	return -ENOMEM;
 336}
 337
 338static int iscsi_login_zero_tsih_s2(
 339	struct iscsi_conn *conn)
 340{
 341	struct iscsi_node_attrib *na;
 342	struct iscsi_session *sess = conn->sess;
 
 343	bool iser = false;
 344
 345	sess->tpg = conn->tpg;
 346
 347	/*
 348	 * Assign a new TPG Session Handle.  Note this is protected with
 349	 * struct iscsi_portal_group->np_login_sem from iscsit_access_np().
 350	 */
 351	sess->tsih = ++sess->tpg->ntsih;
 352	if (!sess->tsih)
 353		sess->tsih = ++sess->tpg->ntsih;
 354
 355	/*
 356	 * Create the default params from user defined values..
 357	 */
 358	if (iscsi_copy_param_list(&conn->param_list,
 359				conn->tpg->param_list, 1) < 0) {
 360		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 361				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 362		return -1;
 363	}
 364
 365	if (conn->conn_transport->transport_type == ISCSI_INFINIBAND)
 366		iser = true;
 367
 368	iscsi_set_keys_to_negotiate(conn->param_list, iser);
 369
 370	if (sess->sess_ops->SessionType)
 371		return iscsi_set_keys_irrelevant_for_discovery(
 372				conn->param_list);
 373
 374	na = iscsit_tpg_get_node_attrib(sess);
 375
 376	/*
 
 
 
 
 
 
 
 
 
 
 
 
 377	 * Need to send TargetPortalGroupTag back in first login response
 378	 * on any iSCSI connection where the Initiator provides TargetName.
 379	 * See 5.3.1.  Login Phase Start
 380	 *
 381	 * In our case, we have already located the struct iscsi_tiqn at this point.
 382	 */
 383	if (iscsi_change_param_sprintf(conn, "TargetPortalGroupTag=%hu", sess->tpg->tpgt))
 384		return -1;
 385
 386	/*
 387	 * Workaround for Initiators that have broken connection recovery logic.
 388	 *
 389	 * "We would really like to get rid of this." Linux-iSCSI.org team
 390	 */
 391	if (iscsi_change_param_sprintf(conn, "ErrorRecoveryLevel=%d", na->default_erl))
 392		return -1;
 393
 394	/*
 395	 * Set RDMAExtensions=Yes by default for iSER enabled network portals
 396	 */
 397	if (iser) {
 398		struct iscsi_param *param;
 399		unsigned long mrdsl, off;
 400		int rc;
 401
 402		if (iscsi_change_param_sprintf(conn, "RDMAExtensions=Yes"))
 403			return -1;
 404
 405		/*
 406		 * Make MaxRecvDataSegmentLength PAGE_SIZE aligned for
 407		 * Immediate Data + Unsolicited Data-OUT if necessary..
 408		 */
 409		param = iscsi_find_param_from_key("MaxRecvDataSegmentLength",
 410						  conn->param_list);
 411		if (!param) {
 412			iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 413				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 414			return -1;
 415		}
 416		rc = kstrtoul(param->value, 0, &mrdsl);
 417		if (rc < 0) {
 418			iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 419				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 420			return -1;
 421		}
 422		off = mrdsl % PAGE_SIZE;
 423		if (!off)
 424			goto check_prot;
 425
 426		if (mrdsl < PAGE_SIZE)
 427			mrdsl = PAGE_SIZE;
 428		else
 429			mrdsl -= off;
 430
 431		pr_warn("Aligning ISER MaxRecvDataSegmentLength: %lu down"
 432			" to PAGE_SIZE\n", mrdsl);
 433
 434		if (iscsi_change_param_sprintf(conn, "MaxRecvDataSegmentLength=%lu\n", mrdsl))
 435			return -1;
 436		/*
 437		 * ISER currently requires that ImmediateData + Unsolicited
 438		 * Data be disabled when protection / signature MRs are enabled.
 439		 */
 440check_prot:
 441		if (sess->se_sess->sup_prot_ops &
 442		   (TARGET_PROT_DOUT_STRIP | TARGET_PROT_DOUT_PASS |
 443		    TARGET_PROT_DOUT_INSERT)) {
 444
 445			if (iscsi_change_param_sprintf(conn, "ImmediateData=No"))
 446				return -1;
 447
 448			if (iscsi_change_param_sprintf(conn, "InitialR2T=Yes"))
 449				return -1;
 450
 451			pr_debug("Forcing ImmediateData=No + InitialR2T=Yes for"
 452				 " T10-PI enabled ISER session\n");
 453		}
 454	}
 455
 456	return 0;
 457}
 458
 459static int iscsi_login_non_zero_tsih_s1(
 460	struct iscsi_conn *conn,
 461	unsigned char *buf)
 462{
 463	struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf;
 464
 465	return iscsi_login_set_conn_values(NULL, conn, pdu->cid);
 466}
 467
 468/*
 469 *	Add a new connection to an existing session.
 470 */
 471static int iscsi_login_non_zero_tsih_s2(
 472	struct iscsi_conn *conn,
 473	unsigned char *buf)
 474{
 475	struct iscsi_portal_group *tpg = conn->tpg;
 476	struct iscsi_session *sess = NULL, *sess_p = NULL;
 477	struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
 478	struct se_session *se_sess, *se_sess_tmp;
 479	struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf;
 480	bool iser = false;
 481
 482	spin_lock_bh(&se_tpg->session_lock);
 483	list_for_each_entry_safe(se_sess, se_sess_tmp, &se_tpg->tpg_sess_list,
 484			sess_list) {
 485
 486		sess_p = (struct iscsi_session *)se_sess->fabric_sess_ptr;
 487		if (atomic_read(&sess_p->session_fall_back_to_erl0) ||
 488		    atomic_read(&sess_p->session_logout) ||
 
 489		   (sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED))
 490			continue;
 491		if (!memcmp(sess_p->isid, pdu->isid, 6) &&
 492		     (sess_p->tsih == be16_to_cpu(pdu->tsih))) {
 493			iscsit_inc_session_usage_count(sess_p);
 494			iscsit_stop_time2retain_timer(sess_p);
 495			sess = sess_p;
 496			break;
 497		}
 498	}
 499	spin_unlock_bh(&se_tpg->session_lock);
 500
 501	/*
 502	 * If the Time2Retain handler has expired, the session is already gone.
 503	 */
 504	if (!sess) {
 505		pr_err("Initiator attempting to add a connection to"
 506			" a non-existent session, rejecting iSCSI Login.\n");
 507		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
 508				ISCSI_LOGIN_STATUS_NO_SESSION);
 509		return -1;
 510	}
 511
 512	/*
 513	 * Stop the Time2Retain timer if this is a failed session, we restart
 514	 * the timer if the login is not successful.
 515	 */
 516	spin_lock_bh(&sess->conn_lock);
 517	if (sess->session_state == TARG_SESS_STATE_FAILED)
 518		atomic_set(&sess->session_continuation, 1);
 519	spin_unlock_bh(&sess->conn_lock);
 520
 521	if (iscsi_login_set_conn_values(sess, conn, pdu->cid) < 0 ||
 522	    iscsi_copy_param_list(&conn->param_list,
 523			conn->tpg->param_list, 0) < 0) {
 524		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
 525				ISCSI_LOGIN_STATUS_NO_RESOURCES);
 526		return -1;
 527	}
 528
 529	if (conn->conn_transport->transport_type == ISCSI_INFINIBAND)
 530		iser = true;
 531
 532	iscsi_set_keys_to_negotiate(conn->param_list, iser);
 533	/*
 534	 * Need to send TargetPortalGroupTag back in first login response
 535	 * on any iSCSI connection where the Initiator provides TargetName.
 536	 * See 5.3.1.  Login Phase Start
 537	 *
 538	 * In our case, we have already located the struct iscsi_tiqn at this point.
 539	 */
 540	if (iscsi_change_param_sprintf(conn, "TargetPortalGroupTag=%hu", sess->tpg->tpgt))
 541		return -1;
 542
 543	return 0;
 544}
 545
 546int iscsi_login_post_auth_non_zero_tsih(
 547	struct iscsi_conn *conn,
 548	u16 cid,
 549	u32 exp_statsn)
 550{
 551	struct iscsi_conn *conn_ptr = NULL;
 552	struct iscsi_conn_recovery *cr = NULL;
 553	struct iscsi_session *sess = conn->sess;
 554
 555	/*
 556	 * By following item 5 in the login table,  if we have found
 557	 * an existing ISID and a valid/existing TSIH and an existing
 558	 * CID we do connection reinstatement.  Currently we dont not
 559	 * support it so we send back an non-zero status class to the
 560	 * initiator and release the new connection.
 561	 */
 562	conn_ptr = iscsit_get_conn_from_cid_rcfr(sess, cid);
 563	if (conn_ptr) {
 564		pr_err("Connection exists with CID %hu for %s,"
 565			" performing connection reinstatement.\n",
 566			conn_ptr->cid, sess->sess_ops->InitiatorName);
 567
 568		iscsit_connection_reinstatement_rcfr(conn_ptr);
 569		iscsit_dec_conn_usage_count(conn_ptr);
 570	}
 571
 572	/*
 573	 * Check for any connection recovery entries containing CID.
 574	 * We use the original ExpStatSN sent in the first login request
 575	 * to acknowledge commands for the failed connection.
 576	 *
 577	 * Also note that an explict logout may have already been sent,
 578	 * but the response may not be sent due to additional connection
 579	 * loss.
 580	 */
 581	if (sess->sess_ops->ErrorRecoveryLevel == 2) {
 582		cr = iscsit_get_inactive_connection_recovery_entry(
 583				sess, cid);
 584		if (cr) {
 585			pr_debug("Performing implicit logout"
 586				" for connection recovery on CID: %hu\n",
 587					conn->cid);
 588			iscsit_discard_cr_cmds_by_expstatsn(cr, exp_statsn);
 589		}
 590	}
 591
 592	/*
 593	 * Else we follow item 4 from the login table in that we have
 594	 * found an existing ISID and a valid/existing TSIH and a new
 595	 * CID we go ahead and continue to add a new connection to the
 596	 * session.
 597	 */
 598	pr_debug("Adding CID %hu to existing session for %s.\n",
 599			cid, sess->sess_ops->InitiatorName);
 600
 601	if ((atomic_read(&sess->nconn) + 1) > sess->sess_ops->MaxConnections) {
 602		pr_err("Adding additional connection to this session"
 603			" would exceed MaxConnections %d, login failed.\n",
 604				sess->sess_ops->MaxConnections);
 605		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
 606				ISCSI_LOGIN_STATUS_ISID_ERROR);
 607		return -1;
 608	}
 609
 610	return 0;
 611}
 612
 613static void iscsi_post_login_start_timers(struct iscsi_conn *conn)
 614{
 615	struct iscsi_session *sess = conn->sess;
 616	/*
 617	 * FIXME: Unsolicited NopIN support for ISER
 618	 */
 619	if (conn->conn_transport->transport_type == ISCSI_INFINIBAND)
 620		return;
 621
 622	if (!sess->sess_ops->SessionType)
 623		iscsit_start_nopin_timer(conn);
 624}
 625
 626int iscsit_start_kthreads(struct iscsi_conn *conn)
 627{
 628	int ret = 0;
 629
 630	spin_lock(&iscsit_global->ts_bitmap_lock);
 631	conn->bitmap_id = bitmap_find_free_region(iscsit_global->ts_bitmap,
 632					ISCSIT_BITMAP_BITS, get_order(1));
 633	spin_unlock(&iscsit_global->ts_bitmap_lock);
 634
 635	if (conn->bitmap_id < 0) {
 636		pr_err("bitmap_find_free_region() failed for"
 637		       " iscsit_start_kthreads()\n");
 638		return -ENOMEM;
 639	}
 640
 641	conn->tx_thread = kthread_run(iscsi_target_tx_thread, conn,
 642				      "%s", ISCSI_TX_THREAD_NAME);
 643	if (IS_ERR(conn->tx_thread)) {
 644		pr_err("Unable to start iscsi_target_tx_thread\n");
 645		ret = PTR_ERR(conn->tx_thread);
 646		goto out_bitmap;
 647	}
 648	conn->tx_thread_active = true;
 649
 650	conn->rx_thread = kthread_run(iscsi_target_rx_thread, conn,
 651				      "%s", ISCSI_RX_THREAD_NAME);
 652	if (IS_ERR(conn->rx_thread)) {
 653		pr_err("Unable to start iscsi_target_rx_thread\n");
 654		ret = PTR_ERR(conn->rx_thread);
 655		goto out_tx;
 656	}
 657	conn->rx_thread_active = true;
 658
 659	return 0;
 660out_tx:
 661	send_sig(SIGINT, conn->tx_thread, 1);
 662	kthread_stop(conn->tx_thread);
 663	conn->tx_thread_active = false;
 664out_bitmap:
 665	spin_lock(&iscsit_global->ts_bitmap_lock);
 666	bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id,
 667			      get_order(1));
 668	spin_unlock(&iscsit_global->ts_bitmap_lock);
 669	return ret;
 670}
 671
 672void iscsi_post_login_handler(
 673	struct iscsi_np *np,
 674	struct iscsi_conn *conn,
 675	u8 zero_tsih)
 676{
 677	int stop_timer = 0;
 678	struct iscsi_session *sess = conn->sess;
 679	struct se_session *se_sess = sess->se_sess;
 680	struct iscsi_portal_group *tpg = sess->tpg;
 681	struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
 682
 683	iscsit_inc_conn_usage_count(conn);
 684
 685	iscsit_collect_login_stats(conn, ISCSI_STATUS_CLS_SUCCESS,
 686			ISCSI_LOGIN_STATUS_ACCEPT);
 687
 688	pr_debug("Moving to TARG_CONN_STATE_LOGGED_IN.\n");
 689	conn->conn_state = TARG_CONN_STATE_LOGGED_IN;
 690
 691	iscsi_set_connection_parameters(conn->conn_ops, conn->param_list);
 692	/*
 693	 * SCSI Initiator -> SCSI Target Port Mapping
 694	 */
 695	if (!zero_tsih) {
 696		iscsi_set_session_parameters(sess->sess_ops,
 697				conn->param_list, 0);
 698		iscsi_release_param_list(conn->param_list);
 699		conn->param_list = NULL;
 700
 701		spin_lock_bh(&sess->conn_lock);
 702		atomic_set(&sess->session_continuation, 0);
 703		if (sess->session_state == TARG_SESS_STATE_FAILED) {
 704			pr_debug("Moving to"
 705					" TARG_SESS_STATE_LOGGED_IN.\n");
 706			sess->session_state = TARG_SESS_STATE_LOGGED_IN;
 707			stop_timer = 1;
 708		}
 709
 710		pr_debug("iSCSI Login successful on CID: %hu from %pISpc to"
 711			" %pISpc,%hu\n", conn->cid, &conn->login_sockaddr,
 712			&conn->local_sockaddr, tpg->tpgt);
 713
 714		list_add_tail(&conn->conn_list, &sess->sess_conn_list);
 715		atomic_inc(&sess->nconn);
 716		pr_debug("Incremented iSCSI Connection count to %hu"
 717			" from node: %s\n", atomic_read(&sess->nconn),
 718			sess->sess_ops->InitiatorName);
 719		spin_unlock_bh(&sess->conn_lock);
 720
 721		iscsi_post_login_start_timers(conn);
 722		/*
 723		 * Determine CPU mask to ensure connection's RX and TX kthreads
 724		 * are scheduled on the same CPU.
 725		 */
 726		iscsit_thread_get_cpumask(conn);
 727		conn->conn_rx_reset_cpumask = 1;
 728		conn->conn_tx_reset_cpumask = 1;
 729		/*
 730		 * Wakeup the sleeping iscsi_target_rx_thread() now that
 731		 * iscsi_conn is in TARG_CONN_STATE_LOGGED_IN state.
 732		 */
 733		complete(&conn->rx_login_comp);
 734		iscsit_dec_conn_usage_count(conn);
 735
 736		if (stop_timer) {
 737			spin_lock_bh(&se_tpg->session_lock);
 738			iscsit_stop_time2retain_timer(sess);
 739			spin_unlock_bh(&se_tpg->session_lock);
 740		}
 741		iscsit_dec_session_usage_count(sess);
 742		return;
 743	}
 744
 745	iscsi_set_session_parameters(sess->sess_ops, conn->param_list, 1);
 746	iscsi_release_param_list(conn->param_list);
 747	conn->param_list = NULL;
 748
 749	iscsit_determine_maxcmdsn(sess);
 750
 751	spin_lock_bh(&se_tpg->session_lock);
 752	__transport_register_session(&sess->tpg->tpg_se_tpg,
 753			se_sess->se_node_acl, se_sess, sess);
 754	pr_debug("Moving to TARG_SESS_STATE_LOGGED_IN.\n");
 755	sess->session_state = TARG_SESS_STATE_LOGGED_IN;
 756
 757	pr_debug("iSCSI Login successful on CID: %hu from %pISpc to %pISpc,%hu\n",
 758		conn->cid, &conn->login_sockaddr, &conn->local_sockaddr,
 759		tpg->tpgt);
 760
 761	spin_lock_bh(&sess->conn_lock);
 762	list_add_tail(&conn->conn_list, &sess->sess_conn_list);
 763	atomic_inc(&sess->nconn);
 764	pr_debug("Incremented iSCSI Connection count to %hu from node:"
 765		" %s\n", atomic_read(&sess->nconn),
 766		sess->sess_ops->InitiatorName);
 767	spin_unlock_bh(&sess->conn_lock);
 768
 769	sess->sid = tpg->sid++;
 770	if (!sess->sid)
 771		sess->sid = tpg->sid++;
 772	pr_debug("Established iSCSI session from node: %s\n",
 773			sess->sess_ops->InitiatorName);
 774
 775	tpg->nsessions++;
 776	if (tpg->tpg_tiqn)
 777		tpg->tpg_tiqn->tiqn_nsessions++;
 778
 779	pr_debug("Incremented number of active iSCSI sessions to %u on"
 780		" iSCSI Target Portal Group: %hu\n", tpg->nsessions, tpg->tpgt);
 781	spin_unlock_bh(&se_tpg->session_lock);
 782
 783	iscsi_post_login_start_timers(conn);
 784	/*
 785	 * Determine CPU mask to ensure connection's RX and TX kthreads
 786	 * are scheduled on the same CPU.
 787	 */
 788	iscsit_thread_get_cpumask(conn);
 789	conn->conn_rx_reset_cpumask = 1;
 790	conn->conn_tx_reset_cpumask = 1;
 791	/*
 792	 * Wakeup the sleeping iscsi_target_rx_thread() now that
 793	 * iscsi_conn is in TARG_CONN_STATE_LOGGED_IN state.
 794	 */
 795	complete(&conn->rx_login_comp);
 796	iscsit_dec_conn_usage_count(conn);
 797}
 798
 799void iscsi_handle_login_thread_timeout(struct timer_list *t)
 800{
 801	struct iscsi_np *np = from_timer(np, t, np_login_timer);
 802
 803	spin_lock_bh(&np->np_thread_lock);
 804	pr_err("iSCSI Login timeout on Network Portal %pISpc\n",
 805			&np->np_sockaddr);
 806
 807	if (np->np_login_timer_flags & ISCSI_TF_STOP) {
 808		spin_unlock_bh(&np->np_thread_lock);
 809		return;
 810	}
 811
 812	if (np->np_thread)
 813		send_sig(SIGINT, np->np_thread, 1);
 814
 815	np->np_login_timer_flags &= ~ISCSI_TF_RUNNING;
 816	spin_unlock_bh(&np->np_thread_lock);
 817}
 818
 819static void iscsi_start_login_thread_timer(struct iscsi_np *np)
 820{
 821	/*
 822	 * This used the TA_LOGIN_TIMEOUT constant because at this
 823	 * point we do not have access to ISCSI_TPG_ATTRIB(tpg)->login_timeout
 824	 */
 825	spin_lock_bh(&np->np_thread_lock);
 826	np->np_login_timer_flags &= ~ISCSI_TF_STOP;
 827	np->np_login_timer_flags |= ISCSI_TF_RUNNING;
 828	mod_timer(&np->np_login_timer, jiffies + TA_LOGIN_TIMEOUT * HZ);
 829
 830	pr_debug("Added timeout timer to iSCSI login request for"
 831			" %u seconds.\n", TA_LOGIN_TIMEOUT);
 832	spin_unlock_bh(&np->np_thread_lock);
 833}
 834
 835static void iscsi_stop_login_thread_timer(struct iscsi_np *np)
 836{
 837	spin_lock_bh(&np->np_thread_lock);
 838	if (!(np->np_login_timer_flags & ISCSI_TF_RUNNING)) {
 839		spin_unlock_bh(&np->np_thread_lock);
 840		return;
 841	}
 842	np->np_login_timer_flags |= ISCSI_TF_STOP;
 843	spin_unlock_bh(&np->np_thread_lock);
 844
 845	del_timer_sync(&np->np_login_timer);
 846
 847	spin_lock_bh(&np->np_thread_lock);
 848	np->np_login_timer_flags &= ~ISCSI_TF_RUNNING;
 849	spin_unlock_bh(&np->np_thread_lock);
 850}
 851
 852int iscsit_setup_np(
 853	struct iscsi_np *np,
 854	struct sockaddr_storage *sockaddr)
 855{
 856	struct socket *sock = NULL;
 857	int backlog = ISCSIT_TCP_BACKLOG, ret, opt = 0, len;
 858
 859	switch (np->np_network_transport) {
 860	case ISCSI_TCP:
 861		np->np_ip_proto = IPPROTO_TCP;
 862		np->np_sock_type = SOCK_STREAM;
 863		break;
 864	case ISCSI_SCTP_TCP:
 865		np->np_ip_proto = IPPROTO_SCTP;
 866		np->np_sock_type = SOCK_STREAM;
 867		break;
 868	case ISCSI_SCTP_UDP:
 869		np->np_ip_proto = IPPROTO_SCTP;
 870		np->np_sock_type = SOCK_SEQPACKET;
 871		break;
 872	default:
 873		pr_err("Unsupported network_transport: %d\n",
 874				np->np_network_transport);
 875		return -EINVAL;
 876	}
 877
 878	ret = sock_create(sockaddr->ss_family, np->np_sock_type,
 879			np->np_ip_proto, &sock);
 880	if (ret < 0) {
 881		pr_err("sock_create() failed.\n");
 882		return ret;
 883	}
 884	np->np_socket = sock;
 885	/*
 886	 * Setup the np->np_sockaddr from the passed sockaddr setup
 887	 * in iscsi_target_configfs.c code..
 888	 */
 889	memcpy(&np->np_sockaddr, sockaddr,
 890			sizeof(struct sockaddr_storage));
 891
 892	if (sockaddr->ss_family == AF_INET6)
 893		len = sizeof(struct sockaddr_in6);
 894	else
 895		len = sizeof(struct sockaddr_in);
 896	/*
 897	 * Set SO_REUSEADDR, and disable Nagel Algorithm with TCP_NODELAY.
 898	 */
 899	/* FIXME: Someone please explain why this is endian-safe */
 900	opt = 1;
 901	if (np->np_network_transport == ISCSI_TCP) {
 902		ret = kernel_setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
 903				(char *)&opt, sizeof(opt));
 904		if (ret < 0) {
 905			pr_err("kernel_setsockopt() for TCP_NODELAY"
 906				" failed: %d\n", ret);
 907			goto fail;
 908		}
 909	}
 910
 911	/* FIXME: Someone please explain why this is endian-safe */
 912	ret = kernel_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
 913			(char *)&opt, sizeof(opt));
 914	if (ret < 0) {
 915		pr_err("kernel_setsockopt() for SO_REUSEADDR"
 916			" failed\n");
 917		goto fail;
 918	}
 919
 920	ret = kernel_setsockopt(sock, IPPROTO_IP, IP_FREEBIND,
 921			(char *)&opt, sizeof(opt));
 922	if (ret < 0) {
 923		pr_err("kernel_setsockopt() for IP_FREEBIND"
 924			" failed\n");
 925		goto fail;
 926	}
 927
 928	ret = kernel_bind(sock, (struct sockaddr *)&np->np_sockaddr, len);
 929	if (ret < 0) {
 930		pr_err("kernel_bind() failed: %d\n", ret);
 931		goto fail;
 932	}
 933
 934	ret = kernel_listen(sock, backlog);
 935	if (ret != 0) {
 936		pr_err("kernel_listen() failed: %d\n", ret);
 937		goto fail;
 938	}
 939
 940	return 0;
 941fail:
 942	np->np_socket = NULL;
 943	sock_release(sock);
 944	return ret;
 945}
 946
 947int iscsi_target_setup_login_socket(
 948	struct iscsi_np *np,
 949	struct sockaddr_storage *sockaddr)
 950{
 951	struct iscsit_transport *t;
 952	int rc;
 953
 954	t = iscsit_get_transport(np->np_network_transport);
 955	if (!t)
 956		return -EINVAL;
 957
 958	rc = t->iscsit_setup_np(np, sockaddr);
 959	if (rc < 0) {
 960		iscsit_put_transport(t);
 961		return rc;
 962	}
 963
 964	np->np_transport = t;
 965	np->enabled = true;
 966	return 0;
 967}
 968
 969int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
 970{
 971	struct socket *new_sock, *sock = np->np_socket;
 972	struct sockaddr_in sock_in;
 973	struct sockaddr_in6 sock_in6;
 974	int rc;
 975
 976	rc = kernel_accept(sock, &new_sock, 0);
 977	if (rc < 0)
 978		return rc;
 979
 980	conn->sock = new_sock;
 981	conn->login_family = np->np_sockaddr.ss_family;
 982
 983	if (np->np_sockaddr.ss_family == AF_INET6) {
 984		memset(&sock_in6, 0, sizeof(struct sockaddr_in6));
 985
 986		rc = conn->sock->ops->getname(conn->sock,
 987				(struct sockaddr *)&sock_in6, 1);
 988		if (rc >= 0) {
 989			if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) {
 990				memcpy(&conn->login_sockaddr, &sock_in6, sizeof(sock_in6));
 991			} else {
 992				/* Pretend to be an ipv4 socket */
 993				sock_in.sin_family = AF_INET;
 994				sock_in.sin_port = sock_in6.sin6_port;
 995				memcpy(&sock_in.sin_addr, &sock_in6.sin6_addr.s6_addr32[3], 4);
 996				memcpy(&conn->login_sockaddr, &sock_in, sizeof(sock_in));
 997			}
 998		}
 999
1000		rc = conn->sock->ops->getname(conn->sock,
1001				(struct sockaddr *)&sock_in6, 0);
1002		if (rc >= 0) {
1003			if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) {
1004				memcpy(&conn->local_sockaddr, &sock_in6, sizeof(sock_in6));
1005			} else {
1006				/* Pretend to be an ipv4 socket */
1007				sock_in.sin_family = AF_INET;
1008				sock_in.sin_port = sock_in6.sin6_port;
1009				memcpy(&sock_in.sin_addr, &sock_in6.sin6_addr.s6_addr32[3], 4);
1010				memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in));
1011			}
1012		}
1013	} else {
1014		memset(&sock_in, 0, sizeof(struct sockaddr_in));
1015
1016		rc = conn->sock->ops->getname(conn->sock,
1017				(struct sockaddr *)&sock_in, 1);
1018		if (rc >= 0)
1019			memcpy(&conn->login_sockaddr, &sock_in, sizeof(sock_in));
1020
1021		rc = conn->sock->ops->getname(conn->sock,
1022				(struct sockaddr *)&sock_in, 0);
1023		if (rc >= 0)
1024			memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in));
1025	}
1026
1027	return 0;
1028}
1029
1030int iscsit_get_login_rx(struct iscsi_conn *conn, struct iscsi_login *login)
1031{
1032	struct iscsi_login_req *login_req;
1033	u32 padding = 0, payload_length;
1034
1035	if (iscsi_login_rx_data(conn, login->req, ISCSI_HDR_LEN) < 0)
1036		return -1;
1037
1038	login_req = (struct iscsi_login_req *)login->req;
1039	payload_length	= ntoh24(login_req->dlength);
1040	padding = ((-payload_length) & 3);
1041
1042	pr_debug("Got Login Command, Flags 0x%02x, ITT: 0x%08x,"
1043		" CmdSN: 0x%08x, ExpStatSN: 0x%08x, CID: %hu, Length: %u\n",
1044		login_req->flags, login_req->itt, login_req->cmdsn,
1045		login_req->exp_statsn, login_req->cid, payload_length);
1046	/*
1047	 * Setup the initial iscsi_login values from the leading
1048	 * login request PDU.
1049	 */
1050	if (login->first_request) {
1051		login_req = (struct iscsi_login_req *)login->req;
1052		login->leading_connection = (!login_req->tsih) ? 1 : 0;
1053		login->current_stage	= ISCSI_LOGIN_CURRENT_STAGE(login_req->flags);
1054		login->version_min	= login_req->min_version;
1055		login->version_max	= login_req->max_version;
1056		memcpy(login->isid, login_req->isid, 6);
1057		login->cmd_sn		= be32_to_cpu(login_req->cmdsn);
1058		login->init_task_tag	= login_req->itt;
1059		login->initial_exp_statsn = be32_to_cpu(login_req->exp_statsn);
1060		login->cid		= be16_to_cpu(login_req->cid);
1061		login->tsih		= be16_to_cpu(login_req->tsih);
1062	}
1063
1064	if (iscsi_target_check_login_request(conn, login) < 0)
1065		return -1;
1066
1067	memset(login->req_buf, 0, MAX_KEY_VALUE_PAIRS);
1068	if (iscsi_login_rx_data(conn, login->req_buf,
1069				payload_length + padding) < 0)
1070		return -1;
1071
1072	return 0;
1073}
1074
1075int iscsit_put_login_tx(struct iscsi_conn *conn, struct iscsi_login *login,
1076			u32 length)
1077{
1078	if (iscsi_login_tx_data(conn, login->rsp, login->rsp_buf, length) < 0)
1079		return -1;
1080
1081	return 0;
1082}
1083
1084static int
1085iscsit_conn_set_transport(struct iscsi_conn *conn, struct iscsit_transport *t)
1086{
1087	int rc;
1088
1089	if (!t->owner) {
1090		conn->conn_transport = t;
1091		return 0;
1092	}
1093
1094	rc = try_module_get(t->owner);
1095	if (!rc) {
1096		pr_err("try_module_get() failed for %s\n", t->name);
1097		return -EINVAL;
1098	}
1099
1100	conn->conn_transport = t;
1101	return 0;
1102}
1103
1104static struct iscsi_conn *iscsit_alloc_conn(struct iscsi_np *np)
1105{
1106	struct iscsi_conn *conn;
1107
1108	conn = kzalloc(sizeof(struct iscsi_conn), GFP_KERNEL);
1109	if (!conn) {
1110		pr_err("Could not allocate memory for new connection\n");
1111		return NULL;
1112	}
1113	pr_debug("Moving to TARG_CONN_STATE_FREE.\n");
1114	conn->conn_state = TARG_CONN_STATE_FREE;
1115
1116	init_waitqueue_head(&conn->queues_wq);
1117	INIT_LIST_HEAD(&conn->conn_list);
1118	INIT_LIST_HEAD(&conn->conn_cmd_list);
1119	INIT_LIST_HEAD(&conn->immed_queue_list);
1120	INIT_LIST_HEAD(&conn->response_queue_list);
1121	init_completion(&conn->conn_post_wait_comp);
1122	init_completion(&conn->conn_wait_comp);
1123	init_completion(&conn->conn_wait_rcfr_comp);
1124	init_completion(&conn->conn_waiting_on_uc_comp);
1125	init_completion(&conn->conn_logout_comp);
1126	init_completion(&conn->rx_half_close_comp);
1127	init_completion(&conn->tx_half_close_comp);
1128	init_completion(&conn->rx_login_comp);
1129	spin_lock_init(&conn->cmd_lock);
1130	spin_lock_init(&conn->conn_usage_lock);
1131	spin_lock_init(&conn->immed_queue_lock);
1132	spin_lock_init(&conn->nopin_timer_lock);
1133	spin_lock_init(&conn->response_queue_lock);
1134	spin_lock_init(&conn->state_lock);
 
 
1135
1136	timer_setup(&conn->nopin_response_timer,
1137		    iscsit_handle_nopin_response_timeout, 0);
1138	timer_setup(&conn->nopin_timer, iscsit_handle_nopin_timeout, 0);
 
1139
1140	if (iscsit_conn_set_transport(conn, np->np_transport) < 0)
1141		goto free_conn;
1142
1143	conn->conn_ops = kzalloc(sizeof(struct iscsi_conn_ops), GFP_KERNEL);
1144	if (!conn->conn_ops) {
1145		pr_err("Unable to allocate memory for struct iscsi_conn_ops.\n");
1146		goto put_transport;
1147	}
1148
1149	if (!zalloc_cpumask_var(&conn->conn_cpumask, GFP_KERNEL)) {
1150		pr_err("Unable to allocate conn->conn_cpumask\n");
1151		goto free_conn_ops;
1152	}
1153
 
 
 
 
 
 
 
 
 
1154	return conn;
1155
 
 
 
 
1156free_conn_ops:
1157	kfree(conn->conn_ops);
1158put_transport:
1159	iscsit_put_transport(conn->conn_transport);
1160free_conn:
1161	kfree(conn);
1162	return NULL;
1163}
1164
1165void iscsit_free_conn(struct iscsi_conn *conn)
1166{
 
 
1167	free_cpumask_var(conn->conn_cpumask);
1168	kfree(conn->conn_ops);
1169	iscsit_put_transport(conn->conn_transport);
1170	kfree(conn);
1171}
1172
1173void iscsi_target_login_sess_out(struct iscsi_conn *conn,
1174		struct iscsi_np *np, bool zero_tsih, bool new_sess)
1175{
1176	if (!new_sess)
1177		goto old_sess_out;
1178
1179	pr_err("iSCSI Login negotiation failed.\n");
1180	iscsit_collect_login_stats(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
1181				   ISCSI_LOGIN_STATUS_INIT_ERR);
1182	if (!zero_tsih || !conn->sess)
1183		goto old_sess_out;
1184
1185	transport_free_session(conn->sess->se_sess);
1186	ida_free(&sess_ida, conn->sess->session_index);
1187	kfree(conn->sess->sess_ops);
1188	kfree(conn->sess);
1189	conn->sess = NULL;
1190
1191old_sess_out:
1192	iscsi_stop_login_thread_timer(np);
1193	/*
1194	 * If login negotiation fails check if the Time2Retain timer
1195	 * needs to be restarted.
1196	 */
1197	if (!zero_tsih && conn->sess) {
1198		spin_lock_bh(&conn->sess->conn_lock);
1199		if (conn->sess->session_state == TARG_SESS_STATE_FAILED) {
1200			struct se_portal_group *se_tpg =
1201					&conn->tpg->tpg_se_tpg;
1202
1203			atomic_set(&conn->sess->session_continuation, 0);
1204			spin_unlock_bh(&conn->sess->conn_lock);
1205			spin_lock_bh(&se_tpg->session_lock);
1206			iscsit_start_time2retain_handler(conn->sess);
1207			spin_unlock_bh(&se_tpg->session_lock);
1208		} else
1209			spin_unlock_bh(&conn->sess->conn_lock);
1210		iscsit_dec_session_usage_count(conn->sess);
1211	}
1212
1213	ahash_request_free(conn->conn_tx_hash);
1214	if (conn->conn_rx_hash) {
1215		struct crypto_ahash *tfm;
1216
1217		tfm = crypto_ahash_reqtfm(conn->conn_rx_hash);
1218		ahash_request_free(conn->conn_rx_hash);
1219		crypto_free_ahash(tfm);
1220	}
1221
1222	if (conn->param_list) {
1223		iscsi_release_param_list(conn->param_list);
1224		conn->param_list = NULL;
1225	}
1226	iscsi_target_nego_release(conn);
1227
1228	if (conn->sock) {
1229		sock_release(conn->sock);
1230		conn->sock = NULL;
1231	}
1232
1233	if (conn->conn_transport->iscsit_wait_conn)
1234		conn->conn_transport->iscsit_wait_conn(conn);
1235
1236	if (conn->conn_transport->iscsit_free_conn)
1237		conn->conn_transport->iscsit_free_conn(conn);
1238
1239	iscsit_free_conn(conn);
1240}
1241
1242static int __iscsi_target_login_thread(struct iscsi_np *np)
1243{
1244	u8 *buffer, zero_tsih = 0;
1245	int ret = 0, rc;
1246	struct iscsi_conn *conn = NULL;
1247	struct iscsi_login *login;
1248	struct iscsi_portal_group *tpg = NULL;
1249	struct iscsi_login_req *pdu;
1250	struct iscsi_tpg_np *tpg_np;
1251	bool new_sess = false;
1252
1253	flush_signals(current);
1254
1255	spin_lock_bh(&np->np_thread_lock);
1256	if (atomic_dec_if_positive(&np->np_reset_count) >= 0) {
1257		np->np_thread_state = ISCSI_NP_THREAD_ACTIVE;
1258		spin_unlock_bh(&np->np_thread_lock);
1259		complete(&np->np_restart_comp);
1260		return 1;
1261	} else if (np->np_thread_state == ISCSI_NP_THREAD_SHUTDOWN) {
1262		spin_unlock_bh(&np->np_thread_lock);
1263		goto exit;
1264	} else {
1265		np->np_thread_state = ISCSI_NP_THREAD_ACTIVE;
1266	}
1267	spin_unlock_bh(&np->np_thread_lock);
1268
1269	conn = iscsit_alloc_conn(np);
1270	if (!conn) {
1271		/* Get another socket */
1272		return 1;
1273	}
1274
1275	rc = np->np_transport->iscsit_accept_np(np, conn);
1276	if (rc == -ENOSYS) {
1277		complete(&np->np_restart_comp);
1278		iscsit_free_conn(conn);
1279		goto exit;
1280	} else if (rc < 0) {
1281		spin_lock_bh(&np->np_thread_lock);
1282		if (atomic_dec_if_positive(&np->np_reset_count) >= 0) {
1283			np->np_thread_state = ISCSI_NP_THREAD_ACTIVE;
1284			spin_unlock_bh(&np->np_thread_lock);
1285			complete(&np->np_restart_comp);
1286			iscsit_free_conn(conn);
1287			/* Get another socket */
1288			return 1;
1289		}
1290		spin_unlock_bh(&np->np_thread_lock);
1291		iscsit_free_conn(conn);
1292		return 1;
1293	}
1294	/*
1295	 * Perform the remaining iSCSI connection initialization items..
1296	 */
1297	login = iscsi_login_init_conn(conn);
1298	if (!login) {
1299		goto new_sess_out;
1300	}
1301
1302	iscsi_start_login_thread_timer(np);
1303
1304	pr_debug("Moving to TARG_CONN_STATE_XPT_UP.\n");
1305	conn->conn_state = TARG_CONN_STATE_XPT_UP;
1306	/*
1307	 * This will process the first login request + payload..
1308	 */
1309	rc = np->np_transport->iscsit_get_login_rx(conn, login);
1310	if (rc == 1)
1311		return 1;
1312	else if (rc < 0)
1313		goto new_sess_out;
1314
1315	buffer = &login->req[0];
1316	pdu = (struct iscsi_login_req *)buffer;
1317	/*
1318	 * Used by iscsit_tx_login_rsp() for Login Resonses PDUs
1319	 * when Status-Class != 0.
1320	*/
1321	conn->login_itt	= pdu->itt;
1322
1323	spin_lock_bh(&np->np_thread_lock);
1324	if (np->np_thread_state != ISCSI_NP_THREAD_ACTIVE) {
1325		spin_unlock_bh(&np->np_thread_lock);
1326		pr_err("iSCSI Network Portal on %pISpc currently not"
1327			" active.\n", &np->np_sockaddr);
1328		iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
1329				ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE);
1330		goto new_sess_out;
1331	}
1332	spin_unlock_bh(&np->np_thread_lock);
1333
1334	conn->network_transport = np->np_network_transport;
1335
1336	pr_debug("Received iSCSI login request from %pISpc on %s Network"
1337		" Portal %pISpc\n", &conn->login_sockaddr, np->np_transport->name,
1338		&conn->local_sockaddr);
1339
1340	pr_debug("Moving to TARG_CONN_STATE_IN_LOGIN.\n");
1341	conn->conn_state	= TARG_CONN_STATE_IN_LOGIN;
1342
1343	if (iscsi_login_check_initiator_version(conn, pdu->max_version,
1344			pdu->min_version) < 0)
1345		goto new_sess_out;
1346
1347	zero_tsih = (pdu->tsih == 0x0000);
1348	if (zero_tsih) {
1349		/*
1350		 * This is the leading connection of a new session.
1351		 * We wait until after authentication to check for
1352		 * session reinstatement.
1353		 */
1354		if (iscsi_login_zero_tsih_s1(conn, buffer) < 0)
1355			goto new_sess_out;
1356	} else {
1357		/*
1358		 * Add a new connection to an existing session.
1359		 * We check for a non-existant session in
1360		 * iscsi_login_non_zero_tsih_s2() below based
1361		 * on ISID/TSIH, but wait until after authentication
1362		 * to check for connection reinstatement, etc.
1363		 */
1364		if (iscsi_login_non_zero_tsih_s1(conn, buffer) < 0)
1365			goto new_sess_out;
1366	}
1367	/*
1368	 * SessionType: Discovery
1369	 *
1370	 * 	Locates Default Portal
1371	 *
1372	 * SessionType: Normal
1373	 *
1374	 * 	Locates Target Portal from NP -> Target IQN
1375	 */
1376	rc = iscsi_target_locate_portal(np, conn, login);
1377	if (rc < 0) {
1378		tpg = conn->tpg;
1379		goto new_sess_out;
1380	}
1381	login->zero_tsih = zero_tsih;
1382
1383	if (conn->sess)
1384		conn->sess->se_sess->sup_prot_ops =
1385			conn->conn_transport->iscsit_get_sup_prot_ops(conn);
1386
1387	tpg = conn->tpg;
1388	if (!tpg) {
1389		pr_err("Unable to locate struct iscsi_conn->tpg\n");
1390		goto new_sess_out;
1391	}
1392
1393	if (zero_tsih) {
1394		if (iscsi_login_zero_tsih_s2(conn) < 0)
1395			goto new_sess_out;
1396	} else {
1397		if (iscsi_login_non_zero_tsih_s2(conn, buffer) < 0)
1398			goto old_sess_out;
1399	}
1400
1401	if (conn->conn_transport->iscsit_validate_params) {
1402		ret = conn->conn_transport->iscsit_validate_params(conn);
1403		if (ret < 0) {
1404			if (zero_tsih)
1405				goto new_sess_out;
1406			else
1407				goto old_sess_out;
1408		}
1409	}
1410
1411	ret = iscsi_target_start_negotiation(login, conn);
1412	if (ret < 0)
1413		goto new_sess_out;
1414
1415	iscsi_stop_login_thread_timer(np);
1416
1417	if (ret == 1) {
1418		tpg_np = conn->tpg_np;
1419
1420		iscsi_post_login_handler(np, conn, zero_tsih);
1421		iscsit_deaccess_np(np, tpg, tpg_np);
1422	}
1423
1424	tpg = NULL;
1425	tpg_np = NULL;
1426	/* Get another socket */
1427	return 1;
1428
1429new_sess_out:
1430	new_sess = true;
1431old_sess_out:
 
1432	tpg_np = conn->tpg_np;
1433	iscsi_target_login_sess_out(conn, np, zero_tsih, new_sess);
1434	new_sess = false;
1435
1436	if (tpg) {
1437		iscsit_deaccess_np(np, tpg, tpg_np);
1438		tpg = NULL;
1439		tpg_np = NULL;
1440	}
1441
1442	return 1;
1443
1444exit:
1445	iscsi_stop_login_thread_timer(np);
1446	spin_lock_bh(&np->np_thread_lock);
1447	np->np_thread_state = ISCSI_NP_THREAD_EXIT;
1448	spin_unlock_bh(&np->np_thread_lock);
1449
1450	return 0;
1451}
1452
1453int iscsi_target_login_thread(void *arg)
1454{
1455	struct iscsi_np *np = arg;
1456	int ret;
1457
1458	allow_signal(SIGINT);
1459
1460	while (1) {
1461		ret = __iscsi_target_login_thread(np);
1462		/*
1463		 * We break and exit here unless another sock_accept() call
1464		 * is expected.
1465		 */
1466		if (ret != 1)
1467			break;
1468	}
1469
1470	while (!kthread_should_stop()) {
1471		msleep(100);
1472	}
1473
1474	return 0;
1475}