Exemplo n.º 1
0
Arquivo: pdu.c Projeto: 2asoft/freebsd
static void
pdu_receive_proxy(struct pdu *pdu)
{
	size_t len;

	assert(proxy_mode);

	kernel_receive(pdu);

	len = pdu_ahs_length(pdu);
	if (len > 0)
		log_errx(1, "protocol error: non-empty AHS");

	len = pdu_data_segment_length(pdu);
	assert(len <= MAX_DATA_SEGMENT_LENGTH);
	pdu->pdu_data_len = len;
}
Exemplo n.º 2
0
void
pdu_receive(struct pdu *pdu)
{
	size_t len, padding;
	char dummy[4];

#ifdef ICL_KERNEL_PROXY
	if (pdu->pdu_connection->conn_conf.isc_iser != 0)
		return (pdu_receive_proxy(pdu));
#endif

	assert(pdu->pdu_connection->conn_conf.isc_iser == 0);

	pdu_read(pdu->pdu_connection->conn_socket,
	    (char *)pdu->pdu_bhs, sizeof(*pdu->pdu_bhs));

	len = pdu_ahs_length(pdu);
	if (len > 0)
		log_errx(1, "protocol error: non-empty AHS");

	len = pdu_data_segment_length(pdu);
	if (len > 0) {
		if (len > ISCSI_MAX_DATA_SEGMENT_LENGTH) {
			log_errx(1, "protocol error: received PDU "
			    "with DataSegmentLength exceeding %d",
			    ISCSI_MAX_DATA_SEGMENT_LENGTH);
		}

		pdu->pdu_data_len = len;
		pdu->pdu_data = malloc(len);
		if (pdu->pdu_data == NULL)
			log_err(1, "malloc");

		pdu_read(pdu->pdu_connection->conn_socket,
		    (char *)pdu->pdu_data, pdu->pdu_data_len);

		padding = pdu_padding(pdu);
		if (padding != 0) {
			assert(padding < sizeof(dummy));
			pdu_read(pdu->pdu_connection->conn_socket,
			    (char *)dummy, padding);
		}
	}
}
Exemplo n.º 3
0
static void
pdu_receive_proxy(struct pdu *pdu)
{
	struct connection *conn;
	struct iscsi_daemon_receive *idr;
	size_t len;
	int error;

	conn = pdu->pdu_connection;
	assert(conn->conn_conf.isc_iser != 0);

	pdu->pdu_data = malloc(conn->conn_max_recv_data_segment_length);
	if (pdu->pdu_data == NULL)
		log_err(1, "malloc");

	idr = calloc(1, sizeof(*idr));
	if (idr == NULL)
		log_err(1, "calloc");

	idr->idr_session_id = conn->conn_session_id;
	idr->idr_bhs = pdu->pdu_bhs;
	idr->idr_data_segment_len = conn->conn_max_recv_data_segment_length;
	idr->idr_data_segment = pdu->pdu_data;

	error = ioctl(conn->conn_iscsi_fd, ISCSIDRECEIVE, idr);
	if (error != 0)
		log_err(1, "ISCSIDRECEIVE");

	len = pdu_ahs_length(pdu);
	if (len > 0)
		log_errx(1, "protocol error: non-empty AHS");

	len = pdu_data_segment_length(pdu);
	assert(len <= (size_t)conn->conn_max_recv_data_segment_length);
	pdu->pdu_data_len = len;

	free(idr);
}