From bd6bb4939714bf8bf9cf180ffd4ff55cd876d643 Mon Sep 17 00:00:00 2001 From: Richard Scheffenegger Date: Fri, 25 Feb 2022 10:33:59 +0100 Subject: iscsi: per-session timeouts and rapid teardown of session on reconnect Add per-Session configurable ping (SCSI NOP) and login timeouts. Remove the torn down, old iSCSI session quickly, when performing a reconnect. Reviewed By: trasz Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D34198 --- usr.sbin/iscsid/iscsid.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'usr.sbin/iscsid') diff --git a/usr.sbin/iscsid/iscsid.c b/usr.sbin/iscsid/iscsid.c index 2689c4a2b455..ebfcfa34dd6d 100644 --- a/usr.sbin/iscsid/iscsid.c +++ b/usr.sbin/iscsid/iscsid.c @@ -38,9 +38,11 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include +#include #include #include #include @@ -383,6 +385,32 @@ connection_new(int iscsi_fd, const struct iscsi_daemon_request *request) from_addr); } } + /* + * Reduce TCP SYN_SENT timeout while + * no connectivity exists, to allow + * rapid reuse of the available slots. + */ + int keepinit = 0; + if (conn->conn_conf.isc_login_timeout > 0) { + keepinit = conn->conn_conf.isc_login_timeout; + log_debugx("session specific LoginTimeout at %d sec", + keepinit); + } + if (conn->conn_conf.isc_login_timeout == -1) { + char value[8]; + size_t size = sizeof(value); + sysctlbyname("kern.iscsi.login_timeout", &value, &size, + NULL, 0); + keepinit = strtol(value, NULL, 10); + log_debugx("global login_timeout at %d sec", keepinit); + } + if (keepinit > 0) { + if (setsockopt(conn->conn.conn_socket, + IPPROTO_TCP, TCP_KEEPINIT, + &keepinit, sizeof(keepinit)) == -1) + log_warnx("setsockopt(TCP_KEEPINIT) " + "failed for %s", to_addr); + } if (from_ai != NULL) { error = bind(conn->conn.conn_socket, from_ai->ai_addr, from_ai->ai_addrlen); -- cgit v1.3