svn commit: r312190 - head/usr.sbin/ctld
Alexander Motin
mav at FreeBSD.org
Sat Jan 14 18:04:14 UTC 2017
Author: mav
Date: Sat Jan 14 18:04:12 2017
New Revision: 312190
URL: https://svnweb.freebsd.org/changeset/base/312190
Log:
Decouple iSCSI connection limits from defaults.
If initiator does not negotiate some parameter, it expects one to get
default value, not some unknown remote hardware limit. On the side side,
if some parameter is negotiated, its default value from RFC should not
be used for anything.
Modified:
head/usr.sbin/ctld/ctld.c
head/usr.sbin/ctld/ctld.h
head/usr.sbin/ctld/login.c
Modified: head/usr.sbin/ctld/ctld.c
==============================================================================
--- head/usr.sbin/ctld/ctld.c Sat Jan 14 16:58:49 2017 (r312189)
+++ head/usr.sbin/ctld/ctld.c Sat Jan 14 18:04:12 2017 (r312190)
@@ -1582,6 +1582,7 @@ connection_new(struct portal *portal, in
* Default values, from RFC 3720, section 12.
*/
conn->conn_max_recv_data_segment_length = 8192;
+ conn->conn_max_send_data_segment_length = 8192;
conn->conn_max_burst_length = 262144;
conn->conn_first_burst_length = 65536;
conn->conn_immediate_data = true;
Modified: head/usr.sbin/ctld/ctld.h
==============================================================================
--- head/usr.sbin/ctld/ctld.h Sat Jan 14 16:58:49 2017 (r312189)
+++ head/usr.sbin/ctld/ctld.h Sat Jan 14 18:04:12 2017 (r312190)
@@ -48,8 +48,6 @@
#define MAX_LUNS 1024
#define MAX_NAME_LEN 223
#define MAX_DATA_SEGMENT_LENGTH (128 * 1024)
-#define MAX_BURST_LENGTH 16776192
-#define FIRST_BURST_LENGTH (128 * 1024)
#define SOCKBUF_SIZE 1048576
struct auth {
@@ -242,6 +240,10 @@ struct connection {
struct sockaddr_storage conn_initiator_sa;
uint32_t conn_cmdsn;
uint32_t conn_statsn;
+ int conn_max_recv_data_segment_limit;
+ int conn_max_send_data_segment_limit;
+ int conn_max_burst_limit;
+ int conn_first_burst_limit;
int conn_max_recv_data_segment_length;
int conn_max_send_data_segment_length;
int conn_max_burst_length;
Modified: head/usr.sbin/ctld/login.c
==============================================================================
--- head/usr.sbin/ctld/login.c Sat Jan 14 16:58:49 2017 (r312189)
+++ head/usr.sbin/ctld/login.c Sat Jan 14 18:04:12 2017 (r312190)
@@ -557,13 +557,15 @@ login_negotiate_key(struct pdu *request,
* our MaxRecvDataSegmentLength is not influenced by the
* initiator in any way.
*/
- if ((int)tmp > conn->conn_max_send_data_segment_length) {
- log_debugx("capping max_send_data_segment_length "
+ if ((int)tmp > conn->conn_max_send_data_segment_limit) {
+ log_debugx("capping MaxRecvDataSegmentLength "
"from %zd to %d", tmp,
- conn->conn_max_send_data_segment_length);
- tmp = conn->conn_max_send_data_segment_length;
+ conn->conn_max_send_data_segment_limit);
+ tmp = conn->conn_max_send_data_segment_limit;
}
conn->conn_max_send_data_segment_length = tmp;
+ conn->conn_max_recv_data_segment_length =
+ conn->conn_max_recv_data_segment_limit;
keys_add_int(response_keys, name,
conn->conn_max_recv_data_segment_length);
} else if (strcmp(name, "MaxBurstLength") == 0) {
@@ -572,10 +574,10 @@ login_negotiate_key(struct pdu *request,
login_send_error(request, 0x02, 0x00);
log_errx(1, "received invalid MaxBurstLength");
}
- if ((int)tmp > conn->conn_max_burst_length) {
+ if ((int)tmp > conn->conn_max_burst_limit) {
log_debugx("capping MaxBurstLength from %zd to %d",
- tmp, conn->conn_max_burst_length);
- tmp = conn->conn_max_burst_length;
+ tmp, conn->conn_max_burst_limit);
+ tmp = conn->conn_max_burst_limit;
}
conn->conn_max_burst_length = tmp;
keys_add_int(response_keys, name, tmp);
@@ -585,10 +587,10 @@ login_negotiate_key(struct pdu *request,
login_send_error(request, 0x02, 0x00);
log_errx(1, "received invalid FirstBurstLength");
}
- if ((int)tmp > conn->conn_first_burst_length) {
+ if ((int)tmp > conn->conn_first_burst_limit) {
log_debugx("capping FirstBurstLength from %zd to %d",
- tmp, conn->conn_first_burst_length);
- tmp = conn->conn_first_burst_length;
+ tmp, conn->conn_first_burst_limit);
+ tmp = conn->conn_first_burst_limit;
}
conn->conn_first_burst_length = tmp;
keys_add_int(response_keys, name, tmp);
@@ -694,25 +696,42 @@ login_negotiate(struct connection *conn,
* offload, it depends on hardware capabilities.
*/
assert(conn->conn_target != NULL);
+ conn->conn_max_recv_data_segment_limit = (1 << 24) - 1;
+ conn->conn_max_send_data_segment_limit = (1 << 24) - 1;
+ conn->conn_max_burst_limit = (1 << 24) - 1;
+ conn->conn_first_burst_limit = (1 << 24) - 1;
kernel_limits(conn->conn_portal->p_portal_group->pg_offload,
- &conn->conn_max_recv_data_segment_length,
- &conn->conn_max_send_data_segment_length,
- &conn->conn_max_burst_length,
- &conn->conn_first_burst_length);
+ &conn->conn_max_recv_data_segment_limit,
+ &conn->conn_max_send_data_segment_limit,
+ &conn->conn_max_burst_limit,
+ &conn->conn_first_burst_limit);
/* We expect legal, usable values at this point. */
- assert(conn->conn_max_recv_data_segment_length >= 512);
- assert(conn->conn_max_recv_data_segment_length < (1 << 24));
- assert(conn->conn_max_burst_length >= 512);
- assert(conn->conn_max_burst_length < (1 << 24));
- assert(conn->conn_first_burst_length >= 512);
- assert(conn->conn_first_burst_length < (1 << 24));
- assert(conn->conn_first_burst_length <=
- conn->conn_max_burst_length);
+ assert(conn->conn_max_recv_data_segment_limit >= 512);
+ assert(conn->conn_max_recv_data_segment_limit < (1 << 24));
+ assert(conn->conn_max_send_data_segment_limit >= 512);
+ assert(conn->conn_max_send_data_segment_limit < (1 << 24));
+ assert(conn->conn_max_burst_limit >= 512);
+ assert(conn->conn_max_burst_limit < (1 << 24));
+ assert(conn->conn_first_burst_limit >= 512);
+ assert(conn->conn_first_burst_limit < (1 << 24));
+ assert(conn->conn_first_burst_limit <=
+ conn->conn_max_burst_limit);
+
+ /*
+ * Limit default send length in case it won't be negotiated.
+ * We can't do it for other limits, since they may affect both
+ * sender and receiver operation, and we must obey defaults.
+ */
+ if (conn->conn_max_send_data_segment_limit <
+ conn->conn_max_send_data_segment_length) {
+ conn->conn_max_send_data_segment_limit =
+ conn->conn_max_send_data_segment_length;
+ }
} else {
- conn->conn_max_recv_data_segment_length =
+ conn->conn_max_recv_data_segment_limit =
MAX_DATA_SEGMENT_LENGTH;
- conn->conn_max_send_data_segment_length =
+ conn->conn_max_send_data_segment_limit =
MAX_DATA_SEGMENT_LENGTH;
}
More information about the svn-src-head
mailing list