diff options
| author | David Lönnhager <david.l@mullvad.net> | 2021-02-15 16:28:00 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2021-02-17 12:21:24 +0100 |
| commit | ba8b38670bdd967d571565e01d34a1c03daa31fc (patch) | |
| tree | d5db3eaf3ca2bc13829e8e3a2c4cfea57bc58395 | |
| parent | 14f919c3bc03fa2f7a6c0d9211e70b07633193da (diff) | |
| download | mullvadvpn-ba8b38670bdd967d571565e01d34a1c03daa31fc.tar.xz mullvadvpn-ba8b38670bdd967d571565e01d34a1c03daa31fc.zip | |
Determine Wintun alias dynamically for WG tunnel
| -rw-r--r-- | talpid-core/src/tunnel/wireguard/mod.rs | 5 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/wireguard/wireguard_go.rs | 20 | ||||
| -rw-r--r-- | wireguard/libwg/libwg_windows.go | 18 |
3 files changed, 35 insertions, 8 deletions
diff --git a/talpid-core/src/tunnel/wireguard/mod.rs b/talpid-core/src/tunnel/wireguard/mod.rs index 5e9cd6704e..9fe6bec4e7 100644 --- a/talpid-core/src/tunnel/wireguard/mod.rs +++ b/talpid-core/src/tunnel/wireguard/mod.rs @@ -389,6 +389,11 @@ pub enum TunnelError { #[error(display = "Invalid tunnel interface name")] InterfaceNameError(#[error(source)] std::ffi::NulError), + /// Failed to convert adapter alias to UTF-8. + #[cfg(target_os = "windows")] + #[error(display = "Failed to convert adapter alias")] + InvalidAlias, + /// Failed to set ip addresses on tunnel interface. #[cfg(target_os = "windows")] #[error(display = "Failed to set IP addresses on WireGuard interface")] diff --git a/talpid-core/src/tunnel/wireguard/wireguard_go.rs b/talpid-core/src/tunnel/wireguard/wireguard_go.rs index 58b77ab47a..2751fbdfbf 100644 --- a/talpid-core/src/tunnel/wireguard/wireguard_go.rs +++ b/talpid-core/src/tunnel/wireguard/wireguard_go.rs @@ -133,12 +133,15 @@ impl WgGoTunnel { .iter() .any(|config| config.allowed_ips.iter().any(|ip| ip.is_ipv6())); + let mut alias_ptr = std::ptr::null_mut(); + let handle = unsafe { wgTurnOn( cstr_iface_name.as_ptr(), config.mtu as i64, wait_on_ipv6 as u8, wg_config_str.as_ptr(), + &mut alias_ptr, Some(logging_callback), logging_context.0 as *mut libc::c_void, ) @@ -148,13 +151,25 @@ impl WgGoTunnel { return Err(TunnelError::FatalStartWireguardError); } - if !add_device_ip_addresses(&iface_name, &config.tunnel.addresses) { + let actual_iface_name = { + let actual_iface_name_c = unsafe { CStr::from_ptr(alias_ptr) }; + let actual_iface_name = actual_iface_name_c + .to_str() + .map_err(|_| TunnelError::InvalidAlias)? + .to_string(); + unsafe { wgFreePtr(alias_ptr as *mut c_void) }; + actual_iface_name + }; + + log::debug!("Adapter alias: {}", actual_iface_name); + + if !add_device_ip_addresses(&actual_iface_name, &config.tunnel.addresses) { // Todo: what kind of clean-up is required? return Err(TunnelError::SetIpAddressesError); } Ok(WgGoTunnel { - interface_name: iface_name.clone(), + interface_name: actual_iface_name, handle: Some(handle), _logging_context: logging_context, }) @@ -360,6 +375,7 @@ extern "C" { mtu: i64, wait_on_ipv6: u8, settings: *const i8, + iface_name_out: *const *mut std::os::raw::c_char, logging_callback: Option<LoggingCallback>, logging_context: *mut libc::c_void, ) -> i32; diff --git a/wireguard/libwg/libwg_windows.go b/wireguard/libwg/libwg_windows.go index 0718caeb6c..bc766418b1 100644 --- a/wireguard/libwg/libwg_windows.go +++ b/wireguard/libwg/libwg_windows.go @@ -6,8 +6,10 @@ package main +// #include <stdlib.h> +import "C" + import ( - "C" "bufio" "fmt" "strings" @@ -64,8 +66,11 @@ func createInterfaceWatcherEvents(waitOnIpv6 bool, tunLuid uint64) []interfacewa } //export wgTurnOn -func wgTurnOn(cIfaceName *C.char, mtu int, waitOnIpv6 bool, cSettings *C.char, logSink LogSink, logContext LogContext) int32 { +func wgTurnOn(cIfaceName *C.char, mtu int, waitOnIpv6 bool, cSettings *C.char, cIfaceNameOut **C.char, logSink LogSink, logContext LogContext) int32 { logger := logging.NewLogger(logSink, logContext) + if cIfaceNameOut != nil { + *cIfaceNameOut = nil + } if cIfaceName == nil { logger.Error.Println("cIfaceName is null") @@ -109,13 +114,10 @@ func wgTurnOn(cIfaceName *C.char, mtu int, waitOnIpv6 bool, cSettings *C.char, l logger.Error.Println("Failed to determine name of wintun adapter") return ERROR_GENERAL_FAILURE } - if actualInterfaceName != ifaceName { // WireGuard picked a different name for the adapter than the one we expected. // This indicates there is already an adapter with the name we intended to use. - nativeTun.Close() - logger.Error.Println("Failed to create adapter with specific name") - return ERROR_GENERAL_FAILURE + logger.Debug.Println("Failed to create adapter with specific name") } device := device.NewDevice(wintun, logger) @@ -154,6 +156,10 @@ func wgTurnOn(cIfaceName *C.char, mtu int, waitOnIpv6 bool, cSettings *C.char, l return ERROR_GENERAL_FAILURE } + if cIfaceNameOut != nil { + *cIfaceNameOut = C.CString(actualInterfaceName) + } + return handle } |
