diff --git a/embassy-net/Cargo.toml b/embassy-net/Cargo.toml index 6b346828..6eea8c30 100644 --- a/embassy-net/Cargo.toml +++ b/embassy-net/Cargo.toml @@ -40,6 +40,7 @@ smoltcp = { version = "0.9.0", default-features = false, features = [ ]} embassy-net-driver = { version = "0.1.0", path = "../embassy-net-driver" } +embassy-hal-common = { version = "0.1.0", path = "../embassy-hal-common" } embassy-time = { version = "0.1.0", path = "../embassy-time" } embassy-sync = { version = "0.1.0", path = "../embassy-sync" } embedded-io = { version = "0.4.0", optional = true } diff --git a/embassy-net/src/dns.rs b/embassy-net/src/dns.rs index f18750cc..2d2e7b79 100644 --- a/embassy-net/src/dns.rs +++ b/embassy-net/src/dns.rs @@ -11,6 +11,7 @@ use smoltcp::iface::{Interface, SocketHandle}; pub use smoltcp::socket::dns::DnsQuery; use smoltcp::socket::dns::{self, GetQueryResultError, StartQueryError, MAX_ADDRESS_COUNT}; pub use smoltcp::wire::{DnsQueryType, IpAddress}; +use embassy_hal_common::drop::OnDrop; use crate::{SocketStack, Stack}; @@ -93,7 +94,15 @@ impl<'a> DnsSocket<'a> { Err(e) => return Err(e.into()), }; - poll_fn(|cx| { + let handle = self.handle; + let drop = OnDrop::new(|| { + let s = &mut *self.stack.borrow_mut(); + let socket = s.sockets.get_mut::(handle); + socket.cancel_query(query); + s.waker.wake(); + }); + + let res = poll_fn(|cx| { self.with_mut(|s, _| match s.get_query_result(query) { Ok(addrs) => Poll::Ready(Ok(addrs)), Err(GetQueryResultError::Pending) => { @@ -103,7 +112,10 @@ impl<'a> DnsSocket<'a> { Err(e) => Poll::Ready(Err(e.into())), }) }) - .await + .await; + + drop.defuse(); + res } }