Blob Blame Raw
From a41a27cd9b910191a616706c4f473259909bc45d Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Tue, 18 Dec 2012 11:27:00 -0800
Subject: iscsiadm: --param parsing for advanced node creation

Share parse_param and apply_param code from iscsistart, allow using multiple
--param options to set arbitrary fields in node mode.

Signed-off-by: Chris Leech <cleech@redhat.com>
---
 usr/Makefile      |  2 +-
 usr/iscsi_param.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 usr/iscsi_param.h |  7 ++++
 usr/iscsiadm.c    | 16 ++++++++--
 usr/iscsistart.c  | 91 ++--------------------------------------------------
 5 files changed, 120 insertions(+), 91 deletions(-)
 create mode 100644 usr/iscsi_param.c
 create mode 100644 usr/iscsi_param.h

diff --git a/usr/Makefile b/usr/Makefile
index 673b7f1..1506111 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -40,7 +40,7 @@ SYSDEPS_SRCS = $(wildcard ../utils/sysdeps/*.o)
 ISCSI_LIB_SRCS = iscsi_util.o io.o auth.o iscsi_timer.o login.o log.o md5.o \
 	sha1.o iface.o idbm.o sysfs.o host.o session_info.o iscsi_sysfs.o \
 	iscsi_net_util.o iscsid_req.o transport.o iser.o cxgbi.o be2iscsi.o \
-	initiator_common.o iscsi_err.o $(IPC_OBJ)  $(SYSDEPS_SRCS)
+	initiator_common.o iscsi_err.o iscsi_param.o $(IPC_OBJ)  $(SYSDEPS_SRCS)
 # core initiator files
 INITIATOR_SRCS = initiator.o scsi.o actor.o event_poll.o mgmt_ipc.o kern_err_table.o
 
diff --git a/usr/iscsi_param.c b/usr/iscsi_param.c
new file mode 100644
index 0000000..c075e8f
--- /dev/null
+++ b/usr/iscsi_param.c
@@ -0,0 +1,95 @@
+#include <string.h>
+#include "log.h"
+#include "config.h"
+#include "idbm.h"
+#include "list.h"
+#include "iface.h"
+#include "idbm_fields.h"
+#include "iscsi_err.h"
+
+int apply_params(struct list_head *user_params, struct node_rec *rec)
+{
+	struct user_param *param;
+	int rc;
+
+	/* Must init this so we can check if user overrode them */
+	rec->session.initial_login_retry_max = -1;
+	rec->conn[0].timeo.noop_out_interval = -1;
+	rec->conn[0].timeo.noop_out_timeout = -1;
+
+	list_for_each_entry(param, user_params, list) {
+		/*
+		 * user may not have passed in all params that were set by
+		 * ibft/iscsi_boot, so clear out values that might conflict
+		 * with user overrides
+		 */
+		if (!strcmp(param->name, IFACE_NETNAME)) {
+			/* overriding netname so MAC will be for old netdev */
+			memset(rec->iface.hwaddress, 0,
+				sizeof(rec->iface.hwaddress));
+		} else if (!strcmp(param->name, IFACE_HWADDR)) {
+			/* overriding MAC so netdev will be for old MAC */
+			memset(rec->iface.netdev, 0, sizeof(rec->iface.netdev));
+		} else if (!strcmp(param->name, IFACE_TRANSPORTNAME)) {
+			/*
+			 * switching drivers so all old binding info is no
+			 * longer valid. Old values were either for offload
+			 * and we are switching to software or the reverse,
+			 * or switching types of cards (bnx2i to cxgb3i).
+			 */
+			memset(&rec->iface, 0, sizeof(rec->iface));
+			iface_setup_defaults(&rec->iface);
+		}
+	}
+
+	rc = idbm_node_set_rec_from_param(user_params, rec, 0);
+	if (rc)
+		return rc;
+
+	/*
+	 * For root boot we could not change this in older versions so
+	 * if user did not override then use the defaults.
+	 *
+	 * Increase to account for boot using static setup.
+	 */
+	if (rec->session.initial_login_retry_max == -1)
+		rec->session.initial_login_retry_max = 30;
+	/* we used to not be able to answer so turn off */
+	if (rec->conn[0].timeo.noop_out_interval == -1)
+		rec->conn[0].timeo.noop_out_interval = 0;
+	if (rec->conn[0].timeo.noop_out_timeout == -1)
+		rec->conn[0].timeo.noop_out_timeout = 0;
+
+	return 0;
+}
+
+int parse_param(struct list_head *user_params, char *param_str)
+{
+	struct user_param *param;
+	char *name, *value;
+
+	name = param_str;
+
+	value = strchr(param_str, '=');
+	if (!value) {
+		log_error("Invalid --param %s. Missing value.", param_str);
+		return ISCSI_ERR_INVAL;
+	}
+	*value = '\0';
+
+	value++;
+	if (!strlen(value)) {
+		log_error("Invalid --param %s. Missing value.", param_str);
+		return ISCSI_ERR_INVAL;
+	}
+
+	param = idbm_alloc_user_param(name, value);
+	if (!param) {
+		log_error("Could not allocate memory for param.");
+		return ISCSI_ERR_NOMEM;
+	}
+
+	list_add(&param->list, user_params);
+	return 0;
+}
+
diff --git a/usr/iscsi_param.h b/usr/iscsi_param.h
new file mode 100644
index 0000000..8b7956c
--- /dev/null
+++ b/usr/iscsi_param.h
@@ -0,0 +1,7 @@
+#ifndef ISCSI_PARAM_H
+#define ISCSI_PARAM_H
+
+extern int parse_param(struct list_head *user_params, char *param_str);
+extern int apply_params(struct list_head *user_params, struct node_rec *rec);
+
+#endif
diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c
index 323d0a8..ef866ae 100644
--- a/usr/iscsiadm.c
+++ b/usr/iscsiadm.c
@@ -53,6 +53,7 @@
 #include "iscsi_err.h"
 #include "iscsi_ipc.h"
 #include "iscsi_timer.h"
+#include "iscsi_param.h"
 
 static char program_name[] = "iscsiadm";
 static char config_file[TARGET_NAME_MAXLEN];
@@ -112,6 +113,7 @@ static struct option const long_options[] =
 	{"count", required_argument, NULL, 'c'},
 	{"interval", required_argument, NULL, 'i'},
 	{"newroot", required_argument, NULL, 0},
+	{"param", required_argument, NULL, 0},
 	{NULL, 0, NULL, 0},
 };
 static char *short_options = "RlDVhm:a:b:c:C:p:P:T:H:i:I:U:k:L:d:r:n:v:o:sSt:u";
@@ -127,7 +129,7 @@ iscsiadm -m discoverydb [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p
 [ -o operation ] [ -n name ] [ -v value ] [ -lD ] ] \n\
 iscsiadm -m discovery [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -l ] ] | [ [ -p ip:port ] [ -l | -D ] ] \n\
 iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u | -R | -s] ] \
-[ [ -o  operation  ] [ -n name ] [ -v value ] ]\n\
+[ [ -o  operation  ] [ -n name ] [ -v value ] ] [ --param=NAME=VALUE ]\n\
 iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P  printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n\
 iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o  operation  ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\
 iscsiadm -m fw [ -l ]\n\
@@ -2430,9 +2432,11 @@ main(int argc, char **argv)
 	uint32_t host_no = -1;
 	struct user_param *param;
 	struct list_head params;
+	struct list_head user_params;
 
 	INIT_LIST_HEAD(&params);
 	INIT_LIST_HEAD(&ifaces);
+	INIT_LIST_HEAD(&user_params);
 	/* do not allow ctrl-c for now... */
 	memset(&sa_old, 0, sizeof(struct sigaction));
 	memset(&sa_new, 0, sizeof(struct sigaction));
@@ -2455,8 +2459,14 @@ main(int argc, char **argv)
 		case 0:
 			if (long_options[longindex].flag != 0)
 				break;
-			if (!strcmp(long_options[longindex].name, "newroot"))
+			if (!strcmp(long_options[longindex].name, "newroot")) {
 				newroot = optarg;
+				break;
+			}
+			if (!strcmp(long_options[longindex].name, "param")) {
+				parse_param(&user_params, optarg);
+				break;
+			}
 			break;
 		case 'k':
 			killiscsid = atoi(optarg);
@@ -2748,6 +2758,8 @@ main(int argc, char **argv)
 			goto out;
 		}
 
