diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-11-22 14:44:47 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-12-03 12:30:32 +0000 |
| commit | b536bd7f18e98b628a7d228e52b5a2823f887772 (patch) | |
| tree | 6d10a86320b8eae6891373c167ae6eac8f72b938 | |
| parent | a3ecc32e80a92ef582a84563695f0036d6021478 (diff) | |
| download | mullvadvpn-b536bd7f18e98b628a7d228e52b5a2823f887772.tar.xz mullvadvpn-b536bd7f18e98b628a7d228e52b5a2823f887772.zip | |
Change `VpnServiceTunProvider` constructor
| -rw-r--r-- | mullvad-jni/src/lib.rs | 3 | ||||
| -rw-r--r-- | mullvad-jni/src/vpn_service_tun_provider.rs | 36 |
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> { |
