Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 May 2016 07:54:53 +0000 (UTC)
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r300022 - head/usr.sbin/iscsid
Message-ID:  <201605170754.u4H7srSd043410@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: trasz
Date: Tue May 17 07:54:53 2016
New Revision: 300022
URL: https://svnweb.freebsd.org/changeset/base/300022

Log:
  Add initial support for negotiating iSER parameters to iscsid(8).  Some
  rework might be needed to support asymetrical limits, but this should be
  ok for now.
  
  Obtained from:	Mellanox Technologies (earlier version)
  MFC after:	1 month
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/usr.sbin/iscsid/login.c

Modified: head/usr.sbin/iscsid/login.c
==============================================================================
--- head/usr.sbin/iscsid/login.c	Tue May 17 07:47:23 2016	(r300021)
+++ head/usr.sbin/iscsid/login.c	Tue May 17 07:54:53 2016	(r300022)
@@ -422,8 +422,38 @@ login_negotiate_key(struct connection *c
 		/* Ignore */
 	} else if (strcmp(name, "IFMarker") == 0) {
 		/* Ignore */
+	} else if (strcmp(name, "RDMAExtensions") == 0) {
+		if (conn->conn_conf.isc_iser == 1 &&
+		    strcmp(value, "Yes") != 0) {
+			log_errx(1, "received unsupported RDMAExtensions");
+		}
+	} else if (strcmp(name, "InitiatorRecvDataSegmentLength") == 0) {
+		tmp = strtoul(value, NULL, 10);
+		if (tmp <= 0)
+			log_errx(1, "received invalid "
+			    "InitiatorRecvDataSegmentLength");
+		if ((size_t)tmp > conn->conn_limits.isl_max_data_segment_length) {
+			log_debugx("capping InitiatorRecvDataSegmentLength "
+			    "from %d to %zd", tmp,
+			    conn->conn_limits.isl_max_data_segment_length);
+			tmp = conn->conn_limits.isl_max_data_segment_length;
+		}
+		conn->conn_max_data_segment_length = tmp;
 	} else if (strcmp(name, "TargetPortalGroupTag") == 0) {
 		/* Ignore */
+	} else if (strcmp(name, "TargetRecvDataSegmentLength") == 0) {
+		tmp = strtoul(value, NULL, 10);
+		if (tmp <= 0) {
+			log_errx(1,
+			    "received invalid TargetRecvDataSegmentLength");
+		}
+		if ((size_t)tmp > conn->conn_limits.isl_max_data_segment_length) {
+			log_debugx("capping TargetRecvDataSegmentLength "
+			    "from %d to %zd", tmp,
+			    conn->conn_limits.isl_max_data_segment_length);
+			tmp = conn->conn_limits.isl_max_data_segment_length;
+		}
+		conn->conn_max_data_segment_length = tmp;
 	} else {
 		log_debugx("unknown key \"%s\"; ignoring",  name);
 	}
@@ -465,13 +495,23 @@ login_negotiate(struct connection *conn)
 		    conn->conn_limits.isl_max_data_segment_length);
 		keys_add(request_keys, "InitialR2T", "Yes");
 		keys_add(request_keys, "MaxOutstandingR2T", "1");
+		if (conn->conn_conf.isc_iser == 1) {
+			keys_add_int(request_keys, "InitiatorRecvDataSegmentLength",
+			    conn->conn_limits.isl_max_data_segment_length);
+			keys_add_int(request_keys, "TargetRecvDataSegmentLength",
+			    conn->conn_limits.isl_max_data_segment_length);
+			keys_add(request_keys, "RDMAExtensions", "Yes");
+		} else {
+			keys_add_int(request_keys, "MaxRecvDataSegmentLength",
+			    conn->conn_limits.isl_max_data_segment_length);
+		}
 	} else {
 		keys_add(request_keys, "HeaderDigest", "None");
 		keys_add(request_keys, "DataDigest", "None");
+		keys_add_int(request_keys, "MaxRecvDataSegmentLength",
+		    conn->conn_limits.isl_max_data_segment_length);
 	}
 
-	keys_add_int(request_keys, "MaxRecvDataSegmentLength",
-	    conn->conn_limits.isl_max_data_segment_length);
 	keys_add(request_keys, "DefaultTime2Wait", "0");
 	keys_add(request_keys, "DefaultTime2Retain", "0");
 	keys_add(request_keys, "ErrorRecoveryLevel", "0");



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201605170754.u4H7srSd043410>