+		apply_params(&user_params, rec);
+
 		rc = exec_node_op(op, do_login, do_logout, do_show,
 				  do_rescan, do_stats, info_level, rec,
 				  &params);
diff --git a/usr/iscsistart.c b/usr/iscsistart.c
index 6924d49..85be35b 100644
--- a/usr/iscsistart.c
+++ b/usr/iscsistart.c
@@ -50,6 +50,7 @@
 #include "iscsid_req.h"
 #include "iscsi_err.h"
 #include "iface.h"
+#include "iscsi_param.h"
 
 /* global config info */
 /* initiator needs initiator name/alias */
@@ -131,99 +132,13 @@ static int stop_event_loop(void)
 	return rc;
 }
 
-static int apply_params(struct node_rec *rec)
-{
-	struct user_param *param;
-	int rc;
-
-	/* Must init this so we can check if user overrode them */
-	rec->session.initial_login_retry_max = -1;
-	rec->conn[0].timeo.noop_out_interval = -1;
-	rec->conn[0].timeo.noop_out_timeout = -1;
-
-	list_for_each_entry(param, &user_params, list) {
-		/*
-		 * user may not have passed in all params that were set by
-		 * ibft/iscsi_boot, so clear out values that might conflict
-		 * with user overrides
-		 */
-		if (!strcmp(param->name, IFACE_NETNAME)) {
-			/* overriding netname so MAC will be for old netdev */
-			memset(rec->iface.hwaddress, 0,
-				sizeof(rec->iface.hwaddress));
-		} else if (!strcmp(param->name, IFACE_HWADDR)) {
-			/* overriding MAC so netdev will be for old MAC */
-			memset(rec->iface.netdev, 0, sizeof(rec->iface.netdev));
-		} else if (!strcmp(param->name, IFACE_TRANSPORTNAME)) {
-			/*
-			 * switching drivers so all old binding info is no
-			 * longer valid. Old values were either for offload
-			 * and we are switching to software or the reverse,
-			 * or switching types of cards (bnx2i to cxgb3i).
-			 */
-			memset(&rec->iface, 0, sizeof(rec->iface));
-			iface_setup_defaults(&rec->iface);
-		}
-	}
-
-	rc = idbm_node_set_rec_from_param(&user_params, rec, 0);
-	if (rc)
-		return rc;
-
-	/*
-	 * For root boot we could not change this in older versions so
-	 * if user did not override then use the defaults.
-	 *
-	 * Increase to account for boot using static setup.
-	 */
-	if (rec->session.initial_login_retry_max == -1)
-		rec->session.initial_login_retry_max = 30;
-	/* we used to not be able to answer so turn off */
-	if (rec->conn[0].timeo.noop_out_interval == -1)
-		rec->conn[0].timeo.noop_out_interval = 0;
-	if (rec->conn[0].timeo.noop_out_timeout == -1)
-		rec->conn[0].timeo.noop_out_timeout = 0;
-
-	return 0;
-}
-
-static int parse_param(char *param_str)
-{
-	struct user_param *param;
-	char *name, *value;
-
-	name = param_str;
-
-	value = strchr(param_str, '=');
-	if (!value) {
-		log_error("Invalid --param %s. Missing value.", param_str);
-		return ISCSI_ERR_INVAL;
-	}
-	*value = '\0';
-
-	value++;
-	if (!strlen(value)) {
-		log_error("Invalid --param %s. Missing value.", param_str);
-		return ISCSI_ERR_INVAL;
-	}
-
-	param = idbm_alloc_user_param(name, value);
-	if (!param) {
-		log_error("Could not allocate memory for param.");
-		return ISCSI_ERR_NOMEM;
-	}
-
-	list_add(&param->list, &user_params);
-	return 0;
-}
-
 static int login_session(struct node_rec *rec)
 {
 	iscsiadm_req_t req;
 	iscsiadm_rsp_t rsp;
 	int rc, retries = 0;
 
-	rc = apply_params(rec);
+	rc = apply_params(&user_params, rec);
 	if (rc)
 		return rc;
 
@@ -426,7 +341,7 @@ int main(int argc, char *argv[])
 			fw_free_targets(&targets);
 			exit(0);
 		case 'P':
-			err = parse_param(optarg);
+			err = parse_param(&user_params, optarg);
 			if (err)
 				exit(err);
 			break;
-- 
1.7.11.7