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;
#[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
}
IpAddr::Any => 0,
}
}
#[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,
};
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};