blkar_lib/
sbx_specs.rs

1#![allow(dead_code)]
2pub const SBX_LARGEST_BLOCK_SIZE: usize = 4096;
3
4pub const SBX_FIRST_DATA_SEQ_NUM: u32 = 1;
5
6pub const SBX_LAST_SEQ_NUM: u32 = u32::max_value();
7
8pub const SBX_METADATA_BLOCK_COUNT: usize = 1;
9
10pub const SBX_SCAN_BLOCK_SIZE: usize = 128;
11
12pub const SBX_FILE_UID_LEN: usize = common_params::FILE_UID_LEN;
13
14pub const SBX_SIGNATURE: &[u8] = common_params::SIGNATURE;
15
16pub const SBX_HEADER_SIZE: usize = common_params::HEADER_SIZE;
17
18pub const SBX_MAX_DATA_BLOCK_COUNT: u32 = u32::max_value();
19
20pub const SBX_MAX_BURST_ERR_RESISTANCE: usize = 1000;
21
22#[derive(Clone, Copy, Debug, PartialEq)]
23pub enum Version {
24    V1,
25    V2,
26    V3,
27    V17,
28    V18,
29    V19,
30}
31
32mod common_params {
33    use std::u32;
34
35    pub const FILE_UID_LEN: usize = 6;
36    pub const SIGNATURE: &[u8] = b"SBx";
37    pub const HEADER_SIZE: usize = 16;
38    pub const MAX_BLOCK_NUM: u64 = u32::MAX as u64;
39}
40
41mod params_for_v1 {
42    use super::common_params;
43
44    pub const BLOCK_SIZE: usize = 512;
45    pub const DATA_SIZE: usize = BLOCK_SIZE - common_params::HEADER_SIZE;
46}
47
48mod params_for_v2 {
49    use super::common_params;
50
51    pub const BLOCK_SIZE: usize = 128;
52    pub const DATA_SIZE: usize = BLOCK_SIZE - common_params::HEADER_SIZE;
53}
54
55mod params_for_v3 {
56    use super::common_params;
57
58    pub const BLOCK_SIZE: usize = 4096;
59    pub const DATA_SIZE: usize = BLOCK_SIZE - common_params::HEADER_SIZE;
60}
61
62mod params_for_v17 {
63    use super::params_for_v1;
64
65    pub const BLOCK_SIZE: usize = params_for_v1::BLOCK_SIZE;
66    pub const DATA_SIZE: usize = params_for_v1::DATA_SIZE;
67}
68
69mod params_for_v18 {
70    use super::params_for_v2;
71
72    pub const BLOCK_SIZE: usize = params_for_v2::BLOCK_SIZE;
73    pub const DATA_SIZE: usize = params_for_v2::DATA_SIZE;
74}
75
76mod params_for_v19 {
77    use super::params_for_v3;
78
79    pub const BLOCK_SIZE: usize = params_for_v3::BLOCK_SIZE;
80    pub const DATA_SIZE: usize = params_for_v3::DATA_SIZE;
81}
82
83pub fn ver_to_usize(version: Version) -> usize {
84    use self::Version::*;
85    match version {
86        V1 => 1,
87        V2 => 2,
88        V3 => 3,
89        V17 => 17,
90        V18 => 18,
91        V19 => 19,
92    }
93}
94
95pub fn string_to_ver(string: &str) -> Result<Version, ()> {
96    use self::Version::*;
97    match string {
98        "1" => Ok(V1),
99        "2" => Ok(V2),
100        "3" => Ok(V3),
101        "17" => Ok(V17),
102        "18" => Ok(V18),
103        "19" => Ok(V19),
104        _ => Err(()),
105    }
106}
107
108pub fn ver_to_block_size(version: Version) -> usize {
109    use self::Version::*;
110    match version {
111        V1 => params_for_v1::BLOCK_SIZE,
112        V2 => params_for_v2::BLOCK_SIZE,
113        V3 => params_for_v3::BLOCK_SIZE,
114        V17 => params_for_v17::BLOCK_SIZE,
115        V18 => params_for_v18::BLOCK_SIZE,
116        V19 => params_for_v19::BLOCK_SIZE,
117    }
118}
119
120pub fn ver_to_data_size(version: Version) -> usize {
121    use self::Version::*;
122    match version {
123        V1 => params_for_v1::DATA_SIZE,
124        V2 => params_for_v2::DATA_SIZE,
125        V3 => params_for_v3::DATA_SIZE,
126        V17 => params_for_v17::DATA_SIZE,
127        V18 => params_for_v18::DATA_SIZE,
128        V19 => params_for_v19::DATA_SIZE,
129    }
130}
131
132pub fn ver_uses_rs(version: Version) -> bool {
133    use self::Version::*;
134    match version {
135        V1 | V2 | V3 => false,
136        V17 | V18 | V19 => true,
137    }
138}
139
140pub fn ver_forces_meta_enabled(version: Version) -> bool {
141    use self::Version::*;
142    match version {
143        V1 | V2 | V3 => false,
144        V17 | V18 | V19 => true,
145    }
146}
147
148pub fn ver_to_max_block_set_count(
149    version: Version,
150    data_par_burst: Option<(usize, usize, usize)>,
151) -> Option<u32> {
152    if ver_uses_rs(version) {
153        let (data, parity, _) = data_par_burst.unwrap();
154
155        let block_set_size = (data + parity) as u32;
156
157        Some(SBX_MAX_DATA_BLOCK_COUNT / block_set_size)
158    } else {
159        assert!(data_par_burst == None);
160
161        None
162    }
163}
164
165pub fn ver_to_last_data_seq_num_exc_parity(
166    version: Version,
167    data_par_burst: Option<(usize, usize, usize)>,
168) -> u32 {
169    if ver_uses_rs(version) {
170        let (data, parity, _) = data_par_burst.unwrap();
171
172        let block_set_size = data + parity;
173        let max_block_set_count = ver_to_max_block_set_count(version, data_par_burst).unwrap();
174
175        max_block_set_count * block_set_size as u32 - parity as u32
176    } else {
177        assert!(data_par_burst == None);
178
179        SBX_LAST_SEQ_NUM
180    }
181}
182
183pub fn ver_to_max_data_file_size(
184    version: Version,
185    data_par_burst: Option<(usize, usize, usize)>,
186) -> u64 {
187    let data_size = ver_to_data_size(version) as u64;
188
189    if ver_uses_rs(version) {
190        let (data, _, _) = data_par_burst.unwrap();
191
192        let max_block_set_count =
193            ver_to_max_block_set_count(version, data_par_burst).unwrap() as u64;
194
195        max_block_set_count * data as u64 * data_size
196    } else {
197        assert!(data_par_burst == None);
198
199        SBX_MAX_DATA_BLOCK_COUNT as u64 * data_size
200    }
201}