summaryrefslogtreecommitdiffstats
path: root/usr.sbin/iscsid
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2014-07-06 17:37:49 +0000
committermav <mav@FreeBSD.org>2014-07-06 17:37:49 +0000
commit3437bf817836057606a700b02d68b0ed46582823 (patch)
tree5346eff0128ea101760a11da63e9ead7ef3cf165 /usr.sbin/iscsid
parent02cefe6a6a1bd9c0f80f48072215e2ba332b1a1c (diff)
downloadFreeBSD-src-3437bf817836057606a700b02d68b0ed46582823.zip
FreeBSD-src-3437bf817836057606a700b02d68b0ed46582823.tar.gz
Make iSCSI initiator keep Initiator Session ID (ISID) across reconnects.
Previously ISID was changed every time, that made impossible correct persistent reservation, because reconnected session was identified as completely new one. Reviewed by: trasz MFC after: 1 week
Diffstat (limited to 'usr.sbin/iscsid')
-rw-r--r--usr.sbin/iscsid/iscsid.c11
-rw-r--r--usr.sbin/iscsid/iscsid.h1
-rw-r--r--usr.sbin/iscsid/login.c22
3 files changed, 10 insertions, 24 deletions
diff --git a/usr.sbin/iscsid/iscsid.c b/usr.sbin/iscsid/iscsid.c
index 16df2d5..4e85b1c 100644
--- a/usr.sbin/iscsid/iscsid.c
+++ b/usr.sbin/iscsid/iscsid.c
@@ -149,8 +149,8 @@ resolve_addr(const struct connection *conn, const char *address,
}
static struct connection *
-connection_new(unsigned int session_id, const struct iscsi_session_conf *conf,
- int iscsi_fd)
+connection_new(unsigned int session_id, const uint8_t isid[8], uint16_t tsih,
+ const struct iscsi_session_conf *conf, int iscsi_fd)
{
struct connection *conn;
struct addrinfo *from_ai, *to_ai;
@@ -176,6 +176,8 @@ connection_new(unsigned int session_id, const struct iscsi_session_conf *conf,
conn->conn_first_burst_length = 65536;
conn->conn_session_id = session_id;
+ memcpy(&conn->conn_isid, isid, sizeof(conn->conn_isid));
+ conn->conn_tsih = tsih;
conn->conn_iscsi_fd = iscsi_fd;
/*
@@ -264,7 +266,7 @@ handoff(struct connection *conn)
idh.idh_socket = conn->conn_socket;
strlcpy(idh.idh_target_alias, conn->conn_target_alias,
sizeof(idh.idh_target_alias));
- memcpy(idh.idh_isid, conn->conn_isid, sizeof(idh.idh_isid));
+ idh.idh_tsih = conn->conn_tsih;
idh.idh_statsn = conn->conn_statsn;
idh.idh_header_digest = conn->conn_header_digest;
idh.idh_data_digest = conn->conn_data_digest;
@@ -430,7 +432,8 @@ handle_request(int iscsi_fd, const struct iscsi_daemon_request *request, int tim
setproctitle("%s", request->idr_conf.isc_target_addr);
}
- conn = connection_new(request->idr_session_id, &request->idr_conf, iscsi_fd);
+ conn = connection_new(request->idr_session_id, request->idr_isid,
+ request->idr_tsih, &request->idr_conf, iscsi_fd);
set_timeout(timeout);
capsicate(conn);
login(conn);
diff --git a/usr.sbin/iscsid/iscsid.h b/usr.sbin/iscsid/iscsid.h
index b19542d..9623559 100644
--- a/usr.sbin/iscsid/iscsid.h
+++ b/usr.sbin/iscsid/iscsid.h
@@ -51,6 +51,7 @@ struct connection {
struct iscsi_session_conf conn_conf;
char conn_target_alias[ISCSI_ADDR_LEN];
uint8_t conn_isid[6];
+ uint16_t conn_tsih;
uint32_t conn_statsn;
int conn_header_digest;
int conn_data_digest;
diff --git a/usr.sbin/iscsid/login.c b/usr.sbin/iscsid/login.c
index 4941a4a..f4fd29f 100644
--- a/usr.sbin/iscsid/login.c
+++ b/usr.sbin/iscsid/login.c
@@ -260,6 +260,7 @@ login_receive(struct connection *conn)
"is %d, should be %d", ntohl(bhslr->bhslr_statsn),
conn->conn_statsn + 1);
}
+ conn->conn_tsih = ntohs(bhslr->bhslr_tsih);
conn->conn_statsn = ntohl(bhslr->bhslr_statsn);
initial = false;
@@ -295,6 +296,7 @@ login_new_request(struct connection *conn, int csg)
login_set_nsg(request, nsg);
memcpy(bhslr->bhslr_isid, &conn->conn_isid, sizeof(bhslr->bhslr_isid));
+ bhslr->bhslr_tsih = htons(conn->conn_tsih);
bhslr->bhslr_initiator_task_tag = 0;
bhslr->bhslr_cmdsn = 0;
bhslr->bhslr_expstatsn = htonl(conn->conn_statsn + 1);
@@ -824,24 +826,6 @@ login_chap(struct connection *conn)
log_debugx("CHAP authentication done");
}
-static void
-login_create_isid(struct connection *conn)
-{
- int rv;
-
- /*
- * RFC 3720, 10.12.5: 10b, "Random" ISID.
- *
- */
- conn->conn_isid[0] = 0x80;
-
- rv = RAND_bytes(&conn->conn_isid[1], 3);
- if (rv != 1) {
- log_errx(1, "RAND_bytes failed: %s",
- ERR_error_string(ERR_get_error(), NULL));
- }
-}
-
void
login(struct connection *conn)
{
@@ -851,8 +835,6 @@ login(struct connection *conn)
const char *auth_method;
int i;
- login_create_isid(conn);
-
log_debugx("beginning Login phase; sending Login PDU");
request = login_new_request(conn, BHSLR_STAGE_SECURITY_NEGOTIATION);
request_keys = keys_new();
OpenPOWER on IntegriCloud