diff options
| -rw-r--r-- | src/server/iscsi.c | 207 | ||||
| -rw-r--r-- | src/server/iscsi.h | 203 |
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 |
