aboutsummaryrefslogtreecommitdiff
path: root/embassy-net
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-10-16 23:41:58 +0200
committerDario Nieuwenhuis <[email protected]>2023-10-18 05:28:16 +0200
commit3cbc6874247d7b814cab8ec8762bfe2f6f385828 (patch)
treeaac4c615c816f6465559874a98c9d3cf60c21817 /embassy-net
parent51708c8ed1962618ac7bc244a3f5e7ceced28182 (diff)
net/driver: remove Medium, make HardwareAddress non_exhaustive.
Diffstat (limited to 'embassy-net')
-rw-r--r--embassy-net/CHANGELOG.md4
-rw-r--r--embassy-net/src/device.rs19
-rw-r--r--embassy-net/src/lib.rs36
3 files changed, 31 insertions, 28 deletions
diff --git a/embassy-net/CHANGELOG.md b/embassy-net/CHANGELOG.md
index 3e7c28772..7b91b844b 100644
--- a/embassy-net/CHANGELOG.md
+++ b/embassy-net/CHANGELOG.md
@@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
5The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 5The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 6and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7 7
8## 0.2.0 - 2023-10-15 8## 0.2.0 - 2023-10-18
9 9
10- Re-export `smoltcp::wire::IpEndpoint` 10- Re-export `smoltcp::wire::IpEndpoint`
11- Add poll functions on UdpSocket 11- Add poll functions on UdpSocket
@@ -27,5 +27,3 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
27## 0.1.0 - 2023-06-29 27## 0.1.0 - 2023-06-29
28 28
29- First release 29- First release
30
31
diff --git a/embassy-net/src/device.rs b/embassy-net/src/device.rs
index 8c2b7d31a..54a0c47e8 100644
--- a/embassy-net/src/device.rs
+++ b/embassy-net/src/device.rs
@@ -1,7 +1,7 @@
1use core::task::Context; 1use core::task::Context;
2 2
3use embassy_net_driver::{Capabilities, Checksum, Driver, Medium, RxToken, TxToken}; 3use embassy_net_driver::{Capabilities, Checksum, Driver, RxToken, TxToken};
4use smoltcp::phy; 4use smoltcp::phy::{self, Medium};
5use smoltcp::time::Instant; 5use smoltcp::time::Instant;
6 6
7pub(crate) struct DriverAdapter<'d, 'c, T> 7pub(crate) struct DriverAdapter<'d, 'c, T>
@@ -11,6 +11,7 @@ where
11 // must be Some when actually using this to rx/tx 11 // must be Some when actually using this to rx/tx
12 pub cx: Option<&'d mut Context<'c>>, 12 pub cx: Option<&'d mut Context<'c>>,
13 pub inner: &'d mut T, 13 pub inner: &'d mut T,
14 pub medium: Medium,
14} 15}
15 16
16impl<'d, 'c, T> phy::Device for DriverAdapter<'d, 'c, T> 17impl<'d, 'c, T> phy::Device for DriverAdapter<'d, 'c, T>
@@ -46,19 +47,7 @@ where
46 47
47 smolcaps.max_transmission_unit = caps.max_transmission_unit; 48 smolcaps.max_transmission_unit = caps.max_transmission_unit;
48 smolcaps.max_burst_size = caps.max_burst_size; 49 smolcaps.max_burst_size = caps.max_burst_size;
49 smolcaps.medium = match caps.medium { 50 smolcaps.medium = self.medium;
50 #[cfg(feature = "medium-ethernet")]
51 Medium::Ethernet => phy::Medium::Ethernet,
52 #[cfg(feature = "medium-ip")]
53 Medium::Ip => phy::Medium::Ip,
54 #[cfg(feature = "medium-ieee802154")]
55 Medium::Ieee802154 => phy::Medium::Ieee802154,
56 #[allow(unreachable_patterns)]
57 _ => panic!(
58 "Unsupported medium {:?}. Make sure to enable it in embassy-net's Cargo features.",
59 caps.medium
60 ),
61 };
62 smolcaps.checksum.ipv4 = convert(caps.checksum.ipv4); 51 smolcaps.checksum.ipv4 = convert(caps.checksum.ipv4);
63 smolcaps.checksum.tcp = convert(caps.checksum.tcp); 52 smolcaps.checksum.tcp = convert(caps.checksum.tcp);
64 smolcaps.checksum.udp = convert(caps.checksum.udp); 53 smolcaps.checksum.udp = convert(caps.checksum.udp);
diff --git a/embassy-net/src/lib.rs b/embassy-net/src/lib.rs
index a0ad33c6b..c41faee2f 100644
--- a/embassy-net/src/lib.rs
+++ b/embassy-net/src/lib.rs
@@ -33,6 +33,7 @@ use heapless::Vec;
33pub use smoltcp::iface::MulticastError; 33pub use smoltcp::iface::MulticastError;
34#[allow(unused_imports)] 34#[allow(unused_imports)]
35use smoltcp::iface::{Interface, SocketHandle, SocketSet, SocketStorage}; 35use smoltcp::iface::{Interface, SocketHandle, SocketSet, SocketStorage};
36use smoltcp::phy::Medium;
36#[cfg(feature = "dhcpv4")] 37#[cfg(feature = "dhcpv4")]
37use smoltcp::socket::dhcpv4::{self, RetryConfig}; 38use smoltcp::socket::dhcpv4::{self, RetryConfig};
38#[cfg(feature = "medium-ethernet")] 39#[cfg(feature = "medium-ethernet")]
@@ -264,14 +265,17 @@ pub(crate) struct SocketStack {
264 next_local_port: u16, 265 next_local_port: u16,
265} 266}
266 267
267fn to_smoltcp_hardware_address(addr: driver::HardwareAddress) -> HardwareAddress { 268fn to_smoltcp_hardware_address(addr: driver::HardwareAddress) -> (HardwareAddress, Medium) {
268 match addr { 269 match addr {
269 #[cfg(feature = "medium-ethernet")] 270 #[cfg(feature = "medium-ethernet")]
270 driver::HardwareAddress::Ethernet(eth) => HardwareAddress::Ethernet(EthernetAddress(eth)), 271 driver::HardwareAddress::Ethernet(eth) => (HardwareAddress::Ethernet(EthernetAddress(eth)), Medium::Ethernet),
271 #[cfg(feature = "medium-ieee802154")] 272 #[cfg(feature = "medium-ieee802154")]
272 driver::HardwareAddress::Ieee802154(ieee) => HardwareAddress::Ieee802154(Ieee802154Address::Extended(ieee)), 273 driver::HardwareAddress::Ieee802154(ieee) => (
274 HardwareAddress::Ieee802154(Ieee802154Address::Extended(ieee)),
275 Medium::Ieee802154,
276 ),
273 #[cfg(feature = "medium-ip")] 277 #[cfg(feature = "medium-ip")]
274 driver::HardwareAddress::Ip => HardwareAddress::Ip, 278 driver::HardwareAddress::Ip => (HardwareAddress::Ip, Medium::Ip),
275 279
276 #[allow(unreachable_patterns)] 280 #[allow(unreachable_patterns)]
277 _ => panic!( 281 _ => panic!(
@@ -289,7 +293,8 @@ impl<D: Driver> Stack<D> {
289 resources: &'static mut StackResources<SOCK>, 293 resources: &'static mut StackResources<SOCK>,
290 random_seed: u64, 294 random_seed: u64,
291 ) -> Self { 295 ) -> Self {
292 let mut iface_cfg = smoltcp::iface::Config::new(to_smoltcp_hardware_address(device.hardware_address())); 296 let (hardware_addr, medium) = to_smoltcp_hardware_address(device.hardware_address());
297 let mut iface_cfg = smoltcp::iface::Config::new(hardware_addr);
293 iface_cfg.random_seed = random_seed; 298 iface_cfg.random_seed = random_seed;
294 299
295 let iface = Interface::new( 300 let iface = Interface::new(
@@ -297,6 +302,7 @@ impl<D: Driver> Stack<D> {
297 &mut DriverAdapter { 302 &mut DriverAdapter {
298 inner: &mut device, 303 inner: &mut device,
299 cx: None, 304 cx: None,
305 medium,
300 }, 306 },
301 instant_to_smoltcp(Instant::now()), 307 instant_to_smoltcp(Instant::now()),
302 ); 308 );
@@ -356,7 +362,7 @@ impl<D: Driver> Stack<D> {
356 362
357 /// Get the hardware address of the network interface. 363 /// Get the hardware address of the network interface.
358 pub fn hardware_address(&self) -> HardwareAddress { 364 pub fn hardware_address(&self) -> HardwareAddress {
359 self.with(|_s, i| to_smoltcp_hardware_address(i.device.hardware_address())) 365 self.with(|_s, i| to_smoltcp_hardware_address(i.device.hardware_address()).0)
360 } 366 }
361 367
362 /// Get whether the link is up. 368 /// Get whether the link is up.
@@ -812,18 +818,28 @@ impl<D: Driver> Inner<D> {
812 fn poll(&mut self, cx: &mut Context<'_>, s: &mut SocketStack) { 818 fn poll(&mut self, cx: &mut Context<'_>, s: &mut SocketStack) {
813 s.waker.register(cx.waker()); 819 s.waker.register(cx.waker());
814 820
821 let (_hardware_addr, medium) = to_smoltcp_hardware_address(self.device.hardware_address());
822
815 #[cfg(any(feature = "medium-ethernet", feature = "medium-ieee802154"))] 823 #[cfg(any(feature = "medium-ethernet", feature = "medium-ieee802154"))]
816 if self.device.capabilities().medium == embassy_net_driver::Medium::Ethernet
817 || self.device.capabilities().medium == embassy_net_driver::Medium::Ieee802154
818 { 824 {
819 s.iface 825 let do_set = match medium {
820 .set_hardware_addr(to_smoltcp_hardware_address(self.device.hardware_address())); 826 #[cfg(feature = "medium-ethernet")]
827 Medium::Ethernet => true,
828 #[cfg(feature = "medium-ieee802154")]
829 Medium::Ieee802154 => true,
830 #[allow(unreachable_patterns)]
831 _ => false,
832 };
833 if do_set {
834 s.iface.set_hardware_addr(_hardware_addr);
835 }
821 } 836 }
822 837
823 let timestamp = instant_to_smoltcp(Instant::now()); 838 let timestamp = instant_to_smoltcp(Instant::now());
824 let mut smoldev = DriverAdapter { 839 let mut smoldev = DriverAdapter {
825 cx: Some(cx), 840 cx: Some(cx),
826 inner: &mut self.device, 841 inner: &mut self.device,
842 medium,
827 }; 843 };
828 s.iface.poll(timestamp, &mut smoldev, &mut s.sockets); 844 s.iface.poll(timestamp, &mut smoldev, &mut s.sockets);
829 845