Remove ISCSI_MAX_DATA_SEGMENT_LENGTH, using negotiated value.
MFC after: 2 weeks
This commit is contained in:
parent
d6a85ec2ee
commit
625571de20
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=312543
@ -106,13 +106,15 @@ pdu_new_response(struct pdu *request)
|
||||
static void
|
||||
pdu_receive_proxy(struct pdu *pdu)
|
||||
{
|
||||
struct connection *conn;
|
||||
struct iscsi_daemon_receive *idr;
|
||||
size_t len;
|
||||
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)
|
||||
log_err(1, "malloc");
|
||||
|
||||
@ -120,12 +122,12 @@ pdu_receive_proxy(struct pdu *pdu)
|
||||
if (idr == NULL)
|
||||
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_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;
|
||||
|
||||
error = ioctl(pdu->pdu_connection->conn_iscsi_fd, ISCSIDRECEIVE, idr);
|
||||
error = ioctl(conn->conn_iscsi_fd, ISCSIDRECEIVE, idr);
|
||||
if (error != 0)
|
||||
log_err(1, "ISCSIDRECEIVE");
|
||||
|
||||
@ -134,7 +136,7 @@ pdu_receive_proxy(struct pdu *pdu)
|
||||
log_errx(1, "protocol error: non-empty AHS");
|
||||
|
||||
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;
|
||||
|
||||
free(idr);
|
||||
@ -143,10 +145,12 @@ pdu_receive_proxy(struct pdu *pdu)
|
||||
static void
|
||||
pdu_send_proxy(struct pdu *pdu)
|
||||
{
|
||||
struct connection *conn;
|
||||
struct iscsi_daemon_send *ids;
|
||||
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);
|
||||
|
||||
@ -154,12 +158,12 @@ pdu_send_proxy(struct pdu *pdu)
|
||||
if (ids == NULL)
|
||||
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_data_segment_len = pdu->pdu_data_len;
|
||||
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)
|
||||
log_err(1, "ISCSIDSEND");
|
||||
|
||||
@ -204,18 +208,18 @@ pdu_read(const struct connection *conn, char *data, size_t len)
|
||||
void
|
||||
pdu_receive(struct pdu *pdu)
|
||||
{
|
||||
struct connection *conn;
|
||||
size_t len, padding;
|
||||
char dummy[4];
|
||||
|
||||
conn = pdu->pdu_connection;
|
||||
#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));
|
||||
#endif
|
||||
assert(conn->conn_conf.isc_iser == 0);
|
||||
|
||||
assert(pdu->pdu_connection->conn_conf.isc_iser == 0);
|
||||
|
||||
pdu_read(pdu->pdu_connection,
|
||||
(char *)pdu->pdu_bhs, sizeof(*pdu->pdu_bhs));
|
||||
pdu_read(conn, (char *)pdu->pdu_bhs, sizeof(*pdu->pdu_bhs));
|
||||
|
||||
len = pdu_ahs_length(pdu);
|
||||
if (len > 0)
|
||||
@ -223,10 +227,10 @@ pdu_receive(struct pdu *pdu)
|
||||
|
||||
len = pdu_data_segment_length(pdu);
|
||||
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 "
|
||||
"with DataSegmentLength exceeding %d",
|
||||
ISCSI_MAX_DATA_SEGMENT_LENGTH);
|
||||
conn->conn_max_recv_data_segment_length);
|
||||
}
|
||||
|
||||
pdu->pdu_data_len = len;
|
||||
@ -234,14 +238,12 @@ pdu_receive(struct pdu *pdu)
|
||||
if (pdu->pdu_data == NULL)
|
||||
log_err(1, "malloc");
|
||||
|
||||
pdu_read(pdu->pdu_connection,
|
||||
(char *)pdu->pdu_data, pdu->pdu_data_len);
|
||||
pdu_read(conn, (char *)pdu->pdu_data, pdu->pdu_data_len);
|
||||
|
||||
padding = pdu_padding(pdu);
|
||||
if (padding != 0) {
|
||||
assert(padding < sizeof(dummy));
|
||||
pdu_read(pdu->pdu_connection,
|
||||
(char *)dummy, padding);
|
||||
pdu_read(conn, (char *)dummy, padding);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -249,18 +251,20 @@ pdu_receive(struct pdu *pdu)
|
||||
void
|
||||
pdu_send(struct pdu *pdu)
|
||||
{
|
||||
struct connection *conn;
|
||||
ssize_t ret, total_len;
|
||||
size_t padding;
|
||||
uint32_t zero = 0;
|
||||
struct iovec iov[3];
|
||||
int iovcnt;
|
||||
|
||||
conn = pdu->pdu_connection;
|
||||
#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));
|
||||
#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);
|
||||
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 (timed_out())
|
||||
log_errx(1, "exiting due to timeout");
|
||||
|
Loading…
Reference in New Issue
Block a user