860e10c
From ea05be3ff043efd44256283d968fa1bb9a371568 Mon Sep 17 00:00:00 2001
860e10c
From: Mike Christie <michaelc@cs.wisc.edu>
860e10c
Date: Thu, 13 Feb 2014 12:37:09 -0600
860e10c
Subject: [PATCH] iscsi tools: set non negotiated params early.
860e10c
860e10c
This patch has the iscsi tools pass down the non-negotiated
860e10c
iscsi settings before doing iscsi login. This allows the
860e10c
drivers to get info that might be neede to setup the session
860e10c
early.
860e10c
860e10c
This patch also adds the missing discovery_sess param to
860e10c
the non negotiated params.
860e10c
---
860e10c
 usr/discovery.c        | 15 +++++++++--
860e10c
 usr/initiator.c        | 22 +++++++++++-----
860e10c
 usr/initiator.h        |  1 +
860e10c
 usr/initiator_common.c | 69 ++++++++++++++++++++++++++++++++++++++++++++------
860e10c
 4 files changed, 91 insertions(+), 16 deletions(-)
860e10c
860e10c
diff --git a/usr/discovery.c b/usr/discovery.c
860e10c
index afce6c0..635ec8d 100644
860e10c
--- a/usr/discovery.c
860e10c
+++ b/usr/discovery.c
860e10c
@@ -1403,6 +1403,17 @@ redirect_reconnect:
860e10c
 	iscsi_copy_operational_params(&session->conn[0], &config->session_conf,
860e10c
 				      &config->conn_conf);
860e10c
 
860e10c
+	if (t->caps & CAP_TEXT_NEGO) {
860e10c
+		log_debug(2, "%s discovery set params\n", __FUNCTION__);
860e10c
+		rc = iscsi_session_set_params(conn);
860e10c
+		if (rc) {
860e10c
+			log_error("Could not set iscsi params for conn %d:%d "
860e10c
+				  "(err %d)\n", session->id, conn->id, rc);
860e10c
+			rc = ISCSI_ERR_INTERNAL;
860e10c
+			goto login_failed;
860e10c
+		}
860e10c
+	}
860e10c
+
860e10c
 	if ((session->t->caps & CAP_LOGIN_OFFLOAD))
860e10c
 		goto start_conn;
860e10c
 
860e10c
@@ -1509,8 +1520,8 @@ redirect_reconnect:
860e10c
 		return 0;
860e10c
 
860e10c
 start_conn:
860e10c
-	log_debug(2, "%s discovery set params\n", __FUNCTION__);
860e10c
-	rc = iscsi_session_set_params(conn);
860e10c
+	log_debug(2, "%s discovery set neg params\n", __FUNCTION__);
860e10c
+	rc = iscsi_session_set_neg_params(conn);
860e10c
 	if (rc) {
860e10c
 		log_error("Could not set iscsi params for conn %d:%d (err "
860e10c
 			  "%d)\n", session->id, conn->id, rc);
860e10c
diff --git a/usr/initiator.c b/usr/initiator.c
860e10c
index 79d1779..05a5b19 100644
860e10c
--- a/usr/initiator.c
860e10c
+++ b/usr/initiator.c
860e10c
@@ -1048,12 +1048,7 @@ setup_full_feature_phase(iscsi_conn_t *conn)
860e10c
 
860e10c
 	actor_delete(&conn->login_timer);
860e10c
 
860e10c
-	if (iscsi_session_set_params(conn)) {
860e10c
-		iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN);
860e10c
-		return;
860e10c
-	}
860e10c
-
860e10c
-	if (iscsi_host_set_params(session)) {
860e10c
+	if (iscsi_session_set_neg_params(conn)) {
860e10c
 		iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN);
860e10c
 		return;
860e10c
 	}
860e10c
@@ -1507,6 +1502,11 @@ static void setup_offload_login_phase(iscsi_conn_t *conn)
860e10c
 		return;
860e10c
 	}
860e10c
 
