diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-12-02 15:38:42 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-12-03 12:30:33 +0000 |
| commit | 9005d7018ba3d4bc855ec49d7e3b449c37f245a8 (patch) | |
| tree | a64a17920e8a5db5d0c0969ce0d1e3a6da02792d | |
| parent | a7e93ec7745ccca9d90ab0099dcab2c76fe32b03 (diff) | |
| download | mullvadvpn-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.rs | 21 | ||||
| -rw-r--r-- | mullvad-jni/src/lib.rs | 16 | ||||
| -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.rs | 11 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/mod.rs | 11 |
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( |
