summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-28 15:01:35 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-29 14:00:10 +0000
commitc84648cfb607891a1b50ccc2da9764f55d6aef86 (patch)
tree31d71aba83af38a25f601553e2daaca457c1a3cd
parent2df12f0ac81f55b22ab086a60b42749f0ce381c9 (diff)
downloadmullvadvpn-c84648cfb607891a1b50ccc2da9764f55d6aef86.tar.xz
mullvadvpn-c84648cfb607891a1b50ccc2da9764f55d6aef86.zip
Use `VpnServiceTunProvider` on Android
-rw-r--r--mullvad-jni/src/lib.rs50
1 files changed, 32 insertions, 18 deletions
diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs
index f50aa9d0c8..e8c7e62f49 100644
--- a/mullvad-jni/src/lib.rs
+++ b/mullvad-jni/src/lib.rs
@@ -9,7 +9,7 @@ mod vpn_service_tun_provider;
use crate::{
daemon_interface::DaemonInterface, from_java::FromJava, into_java::IntoJava,
- jni_event_listener::JniEventListener,
+ jni_event_listener::JniEventListener, vpn_service_tun_provider::VpnServiceTunProvider,
};
use jni::{
objects::{GlobalRef, JObject, JString},
@@ -20,7 +20,6 @@ use lazy_static::lazy_static;
use mullvad_daemon::{logging, version, Daemon, DaemonCommandSender};
use parking_lot::{Mutex, RwLock};
use std::{collections::HashMap, path::PathBuf, sync::mpsc, thread};
-use talpid_core::tunnel::tun_provider::StubTunProvider;
use talpid_types::ErrorExt;
const LOG_FILENAME: &str = "daemon.log";
@@ -52,6 +51,7 @@ const CLASSES_TO_LOAD: &[&str] = &[
"net/mullvad/mullvadvpn/model/TunnelStateTransition$Disconnected",
"net/mullvad/mullvadvpn/model/TunnelStateTransition$Disconnecting",
"net/mullvad/mullvadvpn/MullvadDaemon",
+ "net/mullvad/mullvadvpn/MullvadVpnService",
];
lazy_static! {
@@ -62,6 +62,9 @@ lazy_static! {
#[derive(Debug, err_derive::Error)]
pub enum Error {
+ #[error(display = "Failed to create VpnService tunnel provider")]
+ CreateVpnServiceTunProvider(#[error(cause)] vpn_service_tun_provider::Error),
+
#[error(display = "Failed to get cache directory path")]
GetCacheDir(#[error(cause)] mullvad_paths::Error),
@@ -77,13 +80,13 @@ pub enum Error {
pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_initialize(
env: JNIEnv,
this: JObject,
- _vpnService: JObject,
+ vpnService: JObject,
) {
let log_dir = start_logging();
load_classes(&env);
- if let Err(error) = initialize(&env, &this, log_dir) {
+ if let Err(error) = initialize(&env, &this, &vpnService, log_dir) {
log::error!("{}", error.display_chain());
}
}
@@ -117,8 +120,15 @@ fn load_class_reference(env: &JNIEnv, name: &str) -> GlobalRef {
.expect("Failed to convert local reference to Java class into a global reference")
}
-fn initialize(env: &JNIEnv, this: &JObject, log_dir: PathBuf) -> Result<(), Error> {
- let daemon_command_sender = spawn_daemon(env, this, log_dir)?;
+fn initialize(
+ env: &JNIEnv,
+ this: &JObject,
+ vpn_service: &JObject,
+ log_dir: PathBuf,
+) -> Result<(), Error> {
+ let tun_provider =
+ VpnServiceTunProvider::new(env, vpn_service).map_err(Error::CreateVpnServiceTunProvider)?;
+ let daemon_command_sender = spawn_daemon(env, this, tun_provider, log_dir)?;
DAEMON_INTERFACE
.lock()
@@ -130,29 +140,33 @@ fn initialize(env: &JNIEnv, this: &JObject, log_dir: PathBuf) -> Result<(), Erro
fn spawn_daemon(
env: &JNIEnv,
this: &JObject,
+ tun_provider: VpnServiceTunProvider,
log_dir: PathBuf,
) -> Result<DaemonCommandSender, Error> {
let listener = JniEventListener::spawn(env, this).map_err(Error::SpawnJniEventListener)?;
let (tx, rx) = mpsc::channel();
- thread::spawn(move || match create_daemon(listener, log_dir) {
- Ok(daemon) => {
- let _ = tx.send(Ok(daemon.command_sender()));
- match daemon.run() {
- Ok(()) => log::info!("Mullvad daemon has stopped"),
- Err(error) => log::error!("{}", error.display_chain()),
+ thread::spawn(
+ move || match create_daemon(listener, tun_provider, log_dir) {
+ Ok(daemon) => {
+ let _ = tx.send(Ok(daemon.command_sender()));
+ match daemon.run() {
+ Ok(()) => log::info!("Mullvad daemon has stopped"),
+ Err(error) => log::error!("{}", error.display_chain()),
+ }
}
- }
- Err(error) => {
- let _ = tx.send(Err(error));
- }
- });
+ Err(error) => {
+ let _ = tx.send(Err(error));
+ }
+ },
+ );
rx.recv().unwrap()
}
fn create_daemon(
listener: JniEventListener,
+ tun_provider: VpnServiceTunProvider,
log_dir: PathBuf,
) -> Result<Daemon<JniEventListener>, Error> {
let resource_dir = mullvad_paths::get_resource_dir();
@@ -160,7 +174,7 @@ fn create_daemon(
let daemon = Daemon::start_with_event_listener_and_tun_provider(
listener,
- StubTunProvider,
+ tun_provider,
Some(log_dir),
resource_dir,
cache_dir,