summaryrefslogtreecommitdiffhomepage
path: root/talpid-core/src
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2022-03-16 09:35:37 +0100
committerDavid Lönnhager <david.l@mullvad.net>2022-03-18 10:27:41 +0100
commit302bf767db78b7cb1e76ea64414e33daa52e809f (patch)
treef005b12db400d5da2ad7d331012e9fbd291a0e46 /talpid-core/src
parent7f0ce804744d3e76afee25f06186764ddc6fe524 (diff)
downloadmullvadvpn-302bf767db78b7cb1e76ea64414e33daa52e809f.tar.xz
mullvadvpn-302bf767db78b7cb1e76ea64414e33daa52e809f.zip
Forward default route interface changes to the daemon, including
changes to its IP addresses
Diffstat (limited to 'talpid-core/src')
-rw-r--r--talpid-core/src/offline/windows.rs12
-rw-r--r--talpid-core/src/split_tunnel/windows/mod.rs6
-rw-r--r--talpid-core/src/tunnel/wireguard/wireguard_go.rs8
-rw-r--r--talpid-core/src/winnet.rs3
4 files changed, 20 insertions, 9 deletions
diff --git a/talpid-core/src/offline/windows.rs b/talpid-core/src/offline/windows.rs
index 15b5d47169..3c603cf7e9 100644
--- a/talpid-core/src/offline/windows.rs
+++ b/talpid-core/src/offline/windows.rs
@@ -122,11 +122,15 @@ impl BroadcastListener {
_default_route: winnet::WinNetDefaultRoute,
ctx: *mut c_void,
) {
+ use winnet::WinNetDefaultRouteChangeEventType::*;
+
+ if event_type == DefaultRouteUpdatedDetails {
+ // ignore changes that don't affect the route
+ return;
+ }
+
let state_lock: &mut Arc<Mutex<SystemState>> = &mut *(ctx as *mut _);
- let connectivity = match event_type {
- winnet::WinNetDefaultRouteChangeEventType::DefaultRouteChanged => true,
- winnet::WinNetDefaultRouteChangeEventType::DefaultRouteRemoved => false,
- };
+ let connectivity = event_type != DefaultRouteRemoved;
let change = match family {
winnet::WinNetAddrFamily::IPV4 => StateChange::NetworkV4Connectivity(connectivity),
winnet::WinNetAddrFamily::IPV6 => StateChange::NetworkV6Connectivity(connectivity),
diff --git a/talpid-core/src/split_tunnel/windows/mod.rs b/talpid-core/src/split_tunnel/windows/mod.rs
index efdd75ecf9..5102039e47 100644
--- a/talpid-core/src/split_tunnel/windows/mod.rs
+++ b/talpid-core/src/split_tunnel/windows/mod.rs
@@ -640,6 +640,8 @@ unsafe extern "system" fn split_tunnel_default_route_change_handler(
default_route: winnet::WinNetDefaultRoute,
ctx: *mut libc::c_void,
) {
+ use winnet::WinNetDefaultRouteChangeEventType::*;
+
// Update the "internet interface" IP when best default route changes
let ctx_mutex = &mut *(ctx as *mut Arc<Mutex<SplitTunnelDefaultRouteChangeHandlerContext>>);
let mut ctx = ctx_mutex.lock().expect("ST route handler mutex poisoned");
@@ -652,7 +654,7 @@ unsafe extern "system" fn split_tunnel_default_route_change_handler(
};
let result = match event_type {
- winnet::WinNetDefaultRouteChangeEventType::DefaultRouteChanged => {
+ DefaultRouteChanged | DefaultRouteUpdatedDetails => {
match interface_luid_to_ip(address_family, default_route.interface_luid) {
Ok(Some(ip)) => match IpAddr::from(ip) {
IpAddr::V4(addr) => ctx.internet_ipv4 = Some(addr),
@@ -684,7 +686,7 @@ unsafe extern "system" fn split_tunnel_default_route_change_handler(
ctx.register_ips()
}
// no default route
- winnet::WinNetDefaultRouteChangeEventType::DefaultRouteRemoved => {
+ DefaultRouteRemoved => {
match address_family {
WinNetAddrFamily::IPV4 => {
ctx.internet_ipv4 = None;
diff --git a/talpid-core/src/tunnel/wireguard/wireguard_go.rs b/talpid-core/src/tunnel/wireguard/wireguard_go.rs
index 28666b6506..a3d34acc0e 100644
--- a/talpid-core/src/tunnel/wireguard/wireguard_go.rs
+++ b/talpid-core/src/tunnel/wireguard/wireguard_go.rs
@@ -197,8 +197,10 @@ impl WgGoTunnel {
_ctx: *mut libc::c_void,
) {
use winapi::shared::{ifdef::NET_LUID, netioapi::ConvertInterfaceLuidToIndex};
+ use winnet::WinNetDefaultRouteChangeEventType::*;
+
let iface_idx: u32 = match event_type {
- winnet::WinNetDefaultRouteChangeEventType::DefaultRouteChanged => {
+ DefaultRouteChanged => {
let mut iface_idx = 0u32;
let iface_luid = NET_LUID {
Value: default_route.interface_luid,
@@ -216,7 +218,9 @@ impl WgGoTunnel {
iface_idx
}
// if there is no new default route, specify 0 as the interface index
- winnet::WinNetDefaultRouteChangeEventType::DefaultRouteRemoved => 0,
+ DefaultRouteRemoved => 0,
+ // ignore interface updates that don't affect the interface to use
+ DefaultRouteUpdatedDetails => return,
};
wgRebindTunnelSocket(address_family.to_windows_proto_enum(), iface_idx);
diff --git a/talpid-core/src/winnet.rs b/talpid-core/src/winnet.rs
index 7c9489ecfb..7f31082541 100644
--- a/talpid-core/src/winnet.rs
+++ b/talpid-core/src/winnet.rs
@@ -311,7 +311,8 @@ impl Drop for WinNetCallbackHandle {
#[repr(u16)]
pub enum WinNetDefaultRouteChangeEventType {
DefaultRouteChanged = 0,
- DefaultRouteRemoved = 1,
+ DefaultRouteUpdatedDetails = 1,
+ DefaultRouteRemoved = 2,
}
pub type DefaultRouteChangedCallback = unsafe extern "system" fn(