diff --git a/embassy-net/Cargo.toml b/embassy-net/Cargo.toml index a2ef3b4fe..15cbb5954 100644 --- a/embassy-net/Cargo.toml +++ b/embassy-net/Cargo.toml @@ -51,7 +51,7 @@ atomic-polyfill = { version = "1.0" } [dependencies.smoltcp] version = "0.8.0" git = "https://github.com/smoltcp-rs/smoltcp" -rev = "7b631c27cefe9b29e322a507c076b4156f477ee2" +rev = "5740b765749b95c18aace5de8dc21cab75ba33d4" default-features = false features = [ "proto-ipv4", diff --git a/embassy-net/src/lib.rs b/embassy-net/src/lib.rs index b8e766b8b..8d0119f67 100644 --- a/embassy-net/src/lib.rs +++ b/embassy-net/src/lib.rs @@ -23,11 +23,9 @@ use embassy_sync::waitqueue::WakerRegistration; use embassy_time::{Instant, Timer}; use futures::pin_mut; use heapless::Vec; -#[cfg(feature = "medium-ethernet")] -use smoltcp::iface::Routes; #[cfg(feature = "dhcpv4")] use smoltcp::iface::SocketHandle; -use smoltcp::iface::{Interface, InterfaceBuilder, SocketSet, SocketStorage}; +use smoltcp::iface::{Interface, SocketSet, SocketStorage}; #[cfg(feature = "dhcpv4")] use smoltcp::socket::dhcpv4; use smoltcp::socket::dhcpv4::RetryConfig; @@ -111,7 +109,7 @@ struct Inner { pub(crate) struct SocketStack { pub(crate) sockets: SocketSet<'static>, - pub(crate) iface: Interface<'static>, + pub(crate) iface: Interface, pub(crate) waker: WakerRegistration, next_local_port: u16, } @@ -126,19 +124,20 @@ impl Stack { #[cfg(feature = "medium-ethernet")] let medium = device.capabilities().medium; - let mut b = InterfaceBuilder::new(); - b = b.random_seed(random_seed); - + let mut iface_cfg = smoltcp::iface::Config::new(); + iface_cfg.random_seed = random_seed; #[cfg(feature = "medium-ethernet")] if medium == Medium::Ethernet { - b = b.hardware_addr(HardwareAddress::Ethernet(EthernetAddress(device.ethernet_address()))); - b = b.routes(Routes::new()); + iface_cfg.hardware_addr = Some(HardwareAddress::Ethernet(EthernetAddress(device.ethernet_address()))); } - let iface = b.finalize(&mut DriverAdapter { - inner: &mut device, - cx: None, - }); + let iface = Interface::new( + iface_cfg, + &mut DriverAdapter { + inner: &mut device, + cx: None, + }, + ); let sockets = SocketSet::new(&mut resources.sockets[..]); @@ -226,7 +225,13 @@ impl Inner { debug!("Acquired IP configuration:"); debug!(" IP address: {}", config.address); - self.set_ipv4_addr(s, config.address); + s.iface.update_ip_addrs(|addrs| { + if addrs.is_empty() { + addrs.push(IpCidr::Ipv4(config.address)).unwrap(); + } else { + addrs[0] = IpCidr::Ipv4(config.address); + } + }); #[cfg(feature = "medium-ethernet")] if medium == Medium::Ethernet { @@ -258,7 +263,7 @@ impl Inner { let medium = self.device.capabilities().medium; debug!("Lost IP configuration"); - self.set_ipv4_addr(s, Ipv4Cidr::new(Ipv4Address::UNSPECIFIED, 0)); + s.iface.update_ip_addrs(|ip_addrs| ip_addrs.clear()); #[cfg(feature = "medium-ethernet")] if medium == Medium::Ethernet { s.iface.routes_mut().remove_default_ipv4_route(); @@ -266,13 +271,6 @@ impl Inner { self.config = None } - fn set_ipv4_addr(&mut self, s: &mut SocketStack, cidr: Ipv4Cidr) { - s.iface.update_ip_addrs(|addrs| { - let dest = addrs.iter_mut().next().unwrap(); - *dest = IpCidr::Ipv4(cidr); - }); - } - fn poll(&mut self, cx: &mut Context<'_>, s: &mut SocketStack) { s.waker.register(cx.waker());