Skip to main content

zenith_foundation/
net.rs

1//! 网络协议常量(单一权威来源)
2//!
3//! # NET-013 修复
4//! 协议号与默认白名单位图的**唯一权威来源**。历史上三处独立定义互不一致:
5//! - `zenith-ebpf/src/maps.rs` 的 `DEFAULT_PROTO_WHITELIST`(TCP/UDP/ICMP/ICMPv6)
6//! - `zenith-ebpf/src/maps.rs` 的 `ExpectationConfig::default_allow_all()`
7//!   (漏了 ICMP,仅 TCP/UDP/ICMPv6)
8//! - `zenith-net/src/protocol_expectation.rs` 的 `ProtocolExpectation::default()`
9//!   (仅 TCP/UDP)
10//!
11//! 现统一引用本模块常量,杜绝三套默认值漂移。内核侧 `bpf/include/xdp_common.h`
12//! 的 `DEFAULT_PROTO_WHITELIST` 亦须与此保持一致(TCP/UDP/ICMP/ICMPv6)。
13
14/// IP 协议号:ICMP(linux/in.h)
15pub const IPPROTO_ICMP: u8 = 1;
16/// IP 协议号:TCP(linux/in.h)
17pub const IPPROTO_TCP: u8 = 6;
18/// IP 协议号:UDP(linux/in.h)
19pub const IPPROTO_UDP: u8 = 17;
20/// IP 协议号:ICMPv6(linux/in6.h)
21pub const IPPROTO_ICMPV6: u8 = 58;
22
23/// 默认协议白名单位图:放行 TCP / UDP / ICMP / ICMPv6(bit N = 协议号 N)
24///
25/// 与内核侧 `bpf/include/xdp_common.h` 的 `DEFAULT_PROTO_WHITELIST` 严格一致。
26/// 注:ICMPv6 协议号 58 超出 32 位,位图必须使用 u64。
27pub const DEFAULT_PROTO_WHITELIST: u64 = (1u64 << IPPROTO_TCP)
28    | (1u64 << IPPROTO_UDP)
29    | (1u64 << IPPROTO_ICMP)
30    | (1u64 << IPPROTO_ICMPV6);
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn test_default_whitelist_covers_tcp_udp_icmp_icmpv6() {
38        assert_ne!(DEFAULT_PROTO_WHITELIST & (1u64 << IPPROTO_TCP), 0);
39        assert_ne!(DEFAULT_PROTO_WHITELIST & (1u64 << IPPROTO_UDP), 0);
40        assert_ne!(DEFAULT_PROTO_WHITELIST & (1u64 << IPPROTO_ICMP), 0);
41        assert_ne!(DEFAULT_PROTO_WHITELIST & (1u64 << IPPROTO_ICMPV6), 0);
42        // 未列入的协议(如 GRE=47)不在白名单
43        assert_eq!(DEFAULT_PROTO_WHITELIST & (1u64 << 47u8), 0);
44    }
45
46    #[test]
47    fn test_default_whitelist_exact_value() {
48        let expected = (1u64 << 6) | (1u64 << 17) | (1u64 << 1) | (1u64 << 58);
49        assert_eq!(DEFAULT_PROTO_WHITELIST, expected);
50    }
51
52    #[test]
53    fn test_ipproto_protocol_numbers() {
54        assert_eq!(IPPROTO_ICMP, 1);
55        assert_eq!(IPPROTO_TCP, 6);
56        assert_eq!(IPPROTO_UDP, 17);
57        assert_eq!(IPPROTO_ICMPV6, 58);
58    }
59}