860e10c
+	if (iscsi_session_set_neg_params(conn)) {
860e10c
+		iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN);
860e10c
+		return;
860e10c
+	}
860e10c
+
860e10c
 	if (iscsi_host_set_params(session)) {
860e10c
 		iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN);
860e10c
 		return;
860e10c
@@ -1618,6 +1618,16 @@ static void session_conn_poll(void *data)
860e10c
 			return;
860e10c
 		}
860e10c
 
860e10c
+		if (iscsi_session_set_params(conn)) {
860e10c
+			iscsi_login_eh(conn, qtask, ISCSI_ERR_LOGIN);
860e10c
+			return;
860e10c
+		}
860e10c
+
860e10c
+		if (iscsi_host_set_params(session)) {
860e10c
+			iscsi_login_eh(conn, qtask, ISCSI_ERR_LOGIN);
860e10c
+			return;
860e10c
+		}
860e10c
+
860e10c
 		if (iscsi_login_begin(session, c)) {
860e10c
 			iscsi_login_eh(conn, qtask, ISCSI_ERR_LOGIN);
860e10c
 			return;
860e10c
diff --git a/usr/initiator.h b/usr/initiator.h
860e10c
index 680640c..c34625b 100644
860e10c
--- a/usr/initiator.h
860e10c
+++ b/usr/initiator.h
860e10c
@@ -344,6 +344,7 @@ extern void free_initiator(void);
860e10c
 extern void iscsi_initiator_init(void);
860e10c
 
860e10c
 /* initiator code common to discovery and normal sessions */
860e10c
+extern int iscsi_session_set_neg_params(struct iscsi_conn *conn);
860e10c
 extern int iscsi_session_set_params(struct iscsi_conn *conn);
860e10c
 extern int iscsi_host_set_params(struct iscsi_session *session);
860e10c
 extern int iscsi_host_set_net_params(struct iface_rec *iface,
860e10c
diff --git a/usr/initiator_common.c b/usr/initiator_common.c
860e10c
index e2e87a1..109e8d7 100644
860e10c
--- a/usr/initiator_common.c
860e10c
+++ b/usr/initiator_common.c
860e10c
@@ -345,9 +345,9 @@ void iscsi_session_init_params(struct iscsi_session *session)
860e10c
 	}
860e10c
 }
860e10c
 
860e10c
-#define MAX_SESSION_PARAMS 35
860e10c
+#define MAX_SESSION_NEG_PARAMS 16
860e10c
 
