diff options
| author | Sebastian Vater | 2025-10-21 08:55:06 +0200 |
|---|---|---|
| committer | Sebastian Vater | 2025-10-21 08:55:06 +0200 |
| commit | 1ef25857985ae0cd60a8d20fc5961c85a86edfc3 (patch) | |
| tree | 19a39bc66a82d983c28aff2a127ab3af2be64892 | |
| parent | Fixed typo in iSCSI portal group handling and removed obselete assignment. (diff) | |
| download | dnbd3-1ef25857985ae0cd60a8d20fc5961c85a86edfc3.tar.gz dnbd3-1ef25857985ae0cd60a8d20fc5961c85a86edfc3.tar.xz dnbd3-1ef25857985ae0cd60a8d20fc5961c85a86edfc3.zip | |
A little iSCSI code cleanup ...
| -rw-r--r-- | src/server/iscsi.c | 107 | ||||
| -rw-r--r-- | src/server/iscsi.h | 150 |
2 files changed, 140 insertions, 117 deletions
diff --git a/src/server/iscsi.c b/src/server/iscsi.c index e8474b9..a7c2e4d 100644 --- a/src/server/iscsi.c +++ b/src/server/iscsi.c @@ -1322,7 +1322,6 @@ int iscsi_create() globvec->max_sessions = 0U; globvec->header_digest = 0; globvec->data_digest = 0; - globvec->scsi_device_type = ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_DIRECT; atomic_init( &globvec->connections, 0 ); globvec->pg_tag = 1UL; globvec->max_recv_ds_len = ISCSI_DEFAULT_MAX_RECV_DS_LEN; @@ -1336,6 +1335,7 @@ int iscsi_create() globvec->chap_group = 0L; globvec->scsi_physical_block_size = ISCSI_SCSI_EMU_PHYSICAL_BLOCK_SIZE; globvec->scsi_logical_block_size = ISCSI_SCSI_EMU_BLOCK_SIZE; + globvec->scsi_device_type = ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_DIRECT; iscsi_config_load( globvec ); @@ -1751,7 +1751,7 @@ static int iscsi_config_load_from_ini(void *user_data, const char *section, cons if ( key_len == 0U ) return 0; - uint8_t *hash_key = iscsi_hashmap_key_create( pattern, key_len ); + uint8_t *hash_key = iscsi_hashmap_key_create( pattern, key_len ); if ( hash_key == NULL ) { logadd( LOG_ERROR, "iscsi_config_load_from_ini: Out of memory allocating memory for iSCSI SCSI device INI configuration section key" ); @@ -1807,7 +1807,6 @@ static int iscsi_config_load_from_ini(void *user_data, const char *section, cons scsi_device_config->header_digest = globvec->header_digest; scsi_device_config->data_digest = globvec->data_digest; - scsi_device_config->scsi_device_type = globvec->scsi_device_type; scsi_device_config->pg_tag = globvec->pg_tag; scsi_device_config->max_recv_ds_len = globvec->max_recv_ds_len; scsi_device_config->max_session_conns = globvec->max_session_conns; @@ -1819,6 +1818,7 @@ static int iscsi_config_load_from_ini(void *user_data, const char *section, cons scsi_device_config->err_recovery_level = globvec->err_recovery_level; scsi_device_config->scsi_physical_block_size = globvec->scsi_physical_block_size; scsi_device_config->scsi_logical_block_size = globvec->scsi_logical_block_size; + scsi_device_config->scsi_device_type = globvec->scsi_device_type; rc = iscsi_hashmap_put( globvec->scsi_device_config, hash_key, key_len, (uint8_t *) scsi_device_config ); @@ -3158,10 +3158,10 @@ void iscsi_task_xfer_complete_process_read(iscsi_connection *conn, iscsi_task *t */ static int iscsi_task_xfer_add(iscsi_connection *conn, iscsi_task *task) { - const iscsi_scsi_lun *lun = task->scsi_task.lun; - const uint32_t xfer_len = task->scsi_task.xfer_len; - uint32_t ds_len = task->pdu->ds_len; - uint32_t seg_len = 0UL; + const iscsi_scsi_lun *lun = task->scsi_task.lun; + const uint32_t xfer_len = task->scsi_task.xfer_len; + uint32_t ds_len = task->pdu->ds_len; + uint32_t seg_len = 0UL; if ( (lun != NULL) && (lun->image != NULL) ) seg_len = (uint32_t) iscsi_config_get( (uint8_t *) lun->image->name, ISCSI_GLOBALS_CONFIG_TYPE_MAX_RECV_DS_LEN ); @@ -3455,11 +3455,11 @@ static int iscsi_task_xfer_scsi_data_in(iscsi_connection *conn, iscsi_task *task if ( task->scsi_task.status != ISCSI_SCSI_STATUS_GOOD ) return 0; - const uint32_t pos = task->scsi_task.xfer_pos; - uint32_t xfer_len = task->scsi_task.len; - const uint32_t seg_len = conn->max_recv_ds_len; - uint32_t res_cnt = 0UL; - int8_t flags = 0; + const uint32_t pos = task->scsi_task.xfer_pos; + uint32_t xfer_len = task->scsi_task.len; + const uint32_t seg_len = conn->max_recv_ds_len; + uint32_t res_cnt = 0UL; + int8_t flags = 0; if ( pos < xfer_len ) { res_cnt = (xfer_len - pos); @@ -3637,10 +3637,10 @@ iscsi_portal_group *iscsi_portal_group_create(const uint64_t tag, const int flag return NULL; } - portal_group->ref_count = 0; portal_group->tag = tag; - portal_group->flags = flags; + atomic_init( &portal_group->active_conns, 0UL ); portal_group->chap_group = 0L; + portal_group->flags = flags; return portal_group; } @@ -5417,7 +5417,7 @@ int iscsi_scsi_emu_io_block_read(iscsi_scsi_task *scsi_task, dnbd3_image_t *imag } if ( readFromFile ) { - const int64_t len = pread( image->readFd, scsi_task->buf, (size_t) num_bytes, offset_bytes ); + const int64_t len = pread( image->readFd, scsi_task->buf, (size_t) num_bytes, offset_bytes ); success = ((uint64_t) len == num_bytes); @@ -5651,7 +5651,7 @@ static int iscsi_scsi_emu_block_read_write(dnbd3_image_t *image, iscsi_scsi_task } if ( xfer_len == 0UL ) { - scsi_task->status = ISCSI_SCSI_STATUS_GOOD; + scsi_task->status = ISCSI_SCSI_STATUS_GOOD; return ISCSI_SCSI_TASK_RUN_COMPLETE; } @@ -6336,11 +6336,11 @@ int iscsi_scsi_emu_primary_inquiry_callback(uint8_t *key UNUSED, const size_t ke iscsi_scsi_vpd_scsi_port_design_dec_inquiry_data_packet *vpd_scsi_port_design_desc_inquiry_data_pkt = port_report_fill->port_entry; - vpd_scsi_port_design_desc_inquiry_data_pkt->reserved = 0U; + vpd_scsi_port_design_desc_inquiry_data_pkt->reserved = 0U; iscsi_put_be16( (uint8_t *) &vpd_scsi_port_design_desc_inquiry_data_pkt->rel_port_id, port->index ); - vpd_scsi_port_design_desc_inquiry_data_pkt->reserved2 = 0U; - vpd_scsi_port_design_desc_inquiry_data_pkt->init_port_len = 0U; - vpd_scsi_port_design_desc_inquiry_data_pkt->reserved3 = 0U; + vpd_scsi_port_design_desc_inquiry_data_pkt->reserved2 = 0U; + vpd_scsi_port_design_desc_inquiry_data_pkt->init_port_len = 0U; + vpd_scsi_port_design_desc_inquiry_data_pkt->reserved3 = 0U; iscsi_put_be16( (uint8_t *) &vpd_scsi_port_design_desc_inquiry_data_pkt->target_desc_len, (uint16_t) (len - sizeof(struct iscsi_scsi_vpd_scsi_port_design_dec_inquiry_data_packet)) ); iscsi_scsi_vpd_scsi_target_port_design_dec_inquiry_data_packet *vpd_scsi_target_port_design_desc_inquiry_data_pkt = vpd_scsi_port_design_desc_inquiry_data_pkt->target_desc; @@ -8684,8 +8684,8 @@ iscsi_target_node *iscsi_target_node_create(uint8_t *name, const uint8_t *alias, target->flags = flags; target->header_digest = header_digest; target->data_digest = data_digest; - target->chap_group = chap_group; atomic_init( &target->active_conns, 0UL ); + target->chap_group = chap_group; return target; } @@ -8768,7 +8768,7 @@ static bool iscsi_target_node_iscsi_name_allowed(iscsi_target_node *target, cons iscsi_portal_group *portal_group = NULL; const int rc = iscsi_hashmap_get( iscsi_globvec->portal_groups, (uint8_t *) &target->pg_tag, sizeof(target->pg_tag), (uint8_t **) &portal_group ); - if ( (portal_group == NULL) || (portal_group->flags & ISCSI_PORTAL_GROUP_FLAGS_PRIVATE) != 0 ) + if ( (rc < 0) || (portal_group == NULL) || (portal_group->flags & ISCSI_PORTAL_GROUP_FLAGS_PRIVATE) != 0 ) return false; return (iscsi_target_node_check_name( iqn ) >= 0); @@ -8871,7 +8871,7 @@ int iscsi_target_node_portals_send_callback(uint8_t *key UNUSED, const size_t ke uint8_t *tmp_buf; if ( len > target_send->tmp_len ) { - target_send->tmp_len = iscsi_align_pow2_ceil((len + len)); + target_send->tmp_len = iscsi_align_pow2_ceil( (len + len) ); tmp_buf = realloc( target_send->tmp_buf, target_send->tmp_len ); @@ -8920,7 +8920,7 @@ static uint32_t iscsi_target_node_portals_send(iscsi_target_node *target, iscsi_ iscsi_portal_group *portal_group = NULL; const int rc = iscsi_hashmap_get( iscsi_globvec->portal_groups, (uint8_t *) &target->pg_tag, sizeof(target->pg_tag), (uint8_t **) &portal_group ); - if ( (portal_group == NULL) || (portal_group->flags & ISCSI_PORTAL_GROUP_FLAGS_PRIVATE) != 0 ) + if ( (rc < 0) || (portal_group == NULL) || (portal_group->flags & ISCSI_PORTAL_GROUP_FLAGS_PRIVATE) != 0 ) return target_send->pos; iscsi_hashmap_iterate( portal_group->portals, iscsi_target_node_portals_send_callback, (uint8_t *) target_send ); @@ -8972,7 +8972,7 @@ int iscsi_target_node_send_callback(uint8_t *key UNUSED, const size_t key_size U uint8_t *tmp_buf; if ( len > target_send->tmp_len ) { - target_send->tmp_len = iscsi_align_pow2_ceil((len + len)); + target_send->tmp_len = iscsi_align_pow2_ceil( (len + len) ); tmp_buf = realloc( target_send->tmp_buf, target_send->tmp_len ); @@ -9039,11 +9039,11 @@ int32_t iscsi_target_node_send(iscsi_connection *conn, uint8_t *dst_iqn, uint8_t iscsi_target_node_send_name target_send = {conn, ((strcasecmp( (char *) dst_iqn, "ALL" ) != 0) ? dst_iqn : NULL), src_iqn, NULL, buf, pos, len, 0UL, conn->target_send_total_size, false}; - pthread_rwlock_rdlock( &iscsi_globvec->target_nodes_rwlock ); pthread_rwlock_rdlock( &iscsi_globvec->portal_groups_rwlock ); + pthread_rwlock_rdlock( &iscsi_globvec->target_nodes_rwlock ); iscsi_hashmap_iterate( iscsi_globvec->target_nodes, iscsi_target_node_send_callback, (uint8_t *) &target_send ); - pthread_rwlock_unlock( &iscsi_globvec->portal_groups_rwlock ); pthread_rwlock_unlock( &iscsi_globvec->target_nodes_rwlock ); + pthread_rwlock_unlock( &iscsi_globvec->portal_groups_rwlock ); if ( target_send.tmp_buf != NULL ) free( target_send.tmp_buf ); @@ -9068,8 +9068,8 @@ int32_t iscsi_target_node_send(iscsi_connection *conn, uint8_t *dst_iqn, uint8_t */ uint64_t iscsi_target_node_wwn_get(const uint8_t *name) { - uint64_t value = 0ULL; - int i = 0; + uint64_t value = 0ULL; + int i = 0; while ( name[i] != '\0' ) { value = (value * 131ULL) + name[i++]; @@ -9113,8 +9113,8 @@ dnbd3_image_t *iscsi_target_node_image_get(uint8_t *iqn) if ( image_rev != NULL ) image_name = image_rev; - image_rev = tmp; - tmp = (uint8_t *) strchr( (char *) tmp, ':' ); + image_rev = tmp; + tmp = (uint8_t *) strchr( (char *) tmp, ':' ); } if ( image_rev == NULL ) @@ -9608,11 +9608,11 @@ iscsi_session *iscsi_session_create(iscsi_connection *conn, iscsi_target_node *t session->target = target; session->isid = 0ULL; session->tsih = 0ULL; - session->queue_depth = 0U; session->type = type; atomic_init( &session->exp_cmd_sn, 0UL ); atomic_init( &session->max_cmd_sn, 0UL ); session->current_text_init_task_tag = 0xFFFFFFFFUL; + session->queue_depth = 0U; int rc = iscsi_session_init_key_value_pairs( session->key_value_pairs ); rc |= iscsi_update_int_key_value_pair( session->key_value_pairs, (uint8_t *) ISCSI_LOGIN_AUTH_SESSION_TEXT_KEY_MAX_CONNECTIONS, session->max_conns ); @@ -10374,7 +10374,7 @@ static uint8_t *iscsi_negotiate_key_value_pair_list(const iscsi_key_value_pair * size_t val_len = ((value != NULL) ? (size_t) (value - old_value) : strlen( (char *) old_value )); for ( ;; ) { - const size_t len = strlen( (char *) list ); + const size_t len = strlen( (char *) list ); if ( (val_len == len) && (strncasecmp( (char *) list, (char *) old_value, len ) == 0) ) return list; @@ -11077,7 +11077,7 @@ static void iscsi_connection_pdu_login_ok_complete(uint8_t *user_data) */ static int iscsi_connection_pdu_login_response_init(iscsi_pdu *login_response_pdu, const iscsi_pdu *pdu) { - iscsi_login_req_packet *login_req_pkt = (iscsi_login_req_packet *) pdu->bhs_pkt; + iscsi_login_req_packet *login_req_pkt = (iscsi_login_req_packet *) pdu->bhs_pkt; iscsi_login_response_packet *login_response_pkt = (iscsi_login_response_packet *) login_response_pdu->bhs_pkt; login_response_pdu->ds_len = 0UL; @@ -11151,7 +11151,7 @@ int iscsi_connection_save_incoming_key_value_pairs(iscsi_connection *conn, iscsi { iscsi_login_req_packet *login_req_pkt = (iscsi_login_req_packet *) pdu->bhs_pkt; iscsi_login_response_packet *login_response_pkt = (iscsi_login_response_packet *) login_response_pdu->bhs_pkt; - const int rc = iscsi_parse_key_value_pairs( key_value_pairs, (uint8_t *) pdu->ds_cmd_data, pdu->ds_len, ((login_req_pkt->flags & ISCSI_LOGIN_REQ_FLAGS_CONTINUE) != 0), &conn->partial_pairs ); + const int rc = iscsi_parse_key_value_pairs( key_value_pairs, (uint8_t *) pdu->ds_cmd_data, pdu->ds_len, ((login_req_pkt->flags & ISCSI_LOGIN_REQ_FLAGS_CONTINUE) != 0), &conn->partial_pairs ); if ( rc < 0 ) { login_response_pkt->status_class = ISCSI_LOGIN_RESPONSE_STATUS_CLASS_CLIENT_ERR; @@ -11416,6 +11416,7 @@ static iscsi_session *iscsi_session_get_by_tsih(const uint16_t tsih) static uint16_t iscsi_session_append(iscsi_connection *conn, const uint8_t *init_port_name, const uint16_t tsih) { pthread_rwlock_rdlock( &iscsi_globvec->sessions_rwlock ); + iscsi_session *session = iscsi_session_get_by_tsih( tsih ); if ( (session == NULL) || (conn->pg_tag != session->tag) || (strcasecmp( (char *) init_port_name, (char *) iscsi_port_get_name( session->init_port ) ) != 0) || (conn->target != session->target) ) { @@ -13475,7 +13476,7 @@ static int iscsi_connection_login_session_normal(iscsi_connection *conn, iscsi_p iscsi_target_node *target = NULL; uint8_t *target_name; iscsi_login_response_packet *login_response_pkt = (iscsi_login_response_packet *) login_response_pdu->bhs_pkt; - int rc = iscsi_get_key_value_pair( key_value_pairs, (uint8_t *) ISCSI_LOGIN_AUTH_SECURITY_TEXT_KEY_TARGET_NAME, &target_name ); + int rc = iscsi_get_key_value_pair( key_value_pairs, (uint8_t *) ISCSI_LOGIN_AUTH_SECURITY_TEXT_KEY_TARGET_NAME, &target_name ); if ( (rc < 0) || (target_name == NULL) ) { login_response_pkt->status_class = ISCSI_LOGIN_RESPONSE_STATUS_CLASS_CLIENT_ERR; @@ -13506,8 +13507,26 @@ static int iscsi_connection_login_session_normal(iscsi_connection *conn, iscsi_p if ((int64_t) pg_tag <= 0L ) pg_tag = (uint64_t) iscsi_config_get( NULL, ISCSI_GLOBALS_CONFIG_TYPE_PORTAL_GROUP_TAG ); - if ( conn->pg_tag != pg_tag ) - conn->pg_tag = pg_tag; + if ( conn->pg_tag != pg_tag ) { + pthread_rwlock_rdlock( &iscsi_globvec->portal_groups_rwlock ); + + iscsi_portal_group *portal_group = NULL; + rc = iscsi_hashmap_get( iscsi_globvec->portal_groups, (uint8_t *) &pg_tag, sizeof(pg_tag), (uint8_t **) &portal_group ); + + if ( portal_group != NULL ) { + iscsi_portal_group *old_portal_group = NULL; + rc = iscsi_hashmap_get( iscsi_globvec->portal_groups, (uint8_t *) &conn->pg_tag, sizeof(conn->pg_tag), (uint8_t **) &old_portal_group ); + + atomic_fetch_add_explicit( &portal_group->active_conns, 1UL, memory_order_release ); + + conn->pg_tag = pg_tag; + + if ( old_portal_group != NULL ) + atomic_fetch_sub_explicit( &old_portal_group->active_conns, 1UL, memory_order_release ); + } + + pthread_rwlock_unlock( &iscsi_globvec->portal_groups_rwlock ); + } conn->device = device; conn->target = target; @@ -13545,9 +13564,9 @@ static int iscsi_connection_login_set_info(iscsi_connection *conn, iscsi_pdu *lo if ( conn->session == NULL ) { iscsi_login_response_packet *login_response_pkt = (iscsi_login_response_packet *) login_response_pdu->bhs_pkt; - iscsi_target_node *target = conn->target; - const uint64_t isid = iscsi_connection_get_isid( &login_response_pkt->isid ); - iscsi_port *init_port = iscsi_port_create( init_port_name, isid, 0U ); + iscsi_target_node *target = conn->target; + const uint64_t isid = iscsi_connection_get_isid( &login_response_pkt->isid ); + iscsi_port *init_port = iscsi_port_create( init_port_name, isid, 0U ); if ( init_port == NULL ) { login_response_pkt->status_class = ISCSI_LOGIN_RESPONSE_STATUS_CLASS_SERVER_ERR; @@ -14108,7 +14127,7 @@ static int iscsi_connection_pdu_data_handle_text_req(iscsi_connection *conn, isc return ISCSI_CONNECT_PDU_READ_ERR_FATAL; iscsi_text_req_packet *text_req_pkt = (iscsi_text_req_packet *) pdu->bhs_pkt; - int rc = iscsi_parse_key_value_pairs( key_value_pairs, (uint8_t *) pdu->ds_cmd_data, pdu->ds_len, ((text_req_pkt->flags & ISCSI_TEXT_REQ_FLAGS_CONTINUE) != 0), &conn->text_partial_pairs ); + int rc = iscsi_parse_key_value_pairs( key_value_pairs, (uint8_t *) pdu->ds_cmd_data, pdu->ds_len, ((text_req_pkt->flags & ISCSI_TEXT_REQ_FLAGS_CONTINUE) != 0), &conn->text_partial_pairs ); if ( rc < 0 ) { iscsi_hashmap_iterate( key_value_pairs, iscsi_hashmap_key_destroy_value_callback, NULL ); @@ -15034,6 +15053,8 @@ void iscsi_connection_handle(dnbd3_client_t *client, const dnbd3_request_t *requ } } + atomic_fetch_add_explicit( &portal_group->active_conns, 1UL, memory_order_release ); + iscsi_connection_handle_add_portals add_portals = {sock, NULL, NULL, NULL, write_locked}; rc = iscsi_hashmap_iterate( iscsi_globvec->portal_groups, iscsi_connection_handle_add_portals_callback, (uint8_t *) &add_portals ); pthread_rwlock_unlock( &iscsi_globvec->portal_groups_rwlock ); @@ -15171,6 +15192,8 @@ void iscsi_connection_handle(dnbd3_client_t *client, const dnbd3_request_t *requ } } + atomic_fetch_sub_explicit( &portal_group->active_conns, 1UL, memory_order_release ); + iscsi_connection_destroy( conn ); pthread_rwlock_unlock( &iscsi_globvec_rwlock ); diff --git a/src/server/iscsi.h b/src/server/iscsi.h index 4d825f4..3e74b4e 100644 --- a/src/server/iscsi.h +++ b/src/server/iscsi.h @@ -257,15 +257,15 @@ static inline bool iscsi_is_pow2(const uint32_t value) */ static inline uint32_t iscsi_align_pow2_ceil(const uint32_t value) { - uint32_t num_value = (value - 1UL); // 1UL << (lg(value - 1UL) + 1UL) + uint32_t num_value = (value - 1UL); // 1UL << (lg(value - 1UL) + 1UL) - num_value |= (num_value >> 1UL); - num_value |= (num_value >> 2UL); - num_value |= (num_value >> 4UL); - num_value |= (num_value >> 8UL); - num_value |= (num_value >> 16UL); + num_value |= (num_value >> 1UL); + num_value |= (num_value >> 2UL); + num_value |= (num_value >> 4UL); + num_value |= (num_value >> 8UL); + num_value |= (num_value >> 16UL); - return ++num_value; + return ++num_value; } /** @@ -704,19 +704,19 @@ static inline iscsi_node *iscsi_list_peek(const iscsi_list *list) */ typedef struct iscsi_hashmap_bucket { /// Next bucket, MUST be first element. - iscsi_node node; + iscsi_node node; /// Data used as key, MUST be aligned to 8 bytes and zero padded. - uint8_t *key; + uint8_t *key; /// Size of key. - size_t key_size; + size_t key_size; /// Hash code for the key. - uint32_t hash; + uint32_t hash; /// Associate4d value to the key, NULL is allowed. - uint8_t *value; + uint8_t *value; } iscsi_hashmap_bucket; /** @@ -728,22 +728,22 @@ typedef struct iscsi_hashmap_bucket { */ typedef struct iscsi_hashmap { /// Linked list containing the hash map buckets. - iscsi_hashmap_bucket *buckets; + iscsi_hashmap_bucket *buckets; /// Doubly linked list for fast insertion. iscsi_list list; /// Last inserted unique identifier (primary key). - uint64_t last_insert_id; + uint64_t last_insert_id; /// Current bucket capacity, MUST be a power of two. uint capacity; /// Current capacity threshold triggering resize operation. - uint cap_load; + uint cap_load; - /// Current count of buckets. - uint count; + /// Current count of buckets. + uint count; } iscsi_hashmap; /** @@ -2211,37 +2211,37 @@ typedef struct __attribute__((packed)) iscsi_scsi_ds_cmd_data { /// iSCSI SCSI Basic Inquiry Data peripheral type: Direct access device. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_DIRECT 0x00 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_DIRECT 0x00 /// iSCSI SCSI Basic Inquiry Data peripheral type: Sequential access device. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_SEQ 0x01 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_SEQ 0x01 /// iSCSI SCSI Basic Inquiry Data peripheral type: Printer device. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_PRINTER 0x02 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_PRINTER 0x02 /// iSCSI SCSI Basic Inquiry Data peripheral type: Processor device. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_PROCESSOR 0x03 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_PROCESSOR 0x03 /// iSCSI SCSI Basic Inquiry Data peripheral type: Write once device. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_WORM 0x04 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_WORM 0x04 /// iSCSI SCSI Basic Inquiry Data peripheral type: Read only direct access (e.g. CD-ROM) device. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_RO_DIRECT 0x05 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_RO_DIRECT 0x05 /// iSCSI SCSI Basic Inquiry Data peripheral type: Scanner device. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_SCANNER 0x06 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_SCANNER 0x06 /// iSCSI SCSI Basic Inquiry Data peripheral type: Optical memory device. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_OPTICAL 0x07 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_OPTICAL 0x07 /// iSCSI SCSI Basic Inquiry Data peripheral type: Medium changer device. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_CHANGER 0x08 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_CHANGER 0x08 /// iSCSI SCSI Basic Inquiry Data peripheral type: Communications device. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_COMM 0x09 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_COMM 0x09 /// iSCSI SCSI Basic Inquiry Data peripheral type: Unknown or no device. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_UNKNOWN 0x1F +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_UNKNOWN 0x1F /// iSCSI SCSI Basic Inquiry Data peripheral type: First bit of the five bits. #define ISCSI_SCSI_BASIC_INQUIRY_DATA_PERIPHERAL_TYPE_FIRST_BIT 0 @@ -2370,13 +2370,13 @@ typedef struct __attribute__((packed)) iscsi_scsi_ds_cmd_data { /// iSCSI SCSI Basic Inquiry Data response data format flags: This structure complies with SCSI-1 specifications. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_RESPONSE_DATA_FMT_FLAGS_LEVEL_0 0x00 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_RESPONSE_DATA_FMT_FLAGS_LEVEL_0 0x00 /// iSCSI SCSI Basic Inquiry Data response data format flags: This structure complies with CCS pseudo specifications. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_RESPONSE_DATA_FMT_FLAGS_CCS 0x01 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_RESPONSE_DATA_FMT_FLAGS_CCS 0x01 /// iSCSI SCSI Basic Inquiry Data response data format flags: This structure complies with SCSI-2/3 specifications. -#define ISCSI_SCSI_BASIC_INQUIRY_DATA_RESPONSE_DATA_FMT_FLAGS_SCSI_2 0x02 +#define ISCSI_SCSI_BASIC_INQUIRY_DATA_RESPONSE_DATA_FMT_FLAGS_SCSI_2 0x02 /// iSCSI SCSI Basic Inquiry Data response data format flags: First bit of the four bits. #define ISCSI_SCSI_BASIC_INQUIRY_DATA_RESPONSE_DATA_FMT_FLAGS_FIRST_BIT 0 @@ -2578,37 +2578,37 @@ typedef struct __attribute__((packed)) iscsi_scsi_ext_inquiry_data_packet { /// iSCSI SCSI Vital Product Data (VPD) Page Inquiry Data peripheral type: Direct access device. -#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_DIRECT 0x00 +#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_DIRECT 0x00 /// iSCSI SCSI Vital Product Data (VPD) Page Inquiry Data peripheral type: Sequential access device. -#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_SEQ 0x01 +#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_SEQ 0x01 /// iSCSI SCSI Vital Product Data (VPD) Page Inquiry Data peripheral type: Printer device. -#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_PRINTER 0x02 +#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_PRINTER 0x02 /// iSCSI SCSI Vital Product Data (VPD) Page Inquiry Data peripheral type: Processor device. -#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_PROCESSOR 0x03 +#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_PROCESSOR 0x03 /// iSCSI SCSI Vital Product Data (VPD) Page Inquiry Data peripheral type: Write once device. -#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_WORM 0x04 +#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_WORM 0x04 /// iSCSI SCSI Vital Product Data (VPD) Page Inquiry Data peripheral type: Read only direct access (e.g. CD-ROM) device. -#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_RO_DIRECT 0x05 +#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_RO_DIRECT 0x05 /// iSCSI SCSI Vital Product Data (VPD) Page Inquiry Data peripheral type: Scanner device. -#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_SCANNER 0x06 +#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_SCANNER 0x06 /// iSCSI SCSI Vital Product Data (VPD) Page Inquiry Data peripheral type: Optical memory device. -#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_OPTICAL 0x07 +#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_OPTICAL 0x07 /// iSCSI SCSI Vital Product Data (VPD) Page Inquiry Data peripheral type: Medium changer device. -#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_CHANGER 0x08 +#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_CHANGER 0x08 /// iSCSI SCSI Vital Product Data (VPD) Page Inquiry Data peripheral type: Communications device. -#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_COMM 0x09 +#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_COMM 0x09 /// iSCSI SCSI Vital Product Data (VPD) Page Inquiry Data peripheral type: Unknown or no device. -#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_UNKNOWN 0x1F +#define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_UNKNOWN 0x1F /// iSCSI SCSI Vital Product Data (VPD) Page Inquiry Data peripheral type: First bit of the five bits. #define ISCSI_SCSI_VPD_PAGE_INQUIRY_DATA_PERIPHERAL_TYPE_FIRST_BIT 0 @@ -2932,37 +2932,37 @@ typedef struct __attribute__((packed)) iscsi_scsi_vpd_page_design_desc_logical_u /// iSCSI SCSI Vital Product Data (VPD) Page Extended Inquiry Data peripheral type: Direct access device. -#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_DIRECT 0x00 +#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_DIRECT 0x00 /// iSCSI SCSI Vital Product Data (VPD) Page Extended Inquiry Data peripheral type: Sequential access device. -#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_SEQ 0x01 +#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_SEQ 0x01 /// iSCSI SCSI Vital Product Data (VPD) Page Extended Inquiry Data peripheral type: Printer device. -#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_PRINTER 0x02 +#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_PRINTER 0x02 /// iSCSI SCSI Vital Product Data (VPD) Page Extended Inquiry Data peripheral type: Processor device. -#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_PROCESSOR 0x03 +#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_PROCESSOR 0x03 /// iSCSI SCSI Vital Product Data (VPD) Page Extended Inquiry Data peripheral type: Write once device. -#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_WORM 0x04 +#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_WORM 0x04 /// iSCSI SCSI Vital Product Data (VPD) Page Extended Inquiry Data peripheral type: Read only direct access (e.g. CD-ROM) device. -#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_RO_DIRECT 0x05 +#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_RO_DIRECT 0x05 /// iSCSI SCSI Vital Product Data (VPD) Page Extended Inquiry Data peripheral type: Scanner device. -#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_SCANNER 0x06 +#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_SCANNER 0x06 /// iSCSI SCSI Vital Product Data (VPD) Page Extended Inquiry Data peripheral type: Optical memory device. -#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_OPTICAL 0x07 +#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_OPTICAL 0x07 /// iSCSI SCSI Vital Product Data (VPD) Page Extended Inquiry Data peripheral type: Medium changer device. -#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_CHANGER 0x08 +#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_CHANGER 0x08 /// iSCSI SCSI Vital Product Data (VPD) Page Extended Inquiry Data peripheral type: Communications device. -#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_COMM 0x09 +#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_COMM 0x09 /// iSCSI SCSI Vital Product Data (VPD) Page Extended Inquiry Data peripheral type: Unknown or no device. -#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_UNKNOWN 0x1F +#define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_UNKNOWN 0x1F /// iSCSI SCSI Vital Product Data (VPD) Page Extended Inquiry Data peripheral type: First bit of the five bits. #define ISCSI_SCSI_VPD_PAGE_EXT_INQUIRY_DATA_PERIPHERAL_TYPE_FIRST_BIT 0 @@ -9880,7 +9880,7 @@ typedef struct iscsi_key_value_pair_lut_entry { */ typedef struct iscsi_key_value_pair { /// Value of the key which is stored in the hash map. - uint8_t *value; + uint8_t *value; /// NUL separated list of allowed string values. If key type is numeric: NUL separated minimum and maximum integer range. End is marked with another NUL. uint8_t *list_range; @@ -9892,7 +9892,7 @@ typedef struct iscsi_key_value_pair { int flags; /// State bit mask. - uint state_mask; + uint state_mask; } iscsi_key_value_pair; typedef struct iscsi_connection iscsi_connection; @@ -10122,10 +10122,10 @@ typedef struct iscsi_scsi_device_config { int flags; /// iHeader digest (CRC32), always MUST be 0 or 4 for now. - int header_digest; + int header_digest; /// Data digest (CRC32), always MUST be 0 or 4 for now. - int data_digest; + int data_digest; /// SCSI emulation: Device type. uint scsi_device_type; @@ -10311,13 +10311,10 @@ typedef struct iscsi_globals { uint max_sessions; /// iHeader digest (CRC32), always MUST be 0 or 4 for now. - int header_digest; + int header_digest; /// Data digest (CRC32), always MUST be 0 or 4 for now. - int data_digest; - - /// SCSI emulation: Device type. - uint scsi_device_type; + int data_digest; /// Total number of connections so far. _Atomic int connections; @@ -10357,6 +10354,9 @@ typedef struct iscsi_globals { /// SCSI emulation: Logical block size. uint32_t scsi_logical_block_size; + + /// SCSI emulation: Device type. + uint scsi_device_type; } iscsi_globals; @@ -10411,14 +10411,14 @@ typedef struct iscsi_portal_group { /// Tag value for this portal group. uint64_t tag; - /// Reference count. - int ref_count; - - /// Portal group flags. - int flags; + /// Number of active connections for this portal group. + _Atomic uint32_t active_conns; /// CHAP group id. int32_t chap_group; + + /// Portal group flags. + int flags; } iscsi_portal_group; @@ -10443,7 +10443,7 @@ typedef struct iscsi_portal_group { */ typedef struct iscsi_portal { /// Group this portal belongs to. - iscsi_portal_group *group; + iscsi_portal_group *group; /// Hostname / IP address of the portal. uint8_t *host; @@ -11136,7 +11136,7 @@ typedef struct iscsi_device { int flags; /// Number of active connections for this device. - _Atomic uint32_t active_conns; + _Atomic uint32_t active_conns; /// Protocol identifier. uint8_t protocol_id; @@ -11206,11 +11206,11 @@ typedef struct iscsi_target_node { /// Data digest size (always MUST be 0 or 4 for now). int data_digest; + /// Number of active connections for this target node. + _Atomic uint32_t active_conns; + /// CHAP group ID. int32_t chap_group; - - /// Number of active connections for this target node. - _Atomic uint32_t active_conns; } iscsi_target_node; @@ -11348,9 +11348,6 @@ typedef struct iscsi_session { /// Flags (extracted from key and value pairs). int flags; - /// Queue depth. - uint queue_depth; - /// iSCSI session type. int type; @@ -11386,6 +11383,9 @@ typedef struct iscsi_session { /// Current text Initiator Task Tag (ITT). uint32_t current_text_init_task_tag; + + /// Queue depth. + uint queue_depth; } iscsi_session; |
