aboutsummaryrefslogtreecommitdiff
path: root/embassy-net
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-01-19 14:41:39 +0100
committerDario Nieuwenhuis <[email protected]>2023-01-19 14:44:01 +0100
commit78c2c1709b8c111468fd7dd2ec1f3792d2fcea67 (patch)
tree8549000f6edc66d860de44b7400d62a27c674d4f /embassy-net
parentfe15a7beee5f948b1e4c1cb8ab8e5cc85efb4662 (diff)
net: update smoltcp.
Diffstat (limited to 'embassy-net')
-rw-r--r--embassy-net/Cargo.toml2
-rw-r--r--embassy-net/src/lib.rs42
2 files changed, 21 insertions, 23 deletions
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" }
51[dependencies.smoltcp] 51[dependencies.smoltcp]
52version = "0.8.0" 52version = "0.8.0"
53git = "https://github.com/smoltcp-rs/smoltcp" 53git = "https://github.com/smoltcp-rs/smoltcp"
54rev = "7b631c27cefe9b29e322a507c076b4156f477ee2" 54rev = "5740b765749b95c18aace5de8dc21cab75ba33d4"
55default-features = false 55default-features = false
56features = [ 56features = [
57 "proto-ipv4", 57 "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;
23use embassy_time::{Instant, Timer}; 23use embassy_time::{Instant, Timer};
24use futures::pin_mut; 24use futures::pin_mut;
25use heapless::Vec; 25use heapless::Vec;
26#[cfg(feature = "medium-ethernet")]
27use smoltcp::iface::Routes;
28#[cfg(feature = "dhcpv4")] 26#[cfg(feature = "dhcpv4")]
29use smoltcp::iface::SocketHandle; 27use smoltcp::iface::SocketHandle;
30use smoltcp::iface::{Interface, InterfaceBuilder, SocketSet, SocketStorage}; 28use smoltcp::iface::{Interface, SocketSet, SocketStorage};
31#[cfg(feature = "dhcpv4")] 29#[cfg(feature = "dhcpv4")]
32use smoltcp::socket::dhcpv4; 30use smoltcp::socket::dhcpv4;
33use smoltcp::socket::dhcpv4::RetryConfig; 31use smoltcp::socket::dhcpv4::RetryConfig;
@@ -111,7 +109,7 @@ struct Inner<D: Driver> {
111 109
112pub(crate) struct SocketStack { 110pub(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