aboutsummaryrefslogtreecommitdiff
path: root/embassy-net/src
diff options
context:
space:
mode:
authorRuben De Smet <[email protected]>2023-06-05 16:35:31 +0200
committerRuben De Smet <[email protected]>2023-06-06 17:58:45 +0200
commit18578fd15f29e92280e4e317ff3148ea498566dd (patch)
treebe01fcb41f172b453c522c236ec2a928e6cd9862 /embassy-net/src
parentd7f674e410a674f06a749859bde4081a99718f58 (diff)
net: Allow a combined use of IPv4 and IPv6 DNS servers
Diffstat (limited to 'embassy-net/src')
-rw-r--r--embassy-net/src/lib.rs49
1 files changed, 40 insertions, 9 deletions
diff --git a/embassy-net/src/lib.rs b/embassy-net/src/lib.rs
index 9f83cb4ea..23ec33262 100644
--- a/embassy-net/src/lib.rs
+++ b/embassy-net/src/lib.rs
@@ -444,14 +444,12 @@ impl<D: Driver + 'static> Inner<D> {
444 debug!(" DNS server {}: {}", i, s); 444 debug!(" DNS server {}: {}", i, s);
445 } 445 }
446 446
447 self.static_v4 = Some(config);
448
447 #[cfg(feature = "dns")] 449 #[cfg(feature = "dns")]
448 { 450 {
449 let socket = s.sockets.get_mut::<smoltcp::socket::dns::Socket>(self.dns_socket); 451 self.update_dns_servers(s)
450 let servers: Vec<IpAddress, 3> = config.dns_servers.iter().map(|c| IpAddress::Ipv4(*c)).collect();
451 socket.update_servers(&servers[..]);
452 } 452 }
453
454 self.static_v4 = Some(config)
455 } 453 }
456 454
457 /// Replaces the current IPv6 static configuration with a newly supplied config. 455 /// Replaces the current IPv6 static configuration with a newly supplied config.
@@ -485,14 +483,47 @@ impl<D: Driver + 'static> Inner<D> {
485 debug!(" DNS server {}: {}", i, s); 483 debug!(" DNS server {}: {}", i, s);
486 } 484 }
487 485
486 self.static_v6 = Some(config);
487
488 #[cfg(feature = "dns")] 488 #[cfg(feature = "dns")]
489 { 489 {
490 let socket = s.sockets.get_mut::<smoltcp::socket::dns::Socket>(self.dns_socket); 490 self.update_dns_servers(s)
491 let servers: Vec<IpAddress, 3> = config.dns_servers.iter().map(|c| IpAddress::Ipv6(*c)).collect(); 491 }
492 socket.update_servers(&servers[..]); 492 }
493
494 #[cfg(feature = "dns")]
495 fn update_dns_servers(&mut self, s: &mut SocketStack) {
496 let socket = s.sockets.get_mut::<smoltcp::socket::dns::Socket>(self.dns_socket);
497
498 let servers_v4;
499 #[cfg(feature = "proto-ipv4")]
500 {
501 servers_v4 = self
502 .static_v4
503 .iter()
504 .flat_map(|cfg| cfg.dns_servers.iter().map(|c| IpAddress::Ipv4(*c)));
505 };
506 #[cfg(not(feature = "proto-ipv4"))]
507 {
508 servers_v4 = core::iter::empty();
509 }
510
511 let servers_v6;
512 #[cfg(feature = "proto-ipv6")]
513 {
514 servers_v6 = self
515 .static_v6
516 .iter()
517 .flat_map(|cfg| cfg.dns_servers.iter().map(|c| IpAddress::Ipv6(*c)));
518 }
519 #[cfg(not(feature = "proto-ipv6"))]
520 {
521 servers_v6 = core::iter::empty();
493 } 522 }
494 523
495 self.static_v6 = Some(config) 524 // Prefer the v6 DNS servers over the v4 servers
525 let servers: Vec<IpAddress, 6> = servers_v6.chain(servers_v4).collect();
526 socket.update_servers(&servers[..]);
496 } 527 }
497 528
498 #[cfg(feature = "dhcpv4")] 529 #[cfg(feature = "dhcpv4")]