aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuben De Smet <[email protected]>2023-07-31 10:40:48 +0200
committerRuben De Smet <[email protected]>2023-07-31 14:21:26 +0200
commit4afdce4ec5e39324f8a690961070a25f16397f56 (patch)
treecd0c35f8eb67001349bc48cd7d643565760a6eff
parent69c0a89aa5d52e048fdd8ddc5d47b767da07e88b (diff)
Introduce driver::HardwareAddress without smoltcp dependency
-rw-r--r--cyw43/src/lib.rs2
-rw-r--r--embassy-net-driver-channel/src/lib.rs22
-rw-r--r--embassy-net-driver/Cargo.toml1
-rw-r--r--embassy-net-driver/src/lib.rs10
-rw-r--r--embassy-net-esp-hosted/src/lib.rs2
-rw-r--r--embassy-net-w5500/src/lib.rs2
-rw-r--r--embassy-net/src/lib.rs21
-rw-r--r--embassy-stm32-wpan/src/mac/driver.rs4
-rw-r--r--embassy-stm32/src/eth/mod.rs6
-rw-r--r--embassy-usb/src/class/cdc_ncm/embassy_net.rs5
-rw-r--r--examples/std/src/tuntap.rs5
11 files changed, 54 insertions, 26 deletions
diff --git a/cyw43/src/lib.rs b/cyw43/src/lib.rs
index fd11f3674..30a3d5f26 100644
--- a/cyw43/src/lib.rs
+++ b/cyw43/src/lib.rs
@@ -216,7 +216,7 @@ where
216 PWR: OutputPin, 216 PWR: OutputPin,
217 SPI: SpiBusCyw43, 217 SPI: SpiBusCyw43,
218{ 218{
219 let (ch_runner, device) = ch::new(&mut state.ch, [0; 6]); 219 let (ch_runner, device) = ch::new(&mut state.ch, ch::driver::HardwareAddress::Ethernet([0; 6]));
220 let state_ch = ch_runner.state_runner(); 220 let state_ch = ch_runner.state_runner();
221 221
222 let mut runner = Runner::new(ch_runner, Bus::new(pwr, spi), &state.ioctl_state, &state.events); 222 let mut runner = Runner::new(ch_runner, Bus::new(pwr, spi), &state.ioctl_state, &state.events);
diff --git a/embassy-net-driver-channel/src/lib.rs b/embassy-net-driver-channel/src/lib.rs
index 53b66afba..076238ba0 100644
--- a/embassy-net-driver-channel/src/lib.rs
+++ b/embassy-net-driver-channel/src/lib.rs
@@ -42,7 +42,7 @@ struct StateInner<'d, const MTU: usize> {
42struct Shared { 42struct Shared {
43 link_state: LinkState, 43 link_state: LinkState,
44 waker: WakerRegistration, 44 waker: WakerRegistration,
45 hardware_address: HardwareAddress, 45 hardware_address: driver::HardwareAddress,
46} 46}
47 47
48pub struct Runner<'d, const MTU: usize> { 48pub struct Runner<'d, const MTU: usize> {
@@ -85,7 +85,7 @@ impl<'d, const MTU: usize> Runner<'d, MTU> {
85 }); 85 });
86 } 86 }
87 87
88 pub fn set_hardware_address(&mut self, address: HardwareAddress) { 88 pub fn set_hardware_address(&mut self, address: driver::HardwareAddress) {
89 self.shared.lock(|s| { 89 self.shared.lock(|s| {
90 let s = &mut *s.borrow_mut(); 90 let s = &mut *s.borrow_mut();
91 s.hardware_address = address; 91 s.hardware_address = address;
@@ -150,7 +150,15 @@ impl<'d> StateRunner<'d> {
150 pub fn set_ethernet_address(&self, address: [u8; 6]) { 150 pub fn set_ethernet_address(&self, address: [u8; 6]) {
151 self.shared.lock(|s| { 151 self.shared.lock(|s| {
152 let s = &mut *s.borrow_mut(); 152 let s = &mut *s.borrow_mut();
153 s.ethernet_address = address; 153 s.hardware_address = driver::HardwareAddress::Ethernet(address);
154 s.waker.wake();
155 });
156 }
157
158 pub fn set_ieee802154_address(&self, address: [u8; 8]) {
159 self.shared.lock(|s| {
160 let s = &mut *s.borrow_mut();
161 s.hardware_address = driver::HardwareAddress::Ieee802154(address);
154 s.waker.wake(); 162 s.waker.wake();
155 }); 163 });
156 } 164 }
@@ -206,8 +214,7 @@ impl<'d, const MTU: usize> TxRunner<'d, MTU> {
206 214
207pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>( 215pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>(
208 state: &'d mut State<MTU, N_RX, N_TX>, 216 state: &'d mut State<MTU, N_RX, N_TX>,
209 ethernet_address: [u8; 6], 217 hardware_address: driver::HardwareAddress,
210 ieee802154_address: [u8; 8],
211) -> (Runner<'d, MTU>, Device<'d, MTU>) { 218) -> (Runner<'d, MTU>, Device<'d, MTU>) {
212 let mut caps = Capabilities::default(); 219 let mut caps = Capabilities::default();
213 caps.max_transmission_unit = MTU; 220 caps.max_transmission_unit = MTU;
@@ -223,8 +230,7 @@ pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>(
223 tx: zerocopy_channel::Channel::new(&mut state.tx[..]), 230 tx: zerocopy_channel::Channel::new(&mut state.tx[..]),
224 shared: Mutex::new(RefCell::new(Shared { 231 shared: Mutex::new(RefCell::new(Shared {
225 link_state: LinkState::Down, 232 link_state: LinkState::Down,
226 ethernet_address, 233 hardware_address,
227 ieee802154_address,
228 waker: WakerRegistration::new(), 234 waker: WakerRegistration::new(),
229 })), 235 })),
230 }); 236 });
@@ -291,7 +297,7 @@ impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> {
291 self.caps.clone() 297 self.caps.clone()
292 } 298 }
293 299
294 fn hardware_address(&self) -> HardwareAddress { 300 fn hardware_address(&self) -> driver::HardwareAddress {
295 self.shared.lock(|s| s.borrow().hardware_address) 301 self.shared.lock(|s| s.borrow().hardware_address)
296 } 302 }
297 303
diff --git a/embassy-net-driver/Cargo.toml b/embassy-net-driver/Cargo.toml
index 1af0d61b3..e25950b6b 100644
--- a/embassy-net-driver/Cargo.toml
+++ b/embassy-net-driver/Cargo.toml
@@ -22,4 +22,3 @@ features = ["defmt"]
22 22
23[dependencies] 23[dependencies]
24defmt = { version = "0.3", optional = true } 24defmt = { version = "0.3", optional = true }
25smoltcp = { version = "0.10", default-features = false }
diff --git a/embassy-net-driver/src/lib.rs b/embassy-net-driver/src/lib.rs
index 93a02e46c..ab17d1902 100644
--- a/embassy-net-driver/src/lib.rs
+++ b/embassy-net-driver/src/lib.rs
@@ -4,7 +4,15 @@
4 4
5use core::task::Context; 5use core::task::Context;
6 6
7use smoltcp::wire::HardwareAddress; 7/// Representation of an hardware address, such as an Ethernet address or an IEEE802.15.4 address.
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9#[cfg_attr(feature = "defmt", derive(defmt::Format))]
10pub enum HardwareAddress {
11 /// A six-octet Ethernet address
12 Ethernet([u8; 6]),
13 /// An eight-octet IEEE802.15.4 address
14 Ieee802154([u8; 8]),
15}
8 16
9/// Main `embassy-net` driver API. 17/// Main `embassy-net` driver API.
10/// 18///
diff --git a/embassy-net-esp-hosted/src/lib.rs b/embassy-net-esp-hosted/src/lib.rs
index a35adfca0..96fddce58 100644
--- a/embassy-net-esp-hosted/src/lib.rs
+++ b/embassy-net-esp-hosted/src/lib.rs
@@ -124,7 +124,7 @@ where
124 IN: InputPin + Wait, 124 IN: InputPin + Wait,
125 OUT: OutputPin, 125 OUT: OutputPin,
126{ 126{
127 let (ch_runner, device) = ch::new(&mut state.ch, [0; 6]); 127 let (ch_runner, device) = ch::new(&mut state.ch, ch::driver::HardwareAddress::Ethernet([0; 6]));
128 let state_ch = ch_runner.state_runner(); 128 let state_ch = ch_runner.state_runner();
129 129
130 let mut runner = Runner { 130 let mut runner = Runner {
diff --git a/embassy-net-w5500/src/lib.rs b/embassy-net-w5500/src/lib.rs
index efd9bed66..52494b443 100644
--- a/embassy-net-w5500/src/lib.rs
+++ b/embassy-net-w5500/src/lib.rs
@@ -96,7 +96,7 @@ pub async fn new<'a, const N_RX: usize, const N_TX: usize, SPI: SpiDevice, INT:
96 96
97 let mac = W5500::new(spi_dev, mac_addr).await.unwrap(); 97 let mac = W5500::new(spi_dev, mac_addr).await.unwrap();
98 98
99 let (runner, device) = ch::new(&mut state.ch_state, mac_addr); 99 let (runner, device) = ch::new(&mut state.ch_state, ch::driver::HardwareAddress::Ethernet(mac_addr));
100 ( 100 (
101 device, 101 device,
102 Runner { 102 Runner {
diff --git a/embassy-net/src/lib.rs b/embassy-net/src/lib.rs
index efd820a63..7587b46ff 100644
--- a/embassy-net/src/lib.rs
+++ b/embassy-net/src/lib.rs
@@ -230,6 +230,18 @@ pub(crate) struct SocketStack {
230 next_local_port: u16, 230 next_local_port: u16,
231} 231}
232 232
233fn to_smoltcp_hardware_address(addr: driver::HardwareAddress) -> HardwareAddress {
234 match addr {
235 #[cfg(feature = "medium-ethernet")]
236 driver::HardwareAddress::Ethernet(eth) => HardwareAddress::Ethernet(EthernetAddress(eth)),
237 #[cfg(feature = "medium-ieee802154")]
238 driver::HardwareAddress::Ieee802154(ieee) => HardwareAddress::Ieee802154(Ieee802154Address::Extended(ieee)),
239
240 #[allow(unreachable_patterns)]
241 _ => panic!("Unsupported address {:?}. Make sure to enable medium-ethernet or medium-ieee802154 in embassy-net's Cargo features.", addr),
242 }
243}
244
233impl<D: Driver + 'static> Stack<D> { 245impl<D: Driver + 'static> Stack<D> {
234 /// Create a new network stack. 246 /// Create a new network stack.
235 pub fn new<const SOCK: usize>( 247 pub fn new<const SOCK: usize>(
@@ -243,11 +255,11 @@ impl<D: Driver + 'static> Stack<D> {
243 255
244 let hardware_addr = match medium { 256 let hardware_addr = match medium {
245 #[cfg(feature = "medium-ethernet")] 257 #[cfg(feature = "medium-ethernet")]
246 Medium::Ethernet => device.hardware_address(), 258 Medium::Ethernet => to_smoltcp_hardware_address(device.hardware_address()),
247 #[cfg(feature = "medium-ip")] 259 #[cfg(feature = "medium-ip")]
248 Medium::Ip => HardwareAddress::Ip, 260 Medium::Ip => HardwareAddress::Ip,
249 #[cfg(feature = "medium-ieee802154")] 261 #[cfg(feature = "medium-ieee802154")]
250 Medium::Ieee802154 => device.hardware_address(), 262 Medium::Ieee802154 => to_smoltcp_hardware_address(device.hardware_address()),
251 #[allow(unreachable_patterns)] 263 #[allow(unreachable_patterns)]
252 _ => panic!( 264 _ => panic!(
253 "Unsupported medium {:?}. Make sure to enable it in embassy-net's Cargo features.", 265 "Unsupported medium {:?}. Make sure to enable it in embassy-net's Cargo features.",
@@ -338,7 +350,7 @@ impl<D: Driver + 'static> Stack<D> {
338 350
339 /// Get the hardware address of the network interface. 351 /// Get the hardware address of the network interface.
340 pub fn hardware_address(&self) -> HardwareAddress { 352 pub fn hardware_address(&self) -> HardwareAddress {
341 self.with(|_s, i| i.device.hardware_address()) 353 self.with(|_s, i| to_smoltcp_hardware_address(i.device.hardware_address()))
342 } 354 }
343 355
344 /// Get whether the link is up. 356 /// Get whether the link is up.
@@ -744,7 +756,8 @@ impl<D: Driver + 'static> Inner<D> {
744 if self.device.capabilities().medium == Medium::Ethernet 756 if self.device.capabilities().medium == Medium::Ethernet
745 || self.device.capabilities().medium == Medium::Ieee802154 757 || self.device.capabilities().medium == Medium::Ieee802154
746 { 758 {
747 s.iface.set_hardware_addr(self.device.hardware_address()); 759 s.iface
760 .set_hardware_addr(to_smoltcp_hardware_address(self.device.hardware_address()));
748 } 761 }
749 762
750 let timestamp = instant_to_smoltcp(Instant::now()); 763 let timestamp = instant_to_smoltcp(Instant::now());
diff --git a/embassy-stm32-wpan/src/mac/driver.rs b/embassy-stm32-wpan/src/mac/driver.rs
index 06ff0cf69..f8e3a2b08 100644
--- a/embassy-stm32-wpan/src/mac/driver.rs
+++ b/embassy-stm32-wpan/src/mac/driver.rs
@@ -3,7 +3,7 @@
3 3
4use core::task::Context; 4use core::task::Context;
5 5
6use embassy_net_driver::{Capabilities, LinkState, Medium}; 6use embassy_net_driver::{Capabilities, HardwareAddress, LinkState, Medium};
7use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; 7use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
8use embassy_sync::channel::Channel; 8use embassy_sync::channel::Channel;
9 9
@@ -76,7 +76,7 @@ impl<'d> embassy_net_driver::Driver for Driver<'d> {
76 fn hardware_address(&self) -> HardwareAddress { 76 fn hardware_address(&self) -> HardwareAddress {
77 // self.mac_addr 77 // self.mac_addr
78 78
79 HardwareAddress::Ethernet(EthernetAddress([0; 6])) 79 HardwareAddress::Ieee802154([0; 8])
80 } 80 }
81} 81}
82 82
diff --git a/embassy-stm32/src/eth/mod.rs b/embassy-stm32/src/eth/mod.rs
index 1687cb319..1e057235a 100644
--- a/embassy-stm32/src/eth/mod.rs
+++ b/embassy-stm32/src/eth/mod.rs
@@ -8,7 +8,7 @@ pub mod generic_smi;
8use core::mem::MaybeUninit; 8use core::mem::MaybeUninit;
9use core::task::Context; 9use core::task::Context;
10 10
11use embassy_net_driver::{Capabilities, LinkState}; 11use embassy_net_driver::{Capabilities, HardwareAddress, LinkState};
12use embassy_sync::waitqueue::AtomicWaker; 12use embassy_sync::waitqueue::AtomicWaker;
13 13
14pub use self::_version::{InterruptHandler, *}; 14pub use self::_version::{InterruptHandler, *};
@@ -88,8 +88,8 @@ impl<'d, T: Instance, P: PHY> embassy_net_driver::Driver for Ethernet<'d, T, P>
88 } 88 }
89 } 89 }
90 90
91 fn ethernet_address(&self) -> [u8; 6] { 91 fn hardware_address(&self) -> HardwareAddress {
92 self.mac_addr 92 HardwareAddress::Ethernet(self.mac_addr)
93 } 93 }
94} 94}
95 95
diff --git a/embassy-usb/src/class/cdc_ncm/embassy_net.rs b/embassy-usb/src/class/cdc_ncm/embassy_net.rs
index 670709021..57d322946 100644
--- a/embassy-usb/src/class/cdc_ncm/embassy_net.rs
+++ b/embassy-usb/src/class/cdc_ncm/embassy_net.rs
@@ -87,7 +87,10 @@ impl<'d, D: Driver<'d>> CdcNcmClass<'d, D> {
87 ethernet_address: [u8; 6], 87 ethernet_address: [u8; 6],
88 ) -> (Runner<'d, D, MTU>, Device<'d, MTU>) { 88 ) -> (Runner<'d, D, MTU>, Device<'d, MTU>) {
89 let (tx_usb, rx_usb) = self.split(); 89 let (tx_usb, rx_usb) = self.split();
90 let (runner, device) = ch::new(&mut state.ch_state, ethernet_address); 90 let (runner, device) = ch::new(
91 &mut state.ch_state,
92 ch::driver::HardwareAddress::Ethernet(ethernet_address),
93 );
91 94
92 ( 95 (
93 Runner { 96 Runner {
diff --git a/examples/std/src/tuntap.rs b/examples/std/src/tuntap.rs
index 932bdaf96..167c3da5f 100644
--- a/examples/std/src/tuntap.rs
+++ b/examples/std/src/tuntap.rs
@@ -4,8 +4,7 @@ use std::os::unix::io::{AsRawFd, RawFd};
4use std::task::Context; 4use std::task::Context;
5 5
6use async_io::Async; 6use async_io::Async;
7use embassy_net::HardwareAddress; 7use embassy_net_driver::{self, Capabilities, Driver, HardwareAddress, LinkState};
8use embassy_net_driver::{self, Capabilities, Driver, LinkState};
9use log::*; 8use log::*;
10 9
11pub const SIOCGIFMTU: libc::c_ulong = 0x8921; 10pub const SIOCGIFMTU: libc::c_ulong = 0x8921;
@@ -182,7 +181,7 @@ impl Driver for TunTapDevice {
182 } 181 }
183 182
184 fn hardware_address(&self) -> HardwareAddress { 183 fn hardware_address(&self) -> HardwareAddress {
185 HardwareAddress::Ethernet(EthernetAddress([0x02, 0x03, 0x04, 0x05, 0x06, 0x07])) 184 HardwareAddress::Ethernet([0x02, 0x03, 0x04, 0x05, 0x06, 0x07])
186 } 185 }
187} 186}
188 187