summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mullvad-jni/src/vpn_service_tun_provider.rs84
-rw-r--r--talpid-core/src/tunnel/tun_provider/mod.rs8
-rw-r--r--talpid-core/src/tunnel/tun_provider/stub.rs5
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!();
}