aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2022-12-27 01:04:55 +0100
committerDario Nieuwenhuis <[email protected]>2022-12-27 01:04:55 +0100
commit4a4b59369482572c415487b9d90166e7c19b592a (patch)
tree274b778d838a39f15025ff0d2c458ffbc0196d79
parent4297eb27ffb77d0c05265f972a3526068b78091c (diff)
net; allow changing MAC addr at runtime.
-rw-r--r--embassy-net-driver-channel/src/lib.rs56
-rw-r--r--embassy-net/src/lib.rs16
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_
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>>,
50} 51}
51 52
52pub struct RxRunner<'d, const MTU: usize> { 53pub 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
57pub struct TxRunner<'d, const MTU: usize> { 58pub 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
125impl<'d, const MTU: usize> RxRunner<'d, MTU> { 134impl<'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> {
233pub struct Device<'d, const MTU: usize> { 250pub 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
241impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> { 257impl<'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),