aboutsummaryrefslogtreecommitdiff
path: root/embassy-net/src/raw.rs
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-09-11 22:06:26 +0200
committerDario Nieuwenhuis <[email protected]>2024-09-16 21:17:11 +0200
commitbe0d9775e3bcc3c1bd1448e357d7c6cd67b68991 (patch)
tree5e8c444b233a86ade113b096ab1e2934b7bbc7bd /embassy-net/src/raw.rs
parent7648d42b7f23a2caad29ed6e16123b088ccdc8b5 (diff)
net: refactor to simplify lifetimes/generics.
Diffstat (limited to 'embassy-net/src/raw.rs')
-rw-r--r--embassy-net/src/raw.rs53
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
3use core::cell::RefCell;
4use core::future::poll_fn; 3use core::future::poll_fn;
5use core::mem; 4use core::mem;
6use core::task::{Context, Poll}; 5use core::task::{Context, Poll};
@@ -11,7 +10,7 @@ use smoltcp::socket::raw;
11pub use smoltcp::socket::raw::PacketMetadata; 10pub use smoltcp::socket::raw::PacketMetadata;
12use smoltcp::wire::{IpProtocol, IpVersion}; 11use smoltcp::wire::{IpProtocol, IpVersion};
13 12
14use crate::{SocketStack, Stack}; 13use 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.
25pub struct RawSocket<'a> { 24pub struct RawSocket<'a> {
26 stack: &'a RefCell<SocketStack>, 25 stack: Stack<'a>,
27 handle: SocketHandle, 26 handle: SocketHandle,
28} 27}
29 28
30impl<'a> RawSocket<'a> { 29impl<'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
116impl Drop for RawSocket<'_> { 113impl 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
119fn _assert_covariant<'a, 'b: 'a>(x: RawSocket<'b>) -> RawSocket<'a> {
120 x
121}