summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2015-02-05 06:37:59 +0000
committertrasz <trasz@FreeBSD.org>2015-02-05 06:37:59 +0000
commite9295a0f2d24e7af6336d08da5937b029fb9f3b5 (patch)
tree20fba2173fa09918784fa0c8342c8e206d67f763 /usr.sbin
parent607b4e91ba9ae6ed7256bed8b120415048f66643 (diff)
downloadFreeBSD-src-e9295a0f2d24e7af6336d08da5937b029fb9f3b5.zip
FreeBSD-src-e9295a0f2d24e7af6336d08da5937b029fb9f3b5.tar.gz
Make it possible to set (via iscsi.conf(5)) and query (via iscsictl -v)
initiator iSCSI offload. Pass maximum data segment size supported by chosen offload module to iscsid(8), and make iscsid(8) not try to negotiate anything larger than that. MFC after: 1 month Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/iscsid/iscsid.c7
-rw-r--r--usr.sbin/iscsid/iscsid.h1
-rw-r--r--usr.sbin/iscsid/login.c10
3 files changed, 13 insertions, 5 deletions
diff --git a/usr.sbin/iscsid/iscsid.c b/usr.sbin/iscsid/iscsid.c
index a6feb6a..b879f59 100644
--- a/usr.sbin/iscsid/iscsid.c
+++ b/usr.sbin/iscsid/iscsid.c
@@ -152,7 +152,8 @@ resolve_addr(const struct connection *conn, const char *address,
static struct connection *
connection_new(unsigned int session_id, const uint8_t isid[8], uint16_t tsih,
- const struct iscsi_session_conf *conf, int iscsi_fd)
+ const struct iscsi_session_conf *conf, const struct iscsi_session_limits
+ *limits, int iscsi_fd)
{
struct connection *conn;
struct addrinfo *from_ai, *to_ai;
@@ -186,6 +187,7 @@ connection_new(unsigned int session_id, const uint8_t isid[8], uint16_t tsih,
* XXX: Should we sanitize this somehow?
*/
memcpy(&conn->conn_conf, conf, sizeof(conn->conn_conf));
+ memcpy(&conn->conn_limits, limits, sizeof(conn->conn_limits));
from_addr = conn->conn_conf.isc_initiator_addr;
to_addr = conn->conn_conf.isc_target_addr;
@@ -443,7 +445,8 @@ handle_request(int iscsi_fd, const struct iscsi_daemon_request *request, int tim
}
conn = connection_new(request->idr_session_id, request->idr_isid,
- request->idr_tsih, &request->idr_conf, iscsi_fd);
+ request->idr_tsih, &request->idr_conf, &request->idr_limits,
+ iscsi_fd);
set_timeout(timeout);
capsicate(conn);
login(conn);
diff --git a/usr.sbin/iscsid/iscsid.h b/usr.sbin/iscsid/iscsid.h
index 9ad3325..448e9b7 100644
--- a/usr.sbin/iscsid/iscsid.h
+++ b/usr.sbin/iscsid/iscsid.h
@@ -51,6 +51,7 @@ struct connection {
int conn_socket;
unsigned int conn_session_id;
struct iscsi_session_conf conn_conf;
+ struct iscsi_session_limits conn_limits;
char conn_target_alias[ISCSI_ADDR_LEN];
uint8_t conn_isid[6];
uint16_t conn_tsih;
diff --git a/usr.sbin/iscsid/login.c b/usr.sbin/iscsid/login.c
index 1338970..ed0b9bf 100644
--- a/usr.sbin/iscsid/login.c
+++ b/usr.sbin/iscsid/login.c
@@ -441,6 +441,10 @@ login_negotiate(struct connection *conn)
request = login_new_request(conn, BHSLR_STAGE_OPERATIONAL_NEGOTIATION);
request_keys = keys_new();
+ log_debugx("offload \"%s\" limits MaxRecvDataSegmentLength to %zd",
+ conn->conn_conf.isc_offload,
+ conn->conn_limits.isl_max_data_segment_length);
+
/*
* The following keys are irrelevant for discovery sessions.
*/
@@ -456,9 +460,9 @@ login_negotiate(struct connection *conn)
keys_add(request_keys, "ImmediateData", "Yes");
keys_add_int(request_keys, "MaxBurstLength",
- 2 * ISCSI_MAX_DATA_SEGMENT_LENGTH);
+ 2 * conn->conn_limits.isl_max_data_segment_length);
keys_add_int(request_keys, "FirstBurstLength",
- ISCSI_MAX_DATA_SEGMENT_LENGTH);
+ conn->conn_limits.isl_max_data_segment_length);
keys_add(request_keys, "InitialR2T", "Yes");
keys_add(request_keys, "MaxOutstandingR2T", "1");
} else {
@@ -467,7 +471,7 @@ login_negotiate(struct connection *conn)
}
keys_add_int(request_keys, "MaxRecvDataSegmentLength",
- ISCSI_MAX_DATA_SEGMENT_LENGTH);
+ 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");
OpenPOWER on IntegriCloud