summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-03-22 17:08:49 +0100
committerDavid Lönnhager <david.l@mullvad.net>2021-07-02 09:54:19 +0200
commit2807381201adc5a3adb5b3ff281c5da982a22b70 (patch)
tree5420e72fe1660a072087082b5711f84ae5b1184c
parent9c0b17a98295d8bd21fba2645f9da72121ebb2a2 (diff)
downloadmullvadvpn-2807381201adc5a3adb5b3ff281c5da982a22b70.tar.xz
mullvadvpn-2807381201adc5a3adb5b3ff281c5da982a22b70.zip
Force caller to deal with default route callback handle
-rw-r--r--talpid-core/src/routing/windows.rs30
-rw-r--r--talpid-core/src/tunnel/wireguard/mod.rs13
-rw-r--r--talpid-core/src/tunnel_state_machine/connected_state.rs2
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs2
-rw-r--r--talpid-core/src/tunnel_state_machine/windows.rs10
-rw-r--r--windows/winnet/src/winnet/winnet.cpp4
6 files changed, 26 insertions, 35 deletions
diff --git a/talpid-core/src/routing/windows.rs b/talpid-core/src/routing/windows.rs
index cba05cb936..be812ff99a 100644
--- a/talpid-core/src/routing/windows.rs
+++ b/talpid-core/src/routing/windows.rs
@@ -24,6 +24,9 @@ pub enum Error {
/// Failure to clear routes
#[error(display = "Failed to clear applied routes")]
ClearRoutesFailed,
+ /// WinNet returned an error while adding default route callback
+ #[error(display = "Failed to set callback for default route")]
+ FailedToAddDefaultRouteCallback,
/// Attempt to use route manager that has been dropped
#[error(display = "Cannot send message to route manager since it is down")]
RouteManagerDown,
@@ -33,7 +36,6 @@ pub type Result<T> = std::result::Result<T, Error>;
/// Manages routes by calling into WinNet
pub struct RouteManager {
- callback_handles: Vec<winnet::WinNetCallbackHandle>,
runtime: tokio::runtime::Handle,
manage_tx: Option<UnboundedSender<RouteManagerCommand>>,
}
@@ -73,7 +75,6 @@ impl RouteManager {
}
let (manage_tx, manage_rx) = mpsc::unbounded();
let manager = Self {
- callback_handles: vec![],
runtime: runtime.clone(),
manage_tx: Some(manage_tx),
};
@@ -129,32 +130,16 @@ impl RouteManager {
}
/// Sets a callback that is called whenever the default route changes.
- #[cfg(target_os = "windows")]
pub fn add_default_route_callback<T: 'static>(
&mut self,
callback: Option<winnet::DefaultRouteChangedCallback>,
context: T,
- ) {
+ ) -> Result<winnet::WinNetCallbackHandle> {
if self.manage_tx.is_none() {
- return;
+ return Err(Error::RouteManagerDown);
}
-
- match winnet::add_default_route_change_callback(callback, context) {
- Err(_e) => {
- // not sure if this should panic
- log::error!("Failed to add callback!");
- }
- Ok(handle) => {
- self.callback_handles.push(handle);
- }
- }
- }
-
- /// Removes all routes previously applied in [`RouteManager::new`] or
- /// [`RouteManager::add_routes`].
- pub fn clear_default_route_callbacks(&mut self) {
- // `WinNetCallbackHandle::drop` removes these callbacks.
- self.callback_handles.clear();
+ winnet::add_default_route_change_callback(callback, context)
+ .map_err(|_| Error::FailedToAddDefaultRouteCallback)
}
/// Stops the routing manager and invalidates the route manager - no new default route callbacks
@@ -165,7 +150,6 @@ impl RouteManager {
log::error!("RouteManager channel already down or thread panicked");
}
- self.callback_handles.clear();
winnet::deactivate_routing_manager();
}
}
diff --git a/talpid-core/src/tunnel/wireguard/mod.rs b/talpid-core/src/tunnel/wireguard/mod.rs
index 899589dbc4..47c86e4e5f 100644
--- a/talpid-core/src/tunnel/wireguard/mod.rs
+++ b/talpid-core/src/tunnel/wireguard/mod.rs
@@ -90,6 +90,8 @@ pub struct WireguardMonitor {
stop_setup_tx: Option<futures::channel::oneshot::Sender<()>>,
pinger_stop_sender: mpsc::Sender<()>,
_tcp_proxies: Vec<TcpProxy>,
+ #[cfg(target_os = "windows")]
+ _callback_handle: Option<crate::winnet::WinNetCallbackHandle>,
}
#[cfg(target_os = "linux")]
@@ -191,8 +193,13 @@ impl WireguardMonitor {
runtime.block_on((on_event)(TunnelEvent::InterfaceUp(metadata.clone())));
#[cfg(target_os = "windows")]
- route_manager
- .add_default_route_callback(Some(WgGoTunnel::default_route_changed_callback), ());
+ let callback_handle = route_manager
+ .add_default_route_callback(Some(WgGoTunnel::default_route_changed_callback), ())
+ .ok();
+ #[cfg(target_os = "windows")]
+ if callback_handle.is_none() {
+ log::warn!("Failed to register default route callback");
+ }
let event_callback = Box::new(on_event.clone());
let (close_msg_sender, close_msg_receiver) = mpsc::channel();
@@ -209,6 +216,8 @@ impl WireguardMonitor {
stop_setup_tx: Some(stop_setup_tx),
pinger_stop_sender: pinger_tx,
_tcp_proxies: tcp_proxies,
+ #[cfg(target_os = "windows")]
+ _callback_handle: callback_handle,
};
let gateway = config.ipv4_gateway;
diff --git a/talpid-core/src/tunnel_state_machine/connected_state.rs b/talpid-core/src/tunnel_state_machine/connected_state.rs
index 2511713fc5..68766ec23a 100644
--- a/talpid-core/src/tunnel_state_machine/connected_state.rs
+++ b/talpid-core/src/tunnel_state_machine/connected_state.rs
@@ -139,8 +139,6 @@ impl ConnectedState {
}
fn reset_routes(shared_values: &mut SharedTunnelStateValues) {
- #[cfg(windows)]
- shared_values.route_manager.clear_default_route_callbacks();
if let Err(error) = shared_values.route_manager.clear_routes() {
log::error!("{}", error.display_chain_with_msg("Failed to clear routes"));
}
diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs
index cb337c02ab..9d7f768207 100644
--- a/talpid-core/src/tunnel_state_machine/connecting_state.rs
+++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs
@@ -216,8 +216,6 @@ impl ConnectingState {
}
fn reset_routes(shared_values: &mut SharedTunnelStateValues) {
- #[cfg(windows)]
- shared_values.route_manager.clear_default_route_callbacks();
if let Err(error) = shared_values.route_manager.clear_routes() {
log::error!("{}", error.display_chain_with_msg("Failed to clear routes"));
}
diff --git a/talpid-core/src/tunnel_state_machine/windows.rs b/talpid-core/src/tunnel_state_machine/windows.rs
index 3ea26bf819..52b81055af 100644
--- a/talpid-core/src/tunnel_state_machine/windows.rs
+++ b/talpid-core/src/tunnel_state_machine/windows.rs
@@ -69,13 +69,11 @@ pub(super) fn update_split_tunnel_addresses(
.register_ips(tunnel_ipv4, tunnel_ipv6, internet_ipv4, internet_ipv6)
.map_err(BoxedError::new)?;
- // FIXME: Do this via the route manager
shared_values.st_route_handler = Some(
- crate::winnet::add_default_route_change_callback(
- Some(split_tunnel_default_route_change_handler),
- context,
- )
- .map_err(BoxedError::new)?,
+ shared_values
+ .route_manager
+ .add_default_route_callback(Some(split_tunnel_default_route_change_handler), context)
+ .map_err(BoxedError::new)?,
);
Ok(())
diff --git a/windows/winnet/src/winnet/winnet.cpp b/windows/winnet/src/winnet/winnet.cpp
index e82345ebee..9dda5cbbf2 100644
--- a/windows/winnet/src/winnet/winnet.cpp
+++ b/windows/winnet/src/winnet/winnet.cpp
@@ -524,6 +524,10 @@ WinNet_UnregisterDefaultRouteChangedCallback(
if (nullptr == g_RouteManager)
{
+ if (nullptr != g_RouteManagerLogSink)
+ {
+ g_RouteManagerLogSink->debug("Cannot remove default route callback for deactivated route manager");
+ }
return;
}