summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-02-15 16:28:00 +0100
committerDavid Lönnhager <david.l@mullvad.net>2021-02-17 12:21:24 +0100
commitba8b38670bdd967d571565e01d34a1c03daa31fc (patch)
treed5db3eaf3ca2bc13829e8e3a2c4cfea57bc58395
parent14f919c3bc03fa2f7a6c0d9211e70b07633193da (diff)
downloadmullvadvpn-ba8b38670bdd967d571565e01d34a1c03daa31fc.tar.xz
mullvadvpn-ba8b38670bdd967d571565e01d34a1c03daa31fc.zip
Determine Wintun alias dynamically for WG tunnel
-rw-r--r--talpid-core/src/tunnel/wireguard/mod.rs5
-rw-r--r--talpid-core/src/tunnel/wireguard/wireguard_go.rs20
-rw-r--r--wireguard/libwg/libwg_windows.go18
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
}