pub const NTP_SERVICE_NAME: &str = "ntp";
pub const NTP_PORT: u16 = 123;
pub const NTP_UDP_PORT: u16 = NTP_PORT;
pub const NTP_TCP_PORT: u16 = 123;
pub const NTP_FIXED_HEADER_LEN: usize = 48;
pub const NTP_TIMESTAMP_LEN: usize = 8;
pub const NTP_SHORT_FORMAT_LEN: usize = 4;
pub const NTP_REFERENCE_ID_LEN: usize = 4;
pub const NTP_EXTENSION_FIELD_HEADER_LEN: usize = 4;
pub const NTP_EXTENSION_FIELD_MIN_LEN: usize = 16;
pub const NTP_EXTENSION_FIELD_MIN_LAST_WITHOUT_MAC_LEN: usize = 28;
pub const NTP_LEGACY_MAC_KEY_ID_LEN: usize = 4;
pub const NTP_FIRST_OCTET_LI_MASK: u8 = 0b1100_0000;
pub const NTP_FIRST_OCTET_VERSION_MASK: u8 = 0b0011_1000;
pub const NTP_FIRST_OCTET_MODE_MASK: u8 = 0b0000_0111;
pub const NTP_FIRST_OCTET_LI_SHIFT: u8 = 6;
pub const NTP_FIRST_OCTET_VERSION_SHIFT: u8 = 3;
pub const NTP_FIRST_OCTET_MODE_SHIFT: u8 = 0;
pub const NTP_LI_VALUE_MASK: u8 = 0x03;
pub const NTP_VERSION_VALUE_MASK: u8 = 0x07;
pub const NTP_MODE_VALUE_MASK: u8 = 0x07;
pub const NTP_LI_NO_WARNING: u8 = 0;
pub const NTP_LI_LAST_MINUTE_61_SECONDS: u8 = 1;
pub const NTP_LI_LAST_MINUTE_59_SECONDS: u8 = 2;
pub const NTP_LI_ALARM_UNSYNCHRONIZED: u8 = 3;
pub const NTP_VERSION_MIN: u8 = 0;
pub const NTP_VERSION_1: u8 = 1;
pub const NTP_VERSION_2: u8 = 2;
pub const NTP_VERSION_3: u8 = 3;
pub const NTP_VERSION_4: u8 = 4;
pub const NTP_VERSION_CURRENT: u8 = NTP_VERSION_4;
pub const NTP_VERSION_MAX: u8 = 7;
pub const NTP_MODE_RESERVED: u8 = 0;
pub const NTP_MODE_SYMMETRIC_ACTIVE: u8 = 1;
pub const NTP_MODE_SYMMETRIC_PASSIVE: u8 = 2;
pub const NTP_MODE_CLIENT: u8 = 3;
pub const NTP_MODE_SERVER: u8 = 4;
pub const NTP_MODE_BROADCAST: u8 = 5;
pub const NTP_MODE_CONTROL: u8 = 6;
pub const NTP_MODE_PRIVATE: u8 = 7;
pub const NTP_STRATUM_UNSPECIFIED: u8 = 0;
pub const NTP_STRATUM_PRIMARY: u8 = 1;
pub const NTP_STRATUM_SECONDARY_FIRST: u8 = 2;
pub const NTP_STRATUM_SECONDARY_LAST: u8 = 15;
pub const NTP_STRATUM_UNSYNCHRONIZED: u8 = 16;
pub const NTP_STRATUM_RESERVED_FIRST: u8 = 17;
pub const NTP_STRATUM_RESERVED_LAST: u8 = u8::MAX;
pub const NTP_DEFAULT_LEAP_INDICATOR: u8 = NTP_LI_NO_WARNING;
pub const NTP_DEFAULT_VERSION: u8 = NTP_VERSION_CURRENT;
pub const NTP_DEFAULT_MODE: u8 = NTP_MODE_CLIENT;
pub const NTP_DEFAULT_STRATUM: u8 = NTP_STRATUM_UNSPECIFIED;
pub const NTP_DEFAULT_POLL: i8 = 0;
pub const NTP_DEFAULT_PRECISION: i8 = 0;
pub const NTP_DEFAULT_ROOT_DELAY: u32 = 0;
pub const NTP_DEFAULT_ROOT_DISPERSION: u32 = 0;
pub const NTP_DEFAULT_REFERENCE_ID: [u8; NTP_REFERENCE_ID_LEN] = [0; NTP_REFERENCE_ID_LEN];
pub const NTP_DEFAULT_TIMESTAMP: u64 = 0;
pub const NTP_DEFAULT_REFERENCE_TIMESTAMP: u64 = NTP_DEFAULT_TIMESTAMP;
pub const NTP_DEFAULT_ORIGIN_TIMESTAMP: u64 = NTP_DEFAULT_TIMESTAMP;
pub const NTP_DEFAULT_RECEIVE_TIMESTAMP: u64 = NTP_DEFAULT_TIMESTAMP;
pub const NTP_DEFAULT_TRANSMIT_TIMESTAMP: u64 = NTP_DEFAULT_TIMESTAMP;
pub const NTP_DEFAULT_FIRST_OCTET: u8 = (NTP_DEFAULT_LEAP_INDICATOR << NTP_FIRST_OCTET_LI_SHIFT)
| (NTP_DEFAULT_VERSION << NTP_FIRST_OCTET_VERSION_SHIFT)
| (NTP_DEFAULT_MODE << NTP_FIRST_OCTET_MODE_SHIFT);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ntp_constants_match_source_backed_lengths_and_ports() {
assert_eq!(NTP_SERVICE_NAME, "ntp");
assert_eq!(NTP_PORT, 123);
assert_eq!(NTP_UDP_PORT, NTP_PORT);
assert_eq!(NTP_TCP_PORT, 123);
assert_eq!(NTP_FIXED_HEADER_LEN, 48);
assert_eq!(NTP_TIMESTAMP_LEN, 8);
assert_eq!(NTP_SHORT_FORMAT_LEN, 4);
assert_eq!(NTP_REFERENCE_ID_LEN, 4);
assert_eq!(NTP_EXTENSION_FIELD_HEADER_LEN, 4);
assert_eq!(NTP_EXTENSION_FIELD_MIN_LEN, 16);
assert_eq!(NTP_EXTENSION_FIELD_MIN_LAST_WITHOUT_MAC_LEN, 28);
assert_eq!(NTP_LEGACY_MAC_KEY_ID_LEN, 4);
}
#[test]
fn ntp_constants_cover_first_octet_value_spaces() {
assert_eq!(NTP_FIRST_OCTET_LI_MASK, 0xc0);
assert_eq!(NTP_FIRST_OCTET_VERSION_MASK, 0x38);
assert_eq!(NTP_FIRST_OCTET_MODE_MASK, 0x07);
assert_eq!(NTP_FIRST_OCTET_LI_SHIFT, 6);
assert_eq!(NTP_FIRST_OCTET_VERSION_SHIFT, 3);
assert_eq!(NTP_FIRST_OCTET_MODE_SHIFT, 0);
assert_eq!(NTP_LI_VALUE_MASK, 0x03);
assert_eq!(NTP_VERSION_VALUE_MASK, 0x07);
assert_eq!(NTP_MODE_VALUE_MASK, 0x07);
assert_eq!(NTP_LI_NO_WARNING, 0);
assert_eq!(NTP_LI_LAST_MINUTE_61_SECONDS, 1);
assert_eq!(NTP_LI_LAST_MINUTE_59_SECONDS, 2);
assert_eq!(NTP_LI_ALARM_UNSYNCHRONIZED, 3);
assert_eq!(NTP_VERSION_MIN, 0);
assert_eq!(NTP_VERSION_1, 1);
assert_eq!(NTP_VERSION_2, 2);
assert_eq!(NTP_VERSION_3, 3);
assert_eq!(NTP_VERSION_4, 4);
assert_eq!(NTP_VERSION_CURRENT, NTP_VERSION_4);
assert_eq!(NTP_VERSION_MAX, 7);
assert_eq!(NTP_MODE_RESERVED, 0);
assert_eq!(NTP_MODE_SYMMETRIC_ACTIVE, 1);
assert_eq!(NTP_MODE_SYMMETRIC_PASSIVE, 2);
assert_eq!(NTP_MODE_CLIENT, 3);
assert_eq!(NTP_MODE_SERVER, 4);
assert_eq!(NTP_MODE_BROADCAST, 5);
assert_eq!(NTP_MODE_CONTROL, 6);
assert_eq!(NTP_MODE_PRIVATE, 7);
}
#[test]
fn ntp_constants_default_to_documentation_safe_client_shape() {
assert_eq!(NTP_STRATUM_UNSPECIFIED, 0);
assert_eq!(NTP_STRATUM_PRIMARY, 1);
assert_eq!(NTP_STRATUM_SECONDARY_FIRST, 2);
assert_eq!(NTP_STRATUM_SECONDARY_LAST, 15);
assert_eq!(NTP_STRATUM_UNSYNCHRONIZED, 16);
assert_eq!(NTP_STRATUM_RESERVED_FIRST, 17);
assert_eq!(NTP_STRATUM_RESERVED_LAST, 255);
assert_eq!(NTP_DEFAULT_LEAP_INDICATOR, NTP_LI_NO_WARNING);
assert_eq!(NTP_DEFAULT_VERSION, NTP_VERSION_CURRENT);
assert_eq!(NTP_DEFAULT_MODE, NTP_MODE_CLIENT);
assert_eq!(NTP_DEFAULT_STRATUM, NTP_STRATUM_UNSPECIFIED);
assert_eq!(NTP_DEFAULT_POLL, 0);
assert_eq!(NTP_DEFAULT_PRECISION, 0);
assert_eq!(NTP_DEFAULT_ROOT_DELAY, 0);
assert_eq!(NTP_DEFAULT_ROOT_DISPERSION, 0);
assert_eq!(NTP_DEFAULT_REFERENCE_ID, [0; 4]);
assert_eq!(NTP_DEFAULT_TIMESTAMP, 0);
assert_eq!(NTP_DEFAULT_REFERENCE_TIMESTAMP, 0);
assert_eq!(NTP_DEFAULT_ORIGIN_TIMESTAMP, 0);
assert_eq!(NTP_DEFAULT_RECEIVE_TIMESTAMP, 0);
assert_eq!(NTP_DEFAULT_TRANSMIT_TIMESTAMP, 0);
assert_eq!(NTP_DEFAULT_FIRST_OCTET, 0x23);
}
}