embassy_socket/connection/
mod.rs

1use core::ptr::NonNull;
2use embassy_net::Stack;
3use embassy_net::tcp::{Error, TcpSocket};
4use crate::connection::socket_state::SocketState;
5
6pub mod socket_state;
7pub(crate) mod pool;
8
9/// tcp connection
10pub struct TcpConnection<'d, const N: usize, const TX_SZ: usize, const RX_SZ: usize, const BUF_SIZE: usize> {
11    /// tcp socket
12    pub socket: TcpSocket<'d>,
13    /// socket state, memory pool
14    state: &'d SocketState<N, TX_SZ, RX_SZ, BUF_SIZE>,
15    /// memory buf
16    bufs: NonNull<([u8; TX_SZ], [u8; RX_SZ], [u8; BUF_SIZE])>,
17}
18
19/// custom method
20impl<'d, const N: usize, const TX_SZ: usize, const RX_SZ: usize, const BUF_SIZE: usize> TcpConnection<'d, N, TX_SZ, RX_SZ, BUF_SIZE> {
21    /// create tcp connection
22    pub fn new(stack: Stack<'d>, state: &'d SocketState<N, TX_SZ, RX_SZ, BUF_SIZE>) -> Result<Self, Error> {
23        let mut bufs = state.pool.alloc().ok_or(Error::ConnectionReset)?;
24        Ok(Self {
25            socket: unsafe { TcpSocket::new(stack, &mut bufs.as_mut().1, &mut bufs.as_mut().0) },
26            state,
27            bufs,
28        })
29    }
30
31    /// try read to buf
32    pub async fn try_read(&mut self) -> Result<&[u8], Error> {
33        let bytes = unsafe { &mut self.bufs.as_mut().2 };
34        let len = self.socket.read(bytes).await?;
35        if len == 0 { return Err(Error::ConnectionReset); }
36
37        Ok(&bytes[0..len])
38    }
39}
40
41/// support drop
42impl<'d, const N: usize, const TX_SZ: usize, const RX_SZ: usize, const BUF_SIZE: usize> Drop for TcpConnection<'d, N, TX_SZ, RX_SZ, BUF_SIZE> {
43    fn drop(&mut self) {
44        unsafe {
45            self.socket.close();
46            self.state.pool.free(self.bufs);
47        }
48    }
49}