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}