aboutsummaryrefslogtreecommitdiff
path: root/embassy-net/src
diff options
context:
space:
mode:
authorbjoernQ <[email protected]>2023-07-18 10:39:29 +0200
committerbjoernQ <[email protected]>2023-07-18 10:39:29 +0200
commitf581831b86f1f3e46a1cc7a8c4d1a2baf3379e6a (patch)
tree7746bc2aacfc2d1c4e1c49770cea05dc9c3b969d /embassy-net/src
parent6b5df4523aa1c4902f02e803450ae4b418e0e3ca (diff)
Make dual-stack work in embassy-net
Diffstat (limited to 'embassy-net/src')
-rw-r--r--embassy-net/src/lib.rs39
1 files changed, 26 insertions, 13 deletions
diff --git a/embassy-net/src/lib.rs b/embassy-net/src/lib.rs
index 0d0a986f6..f43e3797b 100644
--- a/embassy-net/src/lib.rs
+++ b/embassy-net/src/lib.rs
@@ -531,11 +531,14 @@ impl<D: Driver + 'static> Inner<D> {
531 531
532 debug!(" IP address: {}", config.address); 532 debug!(" IP address: {}", config.address);
533 s.iface.update_ip_addrs(|addrs| { 533 s.iface.update_ip_addrs(|addrs| {
534 if addrs.is_empty() { 534 if let Some((index, _)) = addrs
535 addrs.push(IpCidr::Ipv4(config.address)).unwrap(); 535 .iter()
536 } else { 536 .enumerate()
537 addrs[0] = IpCidr::Ipv4(config.address); 537 .find(|(_, &addr)| matches!(addr, IpCidr::Ipv4(_)))
538 {
539 addrs.remove(index);
538 } 540 }
541 addrs.push(IpCidr::Ipv4(config.address)).unwrap();
539 }); 542 });
540 543
541 #[cfg(feature = "medium-ethernet")] 544 #[cfg(feature = "medium-ethernet")]
@@ -570,11 +573,14 @@ impl<D: Driver + 'static> Inner<D> {
570 573
571 debug!(" IP address: {}", config.address); 574 debug!(" IP address: {}", config.address);
572 s.iface.update_ip_addrs(|addrs| { 575 s.iface.update_ip_addrs(|addrs| {
573 if addrs.is_empty() { 576 if let Some((index, _)) = addrs
574 addrs.push(IpCidr::Ipv6(config.address)).unwrap(); 577 .iter()
575 } else { 578 .enumerate()
576 addrs[0] = IpCidr::Ipv6(config.address); 579 .find(|(_, &addr)| matches!(addr, IpCidr::Ipv6(_)))
580 {
581 addrs.remove(index);
577 } 582 }
583 addrs.push(IpCidr::Ipv6(config.address)).unwrap();
578 }); 584 });
579 585
580 #[cfg(feature = "medium-ethernet")] 586 #[cfg(feature = "medium-ethernet")]
@@ -643,12 +649,19 @@ impl<D: Driver + 'static> Inner<D> {
643 } 649 }
644 650
645 #[allow(unused)] // used only with dhcp 651 #[allow(unused)] // used only with dhcp
646 fn unapply_config(&mut self, s: &mut SocketStack) { 652 fn unapply_config_v4(&mut self, s: &mut SocketStack) {
647 #[cfg(feature = "medium-ethernet")] 653 #[cfg(feature = "medium-ethernet")]
648 let medium = self.device.capabilities().medium; 654 let medium = self.device.capabilities().medium;
649
650 debug!("Lost IP configuration"); 655 debug!("Lost IP configuration");
651 s.iface.update_ip_addrs(|ip_addrs| ip_addrs.clear()); 656 s.iface.update_ip_addrs(|ip_addrs| {
657 if let Some((index, _)) = ip_addrs
658 .iter()
659 .enumerate()
660 .find(|(index, &addr)| matches!(addr, IpCidr::Ipv4(_)))
661 {
662 ip_addrs.remove(index);
663 }
664 });
652 #[cfg(feature = "medium-ethernet")] 665 #[cfg(feature = "medium-ethernet")]
653 if medium == Medium::Ethernet { 666 if medium == Medium::Ethernet {
654 #[cfg(feature = "proto-ipv4")] 667 #[cfg(feature = "proto-ipv4")]
@@ -695,7 +708,7 @@ impl<D: Driver + 'static> Inner<D> {
695 if self.link_up { 708 if self.link_up {
696 match socket.poll() { 709 match socket.poll() {
697 None => {} 710 None => {}
698 Some(dhcpv4::Event::Deconfigured) => self.unapply_config(s), 711 Some(dhcpv4::Event::Deconfigured) => self.unapply_config_v4(s),
699 Some(dhcpv4::Event::Configured(config)) => { 712 Some(dhcpv4::Event::Configured(config)) => {
700 let config = StaticConfigV4 { 713 let config = StaticConfigV4 {
701 address: config.address, 714 address: config.address,
@@ -707,7 +720,7 @@ impl<D: Driver + 'static> Inner<D> {
707 } 720 }
708 } else if old_link_up { 721 } else if old_link_up {
709 socket.reset(); 722 socket.reset();
710 self.unapply_config(s); 723 self.unapply_config_v4(s);
711 } 724 }
712 } 725 }
713 //if old_link_up || self.link_up { 726 //if old_link_up || self.link_up {