diff options
| -rw-r--r-- | cyw43/src/lib.rs | 2 | ||||
| -rw-r--r-- | embassy-net-driver-channel/src/lib.rs | 22 | ||||
| -rw-r--r-- | embassy-net-driver/Cargo.toml | 1 | ||||
| -rw-r--r-- | embassy-net-driver/src/lib.rs | 10 | ||||
| -rw-r--r-- | embassy-net-esp-hosted/src/lib.rs | 2 | ||||
| -rw-r--r-- | embassy-net-w5500/src/lib.rs | 2 | ||||
| -rw-r--r-- | embassy-net/src/lib.rs | 21 | ||||
| -rw-r--r-- | embassy-stm32-wpan/src/mac/driver.rs | 4 | ||||
| -rw-r--r-- | embassy-stm32/src/eth/mod.rs | 6 | ||||
| -rw-r--r-- | embassy-usb/src/class/cdc_ncm/embassy_net.rs | 5 | ||||
| -rw-r--r-- | examples/std/src/tuntap.rs | 5 |
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> { | |||
| 42 | struct Shared { | 42 | struct 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 | ||
| 48 | pub struct Runner<'d, const MTU: usize> { | 48 | pub 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 | ||
| 207 | pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>( | 215 | pub 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] |
| 24 | defmt = { version = "0.3", optional = true } | 24 | defmt = { version = "0.3", optional = true } |
| 25 | smoltcp = { 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 | ||
| 5 | use core::task::Context; | 5 | use core::task::Context; |
| 6 | 6 | ||
| 7 | use 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))] | ||
| 10 | pub 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 | ||
| 233 | fn 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 | |||
| 233 | impl<D: Driver + 'static> Stack<D> { | 245 | impl<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 | ||
| 4 | use core::task::Context; | 4 | use core::task::Context; |
| 5 | 5 | ||
| 6 | use embassy_net_driver::{Capabilities, LinkState, Medium}; | 6 | use embassy_net_driver::{Capabilities, HardwareAddress, LinkState, Medium}; |
| 7 | use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; | 7 | use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; |
| 8 | use embassy_sync::channel::Channel; | 8 | use 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; | |||
| 8 | use core::mem::MaybeUninit; | 8 | use core::mem::MaybeUninit; |
| 9 | use core::task::Context; | 9 | use core::task::Context; |
| 10 | 10 | ||
| 11 | use embassy_net_driver::{Capabilities, LinkState}; | 11 | use embassy_net_driver::{Capabilities, HardwareAddress, LinkState}; |
| 12 | use embassy_sync::waitqueue::AtomicWaker; | 12 | use embassy_sync::waitqueue::AtomicWaker; |
| 13 | 13 | ||
| 14 | pub use self::_version::{InterruptHandler, *}; | 14 | pub 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}; | |||
| 4 | use std::task::Context; | 4 | use std::task::Context; |
| 5 | 5 | ||
| 6 | use async_io::Async; | 6 | use async_io::Async; |
| 7 | use embassy_net::HardwareAddress; | 7 | use embassy_net_driver::{self, Capabilities, Driver, HardwareAddress, LinkState}; |
| 8 | use embassy_net_driver::{self, Capabilities, Driver, LinkState}; | ||
| 9 | use log::*; | 8 | use log::*; |
| 10 | 9 | ||
| 11 | pub const SIOCGIFMTU: libc::c_ulong = 0x8921; | 10 | pub 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 | ||
