summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6>2007-04-24 05:40:13 +0000
committermnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6>2007-04-24 05:40:13 +0000
commit89cd930dc9315e7a657187fefc924d7ed021aa93 (patch)
treee49a91051de9d1fbe52b4b82b7a497ba9b4c8593
parente3f8f0c590e0e1746366139a03466e813ddbc373 (diff)
downloadopen-iscsi-89cd930dc9315e7a657187fefc924d7ed021aa93.tar.gz
With qla4xxx and braodcom we will want to be able to match the the drivers as well as the other params, so add a -D param
git-svn-id: svn://svn.berlios.de/open-iscsi@814 d7303112-9cec-0310-bdd2-e83a94d6c2b6
-rw-r--r--etc/iscsid.conf21
-rw-r--r--usr/config.h4
-rw-r--r--usr/idbm.c22
-rw-r--r--usr/initiator.c4
-rw-r--r--usr/iscsi_sysfs.c6
-rw-r--r--usr/iscsi_sysfs.h8
-rw-r--r--usr/iscsiadm.c139
-rw-r--r--usr/iscsid.c3
-rw-r--r--usr/util.c4
9 files changed, 138 insertions, 73 deletions
diff --git a/etc/iscsid.conf b/etc/iscsid.conf
index 81f464b..bd4f637 100644
--- a/etc/iscsid.conf
+++ b/etc/iscsid.conf
@@ -14,24 +14,37 @@
#isns.address = 192.168.0.1
#isns.port = 3205
-##################
-# NIC/HBA settings
-##################
+#############################
+# NIC/HBA and driver settings
+#############################
# open-iscsi can create a session and bind it to a NIC/HBA. It
# is currently limited to 32 NICs/HBAs, but this can be easily
# changed so if you need a larger value send a mail.
#
# To define the defaults NICs/HBAs you want to create sessions
# through, set the iface.name value to the MAC address of the NIC.
+#
+# open-iscsi can create sessions over serveral interconnects like iser
+# and tcp. To specific which interconnect to use you can set the
+# iface's transport_name value to "tcp" or "iser"
+#
# iface[0].name = 00:0F:1F:92:6B:BF
+# iface[0].transport_name = tcp
+#
# iface[1].name = 00:0F:1F:92:6C:BF
+# iface[1].transport_name = tcp
+#
# iface[2].name = 00:0F:1F:92:6C:CC
+# iface[2].transport_name = tcp
# the largest index that can be used is 31.
#
# For iscsi_tcp and ib_iser, The default behavior is create a single
# session and let the network and infinninband layers decide which
# NIC/RNIC to route through.
-iface[0].name = default
+# iface[0].name = default
+#
+# The default driver to use is iscsi_tcp
+# iface[0].transport_name = tcp
#*****************
# Startup settings
diff --git a/usr/config.h b/usr/config.h
index b0dbae6..87900f6 100644
--- a/usr/config.h
+++ b/usr/config.h
@@ -193,18 +193,16 @@ typedef struct session_rec {
#define ISCSI_TRANSPORT_NAME_MAXLEN 16
typedef struct iface_rec {
- /* TODO move transport name from node to here */
-
/*
* TODO: we may have to make this bigger and interconnect
* specific for iser and and possibly qla4xxx hba serials
*/
char name[ISCSI_MAX_IFACE_LEN];
+ char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN];
} iface_rec_t;
typedef struct node_rec {
char name[TARGET_NAME_MAXLEN];
- char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN];
int tpgt;
iscsi_startup_e startup;
session_rec_t session;
diff --git a/usr/idbm.c b/usr/idbm.c
index 77b452c..fab3bdb 100644
--- a/usr/idbm.c
+++ b/usr/idbm.c
@@ -208,12 +208,16 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri)
int num = 0, i;
__recinfo_str("node.name", ri, r, name, IDBM_SHOW, num);
- __recinfo_str("node.transport_name", ri, r, transport_name,
- IDBM_SHOW, num);
__recinfo_int("node.tpgt", ri, r, tpgt, IDBM_SHOW, num);
__recinfo_int_o3("node.startup", ri, r, startup,
IDBM_SHOW, "manual", "automatic", "onboot", num);
__recinfo_str("iface.name", ri, r, iface.name, IDBM_SHOW, num);
+ /*
+ * svn 780 compat: older versions used node.transport_name and
+ * rec->transport_name
+ */
+ __recinfo_str("iface.transport_name", ri, r, iface.transport_name,
+ IDBM_SHOW, num);
__recinfo_str("node.discovery_address", ri, r, disc_address, IDBM_SHOW,
num);
__recinfo_int("node.discovery_port", ri, r, disc_port, IDBM_SHOW, num);
@@ -341,6 +345,8 @@ idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri)
for (i = 0; i < ISCSI_IFACE_MAX; i++) {
sprintf(key, "iface[%d].name", i);
__recinfo_str(key, ri, (&r[i]), name, IDBM_SHOW, num);
+ sprintf(key, "iface[%d].transport_name", i);
+ __recinfo_str(key, ri, (&r[i]), transport_name, IDBM_SHOW, num);
}
}
@@ -694,7 +700,7 @@ int idbm_print_node_tree(idbm_t *db, void *data, node_rec_t *rec)
rec->conn[0].port, rec->tpgt);
}
- printf("\t\tDriver: %s\n", rec->transport_name);
+ printf("\t\tDriver: %s\n", rec->iface.transport_name);
printf("\t\tHWaddress: %s\n", rec->iface.name);
memcpy(last_rec, rec, sizeof(node_rec_t));
@@ -1380,7 +1386,7 @@ static int setup_disc_to_node_link(char *disc_portal, node_rec_t *rec)
ST_CONFIG_DIR,
rec->disc_address, rec->disc_port, rec->name,
rec->tpgt, rec->conn[0].address, rec->conn[0].port,
- rec->iface.name, rec->transport_name);
+ rec->iface.name, rec->iface.transport_name);
break;
case DISCOVERY_TYPE_STATIC:
if (access(STATIC_CONFIG_DIR, F_OK) != 0) {
@@ -1394,7 +1400,7 @@ static int setup_disc_to_node_link(char *disc_portal, node_rec_t *rec)
snprintf(disc_portal, PATH_MAX, "%s/%s,%s,%d,%s,%s",
STATIC_CONFIG_DIR, rec->name,
rec->conn[0].address, rec->conn[0].port,
- rec->iface.name, rec->transport_name);
+ rec->iface.name, rec->iface.transport_name);
break;
case DISCOVERY_TYPE_ISNS:
if (access(ISNS_CONFIG_DIR, F_OK) != 0) {
@@ -1409,7 +1415,7 @@ static int setup_disc_to_node_link(char *disc_portal, node_rec_t *rec)
ISNS_CONFIG_DIR, rec->disc_address, rec->disc_port,
rec->name, rec->tpgt, rec->conn[0].address,
rec->conn[0].port, rec->iface.name,
- rec->transport_name);
+ rec->iface.transport_name);
break;
case DISCOVERY_TYPE_SLP:
default:
@@ -1487,6 +1493,8 @@ int idbm_add_nodes(idbm_t *db, node_rec_t *newrec, discovery_rec_t *drec)
continue;
strcpy(newrec->iface.name, db->irec_iface[i].name);
+ strcpy(newrec->iface.transport_name,
+ db->irec_iface[i].transport_name);
rc = idbm_add_node(db, newrec, drec);
if (rc)
return rc;
@@ -1539,7 +1547,7 @@ static void idbm_rm_disc_node_links(idbm_t *db, char *disc_dir)
rec->conn[0].port = atoi(port);
strncpy(rec->conn[0].address, address, NI_MAXHOST);
strncpy(rec->iface.name, iface, ISCSI_MAX_IFACE_LEN);
- strncpy(rec->transport_name, driver,
+ strncpy(rec->iface.transport_name, driver,
ISCSI_TRANSPORT_NAME_MAXLEN);
if (idbm_delete_node(db, NULL, rec))
diff --git a/usr/initiator.c b/usr/initiator.c
index 4b203de..57bacaf 100644
--- a/usr/initiator.c
+++ b/usr/initiator.c
@@ -1819,7 +1819,7 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask)
iscsi_conn_t *conn;
iscsi_provider_t *provider;
- provider = get_transport_by_name(rec->transport_name);
+ provider = get_transport_by_name(rec->iface.transport_name);
if (!provider)
return MGMT_IPC_ERR_TRANS_NOT_FOUND;
if (set_uspace_transport(provider))
@@ -1935,7 +1935,7 @@ iscsi_sync_session(node_rec_t *rec, queue_task_t *qtask, uint32_t sid)
iscsi_provider_t *provider;
int err;
- provider = get_transport_by_name(rec->transport_name);
+ provider = get_transport_by_name(rec->iface.transport_name);
if (!provider)
return MGMT_IPC_ERR_TRANS_NOT_FOUND;
if (set_uspace_transport(provider))
diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c
index a6da62e..9285293 100644
--- a/usr/iscsi_sysfs.c
+++ b/usr/iscsi_sysfs.c
@@ -35,6 +35,7 @@
#include "initiator.h"
#include "transport.h"
#include "version.h"
+#include "iscsi_sysfs.h"
#define ISCSI_TRANSPORT_DIR "/sys/class/iscsi_transport"
#define ISCSI_SESSION_DIR "/sys/class/iscsi_session"
@@ -420,8 +421,7 @@ int get_sessioninfo_by_sysfs_id(int *sid, char *targetname, char *addr,
return 0;
}
-int sysfs_for_each_session(void *data, int *nr_found,
- int (* fn)(void *, char *, int, char *, int, int, char *))
+int sysfs_for_each_session(void *data, int *nr_found, sysfs_op_fn *fn)
{
struct dirent **namelist;
int rc = 0, sid, port, tpgt, n, i;
@@ -740,7 +740,7 @@ pid_t __scan_host(int hostno, int async)
/*
* Scan a session from usersapce using sysfs
*/
-pid_t scan_host(iscsi_session_t *session, int async)
+pid_t scan_host(iscsi_session_t *session)
{
return __scan_host(session->hostno, 1);
}
diff --git a/usr/iscsi_sysfs.h b/usr/iscsi_sysfs.h
index ce28a3d..38e463e 100644
--- a/usr/iscsi_sysfs.h
+++ b/usr/iscsi_sysfs.h
@@ -34,8 +34,10 @@ extern int get_sessioninfo_by_sysfs_id(int *sid, char *targetname,
char *addr, int *port, int *tpgt,
char *iface, char *sys_session);
extern int read_sysfs_file(char *filename, void *value, char *format);
-extern int sysfs_for_each_session(void *data, int *nr_found,
- int (* fn)(void *, char *, int, char *, int, int, char *));
+
+typedef int (sysfs_op_fn)(void *, char *, int, char *, int, int, char *);
+
+extern int sysfs_for_each_session(void *data, int *nr_found, sysfs_op_fn *fn);
extern uint32_t get_host_no_from_sid(uint32_t sid, int *err);
extern int get_netdev_from_mac(char *mac, char *dev);
extern char *get_blockdev_from_lun(int hostno, int target, int sid);
@@ -51,7 +53,7 @@ extern void get_negotiated_session_conf(int sid,
struct iscsi_session_operational_config *conf);
extern void get_negotiated_conn_conf(int sid,
struct iscsi_conn_operational_config *conf);
-extern pid_t scan_host(struct iscsi_session *session);
+extern pid_t scan_host(iscsi_session_t *session);
extern pid_t __scan_host(int hostno, int async);
extern int get_host_state(char *state, int host_no);
extern int get_device_state(char *state, int host_no, int target, int lun);
diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c
index ee38e04..8ad1532 100644
--- a/usr/iscsiadm.c
+++ b/usr/iscsiadm.c
@@ -72,6 +72,7 @@ static struct option const long_options[] =
{"portal", required_argument, NULL, 'p'},
{"targetname", required_argument, NULL, 'T'},
{"interface", required_argument, NULL, 'I'},
+ {"driver", required_argument, NULL, 'D'},
{"op", required_argument, NULL, 'o'},
{"type", required_argument, NULL, 't'},
{"name", required_argument, NULL, 'n'},
@@ -90,7 +91,7 @@ static struct option const long_options[] =
{"help", no_argument, NULL, 'h'},
{NULL, 0, NULL, 0},
};
-static char *short_options = "RlVhm:p:P:T:I:U:L:d:r:n:v:o:sSt:u";
+static char *short_options = "RlVhm:p:P:T:I:D:U:L:d:r:n:v:o:sSt:u";
static void usage(int status)
{
@@ -101,7 +102,7 @@ static void usage(int status)
printf("\
iscsiadm -m discovery [ -dhV ] [--print=[N]] [ -t type -p ip:port [ -l ] ] | [ -p ip:port ] \
[ -o operation ] [ -n name ] [ -v value ]\n\
-iscsiadm -m node [ -dhV ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I HWaddress ] [ -l | -u | -R | -s] ] \
+iscsiadm -m node [ -dhV ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I HWaddress -D driver ] [ -l | -u | -R | -s] ] \
[ [ -o operation ] [ -n name ] [ -v value ] [ -p ip:port ] ]\n\
iscsiadm -m session [ -dhV ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n");
}
@@ -322,7 +323,8 @@ logout_by_startup(idbm_t *db, char *mode)
}
static int match_valid_session(node_rec_t *rec, char *targetname,
- char *address, int port, char *iface)
+ char *address, int port, char *iface,
+ char *driver)
{
if (strlen(rec->name) && strcmp(rec->name, targetname))
return 0;
@@ -331,6 +333,10 @@ static int match_valid_session(node_rec_t *rec, char *targetname,
strcmp(rec->conn[0].address, address))
return 0;
+ if (strlen(rec->iface.transport_name) &&
+ strcmp(rec->iface.transport_name, driver))
+ return 0;
+
if (strlen(rec->iface.name) && strcmp(rec->iface.name, iface))
return 0;
@@ -352,7 +358,8 @@ logout_portal(void *data, char *targetname, int tpgt, char *address,
if (!p)
return 0;
- if (!match_valid_session(rec, targetname, address, port, iface))
+ if (!match_valid_session(rec, targetname, address, port, iface,
+ p->name))
return 0;
printf("Logout session [%s [%d] [%s]:%d %s]\n", iface, sid, address,
@@ -364,7 +371,8 @@ logout_portal(void *data, char *targetname, int tpgt, char *address,
tmprec.conn[0].port = port;
strncpy(tmprec.conn[0].address, address, NI_MAXHOST);
strncpy(tmprec.iface.name, iface, ISCSI_MAX_IFACE_LEN);
- strncpy(tmprec.transport_name, p->name, ISCSI_TRANSPORT_NAME_MAXLEN);
+ strncpy(tmprec.iface.transport_name, p->name,
+ ISCSI_TRANSPORT_NAME_MAXLEN);
rc = session_logout(&tmprec);
/* we raced with another app or instance of iscsiadm */
@@ -382,7 +390,7 @@ logout_portal(void *data, char *targetname, int tpgt, char *address,
}
static void setup_node_record(node_rec_t *rec, char *targetname, char *ip,
- int port, char *iface)
+ int port, char *iface, char *driver)
{
memset(rec, 0, sizeof(*rec));
idbm_node_setup_defaults(rec);
@@ -395,16 +403,22 @@ static void setup_node_record(node_rec_t *rec, char *targetname, char *ip,
strncpy(rec->iface.name, iface, ISCSI_MAX_IFACE_LEN);
else
memset(rec->iface.name, 0, ISCSI_MAX_IFACE_LEN);
+ if (driver)
+ strncpy(rec->iface.transport_name, driver,
+ ISCSI_TRANSPORT_NAME_MAXLEN);
+ else
+ memset(rec->iface.transport_name, 0,
+ ISCSI_TRANSPORT_NAME_MAXLEN);
}
static int
for_each_session(idbm_t *db, char *targetname, char *ip, int port, char *iface,
- int (* fn)(void *, char *, int, char *, int, int, char *))
+ char *driver, sysfs_op_fn *fn)
{
node_rec_t rec;
int err, num_found = 0;
- setup_node_record(&rec, targetname, ip, port, iface);
+ setup_node_record(&rec, targetname, ip, port, iface, driver);
err = sysfs_for_each_session(&rec, &num_found, fn);
if (!num_found) {
log_error("No portal found.");
@@ -428,7 +442,7 @@ static int login_portal(idbm_t *db, void *data, node_rec_t *rec)
{
int rc;
- printf("Login session [%s:%s [%s]:%d %s]\n", rec->transport_name,
+ printf("Login session [%s:%s [%s]:%d %s]\n", rec->iface.transport_name,
rec->iface.name, rec->conn[0].address,
rec->conn[0].port, rec->name);
@@ -485,13 +499,14 @@ static int iface_fn(idbm_t *db, void *data, node_rec_t *rec)
if (!match_valid_session(op_data->match_rec, rec->name,
rec->conn[0].address, rec->conn[0].port,
- rec->iface.name))
+ rec->iface.name, rec->iface.transport_name))
return 0;
return op_data->fn(db, op_data->data, rec);
}
static int for_each_rec(idbm_t *db, char *targetname, char *ip, int port,
- char *iface, void *data, idbm_iface_op_fn *fn)
+ char *iface, char *driver, void *data,
+ idbm_iface_op_fn *fn)
{
node_rec_t rec;
struct rec_op_data op_data;
@@ -501,7 +516,7 @@ static int for_each_rec(idbm_t *db, char *targetname, char *ip, int port,
op_data.match_rec = &rec;
op_data.fn = fn;
- setup_node_record(&rec, targetname, ip, port, iface);
+ setup_node_record(&rec, targetname, ip, port, iface, driver);
if (!idbm_for_each_rec(db, &op_data, iface_fn))
goto nodev;
return 0;
@@ -511,7 +526,7 @@ nodev:
}
static int print_nodes(idbm_t *db, int info_level, char *targetname,
- char *ip, int port, char *iface)
+ char *ip, int port, char *iface, char *driver)
{
node_rec_t tmp_rec;
int rc = 0;
@@ -519,14 +534,14 @@ static int print_nodes(idbm_t *db, int info_level, char *targetname,
switch (info_level) {
case 0:
case -1:
- if (for_each_rec(db, targetname, ip, port,
- iface, NULL, idbm_print_node_flat))
+ if (for_each_rec(db, targetname, ip, port, iface, driver, NULL,
+ idbm_print_node_flat))
rc = -1;
break;
case 1:
memset(&tmp_rec, 0, sizeof(node_rec_t));
- if (for_each_rec(db, targetname, ip, port,
- iface, &tmp_rec, idbm_print_node_tree))
+ if (for_each_rec(db, targetname, ip, port, iface, driver,
+ &tmp_rec, idbm_print_node_tree))
rc = -1;
break;
default:
@@ -875,8 +890,13 @@ static int rescan_portal(void *data, char *targetname, int tpgt, char *address,
int port, int sid, char *iface)
{
int host_no, err;
+ iscsi_provider_t *p = get_transport_by_sid(sid);
+
+ if (!p)
+ return 0;
- if (!match_valid_session(data, targetname, address, port, iface))
+ if (!match_valid_session(data, targetname, address, port, iface,
+ p->name))
return 0;
printf("Rescanning session [%s [%d] [%s]:%d %s]\n", iface, sid, address,
@@ -896,11 +916,16 @@ static int
session_stats(void *data, char *targetname, int tpgt, char *address,
int port, int sid, char *iface)
{
+ iscsi_provider_t *p = get_transport_by_sid(sid);
int rc, i;
iscsiadm_req_t req;
iscsiadm_rsp_t rsp;
- if (!match_valid_session(data, targetname, address, port, iface))
+ if (!p)
+ return 0;
+
+ if (!match_valid_session(data, targetname, address, port, iface,
+ p->name))
return 0;
memset(&req, 0, sizeof(req));
@@ -976,7 +1001,7 @@ session_stats(void *data, char *targetname, int tpgt, char *address,
}
static int add_static_rec(idbm_t *db, char *targetname, char *ip, int port,
- char *iface)
+ char *iface, char *driver)
{
node_rec_t *rec;
discovery_rec_t *drec;
@@ -1002,13 +1027,15 @@ static int add_static_rec(idbm_t *db, char *targetname, char *ip, int port,
rec->conn[0].port = port;
strncpy(rec->conn[0].address, ip, NI_MAXHOST);
strncpy(rec->iface.name, iface, ISCSI_MAX_IFACE_LEN);
+ strncpy(rec->iface.transport_name, driver,
+ ISCSI_TRANSPORT_NAME_MAXLEN);
rc = idbm_add_node(db, rec, drec);
if (rc)
log_error("Could not add new record.");
else
printf("New iSCSI node [%s:%s [%s]:%d %s] added\n",
- rec->transport_name, iface, ip, port, targetname);
+ rec->iface.transport_name, iface, ip, port, targetname);
free(drec);
free_rec:
free(rec);
@@ -1028,7 +1055,8 @@ static int for_each_portal_rec(idbm_t *db, void *data, char *targetname,
if (rec->conn[0].port != -1 && rec->conn[0].port != port)
return 0;
- if (add_static_rec(db, targetname, ip, port, rec->iface.name))
+ if (add_static_rec(db, targetname, ip, port, rec->iface.name,
+ rec->iface.transport_name))
return 0;
return 1;
}
@@ -1047,7 +1075,8 @@ static int for_each_node_rec(idbm_t *db, void *data, char *targetname)
goto search;
if (add_static_rec(db, targetname, rec->conn[0].address,
- rec->conn[0].port, rec->iface.name))
+ rec->conn[0].port, rec->iface.name,
+ rec->iface.transport_name))
return 0;
return 1;
@@ -1056,7 +1085,7 @@ search:
}
static int add_static_recs(idbm_t *db, char *targetname, char *ip, int port,
- char *iface)
+ char *iface, char *driver)
{
node_rec_t *rec;
int rc;
@@ -1068,7 +1097,7 @@ static int add_static_recs(idbm_t *db, char *targetname, char *ip, int port,
goto done;
}
- setup_node_record(rec, targetname, ip, port, iface);
+ setup_node_record(rec, targetname, ip, port, iface, driver);
rc = idbm_for_each_node(db, rec, for_each_node_rec);
if (rc)
goto free_rec;
@@ -1077,7 +1106,9 @@ static int add_static_recs(idbm_t *db, char *targetname, char *ip, int port,
if (targetname && ip) {
if (!iface)
iface = "default";
- rc = add_static_rec(db, targetname, ip, port, iface);
+ if (!driver)
+ driver = "tcp";
+ rc = add_static_rec(db, targetname, ip, port, iface, driver);
if (!rc)
goto free_rec;
}
@@ -1152,30 +1183,31 @@ static void catch_sigint( int signo ) {
static int exec_node_op(idbm_t *db, int op, int do_login, int do_logout,
int do_show, int do_rescan, int do_stats,
int info_level, char *targetname, char *ip, int port,
- char *iface, char *name, char *value)
+ char *iface, char *driver, char *name, char *value)
{
int rc = 0;
struct db_set_param set_param;
- log_debug(2, "%s: node [%s,%s,%d]", __FUNCTION__,
- targetname, ip, port);
+ log_debug(2, "%s: %s:%s node [%s,%s,%d]", __FUNCTION__,
+ driver, iface, targetname, ip, port);
if (op == OP_NEW) {
- if (add_static_recs(db, targetname, ip, port, iface))
+ if (add_static_recs(db, targetname, ip, port, iface,
+ driver))
rc = -1;
goto out;
}
if (do_rescan) {
if (for_each_session(db, targetname, ip, port, iface,
- rescan_portal))
+ driver, rescan_portal))
rc = -1;
goto out;
}
if (do_stats) {
if (for_each_session(db, targetname, ip, port, iface,
- session_stats))
+ driver, session_stats))
rc = -1;
goto out;
}
@@ -1193,29 +1225,29 @@ static int exec_node_op(idbm_t *db, int op, int do_login, int do_logout,
goto out;
}
- if (!do_login && !do_logout && op < 0 &&
- !targetname && !ip && !iface) {
- rc = print_nodes(db, info_level, targetname, ip, port, iface);
+ if (!do_login && !do_logout && op < 0) {
+ rc = print_nodes(db, info_level, targetname, ip, port, iface,
+ driver);
goto out;
}
if (do_login) {
if (for_each_rec(db, targetname, ip, port,
- iface, NULL, login_portal))
+ iface, driver, NULL, login_portal))
rc = -1;
goto out;
}
if (do_logout) {
if (for_each_session(db, targetname, ip, port, iface,
- logout_portal))
+ driver, logout_portal))
rc = -1;
goto out;
}
if (op < 0 || (!do_login && !do_logout && op == OP_SHOW)) {
- if (for_each_rec(db, targetname, ip, port,
- iface, &do_show, idbm_print_node_info))
+ if (for_each_rec(db, targetname, ip, port, iface, driver,
+ &do_show, idbm_print_node_info))
rc = -1;
goto out;
}
@@ -1231,13 +1263,13 @@ static int exec_node_op(idbm_t *db, int op, int do_login, int do_logout,
set_param.name = name;
set_param.value = value;
- if (for_each_rec(db, targetname, ip, port, iface,
+ if (for_each_rec(db, targetname, ip, port, iface, driver,
&set_param, idbm_node_set_param))
rc = -1;
goto out;
} else if (op == OP_DELETE) {
- if (for_each_rec(db, targetname, ip, port,
- iface, NULL, idbm_delete_node))
+ if (for_each_rec(db, targetname, ip, port, iface, driver,
+ NULL, idbm_delete_node))
rc = -1;
goto out;
} else {
@@ -1304,6 +1336,7 @@ main(int argc, char **argv)
{
char *ip = NULL, *name = NULL, *value = NULL, *iface = NULL;
char *targetname = NULL, *group_session_mgmt_mode = NULL;
+ char *driver = NULL;
int ch, longindex, mode=-1, port=-1, do_login=0, do_rescan=0;
int rc=0, sid=-1, op=-1, type=-1, do_logout=0, do_stats=0, do_show=0;
int do_login_all=0, do_logout_all=0, info_level=-1;
@@ -1400,6 +1433,9 @@ main(int argc, char **argv)
case 'I':
iface = optarg;
break;
+ case 'D':
+ driver = optarg;
+ break;
case 'V':
printf("%s version %s\n", program_name,
ISCSI_VERSION_STR);
@@ -1524,7 +1560,7 @@ main(int argc, char **argv)
}
}
} else if (mode == MODE_NODE) {
- if ((rc = verify_mode_params(argc, argv, "RsPdmlSonvupTIUL",
+ if ((rc = verify_mode_params(argc, argv, "RDsPdmlSonvupTIUL",
0))) {
log_error("node mode: option '-%c' is not "
"allowed/supported", rc);
@@ -1544,10 +1580,11 @@ main(int argc, char **argv)
rc = exec_node_op(db, op, do_login, do_logout, do_show,
do_rescan, do_stats, info_level, targetname,
- ip, port, iface, name, value);
+ ip, port, iface, driver, name, value);
goto out;
} else if (mode == MODE_SESSION) {
- if ((rc = verify_mode_params(argc, argv, "PiRdrmusonuSv", 1))) {
+ if ((rc = verify_mode_params(argc, argv,
+ "PiDRdrmusonuSv", 1))) {
log_error("session mode: option '-%c' is not "
"allowed or supported", rc);
rc = -1;
@@ -1556,6 +1593,7 @@ main(int argc, char **argv)
if (sid >= 0) {
char session[64];
int tmp_sid, tpgt;
+ iscsi_provider_t *p;
snprintf(session, 63, "session%d", sid);
session[63] = '\0';
@@ -1589,11 +1627,15 @@ main(int argc, char **argv)
goto free_iface;
}
+ p = get_transport_by_sid(sid);
+ if (!p)
+ goto free_iface;
+
/* drop down to node ops */
rc = exec_node_op(db, op, do_login, do_logout, do_show,
do_rescan, do_stats, info_level,
- targetname, ip, port, iface, name,
- value);
+ targetname, ip, port, iface,
+ p->name, name, value);
free_iface:
free(iface);
free_address:
@@ -1606,7 +1648,8 @@ free_target:
rc = exec_node_op(db, op, do_login, do_logout,
do_show, do_rescan, do_stats,
info_level, NULL,
- NULL, -1, NULL, name, value);
+ NULL, -1, NULL, NULL, name,
+ value);
goto out;
}
diff --git a/usr/iscsid.c b/usr/iscsid.c
index bd03fa0..73246dc 100644
--- a/usr/iscsid.c
+++ b/usr/iscsid.c
@@ -107,7 +107,8 @@ setup_rec_from_negotiated_values(idbm_t *db, node_rec_t *rec,
rec->conn[0].port = port;
strncpy(rec->conn[0].address, address, NI_MAXHOST);
strncpy(rec->iface.name, iface, ISCSI_MAX_IFACE_LEN);
- strncpy(rec->transport_name, p->name, ISCSI_TRANSPORT_NAME_MAXLEN);
+ strncpy(rec->iface.transport_name, p->name,
+ ISCSI_TRANSPORT_NAME_MAXLEN);
rec->tpgt = tpgt;
get_negotiated_session_conf(sid, &session_conf);
diff --git a/usr/util.c b/usr/util.c
index 86f0d9c..5596c21 100644
--- a/usr/util.c
+++ b/usr/util.c
@@ -161,7 +161,6 @@ void idbm_node_setup_defaults(node_rec_t *rec)
memset(rec, 0, sizeof(node_rec_t));
- strcpy(rec->transport_name, "tcp");
rec->tpgt = PORTAL_GROUP_TAG_UNKNOWN;
rec->disc_type = DISCOVERY_TYPE_STATIC;
rec->session.initial_cmdsn = 0;
@@ -212,6 +211,7 @@ void idbm_node_setup_defaults(node_rec_t *rec)
* selects for us
*/
sprintf(rec->iface.name, "default");
+ sprintf(rec->iface.transport_name, "tcp");
}
void iscsid_handle_error(int err)
@@ -253,7 +253,7 @@ int iscsi_match_session(void *data, char *targetname, int tpgt,
if (!p)
return 0;
- if (!strcmp(rec->transport_name, p->name) &&
+ if (!strcmp(rec->iface.transport_name, p->name) &&
!strcmp(rec->name, targetname) &&
!strcmp(rec->conn[0].address, address) &&
!strcmp(rec->iface.name, iface) &&