diff options
| author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-12-27 00:14:16 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-12-27 00:14:16 +0000 |
| commit | 3afb62d8d6d6f9737f3e2275e2bfb2a2f799b758 (patch) | |
| tree | ea20047099f48b1ac3014ffb36b892ef25f25de8 | |
| parent | 4297eb27ffb77d0c05265f972a3526068b78091c (diff) | |
| parent | 771806be790a2758f1314d6460defe7c2f0d3e99 (diff) | |
Merge #1132
1132: net: allow changing mac addr at runtime r=Dirbaio a=Dirbaio
bors r+
Co-authored-by: Dario Nieuwenhuis <[email protected]>
| -rw-r--r-- | embassy-net-driver-channel/src/lib.rs | 76 | ||||
| -rw-r--r-- | embassy-net/src/lib.rs | 16 | ||||
| -rw-r--r-- | embassy-usb/src/class/cdc_ncm/embassy_net.rs | 6 |
3 files changed, 61 insertions, 37 deletions
diff --git a/embassy-net-driver-channel/src/lib.rs b/embassy-net-driver-channel/src/lib.rs index 369dc5a9d..0c8dcc22b 100644 --- a/embassy-net-driver-channel/src/lib.rs +++ b/embassy-net-driver-channel/src/lib.rs | |||
| @@ -34,24 +34,29 @@ 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>>, |
| 51 | } | ||
| 52 | |||
| 53 | #[derive(Clone, Copy)] | ||
| 54 | pub struct StateRunner<'d> { | ||
| 55 | shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, | ||
| 50 | } | 56 | } |
| 51 | 57 | ||
| 52 | pub struct RxRunner<'d, const MTU: usize> { | 58 | pub struct RxRunner<'d, const MTU: usize> { |
| 53 | rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, | 59 | rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 54 | link_state: &'d Mutex<NoopRawMutex, RefCell<LinkStateState>>, | ||
| 55 | } | 60 | } |
| 56 | 61 | ||
| 57 | pub struct TxRunner<'d, const MTU: usize> { | 62 | pub struct TxRunner<'d, const MTU: usize> { |
| @@ -59,20 +64,30 @@ pub struct TxRunner<'d, const MTU: usize> { | |||
| 59 | } | 64 | } |
| 60 | 65 | ||
| 61 | impl<'d, const MTU: usize> Runner<'d, MTU> { | 66 | impl<'d, const MTU: usize> Runner<'d, MTU> { |
| 62 | pub fn split(self) -> (RxRunner<'d, MTU>, TxRunner<'d, MTU>) { | 67 | pub fn split(self) -> (StateRunner<'d>, RxRunner<'d, MTU>, TxRunner<'d, MTU>) { |
| 63 | ( | 68 | ( |
| 64 | RxRunner { | 69 | StateRunner { shared: self.shared }, |
| 65 | link_state: self.link_state, | 70 | RxRunner { rx_chan: self.rx_chan }, |
| 66 | rx_chan: self.rx_chan, | ||
| 67 | }, | ||
| 68 | TxRunner { tx_chan: self.tx_chan }, | 71 | TxRunner { tx_chan: self.tx_chan }, |
| 69 | ) | 72 | ) |
| 70 | } | 73 | } |
| 71 | 74 | ||
| 75 | pub fn state_runner(&self) -> StateRunner<'d> { | ||
| 76 | StateRunner { shared: self.shared } | ||
| 77 | } | ||
| 78 | |||
| 72 | pub fn set_link_state(&mut self, state: LinkState) { | 79 | pub fn set_link_state(&mut self, state: LinkState) { |
| 73 | self.link_state.lock(|s| { | 80 | self.shared.lock(|s| { |
| 74 | let s = &mut *s.borrow_mut(); | 81 | let s = &mut *s.borrow_mut(); |
| 75 | s.state = state; | 82 | s.link_state = state; |
| 83 | s.waker.wake(); | ||
| 84 | }); | ||
| 85 | } | ||
| 86 | |||
| 87 | pub fn set_ethernet_address(&mut self, address: [u8; 6]) { | ||
| 88 | self.shared.lock(|s| { | ||
| 89 | let s = &mut *s.borrow_mut(); | ||
| 90 | s.ethernet_address = address; | ||
| 76 | s.waker.wake(); | 91 | s.waker.wake(); |
| 77 | }); | 92 | }); |
| 78 | } | 93 | } |
| @@ -122,15 +137,25 @@ impl<'d, const MTU: usize> Runner<'d, MTU> { | |||
| 122 | } | 137 | } |
| 123 | } | 138 | } |
| 124 | 139 | ||
| 125 | impl<'d, const MTU: usize> RxRunner<'d, MTU> { | 140 | impl<'d> StateRunner<'d> { |
| 126 | pub fn set_link_state(&mut self, state: LinkState) { | 141 | pub fn set_link_state(&self, state: LinkState) { |
| 127 | self.link_state.lock(|s| { | 142 | self.shared.lock(|s| { |
| 128 | let s = &mut *s.borrow_mut(); | 143 | let s = &mut *s.borrow_mut(); |
| 129 | s.state = state; | 144 | s.link_state = state; |
| 130 | s.waker.wake(); | 145 | s.waker.wake(); |
| 131 | }); | 146 | }); |
| 132 | } | 147 | } |
| 133 | 148 | ||
| 149 | pub fn set_ethernet_address(&self, address: [u8; 6]) { | ||
| 150 | self.shared.lock(|s| { | ||
| 151 | let s = &mut *s.borrow_mut(); | ||
| 152 | s.ethernet_address = address; | ||
| 153 | s.waker.wake(); | ||
| 154 | }); | ||
| 155 | } | ||
| 156 | } | ||
| 157 | |||
| 158 | impl<'d, const MTU: usize> RxRunner<'d, MTU> { | ||
| 134 | pub async fn rx_buf(&mut self) -> &mut [u8] { | 159 | pub async fn rx_buf(&mut self) -> &mut [u8] { |
| 135 | let p = self.rx_chan.send().await; | 160 | let p = self.rx_chan.send().await; |
| 136 | &mut p.buf | 161 | &mut p.buf |
| @@ -194,8 +219,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 { | 219 | let state = unsafe { &mut *state_uninit }.write(StateInner { |
| 195 | rx: zerocopy_channel::Channel::new(&mut state.rx[..]), | 220 | rx: zerocopy_channel::Channel::new(&mut state.rx[..]), |
| 196 | tx: zerocopy_channel::Channel::new(&mut state.tx[..]), | 221 | tx: zerocopy_channel::Channel::new(&mut state.tx[..]), |
| 197 | link_state: Mutex::new(RefCell::new(LinkStateState { | 222 | shared: Mutex::new(RefCell::new(Shared { |
| 198 | state: LinkState::Down, | 223 | link_state: LinkState::Down, |
| 224 | ethernet_address, | ||
| 199 | waker: WakerRegistration::new(), | 225 | waker: WakerRegistration::new(), |
| 200 | })), | 226 | })), |
| 201 | }); | 227 | }); |
| @@ -207,12 +233,11 @@ pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>( | |||
| 207 | Runner { | 233 | Runner { |
| 208 | tx_chan: tx_receiver, | 234 | tx_chan: tx_receiver, |
| 209 | rx_chan: rx_sender, | 235 | rx_chan: rx_sender, |
| 210 | link_state: &state.link_state, | 236 | shared: &state.shared, |
| 211 | }, | 237 | }, |
| 212 | Device { | 238 | Device { |
| 213 | caps, | 239 | caps, |
| 214 | ethernet_address, | 240 | shared: &state.shared, |
| 215 | link_state: &state.link_state, | ||
| 216 | rx: rx_receiver, | 241 | rx: rx_receiver, |
| 217 | tx: tx_sender, | 242 | tx: tx_sender, |
| 218 | }, | 243 | }, |
| @@ -233,9 +258,8 @@ impl<const MTU: usize> PacketBuf<MTU> { | |||
| 233 | pub struct Device<'d, const MTU: usize> { | 258 | pub struct Device<'d, const MTU: usize> { |
| 234 | rx: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>, | 259 | rx: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 235 | tx: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, | 260 | tx: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 236 | link_state: &'d Mutex<NoopRawMutex, RefCell<LinkStateState>>, | 261 | shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, |
| 237 | caps: Capabilities, | 262 | caps: Capabilities, |
| 238 | ethernet_address: [u8; 6], | ||
| 239 | } | 263 | } |
| 240 | 264 | ||
| 241 | impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> { | 265 | impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> { |
| @@ -265,14 +289,14 @@ impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> { | |||
| 265 | } | 289 | } |
| 266 | 290 | ||
| 267 | fn ethernet_address(&self) -> [u8; 6] { | 291 | fn ethernet_address(&self) -> [u8; 6] { |
| 268 | self.ethernet_address | 292 | self.shared.lock(|s| s.borrow().ethernet_address) |
| 269 | } | 293 | } |
| 270 | 294 | ||
| 271 | fn link_state(&mut self, cx: &mut Context) -> LinkState { | 295 | fn link_state(&mut self, cx: &mut Context) -> LinkState { |
| 272 | self.link_state.lock(|s| { | 296 | self.shared.lock(|s| { |
| 273 | let s = &mut *s.borrow_mut(); | 297 | let s = &mut *s.borrow_mut(); |
| 274 | s.waker.register(cx.waker()); | 298 | s.waker.register(cx.waker()); |
| 275 | s.state | 299 | s.link_state |
| 276 | }) | 300 | }) |
| 277 | } | 301 | } |
| 278 | } | 302 | } |
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), |
diff --git a/embassy-usb/src/class/cdc_ncm/embassy_net.rs b/embassy-usb/src/class/cdc_ncm/embassy_net.rs index 7ecf693d2..501df2d8c 100644 --- a/embassy-usb/src/class/cdc_ncm/embassy_net.rs +++ b/embassy-usb/src/class/cdc_ncm/embassy_net.rs | |||
| @@ -25,16 +25,16 @@ pub struct Runner<'d, D: Driver<'d>, const MTU: usize> { | |||
| 25 | 25 | ||
| 26 | impl<'d, D: Driver<'d>, const MTU: usize> Runner<'d, D, MTU> { | 26 | impl<'d, D: Driver<'d>, const MTU: usize> Runner<'d, D, MTU> { |
| 27 | pub async fn run(mut self) -> ! { | 27 | pub async fn run(mut self) -> ! { |
| 28 | let (mut rx_chan, mut tx_chan) = self.ch.split(); | 28 | let (state_chan, mut rx_chan, mut tx_chan) = self.ch.split(); |
| 29 | let rx_fut = async move { | 29 | let rx_fut = async move { |
| 30 | loop { | 30 | loop { |
| 31 | trace!("WAITING for connection"); | 31 | trace!("WAITING for connection"); |
| 32 | rx_chan.set_link_state(LinkState::Down); | 32 | state_chan.set_link_state(LinkState::Down); |
| 33 | 33 | ||
| 34 | self.rx_usb.wait_connection().await.unwrap(); | 34 | self.rx_usb.wait_connection().await.unwrap(); |
| 35 | 35 | ||
| 36 | trace!("Connected"); | 36 | trace!("Connected"); |
| 37 | rx_chan.set_link_state(LinkState::Up); | 37 | state_chan.set_link_state(LinkState::Up); |
| 38 | 38 | ||
| 39 | loop { | 39 | loop { |
| 40 | let p = rx_chan.rx_buf().await; | 40 | let p = rx_chan.rx_buf().await; |
