summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2014-07-05 21:18:33 +0000
committermav <mav@FreeBSD.org>2014-07-05 21:18:33 +0000
commite3cec6db55cb1225d5dd300275ea0821b98e400e (patch)
tree8dd744dc9abb3eaabb01ff17f89d2e955135dc9c
parentf995552a764a2c98cd7a2221aee581a0e5198186 (diff)
downloadFreeBSD-src-e3cec6db55cb1225d5dd300275ea0821b98e400e.zip
FreeBSD-src-e3cec6db55cb1225d5dd300275ea0821b98e400e.tar.gz
Pass through iSCSI session ISID from LOGIN request to the CTL frontend.
ISID is an important part of initiator transport ID for iSCSI. It is not used now, but should be to properly implement persistent reservation.
-rw-r--r--sys/cam/ctl/ctl_frontend_iscsi.c7
-rw-r--r--sys/cam/ctl/ctl_frontend_iscsi.h2
-rw-r--r--sys/cam/ctl/ctl_ioctl.h1
-rw-r--r--usr.sbin/ctld/ctld.h1
-rw-r--r--usr.sbin/ctld/kernel.c2
-rw-r--r--usr.sbin/ctld/login.c3
6 files changed, 16 insertions, 0 deletions
diff --git a/sys/cam/ctl/ctl_frontend_iscsi.c b/sys/cam/ctl/ctl_frontend_iscsi.c
index da2ba3f..31f914b 100644
--- a/sys/cam/ctl/ctl_frontend_iscsi.c
+++ b/sys/cam/ctl/ctl_frontend_iscsi.c
@@ -1507,6 +1507,13 @@ cfiscsi_ioctl_handoff(struct ctl_iscsi *ci)
cihp->initiator_addr, sizeof(cs->cs_initiator_addr));
strlcpy(cs->cs_initiator_alias,
cihp->initiator_alias, sizeof(cs->cs_initiator_alias));
+ memcpy(cs->cs_initiator_isid,
+ cihp->initiator_isid, sizeof(cs->cs_initiator_isid));
+ snprintf(cs->cs_initiator_id, sizeof(cs->cs_initiator_id),
+ "%s,i,0x%02x%02x%02x%02x%02x%02x", cs->cs_initiator_name,
+ cihp->initiator_isid[0], cihp->initiator_isid[1],
+ cihp->initiator_isid[2], cihp->initiator_isid[3],
+ cihp->initiator_isid[4], cihp->initiator_isid[5]);
#ifdef ICL_KERNEL_PROXY
if (cihp->socket > 0) {
diff --git a/sys/cam/ctl/ctl_frontend_iscsi.h b/sys/cam/ctl/ctl_frontend_iscsi.h
index 887576a..886e8ac 100644
--- a/sys/cam/ctl/ctl_frontend_iscsi.h
+++ b/sys/cam/ctl/ctl_frontend_iscsi.h
@@ -86,6 +86,8 @@ struct cfiscsi_session {
char cs_initiator_name[CTL_ISCSI_NAME_LEN];
char cs_initiator_addr[CTL_ISCSI_ADDR_LEN];
char cs_initiator_alias[CTL_ISCSI_ALIAS_LEN];
+ char cs_initiator_isid[6];
+ char cs_initiator_id[CTL_ISCSI_NAME_LEN + 5 + 6 + 1];
unsigned int cs_id;
int cs_ctl_initid;
#ifdef ICL_KERNEL_PROXY
diff --git a/sys/cam/ctl/ctl_ioctl.h b/sys/cam/ctl/ctl_ioctl.h
index 06ff936..94a7cc8 100644
--- a/sys/cam/ctl/ctl_ioctl.h
+++ b/sys/cam/ctl/ctl_ioctl.h
@@ -681,6 +681,7 @@ struct ctl_iscsi_handoff_params {
char initiator_name[CTL_ISCSI_NAME_LEN];
char initiator_addr[CTL_ISCSI_ADDR_LEN];
char initiator_alias[CTL_ISCSI_ALIAS_LEN];
+ uint8_t initiator_isid[6];
char target_name[CTL_ISCSI_NAME_LEN];
int socket;
int portal_group_tag;
diff --git a/usr.sbin/ctld/ctld.h b/usr.sbin/ctld/ctld.h
index 5f7aea6..323ef2c 100644
--- a/usr.sbin/ctld/ctld.h
+++ b/usr.sbin/ctld/ctld.h
@@ -178,6 +178,7 @@ struct connection {
char *conn_initiator_name;
char *conn_initiator_addr;
char *conn_initiator_alias;
+ uint8_t conn_initiator_isid[6];
uint32_t conn_cmdsn;
uint32_t conn_statsn;
size_t conn_max_data_segment_length;
diff --git a/usr.sbin/ctld/kernel.c b/usr.sbin/ctld/kernel.c
index dc07591..74cb27e 100644
--- a/usr.sbin/ctld/kernel.c
+++ b/usr.sbin/ctld/kernel.c
@@ -787,6 +787,8 @@ kernel_handoff(struct connection *conn)
strlcpy(req.data.handoff.initiator_alias,
conn->conn_initiator_alias, sizeof(req.data.handoff.initiator_alias));
}
+ memcpy(req.data.handoff.initiator_isid, conn->conn_initiator_isid,
+ sizeof(req.data.handoff.initiator_isid));
strlcpy(req.data.handoff.target_name,
conn->conn_target->t_name, sizeof(req.data.handoff.target_name));
#ifdef ICL_KERNEL_PROXY
diff --git a/usr.sbin/ctld/login.c b/usr.sbin/ctld/login.c
index f830d15..b14b264 100644
--- a/usr.sbin/ctld/login.c
+++ b/usr.sbin/ctld/login.c
@@ -850,6 +850,9 @@ login(struct connection *conn)
log_errx(1, "received Login PDU with non-zero TSIH");
}
+ memcpy(conn->conn_initiator_isid, bhslr->bhslr_isid,
+ sizeof(conn->conn_initiator_isid));
+
/*
* XXX: Implement the C flag some day.
*/
OpenPOWER on IntegriCloud