aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Lilleengen <[email protected]>2023-02-10 18:30:17 +0100
committerUlf Lilleengen <[email protected]>2023-02-10 18:30:17 +0100
commit6e68353a931cc268f61b4606c3a99bf8f5e96f6e (patch)
tree5ea5ab8676515b0b71eba5897bda26c0f49db06b
parent7ae47cb1d81d5112fdc42ceaec470350aab5c372 (diff)
attempt removing option
-rw-r--r--embassy-net/src/lib.rs74
1 files changed, 27 insertions, 47 deletions
diff --git a/embassy-net/src/lib.rs b/embassy-net/src/lib.rs
index 5b6ab0e3a..627c0a0f7 100644
--- a/embassy-net/src/lib.rs
+++ b/embassy-net/src/lib.rs
@@ -53,7 +53,7 @@ const MAX_QUERIES: usize = 2;
53pub struct StackResources<const SOCK: usize> { 53pub struct StackResources<const SOCK: usize> {
54 sockets: [SocketStorage<'static>; SOCK], 54 sockets: [SocketStorage<'static>; SOCK],
55 #[cfg(feature = "dns")] 55 #[cfg(feature = "dns")]
56 queries: Option<[Option<dns::DnsQuery>; MAX_QUERIES]>, 56 queries: [Option<dns::DnsQuery>; MAX_QUERIES],
57} 57}
58 58
59impl<const SOCK: usize> StackResources<SOCK> { 59impl<const SOCK: usize> StackResources<SOCK> {
@@ -63,7 +63,7 @@ impl<const SOCK: usize> StackResources<SOCK> {
63 Self { 63 Self {
64 sockets: [SocketStorage::EMPTY; SOCK], 64 sockets: [SocketStorage::EMPTY; SOCK],
65 #[cfg(feature = "dns")] 65 #[cfg(feature = "dns")]
66 queries: Some([INIT; MAX_QUERIES]), 66 queries: [INIT; MAX_QUERIES],
67 } 67 }
68 } 68 }
69} 69}
@@ -117,7 +117,7 @@ struct Inner<D: Driver> {
117 #[cfg(feature = "dhcpv4")] 117 #[cfg(feature = "dhcpv4")]
118 dhcp_socket: Option<SocketHandle>, 118 dhcp_socket: Option<SocketHandle>,
119 #[cfg(feature = "dns")] 119 #[cfg(feature = "dns")]
120 dns_socket: Option<SocketHandle>, 120 dns_socket: SocketHandle,
121} 121}
122 122
123pub(crate) struct SocketStack { 123pub(crate) struct SocketStack {
@@ -156,6 +156,14 @@ impl<D: Driver + 'static> Stack<D> {
156 156
157 let next_local_port = (random_seed % (LOCAL_PORT_MAX - LOCAL_PORT_MIN) as u64) as u16 + LOCAL_PORT_MIN; 157 let next_local_port = (random_seed % (LOCAL_PORT_MAX - LOCAL_PORT_MIN) as u64) as u16 + LOCAL_PORT_MIN;
158 158
159
160 let mut socket = SocketStack {
161 sockets,
162 iface,
163 waker: WakerRegistration::new(),
164 next_local_port,
165 };
166
159 let mut inner = Inner { 167 let mut inner = Inner {
160 device, 168 device,
161 link_up: false, 169 link_up: false,
@@ -163,21 +171,8 @@ impl<D: Driver + 'static> Stack<D> {
163 #[cfg(feature = "dhcpv4")] 171 #[cfg(feature = "dhcpv4")]
164 dhcp_socket: None, 172 dhcp_socket: None,
165 #[cfg(feature = "dns")] 173 #[cfg(feature = "dns")]
166 dns_socket: None, 174 dns_socket: socket.sockets.add(dns::Socket::new(&[], &mut resources.queries)),
167 }; 175 };
168 let mut socket = SocketStack {
169 sockets,
170 iface,
171 waker: WakerRegistration::new(),
172 next_local_port,
173 };
174
175 #[cfg(feature = "dns")]
176 {
177 if let Some(queries) = resources.queries.take() {
178 inner.dns_socket = Some(socket.sockets.add(dns::Socket::new(&[], queries)));
179 }
180 }
181 176
182 match config { 177 match config {
183 Config::Static(config) => { 178 Config::Static(config) => {
@@ -235,42 +230,29 @@ impl<D: Driver + 'static> Stack<D> {
235 #[cfg(feature = "dns")] 230 #[cfg(feature = "dns")]
236 pub async fn dns_query(&self, name: &str, qtype: dns::DnsQueryType) -> Result<Vec<IpAddress, 1>, dns::Error> { 231 pub async fn dns_query(&self, name: &str, qtype: dns::DnsQueryType) -> Result<Vec<IpAddress, 1>, dns::Error> {
237 let query = self.with_mut(|s, i| { 232 let query = self.with_mut(|s, i| {
238 if let Some(dns_handle) = i.dns_socket { 233 let socket = s.sockets.get_mut::<dns::Socket>(i.dns_socket);
239 let socket = s.sockets.get_mut::<dns::Socket>(dns_handle); 234 socket.start_query(s.iface.context(), name, qtype)
240 match socket.start_query(s.iface.context(), name, qtype) {
241 Ok(handle) => Ok(handle),
242 Err(e) => Err(e.into()),
243 }
244 } else {
245 Err(dns::Error::Failed)
246 }
247 })?; 235 })?;
248 236
249 use embassy_hal_common::drop::OnDrop; 237 use embassy_hal_common::drop::OnDrop;
250 let drop = OnDrop::new(|| { 238 let drop = OnDrop::new(|| {
251 self.with_mut(|s, i| { 239 self.with_mut(|s, i| {
252 if let Some(dns_handle) = i.dns_socket { 240 let socket = s.sockets.get_mut::<dns::Socket>(i.dns_socket);
253 let socket = s.sockets.get_mut::<dns::Socket>(dns_handle); 241 socket.cancel_query(query);
254 socket.cancel_query(query); 242 s.waker.wake();
255 s.waker.wake();
256 }
257 }) 243 })
258 }); 244 });
259 245
260 let res = poll_fn(|cx| { 246 let res = poll_fn(|cx| {
261 self.with_mut(|s, i| { 247 self.with_mut(|s, i| {
262 if let Some(dns_handle) = i.dns_socket { 248 let socket = s.sockets.get_mut::<dns::Socket>(i.dns_socket);
263 let socket = s.sockets.get_mut::<dns::Socket>(dns_handle); 249 match socket.get_query_result(query) {
264 match socket.get_query_result(query) { 250 Ok(addrs) => Poll::Ready(Ok(addrs)),
265 Ok(addrs) => Poll::Ready(Ok(addrs)), 251 Err(dns::GetQueryResultError::Pending) => {
266 Err(dns::GetQueryResultError::Pending) => { 252 socket.register_query_waker(query, cx.waker());
267 socket.register_query_waker(query, cx.waker()); 253 Poll::Pending
268 Poll::Pending
269 }
270 Err(e) => Poll::Ready(Err(e.into())),
271 } 254 }
272 } else { 255 Err(e) => Poll::Ready(Err(e.into())),
273 Poll::Ready(Err(dns::Error::Failed))
274 } 256 }
275 }) 257 })
276 }) 258 })
@@ -322,11 +304,9 @@ impl<D: Driver + 'static> Inner<D> {
322 } 304 }
323 305
324 #[cfg(feature = "dns")] 306 #[cfg(feature = "dns")]
325 if let Some(dns_socket) = self.dns_socket { 307 let socket = s.sockets.get_mut::<smoltcp::socket::dns::Socket>(self.dns_socket);
326 let socket = s.sockets.get_mut::<smoltcp::socket::dns::Socket>(dns_socket); 308 let servers: Vec<IpAddress, 3> = config.dns_servers.iter().map(|c| IpAddress::Ipv4(*c)).collect();
327 let servers: Vec<IpAddress, 3> = config.dns_servers.iter().map(|c| IpAddress::Ipv4(*c)).collect(); 309 socket.update_servers(&servers[..]);
328 socket.update_servers(&servers[..]);
329 }
330 310
331 self.config = Some(config) 311 self.config = Some(config)
332 } 312 }