diff options
| -rw-r--r-- | mullvad-jni/src/vpn_service_tun_provider.rs | 84 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/tun_provider/mod.rs | 8 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/tun_provider/stub.rs | 5 |
3 files changed, 59 insertions, 38 deletions
diff --git a/mullvad-jni/src/vpn_service_tun_provider.rs b/mullvad-jni/src/vpn_service_tun_provider.rs index 7da3ca3eef..68021ac8cd 100644 --- a/mullvad-jni/src/vpn_service_tun_provider.rs +++ b/mullvad-jni/src/vpn_service_tun_provider.rs @@ -92,42 +92,7 @@ impl VpnServiceTunProvider { fn get_tun_fd(&mut self, config: TunConfig) -> Result<RawFd, Error> { if self.active_tun.is_none() || self.last_tun_config != config { - let env = self - .jvm - .attach_current_thread_as_daemon() - .map_err(Error::AttachJvmToThread)?; - let create_tun_method = env - .get_method_id( - &self.class, - "createTun", - "(Lnet/mullvad/mullvadvpn/model/TunConfig;)I", - ) - .map_err(|cause| Error::FindMethod("createTun", cause))?; - - let java_config = env.auto_local(config.clone().into_java(&env)); - let result = env - .call_method_unchecked( - self.object.as_obj(), - create_tun_method, - JavaType::Primitive(Primitive::Int), - &[JValue::Object(java_config.as_obj())], - ) - .map_err(|cause| Error::CallMethod("createTun", cause))?; - - match result { - JValue::Int(fd) => { - let tun = unsafe { File::from_raw_fd(fd) }; - - self.active_tun = Some(tun); - self.last_tun_config = config; - } - value => { - return Err(Error::InvalidMethodResult( - "createTun", - format!("{:?}", value), - )) - } - } + self.open_tun(config)?; } Ok(self @@ -136,6 +101,45 @@ impl VpnServiceTunProvider { .expect("Tunnel should be configured") .as_raw_fd()) } + + fn open_tun(&mut self, config: TunConfig) -> Result<(), Error> { + let env = self + .jvm + .attach_current_thread_as_daemon() + .map_err(Error::AttachJvmToThread)?; + let create_tun_method = env + .get_method_id( + &self.class, + "createTun", + "(Lnet/mullvad/mullvadvpn/model/TunConfig;)I", + ) + .map_err(|cause| Error::FindMethod("createTun", cause))?; + + let java_config = env.auto_local(config.clone().into_java(&env)); + let result = env + .call_method_unchecked( + self.object.as_obj(), + create_tun_method, + JavaType::Primitive(Primitive::Int), + &[JValue::Object(java_config.as_obj())], + ) + .map_err(|cause| Error::CallMethod("createTun", cause))?; + + match result { + JValue::Int(fd) => { + let tun = unsafe { File::from_raw_fd(fd) }; + + self.active_tun = Some(tun); + self.last_tun_config = config; + + Ok(()) + } + value => Err(Error::InvalidMethodResult( + "createTun", + format!("{:?}", value), + )), + } + } } impl TunProvider for VpnServiceTunProvider { @@ -153,10 +157,14 @@ impl TunProvider for VpnServiceTunProvider { })) } + fn create_tun(&mut self) -> Result<(), BoxedError> { + self.open_tun(self.last_tun_config.clone()) + .map_err(BoxedError::new) + } + fn create_tun_if_closed(&mut self) -> Result<(), BoxedError> { if self.active_tun.is_none() { - self.get_tun_fd(self.last_tun_config.clone()) - .map_err(BoxedError::new)?; + self.create_tun()?; } Ok(()) diff --git a/talpid-core/src/tunnel/tun_provider/mod.rs b/talpid-core/src/tunnel/tun_provider/mod.rs index 3cac459c51..16c9c3f17c 100644 --- a/talpid-core/src/tunnel/tun_provider/mod.rs +++ b/talpid-core/src/tunnel/tun_provider/mod.rs @@ -53,6 +53,14 @@ pub trait TunProvider: Send + 'static { fn get_tun(&mut self, config: TunConfig) -> Result<Box<dyn Tun>, BoxedError>; /// Open a tunnel device using the previous or the default configuration. + /// + /// Will open a new tunnel if there is already an active tunnel. The previous tunnel will be + /// closed. + #[cfg(target_os = "android")] + fn create_tun(&mut self) -> Result<(), BoxedError>; + + /// Open a tunnel device using the previous or the default configuration if there is no + /// currently active tunnel. #[cfg(target_os = "android")] fn create_tun_if_closed(&mut self) -> Result<(), BoxedError>; diff --git a/talpid-core/src/tunnel/tun_provider/stub.rs b/talpid-core/src/tunnel/tun_provider/stub.rs index be985c8045..3cd6dd0ee8 100644 --- a/talpid-core/src/tunnel/tun_provider/stub.rs +++ b/talpid-core/src/tunnel/tun_provider/stub.rs @@ -16,6 +16,11 @@ impl TunProvider for StubTunProvider { } #[cfg(target_os = "android")] + fn create_tun(&mut self) -> Result<(), BoxedError> { + unimplemented!(); + } + + #[cfg(target_os = "android")] fn create_tun_if_closed(&mut self) -> Result<(), BoxedError> { unimplemented!(); } |
