diff options
| author | David Lönnhager <david.l@mullvad.net> | 2022-03-16 09:35:37 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2022-03-18 10:27:41 +0100 |
| commit | 302bf767db78b7cb1e76ea64414e33daa52e809f (patch) | |
| tree | f005b12db400d5da2ad7d331012e9fbd291a0e46 /talpid-core/src | |
| parent | 7f0ce804744d3e76afee25f06186764ddc6fe524 (diff) | |
| download | mullvadvpn-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.rs | 12 | ||||
| -rw-r--r-- | talpid-core/src/split_tunnel/windows/mod.rs | 6 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/wireguard/wireguard_go.rs | 8 | ||||
| -rw-r--r-- | talpid-core/src/winnet.rs | 3 |
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( |
