Skip to main content

iscsi_client_rs/models/data/
mod.rs

1//! This module defines the structures for iSCSI Data-In and Data-Out PDUs.
2//! It includes submodules for common definitions, requests, responses, and
3//! sense data.
4
5// SPDX-License-Identifier: AGPL-3.0-or-later
6// Copyright (C) 2012-2025 Andrei Maltsev
7
8use std::collections::HashMap;
9
10use once_cell::sync::Lazy;
11
12use crate::models::data::asc_ascq_gen::ASC_ASCQ;
13
14mod asc_ascq_gen;
15/// Defines common structures and flags for iSCSI Data-In and Data-Out PDUs.
16pub mod common;
17/// Defines the structures for iSCSI SCSI Data-Out PDUs.
18pub mod request;
19/// Defines the structures for iSCSI SCSI Data-In PDUs.
20pub mod response;
21/// Defines the structures for SCSI Sense Data.
22pub mod sense_data;
23
24/// Represents an entry in the ASC/ASCQ table.
25pub struct Entry {
26    code: usize,
27    desc: &'static str,
28}
29
30impl Entry {
31    /// Looks up the description for a given ASC/ASCQ code.
32    #[inline]
33    pub fn lookup(asc: u8, ascq: u8) -> Option<&'static str> {
34        let k = ((asc as u16) << 8) | (ascq as u16);
35        ASC_ASCQ_MAP.get(&k).copied()
36    }
37}
38
39static ASC_ASCQ_MAP: Lazy<HashMap<u16, &'static str>> = Lazy::new(|| {
40    let mut m: HashMap<u16, &'static str> = HashMap::with_capacity(ASC_ASCQ.len());
41    for e in ASC_ASCQ {
42        let code = e.code as u16;
43        match m.get(&code) {
44            Some(cur) => {
45                if e.desc.len() < cur.len() {
46                    m.insert(code, e.desc);
47                }
48            },
49            None => {
50                m.insert(code, e.desc);
51            },
52        }
53    }
54    m
55});