diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-10-30 15:44:25 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-11-16 13:18:54 +0100 |
| commit | 24be64be7f0f2da8430dda75a92d8a57375772c6 (patch) | |
| tree | 84a6af01990495a1d6ab305ad92243c5f7e24c8f /talpid-core/src | |
| parent | c5877588b8615a0d64d93ab78c95519bb6878ac2 (diff) | |
| download | mullvadvpn-24be64be7f0f2da8430dda75a92d8a57375772c6.tar.xz mullvadvpn-24be64be7f0f2da8430dda75a92d8a57375772c6.zip | |
Apply OpenVPN routes on all OSes via the route manager
Diffstat (limited to 'talpid-core/src')
| -rw-r--r-- | talpid-core/src/process/openvpn.rs | 1 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/mod.rs | 23 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/openvpn.rs | 51 |
3 files changed, 32 insertions, 43 deletions
diff --git a/talpid-core/src/process/openvpn.rs b/talpid-core/src/process/openvpn.rs index bb0e71aa29..414e30ba69 100644 --- a/talpid-core/src/process/openvpn.rs +++ b/talpid-core/src/process/openvpn.rs @@ -231,7 +231,6 @@ impl OpenVpnCommand { args.push(OsString::from(mssfix.to_string())); } - #[cfg(target_os = "linux")] args.push(OsString::from("--route-noexec")); if !self.enable_ipv6 { diff --git a/talpid-core/src/tunnel/mod.rs b/talpid-core/src/tunnel/mod.rs index 6f7e110102..81ca04519a 100644 --- a/talpid-core/src/tunnel/mod.rs +++ b/talpid-core/src/tunnel/mod.rs @@ -160,14 +160,9 @@ impl TunnelMonitor { match tunnel_parameters { #[cfg(not(target_os = "android"))] - TunnelParameters::OpenVpn(config) => Self::start_openvpn_tunnel( - &config, - log_file, - resource_dir, - on_event, - #[cfg(target_os = "linux")] - route_manager, - ), + TunnelParameters::OpenVpn(config) => { + Self::start_openvpn_tunnel(&config, log_file, resource_dir, on_event, route_manager) + } #[cfg(target_os = "android")] TunnelParameters::OpenVpn(_) => Err(Error::UnsupportedPlatform), @@ -230,19 +225,13 @@ impl TunnelMonitor { log: Option<PathBuf>, resource_dir: &Path, on_event: L, - #[cfg(target_os = "linux")] route_manager: &mut RouteManager, + route_manager: &mut RouteManager, ) -> Result<Self> where L: Fn(TunnelEvent) + Send + Sync + 'static, { - let monitor = openvpn::OpenVpnMonitor::start( - on_event, - config, - log, - resource_dir, - #[cfg(target_os = "linux")] - route_manager, - )?; + let monitor = + openvpn::OpenVpnMonitor::start(on_event, config, log, resource_dir, route_manager)?; Ok(TunnelMonitor { monitor: InternalTunnelMonitor::OpenVpn(monitor), }) diff --git a/talpid-core/src/tunnel/openvpn.rs b/talpid-core/src/tunnel/openvpn.rs index 7221a328ff..5ed52f8806 100644 --- a/talpid-core/src/tunnel/openvpn.rs +++ b/talpid-core/src/tunnel/openvpn.rs @@ -1,6 +1,4 @@ use super::TunnelEvent; -#[cfg(target_os = "linux")] -use crate::routing::RequiredRoute; use crate::{ mktemp, process::{ @@ -9,13 +7,13 @@ use crate::{ }, proxy::{self, ProxyMonitor, ProxyResourceData}, routing, + routing::RequiredRoute, }; -#[cfg(target_os = "linux")] -use std::net::IpAddr; use std::{ collections::{HashMap, HashSet}, fs, io::{self, Write}, + net::IpAddr, path::{Path, PathBuf}, process::ExitStatus, sync::{ @@ -154,7 +152,7 @@ impl OpenVpnMonitor<OpenVpnCommand> { params: &openvpn::TunnelParameters, log_path: Option<PathBuf>, resource_dir: &Path, - #[cfg(target_os = "linux")] route_manager: &mut routing::RouteManager, + route_manager: &mut routing::RouteManager, ) -> Result<Self> where L: Fn(TunnelEvent) + Send + Sync + 'static, @@ -173,28 +171,27 @@ impl OpenVpnMonitor<OpenVpnCommand> { _ => None, }; - #[cfg(target_os = "linux")] let route_manager_handle = route_manager.handle().map_err(Error::SetupRoutingError)?; let on_openvpn_event = move |event, env: HashMap<String, String>| { - #[cfg(target_os = "linux")] if event == openvpn_plugin::EventType::Up { - let interface = env.get("dev").unwrap(); - tokio::task::block_in_place(|| { - route_manager_handle - .clone() - .set_tunnel_link(interface) - .unwrap(); - }); - return; - } - if event == openvpn_plugin::EventType::RouteUp { #[cfg(target_os = "linux")] + { + let interface = env.get("dev").unwrap(); + tokio::task::block_in_place(|| { + route_manager_handle + .clone() + .set_tunnel_link(interface) + .unwrap(); + }); + } tokio::task::block_in_place(|| { let routes = extract_routes(&env); route_manager_handle.clone().add_routes(routes).unwrap(); }); - + return; + } + if event == openvpn_plugin::EventType::RouteUp { // The user-pass file has been read. Try to delete it early. let _ = fs::remove_file(&user_pass_file_path); @@ -247,17 +244,21 @@ impl OpenVpnMonitor<OpenVpnCommand> { } } -#[cfg(target_os = "linux")] fn extract_routes(env: &HashMap<String, String>) -> HashSet<RequiredRoute> { let mut routes = HashSet::new(); - let ipv4_relay: IpAddr = env - .get("remote_1") - .expect("No \"remote_1\" in route up event") - .parse() - .expect("Net gateway IP not in valid format"); + let ipv4_hop: IpAddr = if let Some(network) = env.get("route_network_1") { + network + .parse() + .expect("\"route_network_1\": invalid address") + } else { + env.get("remote_1") + .expect("No \"remote_1\" in event") + .parse() + .expect("\"remote_1\": invalid address") + }; routes.insert(RequiredRoute::new( - ipv4_relay.into(), + ipv4_hop.into(), routing::NetNode::DefaultNode, )); |
