use parking_lot::Mutex; use smoltcp::{ iface::{SocketHandle as InnerSocketHandle, SocketSet}, socket::tcp, time::Duration, }; use std::{ ops::{Deref, DerefMut}, sync::Arc, }; /// `BufferSize` is used to configure the size of the socket buffer. #[derive(Debug, Clone, Copy)] pub struct BufferSize { pub tcp_rx_size: usize, pub tcp_tx_size: usize, } impl Default for BufferSize { fn default() -> Self { BufferSize { tcp_rx_size: 8192, tcp_tx_size: 8192, } } } type SharedSocketSet = Arc>>; #[derive(Clone)] pub struct SocketAlloctor { sockets: SharedSocketSet, buffer_size: BufferSize, } impl SocketAlloctor { pub(crate) fn new(buffer_size: BufferSize) -> SocketAlloctor { let sockets = Arc::new(Mutex::new(SocketSet::new(Vec::new()))); SocketAlloctor { sockets, buffer_size, } } pub(crate) fn sockets(&self) -> &SharedSocketSet { &self.sockets } pub fn new_tcp_socket(&self) -> SocketHandle { let mut set = self.sockets.lock(); let handle = set.add(self.alloc_tcp_socket()); SocketHandle::new(handle, self.sockets.clone()) } fn alloc_tcp_socket(&self) -> tcp::Socket<'static> { let rx_buffer = tcp::SocketBuffer::new(vec![0; self.buffer_size.tcp_rx_size]); let tx_buffer = tcp::SocketBuffer::new(vec![0; self.buffer_size.tcp_tx_size]); let mut tcp = tcp::Socket::new(rx_buffer, tx_buffer); tcp.set_nagle_enabled(false); tcp.set_keep_alive(Some(Duration::from_secs(10))); tcp.set_timeout(Some(Duration::from_secs(60))); tcp } } pub struct SocketHandle(InnerSocketHandle, SharedSocketSet); impl SocketHandle { fn new(inner: InnerSocketHandle, set: SharedSocketSet) -> SocketHandle { SocketHandle(inner, set) } } impl Drop for SocketHandle { fn drop(&mut self) { let mut iface = self.1.lock(); iface.remove(self.0); } } impl Deref for SocketHandle { type Target = InnerSocketHandle; fn deref(&self) -> &Self::Target { &self.0 } } impl DerefMut for SocketHandle { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } }