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