1ffe74184SMartin Algesten #[cfg(test)] 2ffe74184SMartin Algesten mod five_tuple_test; 3ffe74184SMartin Algesten 4ffe74184SMartin Algesten use crate::proto::*; 5ffe74184SMartin Algesten 6ffe74184SMartin Algesten use std::fmt; 7ffe74184SMartin Algesten use std::net::{Ipv4Addr, SocketAddr}; 8ffe74184SMartin Algesten 9ffe74184SMartin Algesten // FiveTuple is the combination (client IP address and port, server IP 10ffe74184SMartin Algesten // address and port, and transport protocol (currently one of UDP, 11ffe74184SMartin Algesten // TCP, or TLS)) used to communicate between the client and the 12ffe74184SMartin Algesten // server. The 5-tuple uniquely identifies this communication 13ffe74184SMartin Algesten // stream. The 5-tuple also uniquely identifies the Allocation on 14ffe74184SMartin Algesten // the server. 15*26682c3dSlogist322 #[derive(PartialEq, Eq, Clone, Copy, Hash)] 16ffe74184SMartin Algesten pub struct FiveTuple { 17ffe74184SMartin Algesten pub protocol: Protocol, 18ffe74184SMartin Algesten pub src_addr: SocketAddr, 19ffe74184SMartin Algesten pub dst_addr: SocketAddr, 20ffe74184SMartin Algesten } 21ffe74184SMartin Algesten 22ffe74184SMartin Algesten impl Default for FiveTuple { default() -> Self23ffe74184SMartin Algesten fn default() -> Self { 24ffe74184SMartin Algesten FiveTuple { 25ffe74184SMartin Algesten protocol: PROTO_UDP, 26ffe74184SMartin Algesten src_addr: SocketAddr::new(Ipv4Addr::new(0, 0, 0, 0).into(), 0), 27ffe74184SMartin Algesten dst_addr: SocketAddr::new(Ipv4Addr::new(0, 0, 0, 0).into(), 0), 28ffe74184SMartin Algesten } 29ffe74184SMartin Algesten } 30ffe74184SMartin Algesten } 31ffe74184SMartin Algesten 32ffe74184SMartin Algesten impl fmt::Display for FiveTuple { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result33ffe74184SMartin Algesten fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 34ffe74184SMartin Algesten write!(f, "{}_{}_{}", self.protocol, self.src_addr, self.dst_addr) 35ffe74184SMartin Algesten } 36ffe74184SMartin Algesten } 37*26682c3dSlogist322 38*26682c3dSlogist322 impl fmt::Debug for FiveTuple { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result39*26682c3dSlogist322 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 40*26682c3dSlogist322 f.debug_struct("FiveTuple") 41*26682c3dSlogist322 .field("protocol", &self.protocol) 42*26682c3dSlogist322 .field("src_addr", &self.src_addr) 43*26682c3dSlogist322 .field("dst_addr", &self.dst_addr) 44*26682c3dSlogist322 .finish() 45*26682c3dSlogist322 } 46*26682c3dSlogist322 } 47