summaryrefslogtreecommitdiffstats
path: root/src/server/iscsi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/iscsi.c')
-rw-r--r--src/server/iscsi.c207
1 files changed, 71 insertions, 136 deletions
diff --git a/src/server/iscsi.c b/src/server/iscsi.c
index 95ce1ec..b0b171e 100644
--- a/src/server/iscsi.c
+++ b/src/server/iscsi.c
@@ -45,8 +45,6 @@
#include "uplink.h"
#include "reference.h"
-#include <assert.h>
-
#define ISCSI_DEFAULT_LUN 0
#define ISCSI_DEFAULT_PROTOCOL_ID 1
#define ISCSI_DEFAULT_DEVICE_ID 1
@@ -79,7 +77,7 @@ static int iscsi_scsi_emu_primary_process(iscsi_scsi_task *scsi_task);
static void iscsi_scsi_task_init(iscsi_scsi_task *scsi_task); // Initializes a SCSI task
-static void iscsi_scsi_task_xfer_complete(iscsi_scsi_task *scsi_task, iscsi_pdu *request_pdu); // Callback function when an iSCSI SCSI task completed the data transfer
+static void iscsi_scsi_task_xfer_complete(iscsi_connection *conn, iscsi_scsi_task *scsi_task, iscsi_pdu *request_pdu); // Callback function when an iSCSI SCSI task completed the data transfer
static void iscsi_scsi_task_lun_process_none(iscsi_scsi_task *scsi_task); // Processes a iSCSI SCSI task with no LUN identifier
@@ -356,14 +354,10 @@ static iscsi_task *iscsi_task_create(iscsi_connection *conn)
return NULL;
}
- task->conn = conn;
- task->pos = 0UL;
task->len = 0UL;
- task->id = 0ULL;
task->lun_id = 0;
task->init_task_tag = 0UL;
task->target_xfer_tag = 0UL;
- task->data_sn = 0UL;
iscsi_scsi_task_init( &task->scsi_task );
task->scsi_task.connection = conn;
@@ -528,7 +522,7 @@ static int iscsi_task_xfer_scsi_data_in(iscsi_connection *conn, iscsi_task *task
if ( xfer_len == 0UL )
return 0;
- uint32_t data_sn = task->data_sn;
+ uint32_t data_sn = 0;
uint32_t max_burst_offset = 0UL;
// Max burst length = total length of payload in all PDUs
const uint32_t max_burst_len = conn->session->opts.MaxBurstLength;
@@ -569,8 +563,6 @@ static int iscsi_task_xfer_scsi_data_in(iscsi_connection *conn, iscsi_task *task
max_burst_offset += max_burst_len;
}
- task->data_sn = data_sn;
-
return (status & ISCSI_SCSI_DATA_IN_RESPONSE_FLAGS_STATUS);
}
@@ -606,10 +598,9 @@ static void iscsi_scsi_task_init(iscsi_scsi_task *scsi_task)
* so be careful.
* @param request_pdu
*/
-static void iscsi_scsi_task_xfer_complete(iscsi_scsi_task *scsi_task, iscsi_pdu *request_pdu)
+static void iscsi_scsi_task_xfer_complete(iscsi_connection *conn, iscsi_scsi_task *scsi_task, iscsi_pdu *request_pdu)
{
iscsi_task *task = container_of( scsi_task, iscsi_task, scsi_task );
- iscsi_connection *conn = task->conn;
iscsi_scsi_cmd_packet *scsi_cmd_pkt = (iscsi_scsi_cmd_packet *) request_pdu->bhs_pkt;
@@ -845,31 +836,6 @@ static inline uint64_t iscsi_scsi_emu_block_get_count(const dnbd3_image_t *image
return (image->virtualFilesize / ISCSI_SCSI_EMU_LOGICAL_BLOCK_SIZE);
}
-/**
- * @brief Converts offset and length in bytes to block number and length specified by a block size.
- *
- * This function uses bit shifting if
- * the block size is a power of two.
- *
- * @param[out] offset_blocks Pointer where to store the block
- * number. May NOT be NULL, so be
- * careful.
- * @param[out] num_blocks Pointer where to store the number of
- * blocks. NULL is NOT allowed here,
- * so take caution.
- * @param[in] offset_bytes Offset in bytes.
- * @param[in] num_bytes Number of bytes.
- * @return 0 if specified offset and number of
- * bytes is aligned to block size or a
- * positive value if unaligned.
- */
-static uint64_t iscsi_scsi_emu_bytes_to_blocks(uint64_t *offset_blocks, uint64_t *num_blocks, const uint64_t offset_bytes, const uint64_t num_bytes)
-{
- *offset_blocks = (offset_bytes / ISCSI_SCSI_EMU_LOGICAL_BLOCK_SIZE);
- *num_blocks = (num_bytes / ISCSI_SCSI_EMU_LOGICAL_BLOCK_SIZE);
-
- return ((offset_bytes % ISCSI_SCSI_EMU_LOGICAL_BLOCK_SIZE) | (num_bytes % ISCSI_SCSI_EMU_LOGICAL_BLOCK_SIZE));
-}
/**
* @brief Converts offset and length specified by a block size to offset and length in bytes.
@@ -934,7 +900,6 @@ static void iscsi_uplink_callback(void *data, uint64_t handle UNUSED, uint64_t s
* be careful.
* @param[in] offset_blocks Offset in blocks to start reading from.
* @param[in] num_blocks Number of blocks to read.
- * @param[in] block_size Block size in bytes.
* @return 0 on successful operation, a negative
* error code otherwise.
*/
@@ -1105,7 +1070,7 @@ static int iscsi_scsi_emu_block_process(iscsi_scsi_task *scsi_task)
return iscsi_scsi_emu_block_read( image, scsi_task, lba, xfer_len );
}
case ISCSI_SCSI_OPCODE_READCAPACITY10 : {
- iscsi_scsi_read_capacity_10_parameter_data_packet *buf = (iscsi_scsi_read_capacity_10_parameter_data_packet *) malloc( sizeof(struct iscsi_scsi_read_capacity_10_parameter_data_packet) );
+ iscsi_scsi_read_capacity_10_parameter_data_packet *buf = malloc( sizeof(struct iscsi_scsi_read_capacity_10_parameter_data_packet) );
if ( buf == NULL ) {
iscsi_scsi_task_status_set( scsi_task, ISCSI_SCSI_STATUS_CHECK_COND, ISCSI_SCSI_SENSE_KEY_NOT_READY, ISCSI_SCSI_ASC_LOGICAL_UNIT_NOT_READY, ISCSI_SCSI_ASCQ_BECOMING_READY );
@@ -1193,32 +1158,6 @@ static int iscsi_scsi_emu_block_process(iscsi_scsi_task *scsi_task)
}
/**
- * @brief Checks whether provided SCSI CDB allocation length is large enough.
- *
- * This function also sets the SCSI
- * status result code if the allocation
- * size is insufficent.
- *
- * @param[in] scsi_task Pointer to iSCSI SCSI task to set
- * the iSCSI status result code for and
- * may NOT be NULL, so be careful.
- * @param[in] len Actual length in bytes passed to check.
- * @param[in] min_len Minimum length in bytes required.
- * @retval 0 Allocation length is sufficent.
- * @retval -1 Allocation length is insufficent, SCSI status
- * code set.
- */
-static int iscsi_scsi_emu_check_len(iscsi_scsi_task *scsi_task, const uint len, const uint min_len)
-{
- if ( len >= min_len )
- return 0;
-
- iscsi_scsi_task_status_set( scsi_task, ISCSI_SCSI_STATUS_CHECK_COND, ISCSI_SCSI_SENSE_KEY_ILLEGAL_REQ, ISCSI_SCSI_ASC_INVALID_FIELD_IN_CDB, ISCSI_SCSI_ASCQ_CAUSE_NOT_REPORTABLE );
-
- return -1;
-}
-
-/**
* @brief Calculates the 64-bit IEEE Extended NAA for a name.
*
* @param[out] buf Pointer to 64-bit output buffer for
@@ -1691,32 +1630,33 @@ static int iscsi_scsi_emu_primary_report_luns( iscsi_scsi_report_luns_parameter_
* is initialized, the sub page code
* will also be set.
*
- * @param[in] mode_sense_mode_page_pkt Pointer to mode sense parameter
+ * @param[in] buffer Pointer to mode sense parameter
* mode page or sub page data packet
* to initialize. If this is NULL,
* this function does nothing.
- * @param[in] len Length in bytes to initialize with zeroes.
+ * @param[in] len Length in bytes to initialize. Any padding will be zeroed.
* @param[in] page Page code.
* @param[in] sub_page Sub page code.
*/
-static void iscsi_scsi_emu_primary_mode_sense_page_init(iscsi_scsi_mode_sense_mode_page_data_packet *mode_sense_mode_page_pkt, const uint len, const uint page, const uint sub_page)
+static void iscsi_scsi_emu_primary_mode_sense_page_init(uint8_t *buffer, const uint len, const uint page, const uint sub_page)
{
- if ( mode_sense_mode_page_pkt == NULL )
+ if ( buffer == NULL )
return;
if ( sub_page == 0U ) {
+ iscsi_scsi_mode_sense_mode_page_data_header *mode_sense_mode_page_pkt = (iscsi_scsi_mode_sense_mode_page_data_header *) buffer;
mode_sense_mode_page_pkt->page_code_flags = (uint8_t) ISCSI_SCSI_MODE_SENSE_MODE_PAGE_PUT_PAGE_CODE(page);
- mode_sense_mode_page_pkt->page_len = (uint8_t) (len - sizeof(struct iscsi_scsi_mode_sense_mode_page_data_packet));
+ mode_sense_mode_page_pkt->page_len = (uint8_t) (len - sizeof(*mode_sense_mode_page_pkt));
- memset( mode_sense_mode_page_pkt->params, 0, (len - offsetof(struct iscsi_scsi_mode_sense_mode_page_data_packet, params)) );
+ memset( mode_sense_mode_page_pkt + 1, 0, (len - sizeof(*mode_sense_mode_page_pkt)) );
} else {
- iscsi_scsi_mode_sense_mode_sub_page_data_packet *mode_sense_mode_sub_page_pkt = (iscsi_scsi_mode_sense_mode_sub_page_data_packet *) mode_sense_mode_page_pkt;
+ iscsi_scsi_mode_sense_mode_sub_page_data_header *mode_sense_mode_sub_page_pkt = (iscsi_scsi_mode_sense_mode_sub_page_data_header *) buffer;
mode_sense_mode_sub_page_pkt->page_code_flags = (uint8_t) (ISCSI_SCSI_MODE_SENSE_MODE_PAGE_PUT_PAGE_CODE(page) | ISCSI_SCSI_MODE_SENSE_MODE_PAGE_FLAGS_SPF);
mode_sense_mode_sub_page_pkt->sub_page_code = (uint8_t) sub_page;
- iscsi_put_be16( (uint8_t *) &mode_sense_mode_sub_page_pkt->page_len, (uint16_t) (len - sizeof(struct iscsi_scsi_mode_sense_mode_sub_page_data_packet)) );
+ iscsi_put_be16( (uint8_t *) &mode_sense_mode_sub_page_pkt->page_len, (uint16_t) (len - sizeof(*mode_sense_mode_sub_page_pkt)) );
- memset( mode_sense_mode_sub_page_pkt->params, 0, (len - offsetof(struct iscsi_scsi_mode_sense_mode_sub_page_data_packet, params)) );
+ memset( mode_sense_mode_sub_page_pkt + 1, 0, (len - sizeof(*mode_sense_mode_sub_page_pkt)) );
}
}
@@ -1733,7 +1673,7 @@ static void iscsi_scsi_emu_primary_mode_sense_page_init(iscsi_scsi_mode_sense_mo
* responsible for this mode sense
* task. NULL is NOT allowed here,
* take caution.
- * @param[in] mode_sense_mode_page_pkt Pointer to mode sense parameter
+ * @param[in] buffer Pointer to mode sense parameter
* mode page or sub page data packet
* to process. If this is NULL, only
* the length of page is calculated.
@@ -1743,10 +1683,10 @@ static void iscsi_scsi_emu_primary_mode_sense_page_init(iscsi_scsi_mode_sense_mo
* @return Number of bytes occupied or a
* negative error code otherwise.
*/
-static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_scsi_task *scsi_task, iscsi_scsi_mode_sense_mode_page_data_packet *mode_sense_mode_page_pkt, const uint pc, const uint page, const uint sub_page)
+static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_scsi_task *scsi_task, uint8_t *buffer, const uint pc, const uint page, const uint sub_page)
{
uint page_len;
- int len = 0;
+ uint len = 0;
int tmplen;
switch ( pc ) {
@@ -1827,9 +1767,9 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
if ( sub_page != 0U )
break;
- page_len = sizeof(struct iscsi_scsi_mode_sense_read_write_err_recovery_mode_page_data_packet);
+ page_len = sizeof(iscsi_scsi_mode_sense_read_write_err_recovery_mode_page_data_packet);
- iscsi_scsi_emu_primary_mode_sense_page_init( mode_sense_mode_page_pkt, page_len, page, sub_page );
+ iscsi_scsi_emu_primary_mode_sense_page_init( buffer, page_len, page, sub_page );
len += page_len;
@@ -1839,9 +1779,9 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
if ( sub_page != 0U )
break;
- page_len = sizeof(struct iscsi_scsi_mode_sense_disconnect_reconnect_mode_page_data_packet);
+ page_len = sizeof(iscsi_scsi_mode_sense_disconnect_reconnect_mode_page_data_packet);
- iscsi_scsi_emu_primary_mode_sense_page_init( mode_sense_mode_page_pkt, page_len, page, sub_page );
+ iscsi_scsi_emu_primary_mode_sense_page_init( buffer, page_len, page, sub_page );
len += page_len;
@@ -1851,9 +1791,9 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
if ( sub_page != 0U )
break;
- page_len = sizeof(struct iscsi_scsi_mode_sense_verify_err_recovery_mode_page_data_packet);
+ page_len = sizeof(iscsi_scsi_mode_sense_verify_err_recovery_mode_page_data_packet);
- iscsi_scsi_emu_primary_mode_sense_page_init( mode_sense_mode_page_pkt, page_len, page, sub_page );
+ iscsi_scsi_emu_primary_mode_sense_page_init( buffer, page_len, page, sub_page );
len += page_len;
@@ -1863,13 +1803,13 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
if ( sub_page != 0U )
break;
- iscsi_scsi_mode_sense_caching_mode_page_data_packet *mode_sense_caching_mode_page_pkt = (iscsi_scsi_mode_sense_caching_mode_page_data_packet *) mode_sense_mode_page_pkt;
+ iscsi_scsi_mode_sense_caching_mode_page_data_packet *mode_sense_caching_mode_page_pkt = (iscsi_scsi_mode_sense_caching_mode_page_data_packet *) buffer;
- page_len = sizeof(struct iscsi_scsi_mode_sense_caching_mode_page_data_packet);
+ page_len = sizeof(iscsi_scsi_mode_sense_caching_mode_page_data_packet);
- iscsi_scsi_emu_primary_mode_sense_page_init( mode_sense_mode_page_pkt, page_len, page, sub_page );
+ iscsi_scsi_emu_primary_mode_sense_page_init( buffer, page_len, page, sub_page );
- if ( (mode_sense_mode_page_pkt != NULL) && (pc != ISCSI_SCSI_CDB_MODE_SENSE_6_PAGE_CONTROL_CHG_VALUES) )
+ if ( (buffer != NULL) && (pc != ISCSI_SCSI_CDB_MODE_SENSE_6_PAGE_CONTROL_CHG_VALUES) )
mode_sense_caching_mode_page_pkt->flags |= ISCSI_SCSI_MODE_SENSE_CACHING_MODE_PAGE_FLAGS_RCD;
len += page_len;
@@ -1879,9 +1819,9 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
case ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_CONTROL : {
switch ( sub_page ) {
case ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_CONTROL : {
- page_len = sizeof(struct iscsi_scsi_mode_sense_control_mode_page_data_packet);
+ page_len = sizeof(iscsi_scsi_mode_sense_control_mode_page_data_packet);
- iscsi_scsi_emu_primary_mode_sense_page_init( mode_sense_mode_page_pkt, page_len, page, sub_page );
+ iscsi_scsi_emu_primary_mode_sense_page_init( buffer, page_len, page, sub_page );
len += page_len;
@@ -1892,18 +1832,18 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
page_len = sizeof(struct iscsi_scsi_mode_sense_control_ext_mode_page_data_packet);
- iscsi_scsi_emu_primary_mode_sense_page_init( mode_sense_mode_page_pkt, page_len, page, sub_page );
+ iscsi_scsi_emu_primary_mode_sense_page_init( buffer, page_len, page, sub_page );
len += page_len;
break;
}
case ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_CONTROL_ALL : {
- tmplen = iscsi_scsi_emu_primary_mode_sense_page( image, scsi_task, ((mode_sense_mode_page_pkt != NULL) ? (iscsi_scsi_mode_sense_mode_page_data_packet *) (((uint8_t *) mode_sense_mode_page_pkt) + len) : NULL), pc, page, ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_CONTROL );
+ tmplen = iscsi_scsi_emu_primary_mode_sense_page( image, scsi_task, ((buffer != NULL) ? (buffer + len) : NULL), pc, page, ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_CONTROL );
if ( tmplen == -1 )
return -1;
len += tmplen;
- tmplen = iscsi_scsi_emu_primary_mode_sense_page( image, scsi_task, ((mode_sense_mode_page_pkt != NULL) ? (iscsi_scsi_mode_sense_mode_page_data_packet *) (((uint8_t *) mode_sense_mode_page_pkt) + len) : NULL), pc, page, ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_CONTROL_EXT );
+ tmplen = iscsi_scsi_emu_primary_mode_sense_page( image, scsi_task, ((buffer != NULL) ? (buffer + len) : NULL), pc, page, ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_CONTROL_EXT );
if ( tmplen == -1 )
return -1;
len += tmplen;
@@ -1923,7 +1863,7 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
page_len = sizeof(struct iscsi_scsi_mode_sense_xor_ext_mode_page_data_packet);
- iscsi_scsi_emu_primary_mode_sense_page_init( mode_sense_mode_page_pkt, page_len, page, sub_page );
+ iscsi_scsi_emu_primary_mode_sense_page_init( buffer, page_len, page, sub_page );
len += page_len;
@@ -1935,7 +1875,7 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
page_len = sizeof(struct iscsi_scsi_mode_sense_power_cond_mode_page_data_packet);
- iscsi_scsi_emu_primary_mode_sense_page_init( mode_sense_mode_page_pkt, page_len, page, sub_page );
+ iscsi_scsi_emu_primary_mode_sense_page_init( buffer, page_len, page, sub_page );
len += page_len;
@@ -1947,19 +1887,17 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
page_len = sizeof(struct iscsi_scsi_mode_sense_info_exceptions_control_mode_page_data_packet);
- iscsi_scsi_emu_primary_mode_sense_page_init( mode_sense_mode_page_pkt, page_len, page, sub_page );
+ iscsi_scsi_emu_primary_mode_sense_page_init( buffer, page_len, page, sub_page );
len += page_len;
break;
}
case ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_REPORT_ALL_MODE_PAGES : {
- uint i;
-
switch ( sub_page ) {
case ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_REPORT_ALL_MODE_PAGES : {
- for ( i = ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_VENDOR_SPEC; i < ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_REPORT_ALL_MODE_PAGES; i++ ) {
- tmplen = iscsi_scsi_emu_primary_mode_sense_page( image, scsi_task, ((mode_sense_mode_page_pkt != NULL) ? (iscsi_scsi_mode_sense_mode_page_data_packet *) (((uint8_t *) mode_sense_mode_page_pkt) + len) : NULL), pc, i, ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_REPORT_ALL_MODE_PAGES );
+ for ( uint i = ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_VENDOR_SPEC; i < ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_REPORT_ALL_MODE_PAGES; i++ ) {
+ tmplen = iscsi_scsi_emu_primary_mode_sense_page( image, scsi_task, ((buffer != NULL) ? (buffer + len) : NULL), pc, i, ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_REPORT_ALL_MODE_PAGES );
if ( tmplen == -1 )
return -1;
len += tmplen;
@@ -1968,15 +1906,15 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
break;
}
case ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_REPORT_ALL_MODE_SUB_PAGES : {
- for ( i = ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_VENDOR_SPEC; i < ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_REPORT_ALL_MODE_PAGES; i++ ) {
- tmplen = iscsi_scsi_emu_primary_mode_sense_page( image, scsi_task, ((mode_sense_mode_page_pkt != NULL) ? (iscsi_scsi_mode_sense_mode_page_data_packet *) (((uint8_t *) mode_sense_mode_page_pkt) + len) : NULL), pc, i, ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_REPORT_ALL_MODE_PAGES );
+ for ( uint i = ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_VENDOR_SPEC; i < ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_REPORT_ALL_MODE_PAGES; i++ ) {
+ tmplen = iscsi_scsi_emu_primary_mode_sense_page( image, scsi_task, ((buffer != NULL) ? (buffer + len) : NULL), pc, i, ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_REPORT_ALL_MODE_PAGES );
if ( tmplen == -1 )
return -1;
len += tmplen;
}
- for ( i = ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_VENDOR_SPEC; i < ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_REPORT_ALL_MODE_PAGES; i++ ) {
- tmplen = iscsi_scsi_emu_primary_mode_sense_page( image, scsi_task, ((mode_sense_mode_page_pkt != NULL) ? (iscsi_scsi_mode_sense_mode_page_data_packet *) (((uint8_t *) mode_sense_mode_page_pkt) + len) : NULL), pc, i, ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_REPORT_ALL_MODE_SUB_PAGES );
+ for ( uint i = ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_VENDOR_SPEC; i < ISCSI_SCSI_MODE_SENSE_MODE_PAGE_CODE_REPORT_ALL_MODE_PAGES; i++ ) {
+ tmplen = iscsi_scsi_emu_primary_mode_sense_page( image, scsi_task, ((buffer != NULL) ? (buffer + len) : NULL), pc, i, ISCSI_SCSI_MODE_SENSE_MODE_SUB_PAGE_CODE_REPORT_ALL_MODE_SUB_PAGES );
if ( tmplen == -1 )
return -1;
len += tmplen;
@@ -1996,7 +1934,7 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
}
}
- return len;
+ return (int)len;
}
/**
@@ -2012,7 +1950,7 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
* responsible for this mode sense
* task. NULL is NOT allowed here,
* take caution.
- * @param[in] mode_sense_6_parameter_hdr_data_pkt Pointer to mode sense parameter
+ * @param[in] buffer Pointer to mode sense parameter
* header data packet to fill the
* mode sense data with. If this is
* NULL, only the length of sense
@@ -2028,26 +1966,29 @@ static int iscsi_scsi_emu_primary_mode_sense_page(dnbd3_image_t *image, iscsi_sc
* operation, a negative error code
* otherwise.
*/
-static int iscsi_scsi_emu_primary_mode_sense(dnbd3_image_t *image, iscsi_scsi_task *scsi_task, iscsi_scsi_mode_sense_6_parameter_header_data_packet *mode_sense_6_parameter_hdr_data_pkt, const uint hdr_len, const uint block_desc_len, const uint long_lba, const uint pc, const uint page_code, const uint sub_page_code)
+static int iscsi_scsi_emu_primary_mode_sense(dnbd3_image_t *image, iscsi_scsi_task *scsi_task, uint8_t *buffer,
+ const uint hdr_len, const uint block_desc_len, const uint long_lba, const uint pc, const uint page_code, const uint sub_page_code)
{
- iscsi_scsi_mode_sense_mode_page_data_packet *mode_sense_mode_page_pkt = (iscsi_scsi_mode_sense_mode_page_data_packet *) ((mode_sense_6_parameter_hdr_data_pkt != NULL) ? (((uint8_t *) mode_sense_6_parameter_hdr_data_pkt) + hdr_len + block_desc_len) : NULL);
- const int page_len = iscsi_scsi_emu_primary_mode_sense_page( image, scsi_task, mode_sense_mode_page_pkt, pc, page_code, sub_page_code );
+ // Pointer to right after header and LBA block description; where the pages go
+ uint8_t *mode_sense_payload = (buffer != NULL) ? (buffer + hdr_len + block_desc_len) : NULL;
+ const int page_len = iscsi_scsi_emu_primary_mode_sense_page( image, scsi_task, mode_sense_payload, pc, page_code, sub_page_code );
if ( page_len < 0 )
return -1;
const uint alloc_len = (hdr_len + block_desc_len + page_len);
- if ( mode_sense_6_parameter_hdr_data_pkt == NULL )
- return alloc_len;
+ if ( buffer == NULL )
+ return (int)alloc_len;
- if ( hdr_len == sizeof(struct iscsi_scsi_mode_sense_6_parameter_header_data_packet) ) {
+ if ( hdr_len == sizeof(iscsi_scsi_mode_sense_6_parameter_header_data_packet) ) {
+ iscsi_scsi_mode_sense_6_parameter_header_data_packet *mode_sense_6_parameter_hdr_data_pkt = (iscsi_scsi_mode_sense_6_parameter_header_data_packet *) buffer;
mode_sense_6_parameter_hdr_data_pkt->mode_data_len = (uint8_t) (alloc_len - sizeof(uint8_t));
mode_sense_6_parameter_hdr_data_pkt->medium_type = 0U;
mode_sense_6_parameter_hdr_data_pkt->flags = ISCSI_SCSI_MODE_SENSE_6_PARAM_HDR_DATA_FLAGS_WP;
mode_sense_6_parameter_hdr_data_pkt->block_desc_len = (uint8_t) block_desc_len;
- } else if ( hdr_len == sizeof(struct iscsi_scsi_mode_sense_10_parameter_header_data_packet) ) {
- iscsi_scsi_mode_sense_10_parameter_header_data_packet *mode_sense_10_parameter_hdr_data_pkt = (iscsi_scsi_mode_sense_10_parameter_header_data_packet *) mode_sense_6_parameter_hdr_data_pkt;
+ } else if ( hdr_len == sizeof(iscsi_scsi_mode_sense_10_parameter_header_data_packet) ) {
+ iscsi_scsi_mode_sense_10_parameter_header_data_packet *mode_sense_10_parameter_hdr_data_pkt = (iscsi_scsi_mode_sense_10_parameter_header_data_packet *) buffer;
iscsi_put_be16( (uint8_t *) &mode_sense_10_parameter_hdr_data_pkt->mode_data_len, (uint16_t) (alloc_len - sizeof(uint16_t)) );
mode_sense_10_parameter_hdr_data_pkt->medium_type = 0U;
@@ -2063,8 +2004,8 @@ static int iscsi_scsi_emu_primary_mode_sense(dnbd3_image_t *image, iscsi_scsi_ta
const uint64_t num_blocks = iscsi_scsi_emu_block_get_count( image );
const uint32_t block_size = ISCSI_SCSI_EMU_LOGICAL_BLOCK_SIZE;
- if ( block_desc_len == sizeof(struct iscsi_scsi_mode_sense_lba_parameter_block_desc_data_packet) ) {
- iscsi_scsi_mode_sense_lba_parameter_block_desc_data_packet *lba_parameter_block_desc = (iscsi_scsi_mode_sense_lba_parameter_block_desc_data_packet *) (((uint8_t *) mode_sense_6_parameter_hdr_data_pkt) + hdr_len);
+ if ( block_desc_len == sizeof(iscsi_scsi_mode_sense_lba_parameter_block_desc_data_packet) ) {
+ iscsi_scsi_mode_sense_lba_parameter_block_desc_data_packet *lba_parameter_block_desc = (iscsi_scsi_mode_sense_lba_parameter_block_desc_data_packet *) (buffer + hdr_len);
if ( num_blocks > 0xFFFFFFFFULL )
lba_parameter_block_desc->num_blocks = 0xFFFFFFFFUL; // Minus one does not require endianess conversion
@@ -2073,15 +2014,15 @@ static int iscsi_scsi_emu_primary_mode_sense(dnbd3_image_t *image, iscsi_scsi_ta
lba_parameter_block_desc->reserved = 0U;
iscsi_put_be24( (uint8_t *) &lba_parameter_block_desc->block_len, block_size );
- } else if ( block_desc_len == sizeof(struct iscsi_scsi_mode_sense_long_lba_parameter_block_desc_data_packet) ) {
- iscsi_scsi_mode_sense_long_lba_parameter_block_desc_data_packet *long_lba_parameter_block_desc = (iscsi_scsi_mode_sense_long_lba_parameter_block_desc_data_packet *) (((uint8_t *) mode_sense_6_parameter_hdr_data_pkt) + hdr_len);
+ } else if ( block_desc_len == sizeof(iscsi_scsi_mode_sense_long_lba_parameter_block_desc_data_packet) ) {
+ iscsi_scsi_mode_sense_long_lba_parameter_block_desc_data_packet *long_lba_parameter_block_desc = (iscsi_scsi_mode_sense_long_lba_parameter_block_desc_data_packet *) (buffer + hdr_len);
iscsi_put_be64( (uint8_t *) &long_lba_parameter_block_desc->num_blocks, num_blocks );
long_lba_parameter_block_desc->reserved = 0UL;
iscsi_put_be32( (uint8_t *) &long_lba_parameter_block_desc->block_len, block_size );
}
- return alloc_len;
+ return (int)alloc_len;
}
/**
@@ -2158,7 +2099,7 @@ static int iscsi_scsi_emu_primary_process(iscsi_scsi_task *scsi_task)
if ( rc >= 0 ) {
scsi_task->buf = (uint8_t *) std_inquiry_data_pkt;
- scsi_task->len = MIN( rc, alloc_len );
+ scsi_task->len = MIN( (uint)rc, alloc_len );
scsi_task->status = ISCSI_SCSI_STATUS_GOOD;
} else {
free( std_inquiry_data_pkt );
@@ -2187,7 +2128,7 @@ static int iscsi_scsi_emu_primary_process(iscsi_scsi_task *scsi_task)
if ( rc >= 0 ) {
scsi_task->buf = (uint8_t *) report_luns_parameter_data_pkt;
- scsi_task->len = MIN( rc, alloc_len );
+ scsi_task->len = MIN( (uint)rc, alloc_len );
scsi_task->status = ISCSI_SCSI_STATUS_GOOD;
} else {
free( report_luns_parameter_data_pkt );
@@ -2213,7 +2154,7 @@ static int iscsi_scsi_emu_primary_process(iscsi_scsi_task *scsi_task)
len = rc;
- iscsi_scsi_mode_sense_6_parameter_header_data_packet *mode_sense_6_parameter_hdr_data_pkt = (iscsi_scsi_mode_sense_6_parameter_header_data_packet *) malloc( len );
+ uint8_t *mode_sense_6_parameter_hdr_data_pkt = malloc( len );
if ( mode_sense_6_parameter_hdr_data_pkt == NULL ) {
iscsi_scsi_task_status_set( scsi_task, ISCSI_SCSI_STATUS_CHECK_COND, ISCSI_SCSI_SENSE_KEY_NOT_READY, ISCSI_SCSI_ASC_LOGICAL_UNIT_NOT_READY, ISCSI_SCSI_ASCQ_BECOMING_READY );
@@ -2224,8 +2165,8 @@ static int iscsi_scsi_emu_primary_process(iscsi_scsi_task *scsi_task)
rc = iscsi_scsi_emu_primary_mode_sense( scsi_task->connection->client->image, scsi_task, mode_sense_6_parameter_hdr_data_pkt, sizeof(struct iscsi_scsi_mode_sense_6_parameter_header_data_packet), block_desc_len, 0U, pc, page, sub_page );
if ( rc >= 0 ) {
- scsi_task->buf = (uint8_t *) mode_sense_6_parameter_hdr_data_pkt;
- scsi_task->len = MIN( rc, alloc_len );
+ scsi_task->buf = mode_sense_6_parameter_hdr_data_pkt;
+ scsi_task->len = MIN( (uint)rc, alloc_len );
scsi_task->status = ISCSI_SCSI_STATUS_GOOD;
} else {
free( mode_sense_6_parameter_hdr_data_pkt );
@@ -2245,14 +2186,14 @@ static int iscsi_scsi_emu_primary_process(iscsi_scsi_task *scsi_task)
const uint page10 = ISCSI_SCSI_CDB_MODE_SENSE_10_GET_PAGE_CODE(cdb_mode_sense_10->page_code_control);
const uint sub_page10 = cdb_mode_sense_10->sub_page_code;
- rc = iscsi_scsi_emu_primary_mode_sense( scsi_task->connection->client->image, scsi_task, NULL, sizeof(struct iscsi_scsi_mode_sense_10_parameter_header_data_packet), block_desc_len, long_lba, pc10, page10, sub_page10 );
+ rc = iscsi_scsi_emu_primary_mode_sense( scsi_task->connection->client->image, scsi_task, NULL, sizeof(iscsi_scsi_mode_sense_10_parameter_header_data_packet), block_desc_len, long_lba, pc10, page10, sub_page10 );
if ( rc < 0 )
break;
len = rc;
- iscsi_scsi_mode_sense_10_parameter_header_data_packet *mode_sense_10_parameter_hdr_data_pkt = (iscsi_scsi_mode_sense_10_parameter_header_data_packet *) malloc( len );
+ uint8_t *mode_sense_10_parameter_hdr_data_pkt = malloc( len );
if ( mode_sense_10_parameter_hdr_data_pkt == NULL ) {
iscsi_scsi_task_status_set( scsi_task, ISCSI_SCSI_STATUS_CHECK_COND, ISCSI_SCSI_SENSE_KEY_NOT_READY, ISCSI_SCSI_ASC_LOGICAL_UNIT_NOT_READY, ISCSI_SCSI_ASCQ_BECOMING_READY );
@@ -2260,11 +2201,11 @@ static int iscsi_scsi_emu_primary_process(iscsi_scsi_task *scsi_task)
break;
}
- rc = iscsi_scsi_emu_primary_mode_sense( scsi_task->connection->client->image, scsi_task, (iscsi_scsi_mode_sense_6_parameter_header_data_packet *) mode_sense_10_parameter_hdr_data_pkt, sizeof(struct iscsi_scsi_mode_sense_10_parameter_header_data_packet), block_desc_len, long_lba, pc10, page10, sub_page10 );
+ rc = iscsi_scsi_emu_primary_mode_sense( scsi_task->connection->client->image, scsi_task, mode_sense_10_parameter_hdr_data_pkt, sizeof(struct iscsi_scsi_mode_sense_10_parameter_header_data_packet), block_desc_len, long_lba, pc10, page10, sub_page10 );
if ( rc >= 0 ) {
- scsi_task->buf = (uint8_t *) mode_sense_10_parameter_hdr_data_pkt;
- scsi_task->len = MIN( rc, alloc_len );
+ scsi_task->buf = mode_sense_10_parameter_hdr_data_pkt;
+ scsi_task->len = MIN( (uint)rc, alloc_len );
scsi_task->status = ISCSI_SCSI_STATUS_GOOD;
} else {
free( mode_sense_10_parameter_hdr_data_pkt );
@@ -2274,11 +2215,7 @@ static int iscsi_scsi_emu_primary_process(iscsi_scsi_task *scsi_task)
break;
}
- case ISCSI_SCSI_OPCODE_TESTUNITREADY : {
- scsi_task->status = ISCSI_SCSI_STATUS_GOOD;
-
- break;
- }
+ case ISCSI_SCSI_OPCODE_TESTUNITREADY :
case ISCSI_SCSI_OPCODE_STARTSTOPUNIT : {
scsi_task->status = ISCSI_SCSI_STATUS_GOOD;
@@ -3278,7 +3215,7 @@ static int iscsi_connection_handle_scsi_cmd(iscsi_connection *conn, iscsi_pdu *r
}
if ( rc == ISCSI_SCSI_TASK_RUN_COMPLETE ) {
- iscsi_scsi_task_xfer_complete( &task->scsi_task, request_pdu );
+ iscsi_scsi_task_xfer_complete( conn, &task->scsi_task, request_pdu );
}
iscsi_task_destroy( task );
@@ -3298,7 +3235,6 @@ static int iscsi_connection_handle_scsi_cmd(iscsi_connection *conn, iscsi_pdu *r
* NULL is not allowed here, so take caution.
* @param[in] kvpairs Pointer to key and value pairs.
* which may NOT be NULL, so take caution.
- * @param[in] cid Connection ID (CID).
* @return 0 on success, a negative error code otherwise.
*/
static int iscsi_connection_handle_login_phase_none(iscsi_connection *conn, iscsi_pdu *login_response_pdu, iscsi_negotiation_kvp *kvpairs)
@@ -3327,7 +3263,6 @@ static int iscsi_connection_handle_login_phase_none(iscsi_connection *conn, iscs
return rc;
if ( conn->session == NULL ) {
- iscsi_login_response_packet *login_response_pkt = (iscsi_login_response_packet *) login_response_pdu->bhs_pkt;
conn->session = iscsi_session_create( type );
if ( conn->session == NULL ) {