use bytes::BytesMut;
use std::net::SocketAddr;
use std::str::FromStr;
use std::time::Instant;
pub use ::async_transport::EcnCodepoint;
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum Protocol {
#[default]
UDP,
TCP,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct TransportContext {
pub local_addr: SocketAddr,
pub peer_addr: SocketAddr,
pub protocol: Protocol,
pub ecn: Option<EcnCodepoint>,
}
impl Default for TransportContext {
fn default() -> Self {
Self {
local_addr: SocketAddr::from_str("0.0.0.0:0").unwrap(),
peer_addr: SocketAddr::from_str("0.0.0.0:0").unwrap(),
protocol: Protocol::UDP,
ecn: None,
}
}
}
pub struct Transmit<T> {
pub now: Instant,
pub transport: TransportContext,
pub message: T,
}
pub type TaggedBytesMut = Transmit<BytesMut>;
pub type TaggedString = Transmit<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 protocol: Protocol,
}
impl From<&TransportContext> for FiveTuple {
fn from(value: &TransportContext) -> Self {
Self {
local_addr: value.local_addr,
peer_addr: value.peer_addr,
protocol: value.protocol,
}
}
}
impl From<TransportContext> for FiveTuple {
fn from(value: TransportContext) -> Self {
Self {
local_addr: value.local_addr,
peer_addr: value.peer_addr,
protocol: value.protocol,
}
}
}