diff options
| author | Sebastian Holmin <sebastian.holmin@mullvad.net> | 2025-01-08 16:01:40 +0100 |
|---|---|---|
| committer | Sebastian Holmin <sebastian.holmin@mullvad.net> | 2025-01-08 16:01:40 +0100 |
| commit | aab384fcffff864308467397b2444080ef24e2f2 (patch) | |
| tree | 51019ccbc7b536683b100c642034523518f5cf04 /test | |
| parent | b23da797007f5f4617b3fa484be2f39ebe67ffc4 (diff) | |
| download | mullvadvpn-aab384fcffff864308467397b2444080ef24e2f2.tar.xz mullvadvpn-aab384fcffff864308467397b2444080ef24e2f2.zip | |
Rewrite in functional style
Diffstat (limited to 'test')
| -rw-r--r-- | test/test-manager/src/vm/network/macos.rs | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/test/test-manager/src/vm/network/macos.rs b/test/test-manager/src/vm/network/macos.rs index 3d8bc0fd2f..fab648c338 100644 --- a/test/test-manager/src/vm/network/macos.rs +++ b/test/test-manager/src/vm/network/macos.rs @@ -47,31 +47,29 @@ pub async fn setup_test_network() -> Result<()> { /// Returns the interface name and IP address of the bridge gateway, which is the (first) bridge /// network that the given `guest_ip` belongs to. pub(crate) fn find_vm_bridge(guest_ip: &Ipv4Addr) -> Result<(String, Ipv4Addr)> { - for addr in nix::ifaddrs::getifaddrs() + let to_sock_addr = |addr: Option<SockaddrStorage>| { + addr.as_ref() + .and_then(|addr| addr.as_sockaddr_in()) + .map(|addr| *SocketAddrV4::from(*addr).ip()) + }; + + nix::ifaddrs::getifaddrs() .unwrap() .filter(|addr| addr.interface_name.starts_with("bridge")) - { - let to_sock_addr = |addr: Option<SockaddrStorage>| { - addr.as_ref() - .and_then(|addr| addr.as_sockaddr_in()) - .map(|addr| *SocketAddrV4::from(*addr).ip()) - }; - - if let (Some(address), Some(netmask)) = - (to_sock_addr(addr.address), to_sock_addr(addr.netmask)) - { - if let Ok(ip_v4_network) = ipnetwork::Ipv4Network::with_netmask(address, netmask) { - if ip_v4_network.contains(*guest_ip) { - return Ok((addr.interface_name.to_owned(), address)); - } - }; - }; - } - - // This is probably either due to IP mismatch or Tart not running - Err(anyhow!( - "Failed to identify bridge used by tart -- not running?" - )) + .filter_map(|addr| { + let address = to_sock_addr(addr.address); + let netmask = to_sock_addr(addr.netmask); + address + .zip(netmask) + .map(|(address, netmask)| (addr.interface_name, address, netmask)) + }) + .find_map(|(interface_name, address, netmask)| { + ipnetwork::Ipv4Network::with_netmask(address, netmask) + .ok() + .filter(|ip_v4_network| ip_v4_network.contains(*guest_ip)) + .map(|_| (interface_name.to_owned(), address)) + }) + .ok_or_else(|| anyhow!("Failed to identify bridge used by tart -- not running?")) } async fn enable_forwarding() -> Result<()> { |
