Remove ISCSI_MAX_DATA_SEGMENT_LENGTH, using negotiated value.

MFC after:	2 weeks
This commit is contained in:
Alexander Motin 2017-01-20 17:14:10 +00:00
parent d6a85ec2ee
commit 625571de20
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=312543

View File

@ -106,13 +106,15 @@ pdu_new_response(struct pdu *request)
static void static void
pdu_receive_proxy(struct pdu *pdu) pdu_receive_proxy(struct pdu *pdu)
{ {
struct connection *conn;
struct iscsi_daemon_receive *idr; struct iscsi_daemon_receive *idr;
size_t len; size_t len;
int error; int error;
assert(pdu->pdu_connection->conn_conf.isc_iser != 0); conn = pdu->pdu_connection;
assert(conn->conn_conf.isc_iser != 0);
pdu->pdu_data = malloc(ISCSI_MAX_DATA_SEGMENT_LENGTH); pdu->pdu_data = malloc(conn->conn_max_recv_data_segment_length);
if (pdu->pdu_data == NULL) if (pdu->pdu_data == NULL)
log_err(1, "malloc"); log_err(1, "malloc");
@ -120,12 +122,12 @@ pdu_receive_proxy(struct pdu *pdu)
if (idr == NULL) if (idr == NULL)
log_err(1, "calloc"); log_err(1, "calloc");
idr->idr_session_id = pdu->pdu_connection->conn_session_id; idr->idr_session_id = conn->conn_session_id;
idr->idr_bhs = pdu->pdu_bhs; idr->idr_bhs = pdu->pdu_bhs;
idr->idr_data_segment_len = ISCSI_MAX_DATA_SEGMENT_LENGTH; idr->idr_data_segment_len = conn->conn_max_recv_data_segment_length;
idr->idr_data_segment = pdu->pdu_data; idr->idr_data_segment = pdu->pdu_data;
error = ioctl(pdu->pdu_connection->conn_iscsi_fd, ISCSIDRECEIVE, idr); error = ioctl(conn->conn_iscsi_fd, ISCSIDRECEIVE, idr);
if (error != 0) if (error != 0)
log_err(1, "ISCSIDRECEIVE"); log_err(1, "ISCSIDRECEIVE");
@ -134,7 +136,7 @@ pdu_receive_proxy(struct pdu *pdu)
log_errx(1, "protocol error: non-empty AHS"); log_errx(1, "protocol error: non-empty AHS");
len = pdu_data_segment_length(pdu); len = pdu_data_segment_length(pdu);
assert(len <= ISCSI_MAX_DATA_SEGMENT_LENGTH); assert(len <= (size_t)conn->conn_max_recv_data_segment_length);
pdu->pdu_data_len = len; pdu->pdu_data_len = len;
free(idr); free(idr);
@ -143,10 +145,12 @@ pdu_receive_proxy(struct pdu *pdu)
static void static void
pdu_send_proxy(struct pdu *pdu) pdu_send_proxy(struct pdu *pdu)
{ {
struct connection *conn;
struct iscsi_daemon_send *ids; struct iscsi_daemon_send *ids;
int error; int error;
assert(pdu->pdu_connection->conn_conf.isc_iser != 0); conn = pdu->pdu_connection;
assert(conn->conn_conf.isc_iser != 0);
pdu_set_data_segment_length(pdu, pdu->pdu_data_len); pdu_set_data_segment_length(pdu, pdu->pdu_data_len);
@ -154,12 +158,12 @@ pdu_send_proxy(struct pdu *pdu)
if (ids == NULL) if (ids == NULL)
log_err(1, "calloc"); log_err(1, "calloc");
ids->ids_session_id = pdu->pdu_connection->conn_session_id; ids->ids_session_id = conn->conn_session_id;
ids->ids_bhs = pdu->pdu_bhs; ids->ids_bhs = pdu->pdu_bhs;
ids->ids_data_segment_len = pdu->pdu_data_len; ids->ids_data_segment_len = pdu->pdu_data_len;
ids->ids_data_segment = pdu->pdu_data; ids->ids_data_segment = pdu->pdu_data;
error = ioctl(pdu->pdu_connection->conn_iscsi_fd, ISCSIDSEND, ids); error = ioctl(conn->conn_iscsi_fd, ISCSIDSEND, ids);
if (error != 0) if (error != 0)
log_err(1, "ISCSIDSEND"); log_err(1, "ISCSIDSEND");
@ -204,18 +208,18 @@ pdu_read(const struct connection *conn, char *data, size_t len)
void void
pdu_receive(struct pdu *pdu) pdu_receive(struct pdu *pdu)
{ {
struct connection *conn;
size_t len, padding; size_t len, padding;
char dummy[4]; char dummy[4];
conn = pdu->pdu_connection;
#ifdef ICL_KERNEL_PROXY #ifdef ICL_KERNEL_PROXY
if (pdu->pdu_connection->conn_conf.isc_iser != 0) if (conn->conn_conf.isc_iser != 0)
return (pdu_receive_proxy(pdu)); return (pdu_receive_proxy(pdu));
#endif #endif
assert(conn->conn_conf.isc_iser == 0);
assert(pdu->pdu_connection->conn_conf.isc_iser == 0); pdu_read(conn, (char *)pdu->pdu_bhs, sizeof(*pdu->pdu_bhs));
pdu_read(pdu->pdu_connection,
(char *)pdu->pdu_bhs, sizeof(*pdu->pdu_bhs));
len = pdu_ahs_length(pdu); len = pdu_ahs_length(pdu);
if (len > 0) if (len > 0)
@ -223,10 +227,10 @@ pdu_receive(struct pdu *pdu)
len = pdu_data_segment_length(pdu); len = pdu_data_segment_length(pdu);
if (len > 0) { if (len > 0) {
if (len > ISCSI_MAX_DATA_SEGMENT_LENGTH) { if (len > (size_t)conn->conn_max_recv_data_segment_length) {
log_errx(1, "protocol error: received PDU " log_errx(1, "protocol error: received PDU "
"with DataSegmentLength exceeding %d", "with DataSegmentLength exceeding %d",
ISCSI_MAX_DATA_SEGMENT_LENGTH); conn->conn_max_recv_data_segment_length);
} }
pdu->pdu_data_len = len; pdu->pdu_data_len = len;
@ -234,14 +238,12 @@ pdu_receive(struct pdu *pdu)
if (pdu->pdu_data == NULL) if (pdu->pdu_data == NULL)
log_err(1, "malloc"); log_err(1, "malloc");
pdu_read(pdu->pdu_connection, pdu_read(conn, (char *)pdu->pdu_data, pdu->pdu_data_len);
(char *)pdu->pdu_data, pdu->pdu_data_len);
padding = pdu_padding(pdu); padding = pdu_padding(pdu);
if (padding != 0) { if (padding != 0) {
assert(padding < sizeof(dummy)); assert(padding < sizeof(dummy));
pdu_read(pdu->pdu_connection, pdu_read(conn, (char *)dummy, padding);
(char *)dummy, padding);
} }
} }
} }
@ -249,18 +251,20 @@ pdu_receive(struct pdu *pdu)
void void
pdu_send(struct pdu *pdu) pdu_send(struct pdu *pdu)
{ {
struct connection *conn;
ssize_t ret, total_len; ssize_t ret, total_len;
size_t padding; size_t padding;
uint32_t zero = 0; uint32_t zero = 0;
struct iovec iov[3]; struct iovec iov[3];
int iovcnt; int iovcnt;
conn = pdu->pdu_connection;
#ifdef ICL_KERNEL_PROXY #ifdef ICL_KERNEL_PROXY
if (pdu->pdu_connection->conn_conf.isc_iser != 0) if (conn->conn_conf.isc_iser != 0)
return (pdu_send_proxy(pdu)); return (pdu_send_proxy(pdu));
#endif #endif
assert(pdu->pdu_connection->conn_conf.isc_iser == 0); assert(conn->conn_conf.isc_iser == 0);
pdu_set_data_segment_length(pdu, pdu->pdu_data_len); pdu_set_data_segment_length(pdu, pdu->pdu_data_len);
iov[0].iov_base = pdu->pdu_bhs; iov[0].iov_base = pdu->pdu_bhs;
@ -284,7 +288,7 @@ pdu_send(struct pdu *pdu)
} }
} }
ret = writev(pdu->pdu_connection->conn_socket, iov, iovcnt); ret = writev(conn->conn_socket, iov, iovcnt);
if (ret < 0) { if (ret < 0) {
if (timed_out()) if (timed_out())
log_errx(1, "exiting due to timeout"); log_errx(1, "exiting due to timeout");