zenith-net 0.1.0

Zenith 网络地址与传输层抽象:L2-L4 协议解析、TCP/UDP/QUIC 状态机、来源准入引擎、单队列 Worker 数据面循环
//! 传输层协议处理
//!
//! 本模块提供完整的 TCP/UDP/QUIC 传输层实现:
//! - TCP 状态机(全状态实现:SYN-SENT, SYN-RECEIVED, ESTABLISHED, FIN-WAIT, CLOSE-WAIT, TIME-WAIT 等)
//! - TCP 连接表(预分配、单 Owner、零堆分配、O(1) 查找)
//! - TCP 序列号管理(滑动窗口、重传队列)
//! - UDP 双模式(无状态 + 有状态会话)
//! - QUIC 核心协议(包头解析、连接管理、防放大攻击、流管理、关闭流程)
//! - 层级时间轮(零堆分配定时器管理)
//! - 传输层校验和验证
//! - 统一连接监听器与接收器抽象(Accept trait / BindTable / StdTcpAcceptor)

pub mod acceptor;
pub mod quic;
pub mod quic_server;
pub mod tcp;
pub mod timer;
pub mod udp;

use crate::packet::IpVersion;
use crate::source_admission::IpAddr;

/// 哈希 IP 地址到 u64(按字节折叠)
///
/// transport 层共享实现:TCP([`tcp::ConnectionKey`])与 UDP
/// ([`udp::UdpSessionTable`])的五元组哈希均以此为基础,
/// 禁止在 tcp.rs / udp.rs 中各自复制实现。
#[inline]
pub(crate) fn hash_ip_addr(ip: &IpAddr) -> u64 {
    match ip {
        IpAddr::V4(bytes) => {
            (bytes[0] as u64) << 24
                | (bytes[1] as u64) << 16
                | (bytes[2] as u64) << 8
                | (bytes[3] as u64)
        }
        IpAddr::V6(bytes) => {
            let mut h: u64 = 0;
            let mut i = 0;
            while i < 16 {
                h ^= (bytes[i] as u64) << ((i % 8) * 8);
                i += 1;
            }
            h
        }
        // NET-019:跨族通配固定哈希(无具体地址字节)
        IpAddr::Any => 0,
    }
}

/// 连接/会话五元组折叠哈希(transport 层共享实现)
///
/// 布局:端口占低 48 位(`src_port << 32 | dst_port`),IP 版本标志占 bit 48 起,
/// 与端口字段无位重叠。
///
/// # 差异说明(历史已统一)
/// 原 TCP 侧端口占高 32 位(`src_port << 48`),其 bit 48 与 V6 标志位交叠;
/// 原 UDP 侧端口占低 48 位,无交叠。统一采用无交叠布局。
/// 哈希值仅用于各自表内桶定位(无持久化、无跨表比较、无外部调用方),统一安全。
#[inline]
pub(crate) fn hash_flow_tuple(
    src_ip: &IpAddr,
    src_port: u16,
    dst_ip: &IpAddr,
    dst_port: u16,
    ip_version: IpVersion,
) -> u64 {
    let h1 = hash_ip_addr(src_ip);
    let h2 = hash_ip_addr(dst_ip);
    let h3 = (src_port as u64) << 32 | (dst_port as u64);
    let h4 = match ip_version {
        IpVersion::V4 => 0u64,
        IpVersion::V6 => 1u64 << 48,
        IpVersion::Unknown => 2u64 << 48,
    };
    h1 ^ h2 ^ h3 ^ h4
}

pub use acceptor::{
    Accept, AcceptedConn, AcceptError, BindTable, ListenEndpoint, StdTcpAcceptor,
    BIND_TABLE_CAPACITY,
};
pub use quic::{
    parse_path_challenge_frame, parse_path_response_frame, parse_quic_header,
    parse_quic_header_with_dcid_len, PathChallengeFrame,
    PathResponseFrame, PathValidationState, QuicAction, QuicConnParams, QuicConnState,
    QuicConnection, QuicConnectionTable, QuicFrameType, QuicHeader, QuicHeaderType, QuicStream,
    QuicStreamState,
};
pub use quic_server::{
    build_ack_frame, build_connection_close_app, build_connection_close_transport, build_crypto_frame, build_handshake_done_frame,
    build_padding_frame, build_ping_frame, build_stream_frame, build_default_transport_params,
    decode_packet_number, encode_varint, parse_frame, parse_frames, parse_long_header_full,
    parse_short_header, parse_varint, ParsedLongHeader, ParsedShortHeader,
    QuicConnection as QuicServerConnection, QuicFrame as QuicServerFrame, QuicServer,
    QuicServerConfig, QuicServerError, QuicServerState, QUIC_VERSION_V1, QUIC_VERSION_V2,
};
// Re-export QuicVersion from zenith-tls so callers don't need a direct zenith-tls import
pub use zenith_tls::quic::QuicVersion;
pub use tcp::{
    ConnectionKey, ConnectionState, TcpAction, TcpConnection, TcpStateMachine, TcpStats,
};
pub use timer::{TimerAction, TimerType, TimerWheel};
pub use udp::{UdpAction, UdpMode, UdpSession, UdpSessionTable, UdpStats};