diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-01-19 14:41:39 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2023-01-19 14:44:01 +0100 |
| commit | 78c2c1709b8c111468fd7dd2ec1f3792d2fcea67 (patch) | |
| tree | 8549000f6edc66d860de44b7400d62a27c674d4f /embassy-net/src | |
| parent | fe15a7beee5f948b1e4c1cb8ab8e5cc85efb4662 (diff) | |
net: update smoltcp.
Diffstat (limited to 'embassy-net/src')
| -rw-r--r-- | embassy-net/src/lib.rs | 42 |
1 files changed, 20 insertions, 22 deletions
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; | |||
| 23 | use embassy_time::{Instant, Timer}; | 23 | use embassy_time::{Instant, Timer}; |
| 24 | use futures::pin_mut; | 24 | use futures::pin_mut; |
| 25 | use heapless::Vec; | 25 | use heapless::Vec; |
| 26 | #[cfg(feature = "medium-ethernet")] | ||
| 27 | use smoltcp::iface::Routes; | ||
| 28 | #[cfg(feature = "dhcpv4")] | 26 | #[cfg(feature = "dhcpv4")] |
| 29 | use smoltcp::iface::SocketHandle; | 27 | use smoltcp::iface::SocketHandle; |
| 30 | use smoltcp::iface::{Interface, InterfaceBuilder, SocketSet, SocketStorage}; | 28 | use smoltcp::iface::{Interface, SocketSet, SocketStorage}; |
| 31 | #[cfg(feature = "dhcpv4")] | 29 | #[cfg(feature = "dhcpv4")] |
| 32 | use smoltcp::socket::dhcpv4; | 30 | use smoltcp::socket::dhcpv4; |
| 33 | use smoltcp::socket::dhcpv4::RetryConfig; | 31 | use smoltcp::socket::dhcpv4::RetryConfig; |
| @@ -111,7 +109,7 @@ struct Inner<D: Driver> { | |||
| 111 | 109 | ||
| 112 | pub(crate) struct SocketStack { | 110 | pub(crate) struct SocketStack { |
| 113 | pub(crate) sockets: SocketSet<'static>, | 111 | pub(crate) sockets: SocketSet<'static>, |
| 114 | pub(crate) iface: Interface<'static>, | 112 | pub(crate) iface: Interface, |
| 115 | pub(crate) waker: WakerRegistration, | 113 | pub(crate) waker: WakerRegistration, |
| 116 | next_local_port: u16, | 114 | next_local_port: u16, |
| 117 | } | 115 | } |
| @@ -126,19 +124,20 @@ impl<D: Driver + 'static> Stack<D> { | |||
| 126 | #[cfg(feature = "medium-ethernet")] | 124 | #[cfg(feature = "medium-ethernet")] |
| 127 | let medium = device.capabilities().medium; | 125 | let medium = device.capabilities().medium; |
| 128 | 126 | ||
| 129 | let mut b = InterfaceBuilder::new(); | 127 | let mut iface_cfg = smoltcp::iface::Config::new(); |
| 130 | b = b.random_seed(random_seed); | 128 | iface_cfg.random_seed = random_seed; |
| 131 | |||
| 132 | #[cfg(feature = "medium-ethernet")] | 129 | #[cfg(feature = "medium-ethernet")] |
| 133 | if medium == Medium::Ethernet { | 130 | if medium == Medium::Ethernet { |
| 134 | b = b.hardware_addr(HardwareAddress::Ethernet(EthernetAddress(device.ethernet_address()))); | 131 | iface_cfg.hardware_addr = Some(HardwareAddress::Ethernet(EthernetAddress(device.ethernet_address()))); |
| 135 | b = b.routes(Routes::new()); | ||
| 136 | } | 132 | } |
| 137 | 133 | ||
| 138 | let iface = b.finalize(&mut DriverAdapter { | 134 | let iface = Interface::new( |
| 139 | inner: &mut device, | 135 | iface_cfg, |
| 140 | cx: None, | 136 | &mut DriverAdapter { |
| 141 | }); | 137 | inner: &mut device, |
| 138 | cx: None, | ||
| 139 | }, | ||
| 140 | ); | ||
| 142 | 141 | ||
| 143 | let sockets = SocketSet::new(&mut resources.sockets[..]); | 142 | let sockets = SocketSet::new(&mut resources.sockets[..]); |
| 144 | 143 | ||
| @@ -226,7 +225,13 @@ impl<D: Driver + 'static> Inner<D> { | |||
| 226 | debug!("Acquired IP configuration:"); | 225 | debug!("Acquired IP configuration:"); |
| 227 | 226 | ||
| 228 | debug!(" IP address: {}", config.address); | 227 | debug!(" IP address: {}", config.address); |
| 229 | self.set_ipv4_addr(s, config.address); | 228 | s.iface.update_ip_addrs(|addrs| { |
| 229 | if addrs.is_empty() { | ||
| 230 | addrs.push(IpCidr::Ipv4(config.address)).unwrap(); | ||
| 231 | } else { | ||
| 232 | addrs[0] = IpCidr::Ipv4(config.address); | ||
| 233 | } | ||
| 234 | }); | ||
| 230 | 235 | ||
| 231 | #[cfg(feature = "medium-ethernet")] | 236 | #[cfg(feature = "medium-ethernet")] |
| 232 | if medium == Medium::Ethernet { | 237 | if medium == Medium::Ethernet { |
| @@ -258,7 +263,7 @@ impl<D: Driver + 'static> Inner<D> { | |||
| 258 | let medium = self.device.capabilities().medium; | 263 | let medium = self.device.capabilities().medium; |
| 259 | 264 | ||
| 260 | debug!("Lost IP configuration"); | 265 | debug!("Lost IP configuration"); |
| 261 | self.set_ipv4_addr(s, Ipv4Cidr::new(Ipv4Address::UNSPECIFIED, 0)); | 266 | s.iface.update_ip_addrs(|ip_addrs| ip_addrs.clear()); |
| 262 | #[cfg(feature = "medium-ethernet")] | 267 | #[cfg(feature = "medium-ethernet")] |
| 263 | if medium == Medium::Ethernet { | 268 | if medium == Medium::Ethernet { |
| 264 | s.iface.routes_mut().remove_default_ipv4_route(); | 269 | s.iface.routes_mut().remove_default_ipv4_route(); |
| @@ -266,13 +271,6 @@ impl<D: Driver + 'static> Inner<D> { | |||
| 266 | self.config = None | 271 | self.config = None |
| 267 | } | 272 | } |
| 268 | 273 | ||
| 269 | fn set_ipv4_addr(&mut self, s: &mut SocketStack, cidr: Ipv4Cidr) { | ||
| 270 | s.iface.update_ip_addrs(|addrs| { | ||
| 271 | let dest = addrs.iter_mut().next().unwrap(); | ||
| 272 | *dest = IpCidr::Ipv4(cidr); | ||
| 273 | }); | ||
| 274 | } | ||
| 275 | |||
| 276 | fn poll(&mut self, cx: &mut Context<'_>, s: &mut SocketStack) { | 274 | fn poll(&mut self, cx: &mut Context<'_>, s: &mut SocketStack) { |
| 277 | s.waker.register(cx.waker()); | 275 | s.waker.register(cx.waker()); |
| 278 | 276 | ||
