diff options
| author | bjoernQ <[email protected]> | 2023-07-18 10:39:29 +0200 |
|---|---|---|
| committer | bjoernQ <[email protected]> | 2023-07-18 10:39:29 +0200 |
| commit | f581831b86f1f3e46a1cc7a8c4d1a2baf3379e6a (patch) | |
| tree | 7746bc2aacfc2d1c4e1c49770cea05dc9c3b969d /embassy-net | |
| parent | 6b5df4523aa1c4902f02e803450ae4b418e0e3ca (diff) | |
Make dual-stack work in embassy-net
Diffstat (limited to 'embassy-net')
| -rw-r--r-- | embassy-net/src/lib.rs | 39 |
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 { |
