summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-10-01 16:00:32 +0200
committerDavid Lönnhager <david.l@mullvad.net>2021-10-01 16:00:32 +0200
commit0556f7e2960699bb8022247bcfe33d5c215c1955 (patch)
tree4c5c11e672bbf33d7df43fc8d32c92f6a0601b2a
parent11806868351c2024e3e0b8fee9c8a6b44fd39f10 (diff)
parent1a310847dd85ac3aca3b999adbfd2f76bc402bb0 (diff)
downloadmullvadvpn-0556f7e2960699bb8022247bcfe33d5c215c1955.tar.xz
mullvadvpn-0556f7e2960699bb8022247bcfe33d5c215c1955.zip
Merge branch 'win-st-fix-event-listener'
-rw-r--r--talpid-core/src/split_tunnel/windows/mod.rs88
-rw-r--r--talpid-core/src/winnet.rs2
2 files changed, 45 insertions, 45 deletions
diff --git a/talpid-core/src/split_tunnel/windows/mod.rs b/talpid-core/src/split_tunnel/windows/mod.rs
index 5e37f8c0b5..2fd19da420 100644
--- a/talpid-core/src/split_tunnel/windows/mod.rs
+++ b/talpid-core/src/split_tunnel/windows/mod.rs
@@ -434,53 +434,30 @@ impl SplitTunnel {
}
}
- // Identify IP address that gives us Internet access
- let internet_ipv4 = get_best_default_route(WinNetAddrFamily::IPV4)
- .map_err(Error::ObtainDefaultRoute)?
- .map(|route| interface_luid_to_ip(WinNetAddrFamily::IPV4, route.interface_luid))
- .transpose()
- .map_err(Error::LuidToIp)?
- .flatten();
- let internet_ipv6 = get_best_default_route(WinNetAddrFamily::IPV6)
- .map_err(Error::ObtainDefaultRoute)?
- .map(|route| interface_luid_to_ip(WinNetAddrFamily::IPV6, route.interface_luid))
- .transpose()
- .map_err(Error::LuidToIp)?
- .flatten();
-
let tunnel_ipv4 = Some(tunnel_ipv4.unwrap_or(RESERVED_IP_V4));
- let internet_ipv4 = internet_ipv4
- .map(|addr| Ipv4Addr::try_from(addr).map_err(|_| Error::IpParseError))
- .transpose()?;
- let internet_ipv6 = internet_ipv6
- .map(|addr| Ipv6Addr::try_from(addr).map_err(|_| Error::IpParseError))
- .transpose()?;
+ let context_mutex = Arc::new(Mutex::new(
+ SplitTunnelDefaultRouteChangeHandlerContext::new(
+ self.request_tx.clone(),
+ self.daemon_tx.clone(),
+ tunnel_ipv4,
+ tunnel_ipv6,
+ ),
+ ));
- let context = SplitTunnelDefaultRouteChangeHandlerContext::new(
- self.request_tx.clone(),
- self.daemon_tx.clone(),
- tunnel_ipv4,
- tunnel_ipv6,
- internet_ipv4,
- internet_ipv6,
- );
self._route_change_callback = None;
-
- self.send_request(Request::RegisterIps(
- tunnel_ipv4,
- tunnel_ipv6,
- internet_ipv4,
- internet_ipv6,
- ))?;
-
- self._route_change_callback = winnet::add_default_route_change_callback(
+ let mut context = context_mutex.lock().unwrap();
+ let callback = winnet::add_default_route_change_callback(
Some(split_tunnel_default_route_change_handler),
- context,
+ context_mutex.clone(),
)
.map(Some)
.map_err(|_| Error::RegisterRouteChangeCallback)?;
+ context.initialize_internet_addresses()?;
+ context.register_ips()?;
+ self._route_change_callback = callback;
+
Ok(())
}
@@ -526,16 +503,14 @@ impl SplitTunnelDefaultRouteChangeHandlerContext {
daemon_tx: Weak<mpsc::UnboundedSender<TunnelCommand>>,
tunnel_ipv4: Option<Ipv4Addr>,
tunnel_ipv6: Option<Ipv6Addr>,
- internet_ipv4: Option<Ipv4Addr>,
- internet_ipv6: Option<Ipv6Addr>,
) -> Self {
SplitTunnelDefaultRouteChangeHandlerContext {
request_tx,
daemon_tx,
tunnel_ipv4,
tunnel_ipv6,
- internet_ipv4,
- internet_ipv6,
+ internet_ipv4: None,
+ internet_ipv6: None,
}
}
@@ -550,6 +525,30 @@ impl SplitTunnelDefaultRouteChangeHandlerContext {
),
)
}
+
+ pub fn initialize_internet_addresses(&mut self) -> Result<(), Error> {
+ // Identify IP address that gives us Internet access
+ let internet_ipv4 = get_best_default_route(WinNetAddrFamily::IPV4)
+ .map_err(Error::ObtainDefaultRoute)?
+ .map(|route| interface_luid_to_ip(WinNetAddrFamily::IPV4, route.interface_luid))
+ .transpose()
+ .map_err(Error::LuidToIp)?
+ .flatten();
+ let internet_ipv6 = get_best_default_route(WinNetAddrFamily::IPV6)
+ .map_err(Error::ObtainDefaultRoute)?
+ .map(|route| interface_luid_to_ip(WinNetAddrFamily::IPV6, route.interface_luid))
+ .transpose()
+ .map_err(Error::LuidToIp)?
+ .flatten();
+
+ self.internet_ipv4 = internet_ipv4
+ .map(|addr| Ipv4Addr::try_from(addr).map_err(|_| Error::IpParseError))
+ .transpose()?;
+ self.internet_ipv6 = internet_ipv6
+ .map(|addr| Ipv6Addr::try_from(addr).map_err(|_| Error::IpParseError))
+ .transpose()?;
+ Ok(())
+ }
}
unsafe extern "system" fn split_tunnel_default_route_change_handler(
@@ -559,7 +558,8 @@ unsafe extern "system" fn split_tunnel_default_route_change_handler(
ctx: *mut libc::c_void,
) {
// Update the "internet interface" IP when best default route changes
- let ctx = &mut *(ctx as *mut SplitTunnelDefaultRouteChangeHandlerContext);
+ let ctx_mutex = &mut *(ctx as *mut Arc<Mutex<SplitTunnelDefaultRouteChangeHandlerContext>>);
+ let mut ctx = ctx_mutex.lock().expect("ST route handler mutex poisoned");
let daemon_tx = ctx.daemon_tx.upgrade();
let maybe_send = move |content| {
@@ -570,7 +570,7 @@ unsafe extern "system" fn split_tunnel_default_route_change_handler(
let result = match event_type {
winnet::WinNetDefaultRouteChangeEventType::DefaultRouteChanged => {
- match interface_luid_to_ip(address_family.clone(), default_route.interface_luid) {
+ 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),
IpAddr::V6(addr) => ctx.internet_ipv6 = Some(addr),
diff --git a/talpid-core/src/winnet.rs b/talpid-core/src/winnet.rs
index 4f71fa0040..e3853e1629 100644
--- a/talpid-core/src/winnet.rs
+++ b/talpid-core/src/winnet.rs
@@ -86,7 +86,7 @@ pub fn ensure_best_metric_for_interface(interface_alias: &str) -> Result<bool, E
}
}
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, Copy)]
#[allow(dead_code)]
#[repr(u32)]
pub enum WinNetAddrFamily {