From owner-svn-src-all@FreeBSD.ORG Tue Jul 15 18:21:28 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 83847BC; Tue, 15 Jul 2014 18:21:28 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 642DB24AF; Tue, 15 Jul 2014 18:21:28 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s6FILSbZ025504; Tue, 15 Jul 2014 18:21:28 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s6FILRNM025491; Tue, 15 Jul 2014 18:21:27 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201407151821.s6FILRNM025491@svn.freebsd.org> From: Alexander Motin Date: Tue, 15 Jul 2014 18:21:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org Subject: svn commit: r268703 - in stable/10: sys/dev/iscsi usr.sbin/iscsid X-SVN-Group: stable-10 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Jul 2014 18:21:28 -0000 Author: mav Date: Tue Jul 15 18:21:26 2014 New Revision: 268703 URL: http://svnweb.freebsd.org/changeset/base/268703 Log: MFC r268326: 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. Modified: stable/10/sys/dev/iscsi/iscsi.c stable/10/sys/dev/iscsi/iscsi.h stable/10/sys/dev/iscsi/iscsi_ioctl.h stable/10/usr.sbin/iscsid/iscsid.c stable/10/usr.sbin/iscsid/iscsid.h stable/10/usr.sbin/iscsid/login.c Directory Properties: stable/10/ (props changed) Modified: stable/10/sys/dev/iscsi/iscsi.c ============================================================================== --- stable/10/sys/dev/iscsi/iscsi.c Tue Jul 15 17:39:53 2014 (r268702) +++ stable/10/sys/dev/iscsi/iscsi.c Tue Jul 15 18:21:26 2014 (r268703) @@ -1226,6 +1226,9 @@ iscsi_ioctl_daemon_wait(struct iscsi_sof 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_ 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_sof 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); Modified: stable/10/sys/dev/iscsi/iscsi.h ============================================================================== --- stable/10/sys/dev/iscsi/iscsi.h Tue Jul 15 17:39:53 2014 (r268702) +++ stable/10/sys/dev/iscsi/iscsi.h Tue Jul 15 18:21:26 2014 (r268703) @@ -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]; Modified: stable/10/sys/dev/iscsi/iscsi_ioctl.h ============================================================================== --- stable/10/sys/dev/iscsi/iscsi_ioctl.h Tue Jul 15 17:39:53 2014 (r268702) +++ stable/10/sys/dev/iscsi/iscsi_ioctl.h Tue Jul 15 18:21:26 2014 (r268703) @@ -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; Modified: stable/10/usr.sbin/iscsid/iscsid.c ============================================================================== --- stable/10/usr.sbin/iscsid/iscsid.c Tue Jul 15 17:39:53 2014 (r268702) +++ stable/10/usr.sbin/iscsid/iscsid.c Tue Jul 15 18:21:26 2014 (r268703) @@ -149,8 +149,8 @@ resolve_addr(const struct connection *co } 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, 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 struc 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); Modified: stable/10/usr.sbin/iscsid/iscsid.h ============================================================================== --- stable/10/usr.sbin/iscsid/iscsid.h Tue Jul 15 17:39:53 2014 (r268702) +++ stable/10/usr.sbin/iscsid/iscsid.h Tue Jul 15 18:21:26 2014 (r268703) @@ -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; Modified: stable/10/usr.sbin/iscsid/login.c ============================================================================== --- stable/10/usr.sbin/iscsid/login.c Tue Jul 15 17:39:53 2014 (r268702) +++ stable/10/usr.sbin/iscsid/login.c Tue Jul 15 18:21:26 2014 (r268703) @@ -199,6 +199,7 @@ login_receive(struct connection *conn, b "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 *con 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);