embassy_socket/connection/
mod.rs1use 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
9pub struct TcpConnection<'d, const N: usize, const TX_SZ: usize, const RX_SZ: usize, const BUF_SIZE: usize> {
11 pub socket: TcpSocket<'d>,
13 state: &'d SocketState<N, TX_SZ, RX_SZ, BUF_SIZE>,
15 bufs: NonNull<([u8; TX_SZ], [u8; RX_SZ], [u8; BUF_SIZE])>,
17}
18
19impl<'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 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 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
41impl<'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 self.socket.close();
45 self.state.pool.free(self.bufs);
46 }
47}