diff options
author | trasz <trasz@FreeBSD.org> | 2015-02-05 06:37:59 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2015-02-05 06:37:59 +0000 |
commit | e9295a0f2d24e7af6336d08da5937b029fb9f3b5 (patch) | |
tree | 20fba2173fa09918784fa0c8342c8e206d67f763 /usr.sbin/iscsid | |
parent | 607b4e91ba9ae6ed7256bed8b120415048f66643 (diff) | |
download | FreeBSD-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/iscsid')
-rw-r--r-- | usr.sbin/iscsid/iscsid.c | 7 | ||||
-rw-r--r-- | usr.sbin/iscsid/iscsid.h | 1 | ||||
-rw-r--r-- | usr.sbin/iscsid/login.c | 10 |
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"); |