summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-12-02 15:38:42 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-12-03 12:30:33 +0000
commit9005d7018ba3d4bc855ec49d7e3b449c37f245a8 (patch)
treea64a17920e8a5db5d0c0969ce0d1e3a6da02792d
parenta7e93ec7745ccca9d90ab0099dcab2c76fe32b03 (diff)
downloadmullvadvpn-9005d7018ba3d4bc855ec49d7e3b449c37f245a8.tar.xz
mullvadvpn-9005d7018ba3d4bc855ec49d7e3b449c37f245a8.zip
Move `VpnServiceProvider` to `talpid-core`
Instead of passing the `TunProvider` to `mullvad-daemon`, now only the `AndroidContext` has to be passed so that the tunnel state machine can create the `TunProvider`.
-rw-r--r--mullvad-daemon/src/lib.rs21
-rw-r--r--mullvad-jni/src/lib.rs16
-rw-r--r--talpid-core/src/tunnel/tun_provider/android.rs (renamed from mullvad-jni/src/vpn_service_tun_provider.rs)13
-rw-r--r--talpid-core/src/tunnel/tun_provider/mod.rs11
-rw-r--r--talpid-core/src/tunnel_state_machine/mod.rs11
5 files changed, 38 insertions, 34 deletions
diff --git a/mullvad-daemon/src/lib.rs b/mullvad-daemon/src/lib.rs
index 55ebe7eb38..3ed88e07eb 100644
--- a/mullvad-daemon/src/lib.rs
+++ b/mullvad-daemon/src/lib.rs
@@ -57,13 +57,12 @@ use std::{
thread,
time::Duration,
};
-#[cfg(not(target_os = "android"))]
-use talpid_core::tunnel::tun_provider::PlatformTunProvider;
use talpid_core::{
mpsc::IntoSender,
- tunnel::tun_provider::TunProvider,
tunnel_state_machine::{self, TunnelCommand, TunnelParametersGenerator},
};
+#[cfg(target_os = "android")]
+use talpid_types::android::AndroidContext;
use talpid_types::{
net::{openvpn, TransportProtocol, TunnelParameters},
tunnel::{BlockReason, ParameterGenerationError, TunnelStateTransition},
@@ -282,7 +281,7 @@ impl Daemon<ManagementInterfaceEventBroadcaster> {
log_dir: Option<PathBuf>,
resource_dir: PathBuf,
cache_dir: PathBuf,
- #[cfg(target_os = "android")] tun_provider: impl TunProvider,
+ #[cfg(target_os = "android")] android_context: AndroidContext,
) -> Result<Self> {
if rpc_uniqueness_check::is_another_instance_running() {
return Err(Error::DaemonIsAlreadyRunning);
@@ -298,7 +297,7 @@ impl Daemon<ManagementInterfaceEventBroadcaster> {
resource_dir,
cache_dir,
#[cfg(target_os = "android")]
- tun_provider,
+ android_context,
)
}
@@ -345,7 +344,7 @@ where
log_dir: Option<PathBuf>,
resource_dir: PathBuf,
cache_dir: PathBuf,
- #[cfg(target_os = "android")] tun_provider: impl TunProvider,
+ #[cfg(target_os = "android")] android_context: AndroidContext,
) -> Result<Self> {
let (tx, rx) = mpsc::channel();
@@ -357,7 +356,7 @@ where
resource_dir,
cache_dir,
#[cfg(target_os = "android")]
- tun_provider,
+ android_context,
)
}
@@ -368,7 +367,7 @@ where
log_dir: Option<PathBuf>,
resource_dir: PathBuf,
cache_dir: PathBuf,
- #[cfg(target_os = "android")] tun_provider: impl TunProvider,
+ #[cfg(target_os = "android")] android_context: AndroidContext,
) -> Result<Self> {
let ca_path = resource_dir.join(mullvad_paths::resources::API_CA_FILENAME);
@@ -433,9 +432,6 @@ where
let account_history =
account_history::AccountHistory::new(&cache_dir).map_err(Error::LoadAccountHistory)?;
- #[cfg(not(target_os = "android"))]
- let tun_provider = PlatformTunProvider::new();
-
let tunnel_parameters_generator = MullvadTunnelParametersGenerator {
tx: internal_event_tx.clone(),
};
@@ -443,11 +439,12 @@ where
settings.get_allow_lan(),
settings.get_block_when_disconnected(),
tunnel_parameters_generator,
- tun_provider,
log_dir,
resource_dir,
cache_dir.clone(),
IntoSender::from(internal_event_tx.clone()),
+ #[cfg(target_os = "android")]
+ android_context,
)
.map_err(Error::TunnelError)?;
diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs
index 35fdd6b099..aeeb3ee742 100644
--- a/mullvad-jni/src/lib.rs
+++ b/mullvad-jni/src/lib.rs
@@ -5,11 +5,9 @@ mod daemon_interface;
mod from_java;
mod is_null;
mod jni_event_listener;
-mod vpn_service_tun_provider;
use crate::{
daemon_interface::DaemonInterface, from_java::FromJava, jni_event_listener::JniEventListener,
- vpn_service_tun_provider::VpnServiceTunProvider,
};
use jnix::{
jni::{
@@ -45,9 +43,6 @@ pub enum Error {
#[error(display = "Failed to create global reference to Java object")]
CreateGlobalReference(#[error(cause)] jnix::jni::errors::Error),
- #[error(display = "Failed to create VpnService tunnel provider")]
- CreateVpnServiceTunProvider(#[error(source)] vpn_service_tun_provider::Error),
-
#[error(display = "Failed to get cache directory path")]
GetCacheDir(#[error(source)] mullvad_paths::Error),
@@ -137,8 +132,7 @@ fn initialize(
log_dir: PathBuf,
) -> Result<(), Error> {
let android_context = create_android_context(env, *vpn_service)?;
- let tun_provider = VpnServiceTunProvider::new(android_context);
- let daemon_command_sender = spawn_daemon(env, this, tun_provider, log_dir)?;
+ let daemon_command_sender = spawn_daemon(env, this, log_dir, android_context)?;
DAEMON_INTERFACE.set_command_sender(daemon_command_sender);
@@ -157,14 +151,14 @@ fn create_android_context(env: &JnixEnv, vpn_service: JObject) -> Result<Android
fn spawn_daemon(
env: &JnixEnv,
this: &JObject,
- tun_provider: VpnServiceTunProvider,
log_dir: PathBuf,
+ android_context: AndroidContext,
) -> 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, tun_provider, log_dir) {
+ move || match create_daemon(listener, log_dir, android_context) {
Ok(daemon) => {
let _ = tx.send(Ok(daemon.command_sender()));
match daemon.run() {
@@ -183,8 +177,8 @@ fn spawn_daemon(
fn create_daemon(
listener: JniEventListener,
- tun_provider: VpnServiceTunProvider,
log_dir: PathBuf,
+ android_context: AndroidContext,
) -> Result<Daemon<JniEventListener>, Error> {
let resource_dir = mullvad_paths::get_resource_dir();
let cache_dir = mullvad_paths::cache_dir().map_err(Error::GetCacheDir)?;
@@ -194,7 +188,7 @@ fn create_daemon(
Some(log_dir),
resource_dir,
cache_dir,
- tun_provider,
+ android_context,
)
.map_err(Error::InitializeDaemon)?;
diff --git a/mullvad-jni/src/vpn_service_tun_provider.rs b/talpid-core/src/tunnel/tun_provider/android.rs
index b21ce02f61..8bf3ed7772 100644
--- a/mullvad-jni/src/vpn_service_tun_provider.rs
+++ b/talpid-core/src/tunnel/tun_provider/android.rs
@@ -1,3 +1,4 @@
+use super::{Tun, TunConfig, TunProvider};
use ipnetwork::IpNetwork;
use jnix::{
jni::{
@@ -12,13 +13,11 @@ use std::{
net::{IpAddr, Ipv4Addr, Ipv6Addr},
os::unix::io::{AsRawFd, FromRawFd, RawFd},
};
-use talpid_core::tunnel::tun_provider::{Tun, TunConfig, TunProvider};
use talpid_types::{android::AndroidContext, BoxedError};
/// Errors that occur while setting up VpnService tunnel.
#[derive(Debug, err_derive::Error)]
-#[error(display = "Failed to set up the VpnService")]
#[error(no_from)]
pub enum Error {
#[error(display = "Failed to attach Java VM to tunnel thread")]
@@ -45,7 +44,7 @@ pub enum Error {
}
/// Factory of tunnel devices on Android.
-pub struct VpnServiceTunProvider {
+pub struct AndroidTunProvider {
jvm: JavaVM,
class: GlobalRef,
object: GlobalRef,
@@ -53,8 +52,8 @@ pub struct VpnServiceTunProvider {
last_tun_config: TunConfig,
}
-impl VpnServiceTunProvider {
- /// Create a new VpnServiceTunProvider interfacing with Android's VpnService.
+impl AndroidTunProvider {
+ /// Create a new AndroidTunProvider interfacing with Android's VpnService.
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
@@ -79,7 +78,7 @@ impl VpnServiceTunProvider {
);
let talpid_vpn_service_class = env.get_class("net/mullvad/talpid/TalpidVpnService");
- VpnServiceTunProvider {
+ AndroidTunProvider {
jvm: context.jvm,
class: talpid_vpn_service_class,
object: context.vpn_service,
@@ -141,7 +140,7 @@ impl VpnServiceTunProvider {
}
}
-impl TunProvider for VpnServiceTunProvider {
+impl TunProvider for AndroidTunProvider {
fn get_tun(&mut self, config: TunConfig) -> Result<Box<dyn Tun>, BoxedError> {
let tun_fd = self.get_tun_fd(config).map_err(BoxedError::new)?;
diff --git a/talpid-core/src/tunnel/tun_provider/mod.rs b/talpid-core/src/tunnel/tun_provider/mod.rs
index f0bf8f69b6..fe044ea49f 100644
--- a/talpid-core/src/tunnel/tun_provider/mod.rs
+++ b/talpid-core/src/tunnel/tun_provider/mod.rs
@@ -10,7 +10,14 @@ use std::os::unix::io::RawFd;
use talpid_types::BoxedError;
cfg_if! {
- if #[cfg(all(unix, not(target_os = "android")))] {
+ if #[cfg(target_os = "android")] {
+ #[path = "android.rs"]
+ mod imp;
+ use self::imp::AndroidTunProvider;
+
+ /// Default implementation of `TunProvider` for Android.
+ pub type PlatformTunProvider = AndroidTunProvider;
+ } else if #[cfg(all(unix, not(target_os = "android")))] {
#[path = "unix.rs"]
mod imp;
use self::imp::UnixTunProvider;
@@ -24,7 +31,7 @@ cfg_if! {
mod stub;
use self::stub::StubTunProvider;
- /// Default stub implementation of `TunProvider` for Android and Windows.
+ /// Default stub implementation of `TunProvider` and Windows.
pub type PlatformTunProvider = StubTunProvider;
}
}
diff --git a/talpid-core/src/tunnel_state_machine/mod.rs b/talpid-core/src/tunnel_state_machine/mod.rs
index 42c959c81e..1854ea07c7 100644
--- a/talpid-core/src/tunnel_state_machine/mod.rs
+++ b/talpid-core/src/tunnel_state_machine/mod.rs
@@ -19,7 +19,7 @@ use crate::{
firewall::{Firewall, FirewallArguments},
mpsc::IntoSender,
offline,
- tunnel::tun_provider::TunProvider,
+ tunnel::tun_provider::{PlatformTunProvider, TunProvider},
};
use futures::{sync::mpsc, Async, Future, Poll, Stream};
use std::{
@@ -28,6 +28,8 @@ use std::{
sync::{mpsc as sync_mpsc, Arc},
thread,
};
+#[cfg(target_os = "android")]
+use talpid_types::android::AndroidContext;
use talpid_types::{
net::TunnelParameters,
tunnel::{BlockReason, ParameterGenerationError, TunnelStateTransition},
@@ -64,11 +66,11 @@ pub fn spawn<P, T>(
allow_lan: bool,
block_when_disconnected: bool,
tunnel_parameters_generator: impl TunnelParametersGenerator,
- tun_provider: impl TunProvider,
log_dir: Option<PathBuf>,
resource_dir: PathBuf,
cache_dir: P,
state_change_listener: IntoSender<TunnelStateTransition, T>,
+ #[cfg(target_os = "android")] android_context: AndroidContext,
) -> Result<Arc<mpsc::UnboundedSender<TunnelCommand>>, Error>
where
P: AsRef<Path> + Send + 'static,
@@ -80,6 +82,11 @@ where
offline::spawn_monitor(Arc::downgrade(&command_tx)).map_err(Error::OfflineMonitorError)?;
let is_offline = offline_monitor.is_offline();
+ let tun_provider = PlatformTunProvider::new(
+ #[cfg(target_os = "android")]
+ android_context,
+ );
+
let (startup_result_tx, startup_result_rx) = sync_mpsc::channel();
thread::spawn(move || {
match create_event_loop(