summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-09-28 20:04:14 +0200
committerDavid Lönnhager <david.l@mullvad.net>2020-11-24 18:50:03 +0100
commite18346243fa3e84aad6167356a659a7efc770fec (patch)
tree872501d928c4d30122f660d2fd3435861a855d2f
parent82e12793f17d88744870c41d9df52c8be667479e (diff)
downloadmullvadvpn-e18346243fa3e84aad6167356a659a7efc770fec.tar.xz
mullvadvpn-e18346243fa3e84aad6167356a659a7efc770fec.zip
Use wintun device with OpenVPN
-rw-r--r--dist-assets/windows/installer.nsh19
-rw-r--r--talpid-core/src/tunnel/openvpn.rs7
-rw-r--r--windows/driverlogic/src/driverlogic.cpp24
3 files changed, 47 insertions, 3 deletions
diff --git a/dist-assets/windows/installer.nsh b/dist-assets/windows/installer.nsh
index 80c4ba998b..f231f36912 100644
--- a/dist-assets/windows/installer.nsh
+++ b/dist-assets/windows/installer.nsh
@@ -15,6 +15,9 @@
# TAP device hardware ID
!define TAP_HARDWARE_ID "tapmullvad0901"
+# Wintun hardware ID
+!define TUN_HARDWARE_ID "wintun"
+
# "sc" exit code
!define SERVICE_STARTED 0
!define SERVICE_START_PENDING 2
@@ -233,6 +236,10 @@
log::Log "RemoveWintun()"
+ nsExec::ExecToStack '"$TEMP\tap-driver\driverlogic.exe" remove-device ${TUN_HARDWARE_ID} Mullvad-WT'
+ Pop $0
+ Pop $1
+
msiutil::SilentUninstall "$TEMP\mullvad-wintun-amd64.msi"
Pop $0
Pop $1
@@ -281,6 +288,18 @@
Goto InstallWintun_return
${EndIf}
+ log::Log "Creating new virtual adapter"
+ nsExec::ExecToStack '"$TEMP\tap-driver\driverlogic.exe" new-device ${TUN_HARDWARE_ID} Mullvad-WT'
+ Pop $0
+ Pop $1
+
+ ${If} $0 != ${DL_GENERAL_SUCCESS}
+ IntFmt $0 "0x%X" $0
+ StrCpy $R0 "Failed to create virtual adapter: error $0"
+ log::LogWithDetails $R0 $1
+ Goto InstallWintun_return
+ ${EndIf}
+
log::Log "InstallWintun() completed successfully"
Push 0
diff --git a/talpid-core/src/tunnel/openvpn.rs b/talpid-core/src/tunnel/openvpn.rs
index 54591565fb..00e5fa2bb1 100644
--- a/talpid-core/src/tunnel/openvpn.rs
+++ b/talpid-core/src/tunnel/openvpn.rs
@@ -600,9 +600,10 @@ impl<C: OpenVpnBuilder + 'static> OpenVpnMonitor<C> {
.enable_ipv6(params.generic_options.enable_ipv6)
.ca(resource_dir.join("ca.crt"));
#[cfg(windows)]
- cmd.tunnel_alias(Some(
- crate::winnet::get_tap_interface_alias().map_err(Error::WinnetError)?,
- ));
+ {
+ cmd.tunnel_alias(Some(OsString::from("Mullvad-WT")));
+ cmd.windows_driver(Some(crate::process::openvpn::WindowsDriver::Wintun));
+ }
if let Some(proxy_settings) = params.proxy.clone().take() {
cmd.proxy_settings(proxy_settings);
}
diff --git a/windows/driverlogic/src/driverlogic.cpp b/windows/driverlogic/src/driverlogic.cpp
index 4b9c24b1e7..25487d8481 100644
--- a/windows/driverlogic/src/driverlogic.cpp
+++ b/windows/driverlogic/src/driverlogic.cpp
@@ -893,6 +893,30 @@ int wmain(int argc, const wchar_t * argv[], const wchar_t * [])
UpdateTapDriver(argv[2]);
}
+ else if (0 == _wcsicmp(argv[1], L"new-device"))
+ {
+ if (4 != argc)
+ {
+ goto INVALID_ARGUMENTS;
+ }
+
+ const wchar_t *hardwareId = argv[2];
+ const wchar_t *baseName = argv[3];
+
+ CreateNetDevice(hardwareId, baseName, true);
+ }
+ else if (0 == _wcsicmp(argv[1], L"remove-device"))
+ {
+ if (4 != argc)
+ {
+ goto INVALID_ARGUMENTS;
+ }
+
+ const wchar_t *hardwareId = argv[2];
+ const wchar_t *baseName = argv[3];
+
+ RemoveNetAdapterByAlias(hardwareId, baseName);
+ }
else if (0 == _wcsicmp(argv[1], L"remove"))
{
if (3 != argc)