aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-12-27 00:14:16 +0000
committerGitHub <[email protected]>2022-12-27 00:14:16 +0000
commit3afb62d8d6d6f9737f3e2275e2bfb2a2f799b758 (patch)
treeea20047099f48b1ac3014ffb36b892ef25f25de8
parent4297eb27ffb77d0c05265f972a3526068b78091c (diff)
parent771806be790a2758f1314d6460defe7c2f0d3e99 (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.rs76
-rw-r--r--embassy-net/src/lib.rs16
-rw-r--r--embassy-usb/src/class/cdc_ncm/embassy_net.rs6
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_
34struct StateInner<'d, const MTU: usize> { 34struct 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
41struct LinkStateState { 41struct Shared {
42 state: LinkState, 42 link_state: LinkState,
43 waker: WakerRegistration, 43 waker: WakerRegistration,
44 ethernet_address: [u8; 6],
44} 45}
45 46
46pub struct Runner<'d, const MTU: usize> { 47pub 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)]
54pub struct StateRunner<'d> {
55 shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>,
50} 56}
51 57
52pub struct RxRunner<'d, const MTU: usize> { 58pub 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
57pub struct TxRunner<'d, const MTU: usize> { 62pub struct TxRunner<'d, const MTU: usize> {
@@ -59,20 +64,30 @@ pub struct TxRunner<'d, const MTU: usize> {
59} 64}
60 65
61impl<'d, const MTU: usize> Runner<'d, MTU> { 66impl<'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
125impl<'d, const MTU: usize> RxRunner<'d, MTU> { 140impl<'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
158impl<'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> {
233pub struct Device<'d, const MTU: usize> { 258pub 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
241impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> { 265impl<'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
26impl<'d, D: Driver<'d>, const MTU: usize> Runner<'d, D, MTU> { 26impl<'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;