diff options
| author | Dario Nieuwenhuis <[email protected]> | 2024-09-11 22:06:26 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2024-09-16 21:17:11 +0200 |
| commit | be0d9775e3bcc3c1bd1448e357d7c6cd67b68991 (patch) | |
| tree | 5e8c444b233a86ade113b096ab1e2934b7bbc7bd /embassy-net/src/raw.rs | |
| parent | 7648d42b7f23a2caad29ed6e16123b088ccdc8b5 (diff) | |
net: refactor to simplify lifetimes/generics.
Diffstat (limited to 'embassy-net/src/raw.rs')
| -rw-r--r-- | embassy-net/src/raw.rs | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/embassy-net/src/raw.rs b/embassy-net/src/raw.rs index 7ecd913e7..1098dc208 100644 --- a/embassy-net/src/raw.rs +++ b/embassy-net/src/raw.rs | |||
| @@ -1,6 +1,5 @@ | |||
| 1 | //! Raw sockets. | 1 | //! Raw sockets. |
| 2 | 2 | ||
| 3 | use core::cell::RefCell; | ||
| 4 | use core::future::poll_fn; | 3 | use core::future::poll_fn; |
| 5 | use core::mem; | 4 | use core::mem; |
| 6 | use core::task::{Context, Poll}; | 5 | use core::task::{Context, Poll}; |
| @@ -11,7 +10,7 @@ use smoltcp::socket::raw; | |||
| 11 | pub use smoltcp::socket::raw::PacketMetadata; | 10 | pub use smoltcp::socket::raw::PacketMetadata; |
| 12 | use smoltcp::wire::{IpProtocol, IpVersion}; | 11 | use smoltcp::wire::{IpProtocol, IpVersion}; |
| 13 | 12 | ||
| 14 | use crate::{SocketStack, Stack}; | 13 | use crate::Stack; |
| 15 | 14 | ||
| 16 | /// Error returned by [`RawSocket::recv`] and [`RawSocket::send`]. | 15 | /// Error returned by [`RawSocket::recv`] and [`RawSocket::send`]. |
| 17 | #[derive(PartialEq, Eq, Clone, Copy, Debug)] | 16 | #[derive(PartialEq, Eq, Clone, Copy, Debug)] |
| @@ -23,14 +22,14 @@ pub enum RecvError { | |||
| 23 | 22 | ||
| 24 | /// An Raw socket. | 23 | /// An Raw socket. |
| 25 | pub struct RawSocket<'a> { | 24 | pub struct RawSocket<'a> { |
| 26 | stack: &'a RefCell<SocketStack>, | 25 | stack: Stack<'a>, |
| 27 | handle: SocketHandle, | 26 | handle: SocketHandle, |
| 28 | } | 27 | } |
| 29 | 28 | ||
| 30 | impl<'a> RawSocket<'a> { | 29 | impl<'a> RawSocket<'a> { |
| 31 | /// Create a new Raw socket using the provided stack and buffers. | 30 | /// Create a new Raw socket using the provided stack and buffers. |
| 32 | pub fn new<D: Driver>( | 31 | pub fn new<D: Driver>( |
| 33 | stack: &'a Stack<D>, | 32 | stack: Stack<'a>, |
| 34 | ip_version: IpVersion, | 33 | ip_version: IpVersion, |
| 35 | ip_protocol: IpProtocol, | 34 | ip_protocol: IpProtocol, |
| 36 | rx_meta: &'a mut [PacketMetadata], | 35 | rx_meta: &'a mut [PacketMetadata], |
| @@ -38,31 +37,29 @@ impl<'a> RawSocket<'a> { | |||
| 38 | tx_meta: &'a mut [PacketMetadata], | 37 | tx_meta: &'a mut [PacketMetadata], |
| 39 | tx_buffer: &'a mut [u8], | 38 | tx_buffer: &'a mut [u8], |
| 40 | ) -> Self { | 39 | ) -> Self { |
| 41 | let s = &mut *stack.socket.borrow_mut(); | 40 | let handle = stack.with_mut(|i| { |
| 41 | let rx_meta: &'static mut [PacketMetadata] = unsafe { mem::transmute(rx_meta) }; | ||
| 42 | let rx_buffer: &'static mut [u8] = unsafe { mem::transmute(rx_buffer) }; | ||
| 43 | let tx_meta: &'static mut [PacketMetadata] = unsafe { mem::transmute(tx_meta) }; | ||
| 44 | let tx_buffer: &'static mut [u8] = unsafe { mem::transmute(tx_buffer) }; | ||
| 45 | i.sockets.add(raw::Socket::new( | ||
| 46 | ip_version, | ||
| 47 | ip_protocol, | ||
| 48 | raw::PacketBuffer::new(rx_meta, rx_buffer), | ||
| 49 | raw::PacketBuffer::new(tx_meta, tx_buffer), | ||
| 50 | )) | ||
| 51 | }); | ||
| 42 | 52 | ||
| 43 | let rx_meta: &'static mut [PacketMetadata] = unsafe { mem::transmute(rx_meta) }; | 53 | Self { stack, handle } |
| 44 | let rx_buffer: &'static mut [u8] = unsafe { mem::transmute(rx_buffer) }; | ||
| 45 | let tx_meta: &'static mut [PacketMetadata] = unsafe { mem::transmute(tx_meta) }; | ||
| 46 | let tx_buffer: &'static mut [u8] = unsafe { mem::transmute(tx_buffer) }; | ||
| 47 | let handle = s.sockets.add(raw::Socket::new( | ||
| 48 | ip_version, | ||
| 49 | ip_protocol, | ||
| 50 | raw::PacketBuffer::new(rx_meta, rx_buffer), | ||
| 51 | raw::PacketBuffer::new(tx_meta, tx_buffer), | ||
| 52 | )); | ||
| 53 | |||
| 54 | Self { | ||
| 55 | stack: &stack.socket, | ||
| 56 | handle, | ||
| 57 | } | ||
| 58 | } | 54 | } |
| 59 | 55 | ||
| 60 | fn with_mut<R>(&self, f: impl FnOnce(&mut raw::Socket, &mut Interface) -> R) -> R { | 56 | fn with_mut<R>(&self, f: impl FnOnce(&mut raw::Socket, &mut Interface) -> R) -> R { |
| 61 | let s = &mut *self.stack.borrow_mut(); | 57 | self.stack.with_mut(|i| { |
| 62 | let socket = s.sockets.get_mut::<raw::Socket>(self.handle); | 58 | let socket = i.sockets.get_mut::<raw::Socket>(self.handle); |
| 63 | let res = f(socket, &mut s.iface); | 59 | let res = f(socket, &mut i.iface); |
| 64 | s.waker.wake(); | 60 | i.waker.wake(); |
| 65 | res | 61 | res |
| 62 | }) | ||
| 66 | } | 63 | } |
| 67 | 64 | ||
| 68 | /// Receive a datagram. | 65 | /// Receive a datagram. |
| @@ -115,6 +112,10 @@ impl<'a> RawSocket<'a> { | |||
| 115 | 112 | ||
| 116 | impl Drop for RawSocket<'_> { | 113 | impl Drop for RawSocket<'_> { |
| 117 | fn drop(&mut self) { | 114 | fn drop(&mut self) { |
| 118 | self.stack.borrow_mut().sockets.remove(self.handle); | 115 | self.stack.with_mut(|i| i.sockets.remove(self.handle)); |
| 119 | } | 116 | } |
| 120 | } | 117 | } |
| 118 | |||
| 119 | fn _assert_covariant<'a, 'b: 'a>(x: RawSocket<'b>) -> RawSocket<'a> { | ||
| 120 | x | ||
| 121 | } | ||
