diff options
| author | David Lönnhager <david.l@mullvad.net> | 2021-09-29 13:04:20 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2021-10-25 19:36:28 +0200 |
| commit | 9f7ae3f10e885f98dd9317f13a80bd738d3ff434 (patch) | |
| tree | 14f6afada72028cf004fddd91f6d6ae8c1dbf5bd | |
| parent | 9db65e8846e26dd551283aff5bec7711f22f0fc2 (diff) | |
| download | mullvadvpn-9f7ae3f10e885f98dd9317f13a80bd738d3ff434.tar.xz mullvadvpn-9f7ae3f10e885f98dd9317f13a80bd738d3ff434.zip | |
Simplify WgIpAddr
| -rw-r--r-- | talpid-core/src/tunnel/wireguard/wireguard_nt.rs | 72 |
1 files changed, 40 insertions, 32 deletions
diff --git a/talpid-core/src/tunnel/wireguard/wireguard_nt.rs b/talpid-core/src/tunnel/wireguard/wireguard_nt.rs index b094416ae7..14097baedb 100644 --- a/talpid-core/src/tunnel/wireguard/wireguard_nt.rs +++ b/talpid-core/src/tunnel/wireguard/wireguard_nt.rs @@ -12,6 +12,7 @@ use std::{ ffi::CStr, fmt, io, iter, mem, mem::MaybeUninit, + net::{IpAddr, Ipv4Addr, Ipv6Addr}, os::windows::{ffi::OsStrExt, io::RawHandle}, path::Path, ptr, @@ -201,6 +202,31 @@ union WgIpAddr { v6: IN6_ADDR, } +impl From<IpAddr> for WgIpAddr { + fn from(address: IpAddr) -> Self { + match address { + IpAddr::V4(addr) => WgIpAddr::from(addr), + IpAddr::V6(addr) => WgIpAddr::from(addr), + } + } +} + +impl From<Ipv6Addr> for WgIpAddr { + fn from(address: Ipv6Addr) -> Self { + Self { + v6: windows::in6addr_from_ipaddr(address), + } + } +} + +impl From<Ipv4Addr> for WgIpAddr { + fn from(address: Ipv4Addr) -> Self { + Self { + v4: windows::inaddr_from_ipaddr(address), + } + } +} + /// See `WIREGUARD_ALLOWED_IP` at https://git.zx2c4.com/wireguard-nt/tree/api/wireguard.h. #[derive(Clone, Copy)] #[repr(C, align(8))] @@ -911,12 +937,8 @@ fn serialize_config(config: &Config) -> Result<Vec<MaybeUninit<u8>>> { IpNetwork::V6(_) => AF_INET6 as u16, }; let address = match allowed_ip { - IpNetwork::V4(v4_network) => WgIpAddr { - v4: windows::inaddr_from_ipaddr(v4_network.ip()), - }, - IpNetwork::V6(v6_network) => WgIpAddr { - v6: windows::in6addr_from_ipaddr(v6_network.ip()), - }, + IpNetwork::V4(v4_network) => WgIpAddr::from(v4_network.ip()), + IpNetwork::V6(v6_network) => WgIpAddr::from(v6_network.ip()), }; let wg_allowed_ip = @@ -1108,9 +1130,7 @@ mod tests { allowed_ips_count: 1, }, p0_allowed_ip_0: WgAllowedIp { - address: WgIpAddr { - v4: windows::inaddr_from_ipaddr("1.3.3.0".parse().unwrap()), - }, + address: WgIpAddr::from("1.3.3.0".parse::<Ipv4Addr>().unwrap()), address_family: AF_INET as u16, cidr: 24, }, @@ -1150,31 +1170,23 @@ mod tests { fn test_wg_allowed_ip_v4() { // Valid: /32 prefix let address_family = AF_INET as u16; - let address = WgIpAddr { - v4: windows::inaddr_from_ipaddr("127.0.0.1".parse().unwrap()), - }; + let address = WgIpAddr::from("127.0.0.1".parse::<Ipv4Addr>().unwrap()); let cidr = 32; WgAllowedIp::new(address, address_family, cidr).unwrap(); // Invalid host bits let cidr = 24; - let address = WgIpAddr { - v4: windows::inaddr_from_ipaddr("0.0.0.1".parse().unwrap()), - }; + let address = WgIpAddr::from("0.0.0.1".parse::<Ipv4Addr>().unwrap()); assert!(WgAllowedIp::new(address, address_family, cidr).is_err()); // Valid host bits let cidr = 24; - let address = WgIpAddr { - v4: windows::inaddr_from_ipaddr("255.255.255.0".parse().unwrap()), - }; + let address = WgIpAddr::from("255.255.255.0".parse::<Ipv4Addr>().unwrap()); WgAllowedIp::new(address, address_family, cidr).unwrap(); // 0.0.0.0/0 let cidr = 0; - let address = WgIpAddr { - v4: windows::inaddr_from_ipaddr("0.0.0.0".parse().unwrap()), - }; + let address = WgIpAddr::from("0.0.0.0".parse::<Ipv4Addr>().unwrap()); WgAllowedIp::new(address, address_family, cidr).unwrap(); // Invalid CIDR @@ -1186,9 +1198,7 @@ mod tests { fn test_wg_allowed_ip_v6() { // Valid: /128 prefix let address_family = AF_INET6 as u16; - let address = WgIpAddr { - v6: windows::in6addr_from_ipaddr("::1".parse().unwrap()), - }; + let address = WgIpAddr::from("::1".parse::<Ipv6Addr>().unwrap()); let cidr = 128; WgAllowedIp::new(address, address_family, cidr).unwrap(); @@ -1197,18 +1207,16 @@ mod tests { assert!(WgAllowedIp::new(address, address_family, cidr).is_err()); // Valid host bits - let address = WgIpAddr { - v6: windows::in6addr_from_ipaddr( - "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe".parse().unwrap(), - ), - }; + let address = WgIpAddr::from( + "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe" + .parse::<Ipv6Addr>() + .unwrap(), + ); WgAllowedIp::new(address, address_family, cidr).unwrap(); // ::/0 let cidr = 0; - let address = WgIpAddr { - v6: windows::in6addr_from_ipaddr("::".parse().unwrap()), - }; + let address = WgIpAddr::from("::".parse::<Ipv6Addr>().unwrap()); WgAllowedIp::new(address, address_family, cidr).unwrap(); // Invalid CIDR |
