diff options
-rw-r--r-- | sys/dev/iscsi/iscsi.c | 8 | ||||
-rw-r--r-- | sys/dev/iscsi/iscsi.h | 1 | ||||
-rw-r--r-- | sys/dev/iscsi/iscsi_ioctl.h | 10 | ||||
-rw-r--r-- | usr.sbin/iscsid/iscsid.c | 11 | ||||
-rw-r--r-- | usr.sbin/iscsid/iscsid.h | 1 | ||||
-rw-r--r-- | usr.sbin/iscsid/login.c | 22 |
6 files changed, 23 insertions, 30 deletions
diff --git a/sys/dev/iscsi/iscsi.c b/sys/dev/iscsi/iscsi.c index e7691fc..0a75838 100644 --- a/sys/dev/iscsi/iscsi.c +++ b/sys/dev/iscsi/iscsi.c @@ -1226,6 +1226,9 @@ iscsi_ioctl_daemon_wait(struct iscsi_softc *sc, ISCSI_SESSION_UNLOCK(is); request->idr_session_id = is->is_id; + memcpy(&request->idr_isid, &is->is_isid, + sizeof(request->idr_isid)); + request->idr_tsih = 0; /* New or reinstated session. */ memcpy(&request->idr_conf, &is->is_conf, sizeof(request->idr_conf)); @@ -1275,7 +1278,7 @@ iscsi_ioctl_daemon_handoff(struct iscsi_softc *sc, strlcpy(is->is_target_alias, handoff->idh_target_alias, sizeof(is->is_target_alias)); - memcpy(is->is_isid, handoff->idh_isid, sizeof(is->is_isid)); + is->is_tsih = handoff->idh_tsih; is->is_statsn = handoff->idh_statsn; is->is_initial_r2t = handoff->idh_initial_r2t; is->is_immediate_data = handoff->idh_immediate_data; @@ -1651,6 +1654,9 @@ iscsi_ioctl_session_add(struct iscsi_softc *sc, struct iscsi_session_add *isa) is->is_softc = sc; sc->sc_last_session_id++; is->is_id = sc->sc_last_session_id; + is->is_isid[0] = 0x80; /* RFC 3720, 10.12.5: 10b, "Random" ISID. */ + arc4rand(&is->is_isid[1], 5, 0); + is->is_tsih = 0; callout_init(&is->is_callout, 1); callout_reset(&is->is_callout, 1 * hz, iscsi_callout, is); TAILQ_INSERT_TAIL(&sc->sc_sessions, is, is_next); diff --git a/sys/dev/iscsi/iscsi.h b/sys/dev/iscsi/iscsi.h index e18f7f8..0fe1515 100644 --- a/sys/dev/iscsi/iscsi.h +++ b/sys/dev/iscsi/iscsi.h @@ -64,6 +64,7 @@ struct iscsi_session { size_t is_max_burst_length; size_t is_first_burst_length; uint8_t is_isid[6]; + uint16_t is_tsih; bool is_immediate_data; size_t is_max_data_segment_length; char is_target_alias[ISCSI_ALIAS_LEN]; diff --git a/sys/dev/iscsi/iscsi_ioctl.h b/sys/dev/iscsi/iscsi_ioctl.h index ace1ebd..4e06b87 100644 --- a/sys/dev/iscsi/iscsi_ioctl.h +++ b/sys/dev/iscsi/iscsi_ioctl.h @@ -91,8 +91,8 @@ struct iscsi_session_state { struct iscsi_daemon_request { unsigned int idr_session_id; struct iscsi_session_conf idr_conf; - uint8_t idr_spare_isid[6]; - uint16_t idr_spare_tsih; + uint8_t idr_isid[6]; + uint16_t idr_tsih; uint16_t idr_spare_cid; int idr_spare[4]; }; @@ -101,9 +101,9 @@ struct iscsi_daemon_handoff { unsigned int idh_session_id; int idh_socket; char idh_target_alias[ISCSI_ALIAS_LEN]; - uint8_t idh_isid[6]; - uint16_t idr_spare_tsih; - uint16_t idr_spare_cid; + uint8_t idh_spare_isid[6]; + uint16_t idh_tsih; + uint16_t idh_spare_cid; uint32_t idh_statsn; int idh_header_digest; int idh_data_digest; diff --git a/usr.sbin/iscsid/iscsid.c b/usr.sbin/iscsid/iscsid.c index 743e02a..1693d30 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 4f53258..81a965d 100644 --- a/usr.sbin/iscsid/login.c +++ b/usr.sbin/iscsid/login.c @@ -199,6 +199,7 @@ login_receive(struct connection *conn, bool initial) "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); return (response); @@ -218,6 +219,7 @@ login_new_request(struct connection *conn) login_set_csg(request, BHSLR_STAGE_SECURITY_NEGOTIATION); login_set_nsg(request, BHSLR_STAGE_OPERATIONAL_NEGOTIATION); 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); @@ -749,24 +751,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) { @@ -777,8 +761,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); |