summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Vater2025-10-21 08:55:06 +0200
committerSebastian Vater2025-10-21 08:55:06 +0200
commit1ef25857985ae0cd60a8d20fc5961c85a86edfc3 (patch)
tree19a39bc66a82d983c28aff2a127ab3af2be64892
parentFixed typo in iSCSI portal group handling and removed obselete assignment. (diff)
downloaddnbd3-1ef25857985ae0cd60a8d20fc5961c85a86edfc3.tar.gz
dnbd3-1ef25857985ae0cd60a8d20fc5961c85a86edfc3.tar.xz
dnbd3-1ef25857985ae0cd60a8d20fc5961c85a86edfc3.zip
A little iSCSI code cleanup ...
-rw-r--r--src/server/iscsi.c107
-rw-r--r--src/server/iscsi.h150
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;