diff options
| -rw-r--r-- | embassy-net-driver-channel/src/lib.rs | 56 | ||||
| -rw-r--r-- | embassy-net/src/lib.rs | 16 |
2 files changed, 44 insertions, 28 deletions
diff --git a/embassy-net-driver-channel/src/lib.rs b/embassy-net-driver-channel/src/lib.rs index 369dc5a9d..073edb41a 100644 --- a/embassy-net-driver-channel/src/lib.rs +++ b/embassy-net-driver-channel/src/lib.rs | |||
| @@ -34,24 +34,25 @@ impl<const MTU: usize, const N_RX: usize, const N_TX: usize> State<MTU, N_RX, N_ | |||
| 34 | struct StateInner<'d, const MTU: usize> { | 34 | struct StateInner<'d, const MTU: usize> { |
| 35 | rx: zerocopy_channel::Channel<'d, NoopRawMutex, PacketBuf<MTU>>, | 35 | rx: zerocopy_channel::Channel<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 36 | tx: zerocopy_channel::Channel<'d, NoopRawMutex, PacketBuf<MTU>>, | 36 | tx: zerocopy_channel::Channel<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 37 | link_state: Mutex<NoopRawMutex, RefCell<LinkStateState>>, | 37 | shared: Mutex<NoopRawMutex, RefCell<Shared>>, |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | /// State of the LinkState | 40 | /// State of the LinkState |
| 41 | struct LinkStateState { | 41 | struct Shared { |
| 42 | state: LinkState, | 42 | link_state: LinkState, |
| 43 | waker: WakerRegistration, | 43 | waker: WakerRegistration, |
| 44 | ethernet_address: [u8; 6], | ||
| 44 | } | 45 | } |
| 45 | 46 | ||
| 46 | pub struct Runner<'d, const MTU: usize> { | 47 | pub struct Runner<'d, const MTU: usize> { |
| 47 | tx_chan: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>, | 48 | tx_chan: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 48 | rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, | 49 | rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 49 | link_state: &'d Mutex<NoopRawMutex, RefCell<LinkStateState>>, | 50 | shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, |
| 50 | } | 51 | } |
| 51 | 52 | ||
| 52 | pub struct RxRunner<'d, const MTU: usize> { | 53 | pub struct RxRunner<'d, const MTU: usize> { |
| 53 | rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, | 54 | rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 54 | link_state: &'d Mutex<NoopRawMutex, RefCell<LinkStateState>>, | 55 | shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, |
| 55 | } | 56 | } |
| 56 | 57 | ||
| 57 | pub struct TxRunner<'d, const MTU: usize> { | 58 | pub struct TxRunner<'d, const MTU: usize> { |
| @@ -62,7 +63,7 @@ impl<'d, const MTU: usize> Runner<'d, MTU> { | |||
| 62 | pub fn split(self) -> (RxRunner<'d, MTU>, TxRunner<'d, MTU>) { | 63 | pub fn split(self) -> (RxRunner<'d, MTU>, TxRunner<'d, MTU>) { |
| 63 | ( | 64 | ( |
| 64 | RxRunner { | 65 | RxRunner { |
| 65 | link_state: self.link_state, | 66 | shared: self.shared, |
| 66 | rx_chan: self.rx_chan, | 67 | rx_chan: self.rx_chan, |
| 67 | }, | 68 | }, |
| 68 | TxRunner { tx_chan: self.tx_chan }, | 69 | TxRunner { tx_chan: self.tx_chan }, |
| @@ -70,9 +71,17 @@ impl<'d, const MTU: usize> Runner<'d, MTU> { | |||
| 70 | } | 71 | } |
| 71 | 72 | ||
| 72 | pub fn set_link_state(&mut self, state: LinkState) { | 73 | pub fn set_link_state(&mut self, state: LinkState) { |
| 73 | self.link_state.lock(|s| { | 74 | self.shared.lock(|s| { |
| 74 | let s = &mut *s.borrow_mut(); | 75 | let s = &mut *s.borrow_mut(); |
| 75 | s.state = state; | 76 | s.link_state = state; |
| 77 | s.waker.wake(); | ||
| 78 | }); | ||
| 79 | } | ||
| 80 | |||
| 81 | pub fn set_ethernet_address(&mut self, address: [u8; 6]) { | ||
| 82 | self.shared.lock(|s| { | ||
| 83 | let s = &mut *s.borrow_mut(); | ||
| 84 | s.ethernet_address = address; | ||
| 76 | s.waker.wake(); | 85 | s.waker.wake(); |
| 77 | }); | 86 | }); |
| 78 | } | 87 | } |
| @@ -124,9 +133,17 @@ impl<'d, const MTU: usize> Runner<'d, MTU> { | |||
| 124 | 133 | ||
| 125 | impl<'d, const MTU: usize> RxRunner<'d, MTU> { | 134 | impl<'d, const MTU: usize> RxRunner<'d, MTU> { |
| 126 | pub fn set_link_state(&mut self, state: LinkState) { | 135 | pub fn set_link_state(&mut self, state: LinkState) { |
| 127 | self.link_state.lock(|s| { | 136 | self.shared.lock(|s| { |
| 137 | let s = &mut *s.borrow_mut(); | ||
| 138 | s.link_state = state; | ||
| 139 | s.waker.wake(); | ||
| 140 | }); | ||
| 141 | } | ||
| 142 | |||
| 143 | pub fn set_ethernet_address(&mut self, address: [u8; 6]) { | ||
| 144 | self.shared.lock(|s| { | ||
| 128 | let s = &mut *s.borrow_mut(); | 145 | let s = &mut *s.borrow_mut(); |
| 129 | s.state = state; | 146 | s.ethernet_address = address; |
| 130 | s.waker.wake(); | 147 | s.waker.wake(); |
| 131 | }); | 148 | }); |
| 132 | } | 149 | } |
| @@ -194,8 +211,9 @@ pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>( | |||
| 194 | let state = unsafe { &mut *state_uninit }.write(StateInner { | 211 | let state = unsafe { &mut *state_uninit }.write(StateInner { |
| 195 | rx: zerocopy_channel::Channel::new(&mut state.rx[..]), | 212 | rx: zerocopy_channel::Channel::new(&mut state.rx[..]), |
| 196 | tx: zerocopy_channel::Channel::new(&mut state.tx[..]), | 213 | tx: zerocopy_channel::Channel::new(&mut state.tx[..]), |
| 197 | link_state: Mutex::new(RefCell::new(LinkStateState { | 214 | shared: Mutex::new(RefCell::new(Shared { |
| 198 | state: LinkState::Down, | 215 | link_state: LinkState::Down, |
| 216 | ethernet_address, | ||
| 199 | waker: WakerRegistration::new(), | 217 | waker: WakerRegistration::new(), |
| 200 | })), | 218 | })), |
| 201 | }); | 219 | }); |
| @@ -207,12 +225,11 @@ pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>( | |||
| 207 | Runner { | 225 | Runner { |
| 208 | tx_chan: tx_receiver, | 226 | tx_chan: tx_receiver, |
| 209 | rx_chan: rx_sender, | 227 | rx_chan: rx_sender, |
| 210 | link_state: &state.link_state, | 228 | shared: &state.shared, |
| 211 | }, | 229 | }, |
| 212 | Device { | 230 | Device { |
| 213 | caps, | 231 | caps, |
| 214 | ethernet_address, | 232 | shared: &state.shared, |
| 215 | link_state: &state.link_state, | ||
| 216 | rx: rx_receiver, | 233 | rx: rx_receiver, |
| 217 | tx: tx_sender, | 234 | tx: tx_sender, |
| 218 | }, | 235 | }, |
| @@ -233,9 +250,8 @@ impl<const MTU: usize> PacketBuf<MTU> { | |||
| 233 | pub struct Device<'d, const MTU: usize> { | 250 | pub struct Device<'d, const MTU: usize> { |
| 234 | rx: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>, | 251 | rx: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 235 | tx: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, | 252 | tx: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 236 | link_state: &'d Mutex<NoopRawMutex, RefCell<LinkStateState>>, | 253 | shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, |
| 237 | caps: Capabilities, | 254 | caps: Capabilities, |
| 238 | ethernet_address: [u8; 6], | ||
| 239 | } | 255 | } |
| 240 | 256 | ||
| 241 | impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> { | 257 | impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> { |
| @@ -265,14 +281,14 @@ impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> { | |||
| 265 | } | 281 | } |
| 266 | 282 | ||
| 267 | fn ethernet_address(&self) -> [u8; 6] { | 283 | fn ethernet_address(&self) -> [u8; 6] { |
| 268 | self.ethernet_address | 284 | self.shared.lock(|s| s.borrow().ethernet_address) |
| 269 | } | 285 | } |
| 270 | 286 | ||
| 271 | fn link_state(&mut self, cx: &mut Context) -> LinkState { | 287 | fn link_state(&mut self, cx: &mut Context) -> LinkState { |
| 272 | self.link_state.lock(|s| { | 288 | self.shared.lock(|s| { |
| 273 | let s = &mut *s.borrow_mut(); | 289 | let s = &mut *s.borrow_mut(); |
| 274 | s.waker.register(cx.waker()); | 290 | s.waker.register(cx.waker()); |
| 275 | s.state | 291 | s.link_state |
| 276 | }) | 292 | }) |
| 277 | } | 293 | } |
| 278 | } | 294 | } |
diff --git a/embassy-net/src/lib.rs b/embassy-net/src/lib.rs index b58c9cf36..e4a4218e3 100644 --- a/embassy-net/src/lib.rs +++ b/embassy-net/src/lib.rs | |||
| @@ -111,20 +111,13 @@ impl<D: Driver + 'static> Stack<D> { | |||
| 111 | #[cfg(feature = "medium-ethernet")] | 111 | #[cfg(feature = "medium-ethernet")] |
| 112 | let medium = device.capabilities().medium; | 112 | let medium = device.capabilities().medium; |
| 113 | 113 | ||
| 114 | #[cfg(feature = "medium-ethernet")] | ||
| 115 | let ethernet_addr = if medium == Medium::Ethernet { | ||
| 116 | device.ethernet_address() | ||
| 117 | } else { | ||
| 118 | [0, 0, 0, 0, 0, 0] | ||
| 119 | }; | ||
| 120 | |||
| 121 | let mut b = InterfaceBuilder::new(); | 114 | let mut b = InterfaceBuilder::new(); |
| 122 | b = b.ip_addrs(&mut resources.addresses[..]); | 115 | b = b.ip_addrs(&mut resources.addresses[..]); |
| 123 | b = b.random_seed(random_seed); | 116 | b = b.random_seed(random_seed); |
| 124 | 117 | ||
| 125 | #[cfg(feature = "medium-ethernet")] | 118 | #[cfg(feature = "medium-ethernet")] |
| 126 | if medium == Medium::Ethernet { | 119 | if medium == Medium::Ethernet { |
| 127 | b = b.hardware_addr(HardwareAddress::Ethernet(EthernetAddress(ethernet_addr))); | 120 | b = b.hardware_addr(HardwareAddress::Ethernet(EthernetAddress(device.ethernet_address()))); |
| 128 | b = b.neighbor_cache(NeighborCache::new(&mut resources.neighbor_cache[..])); | 121 | b = b.neighbor_cache(NeighborCache::new(&mut resources.neighbor_cache[..])); |
| 129 | b = b.routes(Routes::new(&mut resources.routes[..])); | 122 | b = b.routes(Routes::new(&mut resources.routes[..])); |
| 130 | } | 123 | } |
| @@ -261,6 +254,13 @@ impl<D: Driver + 'static> Inner<D> { | |||
| 261 | fn poll(&mut self, cx: &mut Context<'_>, s: &mut SocketStack) { | 254 | fn poll(&mut self, cx: &mut Context<'_>, s: &mut SocketStack) { |
| 262 | s.waker.register(cx.waker()); | 255 | s.waker.register(cx.waker()); |
| 263 | 256 | ||
| 257 | #[cfg(feature = "medium-ethernet")] | ||
| 258 | if self.device.capabilities().medium == Medium::Ethernet { | ||
| 259 | s.iface.set_hardware_addr(HardwareAddress::Ethernet(EthernetAddress( | ||
| 260 | self.device.ethernet_address(), | ||
| 261 | ))); | ||
| 262 | } | ||
| 263 | |||
| 264 | let timestamp = instant_to_smoltcp(Instant::now()); | 264 | let timestamp = instant_to_smoltcp(Instant::now()); |
| 265 | let mut smoldev = DriverAdapter { | 265 | let mut smoldev = DriverAdapter { |
| 266 | cx: Some(cx), | 266 | cx: Some(cx), |
