use bytes::BytesMut;
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use std::time::Instant;
#[repr(u8)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum EcnCodepoint {
#[doc(hidden)]
Ect0 = 0b10,
#[doc(hidden)]
Ect1 = 0b01,
#[doc(hidden)]
Ce = 0b11,
}
impl EcnCodepoint {
pub fn from_bits(x: u8) -> Option<Self> {
use self::EcnCodepoint::*;
Some(match x & 0b11 {
0b10 => Ect0,
0b01 => Ect1,
0b11 => Ce,
_ => {
return None;
}
})
}
}
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum TransportProtocol {
#[default]
UDP,
TCP,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct TransportContext {
pub local_addr: SocketAddr,
pub peer_addr: SocketAddr,
pub transport_protocol: TransportProtocol,
pub ecn: Option<EcnCodepoint>,
}
impl Default for TransportContext {
fn default() -> Self {
Self {
local_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 0),
peer_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 65535),
transport_protocol: TransportProtocol::UDP,
ecn: None,
}
}
}
pub struct TransportMessage<T> {
pub now: Instant,
pub transport: TransportContext,
pub message: T,
}
pub type TaggedBytesMut = TransportMessage<BytesMut>;
pub type TaggedString = TransportMessage<String>;
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct FourTuple {
pub local_addr: SocketAddr,
pub peer_addr: SocketAddr,
}
impl From<&TransportContext> for FourTuple {
fn from(value: &TransportContext) -> Self {
Self {
local_addr: value.local_addr,
peer_addr: value.peer_addr,
}
}
}
impl From<TransportContext> for FourTuple {
fn from(value: TransportContext) -> Self {
Self {
local_addr: value.local_addr,
peer_addr: value.peer_addr,
}
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct FiveTuple {
pub local_addr: SocketAddr,
pub peer_addr: SocketAddr,
pub transport_protocol: TransportProtocol,
}
impl From<&TransportContext> for FiveTuple {
fn from(value: &TransportContext) -> Self {
Self {
local_addr: value.local_addr,
peer_addr: value.peer_addr,
transport_protocol: value.transport_protocol,
}
}
}
impl From<TransportContext> for FiveTuple {
fn from(value: TransportContext) -> Self {
Self {
local_addr: value.local_addr,
peer_addr: value.peer_addr,
transport_protocol: value.transport_protocol,
}
}
}