summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2022-08-15 11:34:01 +0200
committerDavid Lönnhager <david.l@mullvad.net>2022-08-15 11:34:01 +0200
commit428ad126d8ca0bdb42bbde6442028e9497d0e171 (patch)
treef36a2bfedde74a08e41f4bb42528ce6cd8ef0090
parent844714165375e3a8ec45dcc7a97e4907ccda8e27 (diff)
parentc5197218e9612242c36df2504c52f4af8b4b0472 (diff)
downloadmullvadvpn-428ad126d8ca0bdb42bbde6442028e9497d0e171.tar.xz
mullvadvpn-428ad126d8ca0bdb42bbde6442028e9497d0e171.zip
Merge branch 'update-wireguard-go'
-rw-r--r--.github/workflows/android-app.yml4
-rw-r--r--.github/workflows/daemon.yml12
-rw-r--r--.github/workflows/ios.yml2
-rw-r--r--CHANGELOG.md2
-rw-r--r--Dockerfile8
-rw-r--r--README.md5
-rw-r--r--android/docker/Dockerfile16
-rw-r--r--android/docker/README.md2
-rwxr-xr-xandroid/fdroid-build/init.sh11
m---------dist-assets/binaries0
-rw-r--r--dist-assets/windows/installer.nsh7
-rw-r--r--talpid-core/src/tunnel/openvpn/mod.rs28
-rw-r--r--talpid-core/src/tunnel/openvpn/wintun.rs192
-rw-r--r--windows/driverlogic/src/driverlogic.cpp17
-rw-r--r--windows/driverlogic/src/wintun.h10
-rwxr-xr-xwireguard/build-wireguard-go.sh2
-rw-r--r--wireguard/libwg/Android.mk5
-rw-r--r--wireguard/libwg/Dockerfile_AndroidPatchedGoruntime8
-rw-r--r--wireguard/libwg/go.mod16
-rw-r--r--wireguard/libwg/go.sum58
-rw-r--r--wireguard/libwg/libwg_windows.go16
21 files changed, 112 insertions, 309 deletions
diff --git a/.github/workflows/android-app.yml b/.github/workflows/android-app.yml
index 00161fecd9..4e8379e709 100644
--- a/.github/workflows/android-app.yml
+++ b/.github/workflows/android-app.yml
@@ -57,9 +57,9 @@ jobs:
- name: Configure Go
if: steps.cache-native-libs.outputs.cache-hit != 'true'
- uses: actions/setup-go@v2.1.3
+ uses: actions/setup-go@v3
with:
- go-version: 1.16
+ go-version: 1.18.5
- name: Configure Android NDK
if: steps.cache-native-libs.outputs.cache-hit != 'true'
diff --git a/.github/workflows/daemon.yml b/.github/workflows/daemon.yml
index d4eda3e2dc..f0c8b843d6 100644
--- a/.github/workflows/daemon.yml
+++ b/.github/workflows/daemon.yml
@@ -54,9 +54,9 @@ jobs:
default: true
- name: Install Go
- uses: actions/setup-go@v2.1.3
+ uses: actions/setup-go@v3
with:
- go-version: 1.16
+ go-version: 1.18.5
- name: Install build dependencies
run: |
@@ -79,9 +79,9 @@ jobs:
default: true
- name: Install Go
- uses: actions/setup-go@v2.1.3
+ uses: actions/setup-go@v3
with:
- go-version: 1.16
+ go-version: 1.18.5
- name: Build and test crates
run: ./ci/check-rust.sh
@@ -121,9 +121,9 @@ jobs:
default: true
- name: Install Go
- uses: actions/setup-go@v2.1.3
+ uses: actions/setup-go@v3
with:
- go-version: 1.16
+ go-version: 1.18.5
- name: Install msbuild
uses: microsoft/setup-msbuild@v1.0.2
diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml
index 3e4998dc5d..cf1ff4b058 100644
--- a/.github/workflows/ios.yml
+++ b/.github/workflows/ios.yml
@@ -48,7 +48,7 @@ jobs:
- name: Setup go-lang
uses: actions/setup-go@v3
with:
- go-version: '1.16.5'
+ go-version: 1.18.5
- name: Prepare iOS simulator
run: |
diff --git a/CHANGELOG.md b/CHANGELOG.md
index aad8dd68b8..a22ab1c6ff 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -43,6 +43,7 @@ Line wrap the file at 100 chars. Th
### Changed
- Reject invalid WireGuard ports in the CLI.
- Reorganize settings into more logical categories.
+- Upgrade wireguard-go to 20220703234212 (Windows: v0.5.3).
#### Android
- Lowered default MTU to 1280 on Android.
@@ -50,6 +51,7 @@ Line wrap the file at 100 chars. Th
#### Windows
- Remove dependency on `ipconfig.exe`. Call `DnsFlushResolverCache` to flush the DNS cache.
+- Upgrade Wintun to 0.14.1.
### Removed
#### Android
diff --git a/Dockerfile b/Dockerfile
index 563cc13c86..c9dc12294c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -14,10 +14,10 @@ RUN apt update -y && apt install build-essential \
# Install golang
-ENV GOLANG_VERSION 1.16
-# Found on https://golang.org/dl/
-ENV GOLANG_HASH 013a489ebb3e24ef3d915abe5b94c3286c070dfe0818d5bca8108f1d6e8440d2
-RUN curl -Lo go.tgz https://golang.org/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz && \
+ENV GOLANG_VERSION 1.18.5
+# Checksum from: https://go.dev/dl/
+ENV GOLANG_HASH 9e5de37f9c49942c601b191ac5fba404b868bfc21d446d6960acc12283d6e5f2
+RUN curl -Lo go.tgz https://go.dev/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz && \
echo $(sha256sum go.tgz) && \
echo "${GOLANG_HASH} go.tgz" | sha256sum -c - && \
tar -C /usr/local -xzf go.tgz && \
diff --git a/README.md b/README.md
index d27f1da6d1..7ae4f631e3 100644
--- a/README.md
+++ b/README.md
@@ -291,7 +291,7 @@ storePassword = keystore-password
npm install -g npm
```
-1. Install Go (ideally version `1.16`) by following the [official
+1. Install Go (ideally version `1.18`) by following the [official
instructions](https://golang.org/doc/install). Newer versions may work
too. Since `cgo` is being used, make sure to have a C compiler in your path. [*On
Windows*](https://github.com/golang/go/wiki/cgo#windows) `mingw`'s `gcc` compiler should work.
@@ -338,9 +338,6 @@ After that copy the files from `gui/src/main/management_interface/` and `gui/bui
directories into a single directory on your Apple Silicon Mac, and set the value of
`MANAGEMENT_INTERFACE_PROTO_BUILD_DIR` to that directory while running the main build.
-Make sure that the version of Go on your Mac is 1.16 (the first version to add
-[support](https://tip.golang.org/doc/go1.16#darwin) for Apple Silicon) or newer.
-
Install `protobuf` by running:
```bash
diff --git a/android/docker/Dockerfile b/android/docker/Dockerfile
index 7a46151646..3a2bfd73ac 100644
--- a/android/docker/Dockerfile
+++ b/android/docker/Dockerfile
@@ -43,17 +43,19 @@ RUN cd /tmp && \
ENV ANDROID_NDK_HOME="/opt/android/android-ndk-r20b" \
NDK_TOOLCHAIN_DIR="/opt/android/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin"
-# Install Go
+# Install golang
+ENV GOLANG_VERSION 1.18.5
+# Checksum from: https://go.dev/dl/
+ENV GOLANG_HASH 9e5de37f9c49942c601b191ac5fba404b868bfc21d446d6960acc12283d6e5f2
COPY goruntime-boottime-over-monotonic.diff /tmp/goruntime-boottime-over-monotonic.diff
-
RUN cd /tmp && \
- curl -sf -L -O https://dl.google.com/go/go1.16.linux-amd64.tar.gz && \
- echo "013a489ebb3e24ef3d915abe5b94c3286c070dfe0818d5bca8108f1d6e8440d2 go1.16.linux-amd64.tar.gz" | sha256sum -c && \
+ curl -sf -L -o go.tgz https://go.dev/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz && \
+ echo "$GOLANG_HASH go.tgz" | sha256sum -c && \
cd /opt && \
- tar -xzf /tmp/go1.16.linux-amd64.tar.gz && \
+ tar -xzf /tmp/go.tgz && \
patch -p1 -f -N -r- -d "/opt/go" < /tmp/goruntime-boottime-over-monotonic.diff && \
mkdir /opt/go/go-path && \
- rm /tmp/goruntime-boottime-over-monotonic.diff /tmp/go1.16.linux-amd64.tar.gz
+ rm /tmp/goruntime-boottime-over-monotonic.diff /tmp/go.tgz
ENV GOROOT=/opt/go GOPATH=/opt/go/go-path PATH=${PATH}:/opt/go/bin
@@ -72,7 +74,7 @@ ENV PATH="${PATH}:/root/.cargo/bin" \
RUN curl -sf -L https://sh.rustup.rs > /tmp/rustup.sh && \
cd /tmp && \
- echo "a3cb081f88a6789d104518b30d4aa410009cd08c3822a1226991d6cf0442a0f8 rustup.sh" | sha256sum -c && \
+ echo "173f4881e2de99ba9ad1acb59e65be01b2a44979d83b6ec648d0d22f8654cbce rustup.sh" | sha256sum -c && \
chmod +x rustup.sh && \
./rustup.sh -y && \
rm rustup.sh && \
diff --git a/android/docker/README.md b/android/docker/README.md
index 38cf5a38ee..4594f65466 100644
--- a/android/docker/README.md
+++ b/android/docker/README.md
@@ -39,7 +39,7 @@ The example below builds only for 64-bit ARM and x86-64:
docker run \
--rm \
-it \
- -e ARCHITECTURES="aarch64 x86_64"
+ -e ARCHITECTURES="aarch64 x86_64" \
--name mullvad-android-build \
-v /home/user/mullvadvpn-app:/project \
-w /project \
diff --git a/android/fdroid-build/init.sh b/android/fdroid-build/init.sh
index f363372df7..f8d498e10c 100755
--- a/android/fdroid-build/init.sh
+++ b/android/fdroid-build/init.sh
@@ -19,11 +19,14 @@ rustup target add \
aarch64-linux-android \
armv7-linux-androideabi
-# Install Go
+# Install golang
+GOLANG_VERSION="1.18.5"
+# Checksum from: https://golang.org/dl/
+GOLANG_HASH="9e5de37f9c49942c601b191ac5fba404b868bfc21d446d6960acc12283d6e5f2"
cd "$HOME"
-curl -sf -L -O https://golang.org/dl/go1.16.linux-amd64.tar.gz
-echo "013a489ebb3e24ef3d915abe5b94c3286c070dfe0818d5bca8108f1d6e8440d2 go1.16.linux-amd64.tar.gz" | sha256sum -c
-tar -xzvf go1.16.linux-amd64.tar.gz
+curl -sf -L -o go.tgz https://go.dev/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz
+echo "$GOLANG_HASH go.tgz" | sha256sum -c
+tar -xzvf go.tgz
patch -p1 -f -N -r- -d "$HOME/go" < "$REPO_DIR/wireguard/libwg/goruntime-boottime-over-monotonic.diff"
# Configure Cargo for cross-compilation
diff --git a/dist-assets/binaries b/dist-assets/binaries
-Subproject b63c5c8c7977963aeb585b6ddd4537dffe2aeee
+Subproject 1c5f5202fc522ecbf9d5e972ed70df5cbb71cf6
diff --git a/dist-assets/windows/installer.nsh b/dist-assets/windows/installer.nsh
index cb4ea8a417..b699982ad0 100644
--- a/dist-assets/windows/installer.nsh
+++ b/dist-assets/windows/installer.nsh
@@ -12,8 +12,6 @@
# Do not compare variables using the <> operator - broken
#
-!define WINTUN_POOL "Mullvad"
-
# "sc" exit code
!define SERVICE_STARTED 0
!define SERVICE_START_PENDING 2
@@ -148,13 +146,12 @@
log::Log "RemoveWintun()"
- nsExec::ExecToStack '"$TEMP\driverlogic.exe" wintun-delete-pool-driver ${WINTUN_POOL}'
+ nsExec::ExecToStack '"$TEMP\driverlogic.exe" wintun-delete-driver'
Pop $0
Pop $1
${If} $0 != ${DL_GENERAL_SUCCESS}
- IntFmt $0 "0x%X" $0
- StrCpy $R0 "Failed to remove Wintun pool: error $0"
+ StrCpy $R0 "Failed to remove Wintun driver. It may be in use."
log::LogWithDetails $R0 $1
Goto RemoveWintun_return_only
${EndIf}
diff --git a/talpid-core/src/tunnel/openvpn/mod.rs b/talpid-core/src/tunnel/openvpn/mod.rs
index 9c09c935f8..15d9013610 100644
--- a/talpid-core/src/tunnel/openvpn/mod.rs
+++ b/talpid-core/src/tunnel/openvpn/mod.rs
@@ -43,7 +43,7 @@ mod wintun;
#[cfg(windows)]
lazy_static! {
static ref ADAPTER_ALIAS: U16CString = U16CString::from_str("Mullvad").unwrap();
- static ref ADAPTER_POOL: U16CString = U16CString::from_str("Mullvad").unwrap();
+ static ref ADAPTER_TUNNEL_TYPE: U16CString = U16CString::from_str("Mullvad").unwrap();
}
#[cfg(windows)]
@@ -87,11 +87,6 @@ pub enum Error {
#[error(display = "Failed to create Wintun adapter")]
WintunCreateAdapterError(#[error(source)] io::Error),
- /// cannot determine adapter name
- #[cfg(windows)]
- #[error(display = "Failed to determine alias of Wintun adapter")]
- WintunFindAlias(#[error(source)] io::Error),
-
/// OpenVPN process died unexpectedly
#[error(display = "OpenVPN process died unexpectedly")]
ChildProcessDied,
@@ -215,7 +210,7 @@ impl std::fmt::Debug for dyn WintunContext {
#[cfg(windows)]
#[derive(Debug)]
struct WintunContextImpl {
- adapter: wintun::TemporaryWintunAdapter,
+ adapter: wintun::WintunAdapter,
wait_v6_interface: bool,
_logger: wintun::WintunLoggerHandle,
}
@@ -224,7 +219,7 @@ struct WintunContextImpl {
#[async_trait::async_trait]
impl WintunContext for WintunContextImpl {
fn luid(&self) -> NET_LUID {
- self.adapter.adapter().luid()
+ self.adapter.luid()
}
fn ipv6(&self) -> bool {
@@ -232,22 +227,19 @@ impl WintunContext for WintunContextImpl {
}
async fn wait_for_interfaces(&self) -> io::Result<()> {
- let luid = self.adapter.adapter().luid();
+ let luid = self.adapter.luid();
crate::windows::wait_for_interfaces(luid, true, self.wait_v6_interface).await
}
fn prepare_interface(&self) {
- self.adapter.adapter().prepare_interface();
+ self.adapter.prepare_interface();
}
}
#[cfg(windows)]
impl WintunContextImpl {
- fn alias(&self) -> Result<U16CString> {
- self.adapter
- .adapter()
- .name()
- .map_err(Error::WintunFindAlias)
+ fn alias(&self) -> U16CString {
+ self.adapter.name()
}
}
@@ -300,7 +292,7 @@ impl OpenVpnMonitor<OpenVpnCommand> {
resource_dir,
&proxy_monitor,
#[cfg(windows)]
- wintun.alias()?.to_os_string(),
+ wintun.alias().to_os_string(),
)?;
let plugin_path = Self::get_plugin_path(resource_dir)?;
@@ -347,10 +339,10 @@ impl OpenVpnMonitor<OpenVpnCommand> {
let dll = wintun::WintunDll::instance(resource_dir).map_err(Error::WintunDllError)?;
let wintun_logger = dll.activate_logging();
- let (wintun_adapter, _reboot_required) = wintun::TemporaryWintunAdapter::create(
+ let wintun_adapter = wintun::WintunAdapter::create(
dll.clone(),
&*ADAPTER_ALIAS,
- &*ADAPTER_POOL,
+ &*ADAPTER_TUNNEL_TYPE,
Some(ADAPTER_GUID.clone()),
)
.map_err(Error::WintunCreateAdapterError)?;
diff --git a/talpid-core/src/tunnel/openvpn/wintun.rs b/talpid-core/src/tunnel/openvpn/wintun.rs
index 813d0de2e7..9d9996aefc 100644
--- a/talpid-core/src/tunnel/openvpn/wintun.rs
+++ b/talpid-core/src/tunnel/openvpn/wintun.rs
@@ -14,7 +14,7 @@ use winapi::{
shared::{
guiddef::GUID,
ifdef::NET_LUID,
- minwindef::{BOOL, FARPROC, HINSTANCE, HMODULE},
+ minwindef::{FARPROC, HINSTANCE, HMODULE},
netioapi::ConvertInterfaceLuidToGuid,
winerror::NO_ERROR,
},
@@ -35,33 +35,17 @@ lazy_static! {
static ref WINTUN_DLL: Mutex<Option<Arc<WintunDll>>> = Mutex::new(None);
}
-/// Longest possible adapter name (in characters), including null terminator
-const MAX_ADAPTER_NAME: usize = 128;
-
-type WintunOpenAdapterFn =
- unsafe extern "stdcall" fn(pool: *const u16, name: *const u16) -> RawHandle;
-
type WintunCreateAdapterFn = unsafe extern "stdcall" fn(
- pool: *const u16,
name: *const u16,
+ tunnel_type: *const u16,
requested_guid: *const GUID,
- reboot_required: *mut BOOL,
) -> RawHandle;
-type WintunFreeAdapterFn = unsafe extern "stdcall" fn(adapter: RawHandle);
-
-type WintunDeleteAdapterFn = unsafe extern "stdcall" fn(
- adapter: RawHandle,
- force_close_sessions: BOOL,
- reboot_required: *mut BOOL,
-) -> BOOL;
-
-type WintunGetAdapterNameFn =
- unsafe extern "stdcall" fn(adapter: RawHandle, name: *mut u16) -> BOOL;
+type WintunCloseAdapterFn = unsafe extern "stdcall" fn(adapter: RawHandle);
type WintunGetAdapterLuidFn = unsafe extern "stdcall" fn(adapter: RawHandle, luid: *mut NET_LUID);
-type WintunLoggerCbFn = extern "stdcall" fn(WintunLoggerLevel, *const u16);
+type WintunLoggerCbFn = extern "stdcall" fn(WintunLoggerLevel, u64, *const u16);
type WintunSetLoggerFn = unsafe extern "stdcall" fn(Option<WintunLoggerCbFn>);
@@ -75,11 +59,8 @@ enum WintunLoggerLevel {
pub struct WintunDll {
handle: HINSTANCE,
- func_open: WintunOpenAdapterFn,
func_create: WintunCreateAdapterFn,
- func_free: WintunFreeAdapterFn,
- func_delete: WintunDeleteAdapterFn,
- func_get_adapter_name: WintunGetAdapterNameFn,
+ func_close: WintunCloseAdapterFn,
func_get_adapter_luid: WintunGetAdapterLuidFn,
func_set_logger: WintunSetLoggerFn,
}
@@ -87,50 +68,11 @@ pub struct WintunDll {
unsafe impl Send for WintunDll {}
unsafe impl Sync for WintunDll {}
-type RebootRequired = bool;
-
-/// A new Wintun adapter that is destroyed when dropped.
-#[derive(Debug)]
-pub struct TemporaryWintunAdapter {
- pub adapter: WintunAdapter,
-}
-
-impl TemporaryWintunAdapter {
- pub fn create(
- dll_handle: Arc<WintunDll>,
- pool: &U16CStr,
- name: &U16CStr,
- requested_guid: Option<GUID>,
- ) -> io::Result<(Self, RebootRequired)> {
- let (adapter, reboot_required) =
- WintunAdapter::create(dll_handle, pool, name, requested_guid)?;
- Ok((TemporaryWintunAdapter { adapter }, reboot_required))
- }
-
- pub fn adapter(&self) -> &WintunAdapter {
- &self.adapter
- }
-}
-
-impl Drop for TemporaryWintunAdapter {
- fn drop(&mut self) {
- if let Err(error) = unsafe {
- self.adapter
- .dll_handle
- .delete_adapter(self.adapter.handle, true)
- } {
- log::error!(
- "{}",
- error.display_chain_with_msg("Failed to delete Wintun adapter")
- );
- }
- }
-}
-
/// Represents a Wintun adapter.
pub struct WintunAdapter {
dll_handle: Arc<WintunDll>,
handle: RawHandle,
+ name: U16CString,
}
impl fmt::Debug for WintunAdapter {
@@ -145,41 +87,20 @@ unsafe impl Send for WintunAdapter {}
unsafe impl Sync for WintunAdapter {}
impl WintunAdapter {
- pub fn open(dll_handle: Arc<WintunDll>, pool: &U16CStr, name: &U16CStr) -> io::Result<Self> {
- Ok(Self {
- handle: dll_handle.open_adapter(pool, name)?,
- dll_handle,
- })
- }
-
pub fn create(
dll_handle: Arc<WintunDll>,
- pool: &U16CStr,
name: &U16CStr,
+ tunnel_type: &U16CStr,
requested_guid: Option<GUID>,
- ) -> io::Result<(Self, RebootRequired)> {
- {
- if let Ok(adapter) = Self::open(dll_handle.clone(), name, pool) {
- // Delete existing adapter in case it has residual config
- adapter.delete(false).map_err(|error| {
- log::error!(
- "{}",
- error.display_chain_with_msg("Failed to delete existing Wintun adapter")
- );
- error
- })?;
- }
- }
-
- let (handle, restart_required) = dll_handle.create_adapter(pool, name, requested_guid)?;
-
- if restart_required {
- log::warn!("You may need to restart Windows to complete the install of Wintun");
- }
-
- let adapter = Self { dll_handle, handle };
+ ) -> io::Result<Self> {
+ let handle = dll_handle.create_adapter(name, tunnel_type, requested_guid)?;
+ let adapter = Self {
+ dll_handle,
+ handle,
+ name: name.to_owned(),
+ };
adapter.restore_missing_component_id();
- Ok((adapter, restart_required))
+ Ok(adapter)
}
pub fn prepare_interface(&self) {
@@ -191,15 +112,8 @@ impl WintunAdapter {
}
}
- pub fn delete(self, force_close_sessions: bool) -> io::Result<RebootRequired> {
- unsafe {
- self.dll_handle
- .delete_adapter(self.handle, force_close_sessions)
- }
- }
-
- pub fn name(&self) -> io::Result<U16CString> {
- unsafe { self.dll_handle.get_adapter_name(self.handle) }
+ pub fn name(&self) -> U16CString {
+ self.name.to_owned()
}
pub fn luid(&self) -> NET_LUID {
@@ -262,7 +176,7 @@ impl WintunAdapter {
impl Drop for WintunAdapter {
fn drop(&mut self) {
- unsafe { self.dll_handle.free_adapter(self.handle) };
+ unsafe { self.dll_handle.close_adapter(self.handle) };
}
}
@@ -301,34 +215,16 @@ impl WintunDll {
) -> io::Result<Self> {
Ok(WintunDll {
handle,
- func_open: unsafe {
- *((&get_proc_fn(
- handle,
- CStr::from_bytes_with_nul(b"WintunOpenAdapter\0").unwrap(),
- )?) as *const _ as *const _)
- },
func_create: unsafe {
*((&get_proc_fn(
handle,
CStr::from_bytes_with_nul(b"WintunCreateAdapter\0").unwrap(),
)?) as *const _ as *const _)
},
- func_delete: unsafe {
+ func_close: unsafe {
*((&get_proc_fn(
handle,
- CStr::from_bytes_with_nul(b"WintunDeleteAdapter\0").unwrap(),
- )?) as *const _ as *const _)
- },
- func_free: unsafe {
- *((&get_proc_fn(
- handle,
- CStr::from_bytes_with_nul(b"WintunFreeAdapter\0").unwrap(),
- )?) as *const _ as *const _)
- },
- func_get_adapter_name: unsafe {
- *((&get_proc_fn(
- handle,
- CStr::from_bytes_with_nul(b"WintunGetAdapterName\0").unwrap(),
+ CStr::from_bytes_with_nul(b"WintunCloseAdapter\0").unwrap(),
)?) as *const _ as *const _)
},
func_get_adapter_luid: unsafe {
@@ -354,59 +250,25 @@ impl WintunDll {
Ok(handle)
}
- pub fn open_adapter(&self, pool: &U16CStr, name: &U16CStr) -> io::Result<RawHandle> {
- let handle = unsafe { (self.func_open)(pool.as_ptr(), name.as_ptr()) };
- if handle == ptr::null_mut() {
- return Err(io::Error::last_os_error());
- }
- Ok(handle)
- }
-
pub fn create_adapter(
&self,
- pool: &U16CStr,
name: &U16CStr,
+ tunnel_type: &U16CStr,
requested_guid: Option<GUID>,
- ) -> io::Result<(RawHandle, RebootRequired)> {
+ ) -> io::Result<RawHandle> {
let guid_ptr = match requested_guid.as_ref() {
Some(guid) => guid as *const _,
None => ptr::null_mut(),
};
- let mut reboot_required = 0;
- let handle = unsafe {
- (self.func_create)(pool.as_ptr(), name.as_ptr(), guid_ptr, &mut reboot_required)
- };
+ let handle = unsafe { (self.func_create)(name.as_ptr(), tunnel_type.as_ptr(), guid_ptr) };
if handle == ptr::null_mut() {
return Err(io::Error::last_os_error());
}
- Ok((handle, reboot_required != 0))
- }
-
- pub unsafe fn delete_adapter(
- &self,
- adapter: RawHandle,
- force_close_sessions: bool,
- ) -> io::Result<RebootRequired> {
- let mut reboot_required = 0;
- let force_close_sessions = if force_close_sessions { 1 } else { 0 };
- let result = (self.func_delete)(adapter, force_close_sessions, &mut reboot_required);
- if result == 0 {
- return Err(io::Error::last_os_error());
- }
- Ok(reboot_required != 0)
- }
-
- pub unsafe fn free_adapter(&self, adapter: RawHandle) {
- (self.func_free)(adapter);
+ Ok(handle)
}
- pub unsafe fn get_adapter_name(&self, adapter: RawHandle) -> io::Result<U16CString> {
- let mut alias_buffer = vec![0u16; MAX_ADAPTER_NAME];
- let result = (self.func_get_adapter_name)(adapter, alias_buffer.as_mut_ptr());
- if result == 0 {
- return Err(io::Error::last_os_error());
- }
- Ok(U16CString::from_vec_truncate(alias_buffer))
+ pub unsafe fn close_adapter(&self, adapter: RawHandle) {
+ (self.func_close)(adapter);
}
pub unsafe fn get_adapter_luid(&self, adapter: RawHandle) -> NET_LUID {
@@ -440,7 +302,7 @@ impl WintunLoggerHandle {
Self { dll_handle }
}
- extern "stdcall" fn callback(level: WintunLoggerLevel, message: *const u16) {
+ extern "stdcall" fn callback(level: WintunLoggerLevel, _timestamp: u64, message: *const u16) {
if message.is_null() {
return;
}
diff --git a/windows/driverlogic/src/driverlogic.cpp b/windows/driverlogic/src/driverlogic.cpp
index aba746d3e3..2fdcc3046c 100644
--- a/windows/driverlogic/src/driverlogic.cpp
+++ b/windows/driverlogic/src/driverlogic.cpp
@@ -228,26 +228,23 @@ ReturnCode CommandSplitTunnelForceInstall(const std::vector<std::wstring> &args)
return CommandSplitTunnelNewInstall(args);
}
-ReturnCode CommandWintunDeletePool(const std::vector<std::wstring> &args)
+ReturnCode CommandWintunDeleteDriver(const std::vector<std::wstring> &args)
{
ArgumentContext argsContext(args);
- argsContext.ensureExactArgumentCount(1);
-
- const auto poolName = argsContext.next();
+ argsContext.ensureExactArgumentCount(0);
WintunDll wintun;
- BOOL rebootRequired;
-
- if (FALSE == wintun.deletePoolDriver(poolName.c_str(), &rebootRequired))
+ if (FALSE == wintun.deleteDriver())
{
- throw std::runtime_error("Failed to delete wintun pool");
+ // NOTE: This is expected if there are other adapters in use.
+ throw std::runtime_error("Failed to delete wintun driver");
}
std::wstringstream ss;
- ss << L"Successfully deleted wintun pool. Reboot required: " << rebootRequired;
+ ss << L"Deleted Wintun driver";
Log(ss.str());
@@ -343,7 +340,7 @@ int wmain(int argc, const wchar_t *argv[])
{ L"st-new-install", CommandSplitTunnelNewInstall },
{ L"st-force-install", CommandSplitTunnelForceInstall },
{ L"st-remove", CommandSplitTunnelRemove },
- { L"wintun-delete-pool-driver", CommandWintunDeletePool },
+ { L"wintun-delete-driver", CommandWintunDeleteDriver },
{ L"wintun-delete-abandoned-device", CommandWintunDeleteAbandonedDevice },
{ L"wg-nt-cleanup", CommandWireGuardNtCleanup }
};
diff --git a/windows/driverlogic/src/wintun.h b/windows/driverlogic/src/wintun.h
index 3d81be97e3..22444fcd94 100644
--- a/windows/driverlogic/src/wintun.h
+++ b/windows/driverlogic/src/wintun.h
@@ -20,10 +20,7 @@ public:
try
{
- createAdapter = getProcAddressOrThrow<WINTUN_CREATE_ADAPTER_FUNC>("WintunCreateAdapter");
- openAdapter = getProcAddressOrThrow<WINTUN_OPEN_ADAPTER_FUNC>("WintunOpenAdapter");
- freeAdapter = getProcAddressOrThrow<WINTUN_FREE_ADAPTER_FUNC>("WintunFreeAdapter");
- deletePoolDriver = getProcAddressOrThrow<WINTUN_DELETE_POOL_DRIVER_FUNC>("WintunDeletePoolDriver");
+ deleteDriver = getProcAddressOrThrow<WINTUN_DELETE_DRIVER_FUNC*>("WintunDeleteDriver");
}
catch (...)
{
@@ -40,10 +37,7 @@ public:
}
}
- WINTUN_CREATE_ADAPTER_FUNC createAdapter;
- WINTUN_OPEN_ADAPTER_FUNC openAdapter;
- WINTUN_FREE_ADAPTER_FUNC freeAdapter;
- WINTUN_DELETE_POOL_DRIVER_FUNC deletePoolDriver;
+ WINTUN_DELETE_DRIVER_FUNC *deleteDriver;
private:
diff --git a/wireguard/build-wireguard-go.sh b/wireguard/build-wireguard-go.sh
index 0b63cc3f43..33330c9298 100755
--- a/wireguard/build-wireguard-go.sh
+++ b/wireguard/build-wireguard-go.sh
@@ -109,7 +109,7 @@ function build_unix {
function build_android {
echo "Building for android"
- local docker_image_hash="5e3ad65f2d344a891343633a7f545b56fd4cbc0a9776b921ce245773150cf781"
+ local docker_image_hash="afa84a78b428163b4585d04259fad801df2ebf5ab079f53b3a90892afd18dd9f"
if is_docker_build $@; then
docker run --rm \
diff --git a/wireguard/libwg/Android.mk b/wireguard/libwg/Android.mk
index cfbf5e3eb5..54fd160db8 100644
--- a/wireguard/libwg/Android.mk
+++ b/wireguard/libwg/Android.mk
@@ -22,8 +22,9 @@ default: $(DESTDIR)/libwg.so
GOBUILDARCH := $(NDK_GO_ARCH_MAP_$(shell uname -m))
GOBUILDOS := $(shell uname -s | tr '[:upper:]' '[:lower:]')
-GOBUILDVERSION := 1.12
-GOBUILDTARBALL := https://dl.google.com/go/go$(GOBUILDVERSION).$(GOBUILDOS)-$(GOBUILDARCH).tar.gz
+GOBUILDVERSION := 1.18.5
+# TODO: Add checksum?
+GOBUILDTARBALL := https://go.dev/dl/go$(GOBUILDVERSION).$(GOBUILDOS)-$(GOBUILDARCH).tar.gz
GOBUILDVERSION_NEEDED := go version go$(GOBUILDVERSION) $(GOBUILDOS)/$(GOBUILDARCH)
$(DESTDIR)/libwg.so:
diff --git a/wireguard/libwg/Dockerfile_AndroidPatchedGoruntime b/wireguard/libwg/Dockerfile_AndroidPatchedGoruntime
index 12b1248fa1..32e1591fe3 100644
--- a/wireguard/libwg/Dockerfile_AndroidPatchedGoruntime
+++ b/wireguard/libwg/Dockerfile_AndroidPatchedGoruntime
@@ -1,5 +1,5 @@
# To build the image:
-# docker build . -t quay.io/mullvad/mullvad-android-app-build
+# docker build . -t quay.io/mullvad/mullvad-android-app-build -f Dockerfile_AndroidPatchedGoruntime
# To push the image to Quay.io:
# docker push quay.io/mullvad/mullvad-android-app-build
@@ -27,13 +27,13 @@ RUN cd /tmp && \
ENV ANDROID_NDK_HOME="/opt/android/android-ndk-r20b"
ENV NDK_TOOLCHAIN_DIR="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin"
-ENV GOLANG_VERSION 1.16
-ENV GOLANG_HASH 013a489ebb3e24ef3d915abe5b94c3286c070dfe0818d5bca8108f1d6e8440d2
+ENV GOLANG_VERSION 1.18.5
+ENV GOLANG_HASH 9e5de37f9c49942c601b191ac5fba404b868bfc21d446d6960acc12283d6e5f2
# Install Go-lang and patch it to use the appropriate monotonic clock
COPY goruntime-boottime-over-monotonic.diff /opt/goruntime-boottime-over-monotonic.diff
RUN cd /tmp && \
- curl -sf -L -o go.tgz https://golang.org/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz && \
+ curl -sf -L -o go.tgz https://go.dev/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz && \
echo "${GOLANG_HASH} go.tgz" | sha256sum -c - && \
cd /opt && \
tar -xzf /tmp/go.tgz && \
diff --git a/wireguard/libwg/go.mod b/wireguard/libwg/go.mod
index cde1c8b121..27f48a3d06 100644
--- a/wireguard/libwg/go.mod
+++ b/wireguard/libwg/go.mod
@@ -1,11 +1,15 @@
module github.com/mullvad/mullvadvpn-app/wireguard/libwg
-go 1.16
+go 1.18
require (
- golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a // indirect
- golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect
- golang.org/x/sys v0.0.0-20210521203332-0cec03c779c1
- golang.zx2c4.com/wireguard v0.0.0-20210521230051-c27ff9b9f6f7
- golang.zx2c4.com/wireguard/windows v0.3.14
+ golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664
+ golang.zx2c4.com/wireguard v0.0.0-20220703234212-c31a7b1ab478
+ golang.zx2c4.com/wireguard/windows v0.5.3
+)
+
+require (
+ golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
+ golang.org/x/net v0.0.0-20220809184613-07c6da5e1ced // indirect
+ golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224 // indirect
)
diff --git a/wireguard/libwg/go.sum b/wireguard/libwg/go.sum
index 56874032e0..d1f125b01c 100644
--- a/wireguard/libwg/go.sum
+++ b/wireguard/libwg/go.sum
@@ -1,46 +1,12 @@
-github.com/lxn/walk v0.0.0-20210112085537-c389da54e794/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ=
-github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g=
-golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
-golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc=
-golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo=
-golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210225014209-683adc9d29d7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210303074136-134d130e1a04 h1:cEhElsAv9LUt9ZUUocxzWe05oFLVd+AA2nstydTeI8g=
-golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210309040221-94ec62e08169 h1:fpeMGRM6A+XFcw4RPCO8s8hH7ppgrGR22pSIjwM7YUI=
-golang.org/x/sys v0.0.0-20210309040221-94ec62e08169/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210521203332-0cec03c779c1 h1:lCnv+lfrU9FRPGf8NeRuWAAPjNnema5WtBinMgs1fD8=
-golang.org/x/sys v0.0.0-20210521203332-0cec03c779c1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6-0.20210220033129-8f690f22cf1c/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7-0.20210503195748-5c7c50ebbd4f/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.zx2c4.com/wireguard v0.0.0-20210225140808-70b7b7158fc9 h1:TJSR8+LPfs2r4KYDa8DMfYm4RH/PdjY7GoyidowPqXo=
-golang.zx2c4.com/wireguard v0.0.0-20210225140808-70b7b7158fc9/go.mod h1:39ZQQ95hUxDxT7opsWy/rtfgvXXc8s30qfZ02df69Fo=
-golang.zx2c4.com/wireguard v0.0.0-20210424170727-c9db4b7aaa22 h1:ytS28bw9HtZVDRMDxviC6ryCJuccw+zXhh04u2IRWJw=
-golang.zx2c4.com/wireguard v0.0.0-20210424170727-c9db4b7aaa22/go.mod h1:a057zjmoc00UN7gVkaJt2sXVK523kMJcogDTEvPIasg=
-golang.zx2c4.com/wireguard v0.0.0-20210510202332-9844c74f67ec/go.mod h1:a057zjmoc00UN7gVkaJt2sXVK523kMJcogDTEvPIasg=
-golang.zx2c4.com/wireguard v0.0.0-20210521230051-c27ff9b9f6f7 h1:49xj+395UVX4Bo7Qvm9JR44mewBtqUpWqHqreDuPQI8=
-golang.zx2c4.com/wireguard v0.0.0-20210521230051-c27ff9b9f6f7/go.mod h1:a057zjmoc00UN7gVkaJt2sXVK523kMJcogDTEvPIasg=
-golang.zx2c4.com/wireguard/windows v0.3.14 h1:5yIDYyrQyGkLqV+tzY4ilMNeIvQeMXAz0glZz9u179A=
-golang.zx2c4.com/wireguard/windows v0.3.14/go.mod h1:3P4IEAsb+BjlKZmpUXgy74c0iX9AVwwr3WcVJ8nPgME=
+golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c=
+golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/net v0.0.0-20220809184613-07c6da5e1ced h1:3dYNDff0VT5xj+mbj2XucFst9WKk6PdGOrb9n+SbIvw=
+golang.org/x/net v0.0.0-20220809184613-07c6da5e1ced/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
+golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664 h1:v1W7bwXHsnLLloWYTVEdvGvA7BHMeBYsPcF0GLDxIRs=
+golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224 h1:Ug9qvr1myri/zFN6xL17LSCBGFDnphBBhzmILHsM5TY=
+golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI=
+golang.zx2c4.com/wireguard v0.0.0-20220703234212-c31a7b1ab478 h1:vDy//hdR+GnROE3OdYbQKt9rdtNdHkDtONvpRwmls/0=
+golang.zx2c4.com/wireguard v0.0.0-20220703234212-c31a7b1ab478/go.mod h1:bVQfyl2sCM/QIIGHpWbFGfHPuDvqnCNkT6MQLTCjO/U=
+golang.zx2c4.com/wireguard/windows v0.5.3 h1:On6j2Rpn3OEMXqBq00QEDC7bWSZrPIHKIus8eIuExIE=
+golang.zx2c4.com/wireguard/windows v0.5.3/go.mod h1:9TEe8TJmtwyQebdFwAkEWOPr3prrtqm+REGFifP60hI=
diff --git a/wireguard/libwg/libwg_windows.go b/wireguard/libwg/libwg_windows.go
index af7d7f6488..a1dc4fd265 100644
--- a/wireguard/libwg/libwg_windows.go
+++ b/wireguard/libwg/libwg_windows.go
@@ -11,7 +11,6 @@ import "C"
import (
"bufio"
- "fmt"
"strings"
"unsafe"
@@ -20,7 +19,6 @@ import (
"golang.zx2c4.com/wireguard/conn"
"golang.zx2c4.com/wireguard/device"
"golang.zx2c4.com/wireguard/tun"
- "golang.zx2c4.com/wireguard/tun/wintun"
"github.com/mullvad/mullvadvpn-app/wireguard/libwg/logging"
"github.com/mullvad/mullvadvpn-app/wireguard/libwg/tunnelcontainer"
@@ -31,16 +29,6 @@ import (
type LogSink = unsafe.Pointer
type LogContext = unsafe.Pointer
-var MullvadPool *wintun.Pool
-
-func init() {
- var err error
- MullvadPool, err = wintun.MakePool("Mullvad")
- if err != nil {
- panic(fmt.Errorf("Failed to make pool: %w", err))
- }
-}
-
//export wgTurnOn
func wgTurnOn(cIfaceName *C.char, mtu int, cSettings *C.char, cIfaceNameOut **C.char, cLuidOut *uint64, logSink LogSink, logContext LogContext) int32 {
logger := logging.NewLogger(logSink, logContext)
@@ -64,9 +52,7 @@ func wgTurnOn(cIfaceName *C.char, mtu int, cSettings *C.char, cIfaceNameOut **C.
// {AFE43773-E1F8-4EBB-8536-576AB86AFE9A}
networkId := windows.GUID{0xafe43773, 0xe1f8, 0x4ebb, [8]byte{0x85, 0x36, 0x57, 0x6a, 0xb8, 0x6a, 0xfe, 0x9a}}
- if tun.WintunPool != MullvadPool {
- tun.WintunPool = MullvadPool
- }
+ tun.WintunTunnelType = "Mullvad"
wintun, err := tun.CreateTUNWithRequestedGUID(ifaceName, &networkId, mtu)
if err != nil {