summaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
authorSimon Rettberg2025-10-31 14:29:02 +0100
committerSimon Rettberg2025-12-09 15:33:20 +0100
commit884735d4af0d96c4011eb8b63ffa0e72a81e9a85 (patch)
treef3a8e1f41eaec2ed06cd312254d9a767eaec2f42 /src/server
parent[SERVER] iscsi: Rename constant to reflect it means LOGICAL block size (diff)
downloaddnbd3-884735d4af0d96c4011eb8b63ffa0e72a81e9a85.tar.gz
dnbd3-884735d4af0d96c4011eb8b63ffa0e72a81e9a85.tar.xz
dnbd3-884735d4af0d96c4011eb8b63ffa0e72a81e9a85.zip
[SERVER] iscsi: Remove unused functions & casts, turn [0] into []
In functions that can handle multiple different structs, instead of picking an arbitrary one as the pointer type in the function signature, pass an uint8_t and cast to the according struct in the sub-cases in the method body.
Diffstat (limited to 'src/server')
-rw-r--r--src/server/iscsi.c207
-rw-r--r--src/server/iscsi.h203
2 files changed, 104 insertions, 306 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 ) {
diff --git a/src/server/iscsi.h b/src/server/iscsi.h
index 1a98fff..ff33acd 100644
--- a/src/server/iscsi.h
+++ b/src/server/iscsi.h
@@ -38,10 +38,8 @@
#include <stdio.h>
#include <sys/types.h>
#include <dnbd3/types.h>
-#include <pthread.h>
#include "globals.h"
-#include "image.h"
#if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
// GCC-compatible compiler, targeting x86/x86-64
@@ -218,26 +216,6 @@ static inline void iscsi_put_le64(uint8_t *data, const uint64_t value)
#endif
-/**
- * @brief Checks whether a specified 32-bit integer value is a power of two.
- *
- * This function is used to determine
- * if shift operations can be used for
- * calculating instead of very slow
- * multiplication, division and modulo
- * operations.
- *
- * @param[in] value Value to check for a power of two.
- * @retval true Value is a power of two.
- * @retval false Value is NOT a power of two,
- * hence slow division is required.
- */
-static inline bool iscsi_is_pow2(const uint32_t value)
-{
- return ((value & (value - 1UL)) == 0UL);
-}
-
-
/// Determines the next offset after member b of struct a.
#define ISCSI_NEXT_OFFSET(a, b) (offsetof(struct a, b) + sizeof(((struct a *) 0)->b))
@@ -495,9 +473,6 @@ typedef struct __attribute__((packed)) iscsi_ahs_packet {
/// AHS-Specific.
uint8_t specific;
-
- /// AHS-Specific data.
- uint8_t data[0];
} iscsi_ahs_packet;
/**
@@ -553,7 +528,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_cdb {
uint8_t opcode;
/// Additional op-code specific data.
- uint8_t data[0];
+ uint8_t data[15];
} iscsi_scsi_cdb;
@@ -571,7 +546,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_cdb {
*/
typedef struct __attribute__((packed)) iscsi_scsi_cdb_inquiry {
/// SCSI opcode.
- iscsi_scsi_cdb cdb;
+ uint8_t opcode;
/// Logical Unit Number (LUN), CMMDT and EVPD.
uint8_t lun_flags;
@@ -594,7 +569,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_cdb_inquiry {
*/
typedef struct __attribute__((packed)) iscsi_scsi_cdb_read_write_6 {
/// SCSI opcode.
- iscsi_scsi_cdb cdb;
+ uint8_t opcode;
/// Logical Block Address (LBA).
uint8_t lba[3];
@@ -614,7 +589,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_cdb_read_write_6 {
*/
typedef struct __attribute__((packed)) iscsi_scsi_cdb_read_write_10 {
/// SCSI opcode.
- iscsi_scsi_cdb cdb;
+ uint8_t opcode;
/// Flags.
uint8_t flags;
@@ -640,7 +615,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_cdb_read_write_10 {
*/
typedef struct __attribute__((packed)) iscsi_scsi_cdb_read_write_12 {
/// SCSI opcode.
- iscsi_scsi_cdb cdb;
+ uint8_t opcode;
/// Flags.
uint8_t flags;
@@ -666,7 +641,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_cdb_read_write_12 {
*/
typedef struct __attribute__((packed)) iscsi_scsi_cdb_read_write_16 {
/// SCSI opcode.
- iscsi_scsi_cdb cdb;
+ uint8_t opcode;
/// Flags.
uint8_t flags;
@@ -702,7 +677,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_cdb_read_write_16 {
*/
typedef struct __attribute__((packed)) iscsi_scsi_cdb_report_luns {
/// SCSI opcode.
- iscsi_scsi_cdb cdb;
+ uint8_t opcode;
/// Reserved for future usage (always MUST be 0 for now).
uint8_t reserved;
@@ -756,7 +731,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_cdb_report_luns {
*/
typedef struct __attribute__((packed)) iscsi_scsi_cdb_service_action_in_16 {
/// SCSI opcode.
- iscsi_scsi_cdb cdb;
+ uint8_t opcode;
/// Service action.
uint8_t action;
@@ -829,7 +804,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_cdb_service_action_in_16 {
*/
typedef struct __attribute__((packed)) iscsi_scsi_cdb_mode_sense_6 {
/// SCSI opcode.
- iscsi_scsi_cdb cdb;
+ uint8_t opcode;
/// Flags.
uint8_t flags;
@@ -905,7 +880,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_cdb_mode_sense_6 {
*/
typedef struct __attribute__((packed)) iscsi_scsi_cdb_mode_sense_10 {
/// SCSI opcode.
- iscsi_scsi_cdb cdb;
+ uint8_t opcode;
/// Flags.
uint8_t flags;
@@ -946,10 +921,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_ds_cmd_data {
uint16_t len;
/// The Sense Data contains detailed information about a CHECK CONDITION. SPC3 specifies the format and content of the Sense Data.
- uint8_t sense_data[0];
-
- /// Response Data.
- uint8_t res_data[0];
+ uint8_t sense_data[];
} iscsi_scsi_ds_cmd_data;
@@ -1452,7 +1424,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_vpd_page_inquiry_data_packet {
uint16_t alloc_len;
/// Parameters.
- uint8_t params[0];
+ uint8_t params[];
} iscsi_scsi_vpd_page_inquiry_data_packet;
@@ -1590,7 +1562,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_vpd_page_design_desc_inquiry_d
uint8_t len;
/// Designation descriptor.
- uint8_t desc[0];
+ uint8_t desc[];
} iscsi_scsi_vpd_page_design_desc_inquiry_data_packet;
@@ -2675,16 +2647,13 @@ typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_long_lba_parameter_
*
* This returns mode page specific data.
*/
-typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_mode_page_data_packet {
+typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_mode_page_data_header {
/// Page code and flags.
- int8_t page_code_flags;
+ uint8_t page_code_flags;
/// Page length in bytes.
uint8_t page_len;
-
- /// Mode parameters.
- uint8_t params[0];
-} iscsi_scsi_mode_sense_mode_page_data_packet;
+} iscsi_scsi_mode_sense_mode_page_data_header;
/**
@@ -2692,19 +2661,16 @@ typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_mode_page_data_pack
*
* This returns mode sub page specific data.
*/
-typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_mode_sub_page_data_packet {
+typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_mode_sub_page_data_header {
/// Page code and flags.
- int8_t page_code_flags;
+ uint8_t page_code_flags;
/// Sub page code.
uint8_t sub_page_code;
/// Page length in bytes.
uint16_t page_len;
-
- /// Mode parameters.
- uint8_t params[0];
-} iscsi_scsi_mode_sense_mode_sub_page_data_packet;
+} iscsi_scsi_mode_sense_mode_sub_page_data_header;
/**
@@ -2714,7 +2680,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_mode_sub_page_data_
*/
typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_read_write_err_recovery_mode_page_data_packet {
/// Mode page.
- iscsi_scsi_mode_sense_mode_page_data_packet mode_page;
+ iscsi_scsi_mode_sense_mode_page_data_header mode_page;
/// Flags.
uint8_t flags;
@@ -2746,7 +2712,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_read_write_err_reco
*/
typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_disconnect_reconnect_mode_page_data_packet {
/// Mode page.
- iscsi_scsi_mode_sense_mode_page_data_packet mode_page;
+ iscsi_scsi_mode_sense_mode_page_data_header mode_page;
/// Reserved for future usage (always MUST be 0 for now).
uint16_t reserved;
@@ -2781,7 +2747,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_disconnect_reconnec
*/
typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_verify_err_recovery_mode_page_data_packet {
/// Mode page.
- iscsi_scsi_mode_sense_mode_page_data_packet mode_page;
+ iscsi_scsi_mode_sense_mode_page_data_header mode_page;
/// Flags.
uint8_t flags;
@@ -2844,7 +2810,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_verify_err_recovery
*/
typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_caching_mode_page_data_packet {
/// Mode page.
- iscsi_scsi_mode_sense_mode_page_data_packet mode_page;
+ iscsi_scsi_mode_sense_mode_page_data_header mode_page;
/// Flags.
uint8_t flags;
@@ -2888,7 +2854,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_caching_mode_page_d
*/
typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_control_mode_page_data_packet {
/// Mode page.
- iscsi_scsi_mode_sense_mode_page_data_packet mode_page;
+ iscsi_scsi_mode_sense_mode_page_data_header mode_page;
/// Flags.
uint8_t flags;
@@ -2920,7 +2886,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_control_mode_page_d
*/
typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_control_ext_mode_page_data_packet {
/// Mode page.
- iscsi_scsi_mode_sense_mode_sub_page_data_packet mode_sub_page;
+ iscsi_scsi_mode_sense_mode_sub_page_data_header mode_sub_page;
/// Flags.
uint8_t flags;
@@ -2946,7 +2912,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_control_ext_mode_pa
*/
typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_xor_ext_mode_page_data_packet {
/// Mode page.
- iscsi_scsi_mode_sense_mode_page_data_packet mode_page;
+ iscsi_scsi_mode_sense_mode_page_data_header mode_page;
/// Flags.
uint8_t flags;
@@ -2981,7 +2947,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_xor_ext_mode_page_d
*/
typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_power_cond_mode_page_data_packet {
/// Mode page.
- iscsi_scsi_mode_sense_mode_page_data_packet mode_page;
+ iscsi_scsi_mode_sense_mode_page_data_header mode_page;
/// Flags.
uint8_t flags;
@@ -3028,7 +2994,7 @@ typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_power_cond_mode_pag
*/
typedef struct __attribute__((packed)) iscsi_scsi_mode_sense_info_exceptions_control_mode_page_data_packet {
/// Mode page.
- iscsi_scsi_mode_sense_mode_page_data_packet mode_page;
+ iscsi_scsi_mode_sense_mode_page_data_header mode_page;
/// Flags.
uint8_t flags;
@@ -3338,12 +3304,6 @@ typedef struct __attribute__((packed)) iscsi_scsi_cmd_packet {
* MUST be used to contain the CDB spillover.
*/
iscsi_scsi_cdb scsi_cdb;
-
- /// Optional AHS packet data.
- iscsi_ahs_packet ahs;
-
- /// Optional data segment, command data.
- iscsi_scsi_ds_cmd_data ds_cmd_data;
} iscsi_scsi_cmd_packet;
@@ -3662,9 +3622,6 @@ typedef struct __attribute__((packed)) iscsi_scsi_response_packet {
* transferred.
*/
uint32_t res_cnt;
-
- /// Optional data segment, command data.
- iscsi_scsi_ds_cmd_data ds_cmd_data;
} iscsi_scsi_response_packet;
/// SCSI data out / in flags: Immediately process transfer.
@@ -3871,9 +3828,6 @@ typedef struct __attribute__((packed)) iscsi_scsi_data_in_response_packet {
/// Residual Count or Reserved.
uint32_t res_cnt;
-
- /// Data segment.
- iscsi_scsi_ds_cmd_data ds_cmd_data;
} iscsi_scsi_data_in_response_packet;
/**
@@ -3985,26 +3939,6 @@ typedef struct __attribute__((packed)) iscsi_text_req_packet {
/// Reserved for future usage, always MUST be 0.
uint64_t reserved2[2];
-
- /**
- * @brief Data segment.
- *
- * The data lengths of a Text Request MUST NOT exceed the iSCSI target
- * MaxRecvDataSegmentLength (a parameter that is negotiated per
- * connection and per direction).\n
- * A key=value pair can span Text Request or Text Response boundaries.
- * A key=value pair can start in one PDU and continue on the next. In
- * other words, the end of a PDU does not necessarily signal the end of
- * a key=value pair.\n
- * The target responds by sending its response back to the initiator.
- * The response text format is similar to the request text format. The
- * Text Response MAY refer to key=value pairs presented in an earlier
- * Text Request, and the text in the request may refer to earlier
- * responses.\n
- * Text operations are usually meant for parameter setting/negotiations
- * but can also be used to perform some long-lasting operations.
- */
- iscsi_scsi_ds_cmd_data ds_cmd_data;
} iscsi_text_req_packet;
@@ -4106,21 +4040,6 @@ typedef struct __attribute__((packed)) iscsi_text_response_packet {
/// Reserved for future usage, always MUST be 0.
uint64_t reserved2[2];
-
- /**
- * @brief Data segment.
- *
- * The data lengths of a Text Response MUST NOT exceed the iSCSI
- * initiator MaxRecvDataSegmentLength (a parameter that is negotiated
- * per connection and per direction).\n
- * The text in the Text Response Data is governed by the same rules as
- * the text in the Text Request Data.\n
- * Although the initiator is the requesting party and controls the
- * request-response initiation and termination, the target can offer
- * key=value pairs of its own as part of a sequence and not only in
- * response to the initiator.
- */
- iscsi_scsi_ds_cmd_data ds_cmd_data;
} iscsi_text_response_packet;
@@ -4773,17 +4692,6 @@ typedef struct __attribute__((packed)) iscsi_login_response_packet {
/// Reserved for future usage, always MUST be 0.
uint64_t reserved3;
-
- /**
- * @brief Data segment - Login Parameters in Text Request Format.
- *
- * The target MUST provide some basic parameters in order to enable the
- * initiator to determine if it is connected to the correct port and the
- * initial text parameters for the security exchange.\n
- * All the rules specified for Text Responses also hold for Login
- * Responses.
- */
- iscsi_scsi_ds_cmd_data ds_cmd_data;
} iscsi_login_response_packet;
@@ -5303,16 +5211,6 @@ typedef struct __attribute__((packed)) iscsi_nop_out_packet {
/// Reserved for future usage, always MUST be 0.
uint64_t reserved2[2];
-
- /**
- * @brief DataSegment - Ping Data (optional).
- *
- * Ping data is reflected in the NOP-In Response. The length of the
- * reflected data is limited to MaxRecvDataSegmentLength. The length of
- * ping data is indicated by the DataSegmentLength. 0 is a valid value
- * for the DataSegmentLength and indicates the absence of ping data.
- */
- iscsi_scsi_ds_cmd_data ds_ping_data;
} iscsi_nop_out_packet;
@@ -5396,9 +5294,6 @@ typedef struct __attribute__((packed)) iscsi_nop_in_packet {
/// Reserved for future usage, always MUST be 0.
uint64_t reserved3;
-
- /// DataSegment - Return Ping Data.
- iscsi_scsi_ds_cmd_data ds_ping_data;
} iscsi_nop_in_packet;
@@ -5462,29 +5357,6 @@ typedef struct iscsi_key_value_pair {
typedef struct iscsi_connection iscsi_connection;
-/**
- * @brief iSCSI Text / Login key=value packet data construction helper.
- *
- * This structure is used to store the key=value plus NUL terminator
- * pairs for sending as DataSegment packet data to the client.
- */
-typedef struct iscsi_key_value_pair_packet {
- /// Associated iSCSI connection.
- iscsi_connection *conn;
-
- /// Current text buffer containing multiple key=value + NUL terminator pairs.
- uint8_t *buf;
-
- /// Position of output buffer for next write.
- uint32_t pos;
-
- /// Current length of buffer including final NUL terminator without iSCSI zero padding.
- uint32_t len;
-
- /// Discovery mode.
- int discovery;
-} iscsi_key_value_pair_packet;
-
/// Read/write lock for iSCSI global vector. MUST be initialized with iscsi_create before any iSCSI functions are used.
//extern pthread_rwlock_t iscsi_globvec_rwlock;
@@ -5665,7 +5537,7 @@ typedef struct iscsi_key_value_pair_packet {
/// iSCSI SCSI task run: Unknown.
-#define ISCSI_SCSI_TASK_RUN_UNKNOWN -1
+#define ISCSI_SCSI_TASK_RUN_UNKNOWN (-1)
/// iSCSI SCSI task run: Completed.
#define ISCSI_SCSI_TASK_RUN_COMPLETE 0
@@ -5738,6 +5610,9 @@ typedef struct iscsi_scsi_task {
/// Block shift difference between dnbd3 (4k) and iSCSI (512b)
#define ISCSI_SCSI_EMU_BLOCK_DIFF_SHIFT (3)
+_Static_assert( (ISCSI_SCSI_EMU_LOGICAL_BLOCK_SIZE << ISCSI_SCSI_EMU_BLOCK_DIFF_SHIFT) == ISCSI_SCSI_EMU_PHYSICAL_BLOCK_SIZE,
+ "Block size parameters are inconsistent" );
+
/// iSCSI SCSI emulation I/O type: Removable.
#define ISCSI_SCSI_EMU_IO_TYPE_REMOVABLE (1 << 0)
@@ -5996,7 +5871,7 @@ typedef struct iscsi_pdu {
iscsi_ahs_packet *ahs_pkt;
/// iSCSI DataSegment (DS) packet data for fast access and is straight after BHS, AHS and header digest packet in memory.
- iscsi_scsi_ds_cmd_data *ds_cmd_data;
+ void *ds_cmd_data;
/// Flags.
int flags;
@@ -6034,18 +5909,9 @@ typedef struct iscsi_task {
/// Underlying SCSI task structure.
iscsi_scsi_task scsi_task;
- /// Associated iSCSI connection.
- iscsi_connection *conn;
-
- /// Buffer position in bytes.
- uint32_t pos;
-
/// Buffer length in bytes.
uint32_t len;
- /// Unique identifier for this task.
- uint64_t id;
-
/// LUN identifier associated with this task (always MUST be between 0 and 7), used for hot removal tracking.
int lun_id;
@@ -6054,9 +5920,6 @@ typedef struct iscsi_task {
/// Target Transfer Tag (TTT).
uint32_t target_xfer_tag;
-
- /// SCSI Data In Data Sequence Number (DataSN).
- uint32_t data_sn;
} iscsi_task;
void iscsi_connection_handle(dnbd3_client_t *client, const dnbd3_request_t *request, const int len); // Handles an iSCSI connection until connection is closed