use strum::FromRepr;
pub const PROTO_VERSION: u8 = 2;
pub const P2P_MAGIC: u32 = 0x3250_3053;
pub const SUB_MAGIC: u32 = 0x3242_3053;
pub const PROFILE_MAGIC: u32 = 0x3143_3053;
pub const MANIFEST_MAGIC: [u8; 4] = *b"S0M2";
pub const ALPN_P2P: &[u8] = b"s0/p2p/1";
pub const PROFILE_SIG_DOMAIN: &[u8] = b"s0/profile/v1";
pub const MAX_NAME_CHARS: usize = 64;
pub const MAX_EMAIL_LEN: usize = 128;
pub const MAX_URL_LEN: usize = 256;
pub const MAX_BIO_CHARS: usize = 256;
pub const U15_MAX: u16 = 0x7FFF;
pub const FLAG_DELETE: u8 = 1 << 0;
pub const FLAG_PARTIAL: u8 = 1 << 1;
pub const FLAG_RANGE: u8 = 1 << 2;
pub const FLAG_SEED: u8 = 1 << 3;
pub const FLAG_RW: u8 = 1 << 4;
pub const HAVE_ALL_ONES: u32 = 0xFFFF_FFFF;
pub const DATA_HDR_LEN: usize = 20;
pub const DEFAULT_SEG_PAYLOAD: usize = 1380;
pub const MAX_UDP_PKT: usize = 1500;
pub const PKT_NACK: u8 = 0x81;
pub const PKT_ACK: u8 = 0x82;
pub const PKT_PUNCH: u8 = 0x83;
pub const CDC_MIN_CHUNK: u32 = 16 * 1024;
pub const CDC_AVG_CHUNK: u32 = 32 * 1024;
pub const CDC_MAX_CHUNK: u32 = 64 * 1024;
pub const DATA_FLAG_ZSTD: u16 = 0x8000;
pub const DIR_MAGIC: u32 = u32::from_le_bytes(*b"S0DM");
pub const DIR_ACK_MAGIC: u32 = u32::from_le_bytes(*b"S0DA");
pub const FIN_MAGIC: u32 = u32::from_le_bytes(*b"S0BF");
pub const PROBE_MAGIC: u32 = u32::from_le_bytes(*b"S0PB");
pub const PROBE_ACK_MAGIC: u32 = u32::from_le_bytes(*b"S0PA");
pub const ADDR_MAGIC: u32 = u32::from_le_bytes(*b"S0AD");
pub const V6_PREFER_MARGIN_US: u64 = 5_000;
pub const SESSION_HLEN: usize = 12;
pub const DATA_HLEN: usize = 20;
pub const PROBE_LEN: usize = 12;
pub const DIR_HDR_LEN: usize = 12;
pub const DIR_ACK_HDR_LEN: usize = 8;
pub const MAX_DATAGRAM: usize = 2048;
pub const DEFAULT_PKT: usize = 1400;
pub const MIN_PKT: usize = 1024;
pub const MAX_BLOCK: usize = 128 * 1024;
pub const MAX_CNT: usize = 96;
pub const WINDOW_BLOCKS: u32 = 512;
pub const PHASE: u8 = 1;
pub const RETX: u8 = 1 << 1;
pub const ZSTD: u8 = 1 << 2;
pub const PAR: u8 = 1 << 3;
pub const R_SHIFT: u8 = 4;
pub const R_MASK: u8 = 0xF0;
pub const MANIFEST_CHUNK: usize = 1200;
pub const MANIFEST_ZSTD: u32 = 1 << 31;
pub const HAVE_ALL_ONES_BIT: u32 = 1 << 30;
pub const MANIFEST_DELETE: u32 = 1 << 31;
pub const MANIFEST_PARTIAL: u32 = 1 << 30;
pub const TOMBSTONE_NCHUNKS: u16 = 0xFFFE;
pub const ZSTD_DEFAULT_LEVEL: i32 = 3;
pub const ACK_DELAY_US: u64 = 8;
pub const MAX_RANGES: usize = 255;
pub const ACK_BLOCKS: usize = 8;
pub const ACK_SCAN_BLOCKS: u32 = 64;
pub const MIN_TACK_US: u64 = 2_000;
pub const MAX_TACK_US: u64 = 20_000;
pub const MIN_RTO_US: u64 = 5_000;
pub const MAX_RTO_US: u64 = 2_000_000;
pub const MAX_REO_US: u64 = 250_000;
pub const DEFAULT_AMP_FACTOR: u64 = 3;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[repr(u8)]
pub enum Role {
Send = 0,
Recv = 1,
}
impl Role {
#[inline]
pub const fn code(self) -> u8 {
self as u8
}
#[inline]
pub const fn as_str(self) -> &'static str {
match self {
Self::Send => "send",
Self::Recv => "recv",
}
}
}
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, FromRepr)]
pub enum Op {
Pull = 1,
Push = 2,
Stat = 3,
Sub = 4,
Have = 5,
GroupJoin = 6,
}
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, FromRepr)]
pub enum Status {
Ok = 0,
Unauth = 1,
Forbidden = 2,
NotFound = 3,
Conflict = 4,
BadReq = 5,
}
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, FromRepr)]
pub enum AttrKey {
Name = 1,
Email = 2,
Url = 3,
Region = 4,
Bio = 5,
}
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, FromRepr)]
pub enum Perm {
Ro = 1,
Rw = 2,
}