summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2022-06-10 16:14:36 +0200
committerDavid Lönnhager <david.l@mullvad.net>2022-06-10 16:14:36 +0200
commit1065db6ec3e2e0485bd39a5730942071f5cdbaf4 (patch)
treee82417eefe218d259641a226cf70a32889d73fbe
parent5687ad3931130b024578068df9f0a4fe60e3910f (diff)
parent5688bbdd740f42023275daba6475c43cfe3fa5d4 (diff)
downloadmullvadvpn-1065db6ec3e2e0485bd39a5730942071f5cdbaf4.tar.xz
mullvadvpn-1065db6ec3e2e0485bd39a5730942071f5cdbaf4.zip
Merge branch 'win-st-reset-post-hibernation'
-rw-r--r--talpid-core/src/split_tunnel/windows/driver.rs53
-rw-r--r--talpid-core/src/split_tunnel/windows/mod.rs2
2 files changed, 31 insertions, 24 deletions
diff --git a/talpid-core/src/split_tunnel/windows/driver.rs b/talpid-core/src/split_tunnel/windows/driver.rs
index 158101d515..70fe90f45d 100644
--- a/talpid-core/src/split_tunnel/windows/driver.rs
+++ b/talpid-core/src/split_tunnel/windows/driver.rs
@@ -63,6 +63,7 @@ pub enum DriverIoctlCode {
ClearConfiguration = ctl_code(ST_DEVICE_TYPE, 8, METHOD_NEITHER, FILE_ANY_ACCESS),
GetState = ctl_code(ST_DEVICE_TYPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS),
QueryProcess = ctl_code(ST_DEVICE_TYPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS),
+ Reset = ctl_code(ST_DEVICE_TYPE, 11, METHOD_NEITHER, FILE_ANY_ACCESS),
}
#[derive(Debug, PartialEq)]
@@ -206,6 +207,10 @@ pub enum DeviceHandleError {
/// Failed to clear configuration in driver
#[error(display = "Failed to clear configuration in driver")]
ClearConfigError(#[error(source)] io::Error),
+
+ /// Failed to reset driver state to "started"
+ #[error(display = "Failed to reset driver state")]
+ ResetError(#[error(source)] io::Error),
}
impl DeviceHandle {
@@ -226,35 +231,26 @@ impl DeviceHandle {
})?;
let device = Self { handle };
+ device.reinitialize()?;
+ Ok(device)
+ }
- // Initialize the driver
- let state = device
- .get_driver_state()
- .map_err(DeviceHandleError::GetStateError)?;
- if state == DriverState::Started {
- log::trace!("Initializing driver");
- device
- .initialize()
- .map_err(DeviceHandleError::InitializationError)?;
- }
-
- // Initialize process tree
- let state = device
+ pub fn reinitialize(&self) -> Result<(), DeviceHandleError> {
+ let state = self
.get_driver_state()
.map_err(DeviceHandleError::GetStateError)?;
- if state == DriverState::Initialized {
- log::trace!("Registering processes");
- device
- .register_processes()
- .map_err(DeviceHandleError::RegisterProcessesError)?;
+ if state != DriverState::Started {
+ log::debug!("Resetting driver state");
+ self.reset().map_err(DeviceHandleError::ResetError)?;
}
- log::trace!("Clearing any existing exclusion config");
- device
- .clear_config()
- .map_err(DeviceHandleError::ClearConfigError)?;
+ log::debug!("Initializing driver");
+ self.initialize()
+ .map_err(DeviceHandleError::InitializationError)?;
- Ok(device)
+ log::debug!("Initializing driver process tree");
+ self.register_processes()
+ .map_err(DeviceHandleError::RegisterProcessesError)
}
fn initialize(&self) -> io::Result<()> {
@@ -406,6 +402,17 @@ impl DeviceHandle {
Ok(())
}
+
+ fn reset(&self) -> io::Result<()> {
+ device_io_control(
+ self.handle.as_raw_handle(),
+ DriverIoctlCode::Reset as u32,
+ None,
+ 0,
+ None,
+ )?;
+ Ok(())
+ }
}
impl AsRawHandle for DeviceHandle {
diff --git a/talpid-core/src/split_tunnel/windows/mod.rs b/talpid-core/src/split_tunnel/windows/mod.rs
index 6c3d8b9368..5b5b29e0cc 100644
--- a/talpid-core/src/split_tunnel/windows/mod.rs
+++ b/talpid-core/src/split_tunnel/windows/mod.rs
@@ -156,7 +156,7 @@ struct EventThreadContext {
unsafe impl Send for EventThreadContext {}
impl SplitTunnel {
- /// Initialize the driver.
+ /// Initialize the split tunnel device.
pub fn new(
runtime: tokio::runtime::Handle,
daemon_tx: Weak<mpsc::UnboundedSender<TunnelCommand>>,