860e10c
-int iscsi_session_set_params(struct iscsi_conn *conn)
860e10c
+int iscsi_session_set_neg_params(struct iscsi_conn *conn)
860e10c
 {
860e10c
 	struct iscsi_session *session = conn->session;
860e10c
 	int i, rc;
860e10c
@@ -357,7 +357,7 @@ int iscsi_session_set_params(struct iscsi_conn *conn)
860e10c
 		int type;
860e10c
 		void *value;
860e10c
 		int conn_only;
860e10c
-	} conntbl[MAX_SESSION_PARAMS] = {
860e10c
+	} conntbl[MAX_SESSION_NEG_PARAMS] = {
860e10c
 		{
860e10c
 			.param = ISCSI_PARAM_MAX_RECV_DLENGTH,
860e10c
 			.value = &conn->max_recv_dlength,
860e10c
@@ -434,15 +434,58 @@ int iscsi_session_set_params(struct iscsi_conn *conn)
860e10c
 			.type = ISCSI_INT,
860e10c
 			.conn_only = 1,
860e10c
 		}, {
860e10c
-			.param = ISCSI_PARAM_TARGET_NAME,
860e10c
-			.conn_only = 0,
860e10c
-			.type = ISCSI_STRING,
860e10c
-			.value = session->target_name,
860e10c
-		}, {
860e10c
 			.param = ISCSI_PARAM_TPGT,
860e10c
 			.value = &session->portal_group_tag,
860e10c
 			.type = ISCSI_INT,
860e10c
 			.conn_only = 0,
860e10c
+		},
860e10c
+	};
860e10c
+
860e10c
+	iscsi_session_init_params(session);
860e10c
+
860e10c
+	/* Entered full-feature phase! */
860e10c
+	for (i = 0; i < MAX_SESSION_NEG_PARAMS; i++) {
860e10c
+		if (conn->id != 0 && !conntbl[i].conn_only)
860e10c
+			continue;
860e10c
+
860e10c
+		if (!(session->param_mask & (1ULL << conntbl[i].param)))
860e10c
+			continue;
860e10c
+
860e10c
+		rc = ipc->set_param(session->t->handle, session->id,
860e10c
+				   conn->id, conntbl[i].param, conntbl[i].value,
860e10c
+				   conntbl[i].type);
860e10c
+		if (rc && rc != -ENOSYS) {
860e10c
+			log_error("can't set operational parameter %d for "
860e10c
+				  "connection %d:%d, retcode %d (%d)",
860e10c
+				  conntbl[i].param, session->id, conn->id,
860e10c
+				  rc, errno);
860e10c
+			return EPERM;
860e10c
+		}
860e10c
+
860e10c
+		print_param_value(conntbl[i].param, conntbl[i].value,
860e10c
+				  conntbl[i].type);
860e10c
+	}
860e10c
+
860e10c
+	return 0;
860e10c
+}
860e10c
+
860e10c
+#define MAX_SESSION_PARAMS 20
860e10c
+
860e10c
+int iscsi_session_set_params(struct iscsi_conn *conn)
860e10c
+{
860e10c
+	struct iscsi_session *session = conn->session;
860e10c
+	int i, rc;
860e10c
+	struct connparam {
860e10c
+		int param;
860e10c
+		int type;
860e10c
+		void *value;
860e10c
+		int conn_only;
860e10c
+	} conntbl[MAX_SESSION_PARAMS] = {
860e10c
+		{
860e10c
+			.param = ISCSI_PARAM_TARGET_NAME,
860e10c
+			.conn_only = 0,
860e10c
+			.type = ISCSI_STRING,
860e10c
+			.value = session->target_name,
860e10c
 		}, {
860e10c
 			.param = ISCSI_PARAM_PERSISTENT_ADDRESS,
860e10c
 			.value = session->nrec.conn[conn->id].address,
860e10c
@@ -512,22 +555,32 @@ int iscsi_session_set_params(struct iscsi_conn *conn)
860e10c
 			.param = ISCSI_PARAM_IFACE_NAME,
860e10c
 			.value = session->nrec.iface.name,
860e10c
 			.type = ISCSI_STRING,
860e10c
+			.conn_only = 0,
860e10c
 		}, {
860e10c
 			.param = ISCSI_PARAM_INITIATOR_NAME,
860e10c
 			.value = session->initiator_name,
860e10c
 			.type = ISCSI_STRING,
860e10c
+			.conn_only = 0,
860e10c
 		}, {
860e10c
 			.param = ISCSI_PARAM_BOOT_ROOT,
860e10c
 			.value = session->nrec.session.boot_root,
860e10c
 			.type = ISCSI_STRING,
860e10c
+			.conn_only = 0,
860e10c
 		}, {
860e10c
 			.param = ISCSI_PARAM_BOOT_NIC,
860e10c
 			.value = session->nrec.session.boot_nic,
860e10c
 			.type = ISCSI_STRING,
860e10c
+			.conn_only = 0,
860e10c
 		}, {
860e10c
 			.param = ISCSI_PARAM_BOOT_TARGET,
860e10c
 			.value = session->nrec.session.boot_target,
860e10c
 			.type = ISCSI_STRING,
860e10c
+			.conn_only = 0,
860e10c
+		}, {
860e10c
+			.param = ISCSI_PARAM_DISCOVERY_SESS,
860e10c
+			.value = &session->type,
860e10c
+			.type = ISCSI_INT,
860e10c
+			.conn_only = 0,
860e10c
 		},
860e10c
 	};
860e10c
 
860e10c
-- 
860e10c
1.8.3.1
860e10c