summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-11-22 14:44:47 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-12-03 12:30:32 +0000
commitb536bd7f18e98b628a7d228e52b5a2823f887772 (patch)
tree6d10a86320b8eae6891373c167ae6eac8f72b938
parenta3ecc32e80a92ef582a84563695f0036d6021478 (diff)
downloadmullvadvpn-b536bd7f18e98b628a7d228e52b5a2823f887772.tar.xz
mullvadvpn-b536bd7f18e98b628a7d228e52b5a2823f887772.zip
Change `VpnServiceTunProvider` constructor
-rw-r--r--mullvad-jni/src/lib.rs3
-rw-r--r--mullvad-jni/src/vpn_service_tun_provider.rs36
2 files changed, 17 insertions, 22 deletions
diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs
index c8503e6e8a..15a003ee28 100644
--- a/mullvad-jni/src/lib.rs
+++ b/mullvad-jni/src/lib.rs
@@ -137,8 +137,7 @@ fn initialize(
log_dir: PathBuf,
) -> Result<(), Error> {
let android_context = create_android_context(env, *vpn_service)?;
- let tun_provider =
- VpnServiceTunProvider::new(env, vpn_service).map_err(Error::CreateVpnServiceTunProvider)?;
+ let tun_provider = VpnServiceTunProvider::new(android_context);
let daemon_command_sender = spawn_daemon(env, this, tun_provider, log_dir)?;
DAEMON_INTERFACE.set_command_sender(daemon_command_sender);
diff --git a/mullvad-jni/src/vpn_service_tun_provider.rs b/mullvad-jni/src/vpn_service_tun_provider.rs
index 01f1905814..b21ce02f61 100644
--- a/mullvad-jni/src/vpn_service_tun_provider.rs
+++ b/mullvad-jni/src/vpn_service_tun_provider.rs
@@ -1,7 +1,7 @@
use ipnetwork::IpNetwork;
use jnix::{
jni::{
- objects::{GlobalRef, JObject, JValue},
+ objects::{GlobalRef, JValue},
signature::{JavaType, Primitive},
JavaVM,
},
@@ -13,7 +13,7 @@ use std::{
os::unix::io::{AsRawFd, FromRawFd, RawFd},
};
use talpid_core::tunnel::tun_provider::{Tun, TunConfig, TunProvider};
-use talpid_types::BoxedError;
+use talpid_types::{android::AndroidContext, BoxedError};
/// Errors that occur while setting up VpnService tunnel.
@@ -33,15 +33,9 @@ pub enum Error {
#[error(display = "Failed to create Java VM handle clone")]
CloneJavaVm(#[error(source)] jnix::jni::errors::Error),
- #[error(display = "Failed to create global reference to TalpidVpnService instance")]
- CreateGlobalReference(#[error(source)] jnix::jni::errors::Error),
-
#[error(display = "Failed to find TalpidVpnService.{} method", _0)]
FindMethod(&'static str, #[error(source)] jnix::jni::errors::Error),
- #[error(display = "Failed to get Java VM instance")]
- GetJvmInstance(#[error(source)] jnix::jni::errors::Error),
-
#[error(
display = "Received an invalid result from TalpidVpnService.{}: {}",
_0,
@@ -61,13 +55,7 @@ pub struct VpnServiceTunProvider {
impl VpnServiceTunProvider {
/// Create a new VpnServiceTunProvider interfacing with Android's VpnService.
- pub fn new(env: &JnixEnv, mullvad_vpn_service: &JObject) -> Result<Self, Error> {
- let jvm = env.get_java_vm().map_err(Error::GetJvmInstance)?;
- let class = env.get_class("net/mullvad/talpid/TalpidVpnService");
- let object = env
- .new_global_ref(*mullvad_vpn_service)
- .map_err(Error::CreateGlobalReference)?;
-
+ pub fn new(context: AndroidContext) -> Self {
// Initial configuration simply intercepts all packets. The only field that matters is
// `routes`, because it determines what must enter the tunnel. All other fields contain
// stub values.
@@ -83,13 +71,21 @@ impl VpnServiceTunProvider {
mtu: 1380,
};
- Ok(VpnServiceTunProvider {
- jvm,
- class,
- object,
+ let env = JnixEnv::from(
+ context
+ .jvm
+ .attach_current_thread_as_daemon()
+ .expect("Failed to attach thread to Java VM"),
+ );
+ let talpid_vpn_service_class = env.get_class("net/mullvad/talpid/TalpidVpnService");
+
+ VpnServiceTunProvider {
+ jvm: context.jvm,
+ class: talpid_vpn_service_class,
+ object: context.vpn_service,
active_tun: None,
last_tun_config: initial_tun_config,
- })
+ }
}
fn get_tun_fd(&mut self, config: TunConfig) -> Result<RawFd, Error> {