zenith-foundation 0.1.0

Zenith 核心基础设施:统一错误类型、FrameToken 所有权令牌、FramePool、分层资源账本、恒定时间比较
Documentation
//! 网络协议常量(单一权威来源)
//!
//! # NET-013 修复
//! 协议号与默认白名单位图的**唯一权威来源**。历史上三处独立定义互不一致:
//! - `zenith-ebpf/src/maps.rs` 的 `DEFAULT_PROTO_WHITELIST`(TCP/UDP/ICMP/ICMPv6)
//! - `zenith-ebpf/src/maps.rs` 的 `ExpectationConfig::default_allow_all()`
//!   (漏了 ICMP,仅 TCP/UDP/ICMPv6)
//! - `zenith-net/src/protocol_expectation.rs` 的 `ProtocolExpectation::default()`
//!   (仅 TCP/UDP)
//!
//! 现统一引用本模块常量,杜绝三套默认值漂移。内核侧 `bpf/include/xdp_common.h`
//! 的 `DEFAULT_PROTO_WHITELIST` 亦须与此保持一致(TCP/UDP/ICMP/ICMPv6)。

/// IP 协议号:ICMP(linux/in.h)
pub const IPPROTO_ICMP: u8 = 1;
/// IP 协议号:TCP(linux/in.h)
pub const IPPROTO_TCP: u8 = 6;
/// IP 协议号:UDP(linux/in.h)
pub const IPPROTO_UDP: u8 = 17;
/// IP 协议号:ICMPv6(linux/in6.h)
pub const IPPROTO_ICMPV6: u8 = 58;

/// 默认协议白名单位图:放行 TCP / UDP / ICMP / ICMPv6(bit N = 协议号 N)
///
/// 与内核侧 `bpf/include/xdp_common.h` 的 `DEFAULT_PROTO_WHITELIST` 严格一致。
/// 注:ICMPv6 协议号 58 超出 32 位,位图必须使用 u64。
pub const DEFAULT_PROTO_WHITELIST: u64 = (1u64 << IPPROTO_TCP)
    | (1u64 << IPPROTO_UDP)
    | (1u64 << IPPROTO_ICMP)
    | (1u64 << IPPROTO_ICMPV6);

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_default_whitelist_covers_tcp_udp_icmp_icmpv6() {
        assert_ne!(DEFAULT_PROTO_WHITELIST & (1u64 << IPPROTO_TCP), 0);
        assert_ne!(DEFAULT_PROTO_WHITELIST & (1u64 << IPPROTO_UDP), 0);
        assert_ne!(DEFAULT_PROTO_WHITELIST & (1u64 << IPPROTO_ICMP), 0);
        assert_ne!(DEFAULT_PROTO_WHITELIST & (1u64 << IPPROTO_ICMPV6), 0);
        // 未列入的协议(如 GRE=47)不在白名单
        assert_eq!(DEFAULT_PROTO_WHITELIST & (1u64 << 47u8), 0);
    }

    #[test]
    fn test_default_whitelist_exact_value() {
        let expected = (1u64 << 6) | (1u64 << 17) | (1u64 << 1) | (1u64 << 58);
        assert_eq!(DEFAULT_PROTO_WHITELIST, expected);
    }

    #[test]
    fn test_ipproto_protocol_numbers() {
        assert_eq!(IPPROTO_ICMP, 1);
        assert_eq!(IPPROTO_TCP, 6);
        assert_eq!(IPPROTO_UDP, 17);
        assert_eq!(IPPROTO_ICMPV6, 58);
    }
}