pub const PROTOCOL_VERSION: u32 = 1;
pub use crate::broker::FRAMING_VERSION_V1;
pub const CONTROL_PAYLOAD_PROTOCOL: u32 = 0x00;
pub const ADMIN_PAYLOAD_PROTOCOL: u32 = 0xAD01;
pub const BACKEND_HANDLE_PROBE_PAYLOAD_PROTOCOL: u32 = 0xB232;
pub const HANDOFF_PAYLOAD_PROTOCOL: u32 = 0xD0FF;
pub const CONSUMER_PAYLOAD_PROTOCOL_MIN: u32 = 0x7000;
pub const CONSUMER_PAYLOAD_PROTOCOL_MAX: u32 = 0x7EFF;
pub const PRIVATE_USE_PAYLOAD_PROTOCOL_MIN: u32 = 0xF000;
pub const PRIVATE_USE_PAYLOAD_PROTOCOL_MAX: u32 = 0xFFFF;
pub const ZCCACHE_PAYLOAD_PROTOCOL: u32 = 0x7A63;
pub const CLUD_PAYLOAD_PROTOCOL: u32 = 0x7C4C;
pub const FBUILD_PAYLOAD_PROTOCOL: u32 = 0x7EB1;
pub const FIRST_PARTY_PAYLOAD_PROTOCOLS: [u32; 4] = [
CONTROL_PAYLOAD_PROTOCOL,
ADMIN_PAYLOAD_PROTOCOL,
BACKEND_HANDLE_PROBE_PAYLOAD_PROTOCOL,
HANDOFF_PAYLOAD_PROTOCOL,
];
pub const fn is_first_party(id: u32) -> bool {
let mut index = 0;
while index < FIRST_PARTY_PAYLOAD_PROTOCOLS.len() {
if FIRST_PARTY_PAYLOAD_PROTOCOLS[index] == id {
return true;
}
index += 1;
}
false
}
pub const fn is_registered_consumer_id(id: u32) -> bool {
id >= CONSUMER_PAYLOAD_PROTOCOL_MIN && id <= CONSUMER_PAYLOAD_PROTOCOL_MAX
}
pub const fn is_private_use_id(id: u32) -> bool {
id >= PRIVATE_USE_PAYLOAD_PROTOCOL_MIN && id <= PRIVATE_USE_PAYLOAD_PROTOCOL_MAX
}
#[macro_export]
macro_rules! register_payload_protocol {
($(#[$meta:meta])* $vis:vis const $name:ident: u32 = $value:expr;) => {
$(#[$meta])*
$vis const $name: u32 = $value;
const _: () = {
assert!(
!$crate::broker::protocol::registry::is_first_party($name),
concat!(
stringify!($name),
" collides with a first-party running-process payload protocol",
),
);
assert!(
$crate::broker::protocol::registry::is_registered_consumer_id($name)
|| $crate::broker::protocol::registry::is_private_use_id($name),
concat!(
stringify!($name),
" must lie in the registered-consumer range (0x7000..=0x7EFF) \
or the private-use range (0xF000..=0xFFFF)",
),
);
};
};
}
#[cfg(test)]
mod tests {
use super::{
ADMIN_PAYLOAD_PROTOCOL, BACKEND_HANDLE_PROBE_PAYLOAD_PROTOCOL, CONTROL_PAYLOAD_PROTOCOL,
HANDOFF_PAYLOAD_PROTOCOL, PROTOCOL_VERSION,
};
#[test]
fn payload_protocol_ids_are_pairwise_distinct() {
let registered: [(u32, &str); 4] = [
(CONTROL_PAYLOAD_PROTOCOL, "CONTROL_PAYLOAD_PROTOCOL"),
(ADMIN_PAYLOAD_PROTOCOL, "ADMIN_PAYLOAD_PROTOCOL"),
(
BACKEND_HANDLE_PROBE_PAYLOAD_PROTOCOL,
"BACKEND_HANDLE_PROBE_PAYLOAD_PROTOCOL",
),
(HANDOFF_PAYLOAD_PROTOCOL, "HANDOFF_PAYLOAD_PROTOCOL"),
];
for (left_index, (left_id, left_name)) in registered.iter().enumerate() {
for (right_id, right_name) in ®istered[left_index + 1..] {
assert_ne!(
left_id, right_id,
"{left_name} and {right_name} share payload-protocol id {left_id:#06X}"
);
}
}
}
#[test]
fn frozen_v1_wire_values() {
assert_eq!(PROTOCOL_VERSION, 1);
assert_eq!(CONTROL_PAYLOAD_PROTOCOL, 0x00);
assert_eq!(ADMIN_PAYLOAD_PROTOCOL, 0xAD01);
assert_eq!(BACKEND_HANDLE_PROBE_PAYLOAD_PROTOCOL, 0xB232);
assert_eq!(HANDOFF_PAYLOAD_PROTOCOL, 0xD0FF);
assert_eq!(u32::from(crate::broker::FRAMING_VERSION_V1), 1);
}
#[test]
fn frozen_consumer_registry_values() {
use super::{
is_first_party, is_private_use_id, is_registered_consumer_id, CLUD_PAYLOAD_PROTOCOL,
CONSUMER_PAYLOAD_PROTOCOL_MAX, CONSUMER_PAYLOAD_PROTOCOL_MIN, FBUILD_PAYLOAD_PROTOCOL,
PRIVATE_USE_PAYLOAD_PROTOCOL_MAX, PRIVATE_USE_PAYLOAD_PROTOCOL_MIN,
ZCCACHE_PAYLOAD_PROTOCOL,
};
assert_eq!(CONSUMER_PAYLOAD_PROTOCOL_MIN, 0x7000);
assert_eq!(CONSUMER_PAYLOAD_PROTOCOL_MAX, 0x7EFF);
assert_eq!(PRIVATE_USE_PAYLOAD_PROTOCOL_MIN, 0xF000);
assert_eq!(PRIVATE_USE_PAYLOAD_PROTOCOL_MAX, 0xFFFF);
assert_eq!(ZCCACHE_PAYLOAD_PROTOCOL, 0x7A63);
assert_eq!(CLUD_PAYLOAD_PROTOCOL, 0x7C4C);
assert_eq!(FBUILD_PAYLOAD_PROTOCOL, 0x7EB1);
assert_ne!(CLUD_PAYLOAD_PROTOCOL, ZCCACHE_PAYLOAD_PROTOCOL);
assert_ne!(FBUILD_PAYLOAD_PROTOCOL, ZCCACHE_PAYLOAD_PROTOCOL);
assert_ne!(FBUILD_PAYLOAD_PROTOCOL, CLUD_PAYLOAD_PROTOCOL);
assert!(is_registered_consumer_id(ZCCACHE_PAYLOAD_PROTOCOL));
assert!(!is_first_party(ZCCACHE_PAYLOAD_PROTOCOL));
assert!(!is_private_use_id(ZCCACHE_PAYLOAD_PROTOCOL));
assert!(is_registered_consumer_id(CLUD_PAYLOAD_PROTOCOL));
assert!(!is_first_party(CLUD_PAYLOAD_PROTOCOL));
assert!(!is_private_use_id(CLUD_PAYLOAD_PROTOCOL));
assert!(is_registered_consumer_id(FBUILD_PAYLOAD_PROTOCOL));
assert!(!is_first_party(FBUILD_PAYLOAD_PROTOCOL));
assert!(!is_private_use_id(FBUILD_PAYLOAD_PROTOCOL));
for id in super::FIRST_PARTY_PAYLOAD_PROTOCOLS {
assert!(is_first_party(id));
assert!(!is_registered_consumer_id(id));
assert!(!is_private_use_id(id));
}
}
crate::register_payload_protocol! {
const MACRO_CONSUMER_RANGE_EXAMPLE: u32 = 0x7001;
}
crate::register_payload_protocol! {
const MACRO_PRIVATE_RANGE_EXAMPLE: u32 = 0xF00D;
}
#[test]
fn register_macro_defines_usable_constants() {
assert_eq!(MACRO_CONSUMER_RANGE_EXAMPLE, 0x7001);
assert_eq!(MACRO_PRIVATE_RANGE_EXAMPLE, 0xF00D);
}
}