diff options
| author | Odd Stranne <odd@mullvad.net> | 2018-10-25 11:05:43 +0200 |
|---|---|---|
| committer | Odd Stranne <odd@mullvad.net> | 2018-10-30 14:57:46 +0100 |
| commit | 1d2aee7a736ed4e6eda1915ddffca84916841b5f (patch) | |
| tree | 1f9bface5dd14a131b0e26ec2805bc1863407d58 | |
| parent | 1bbfe8c90dff4f0abb84f7fea4ddc4fff1b44e7c (diff) | |
| download | mullvadvpn-1d2aee7a736ed4e6eda1915ddffca84916841b5f.tar.xz mullvadvpn-1d2aee7a736ed4e6eda1915ddffca84916841b5f.zip | |
Set TCP as transport and recreate tunnel when proxy is configured
| -rw-r--r-- | mullvad-cli/src/cmds/tunnel.rs | 1 | ||||
| -rw-r--r-- | mullvad-daemon/src/lib.rs | 51 |
2 files changed, 43 insertions, 9 deletions
diff --git a/mullvad-cli/src/cmds/tunnel.rs b/mullvad-cli/src/cmds/tunnel.rs index d8909f3314..329f72f6bd 100644 --- a/mullvad-cli/src/cmds/tunnel.rs +++ b/mullvad-cli/src/cmds/tunnel.rs @@ -303,6 +303,7 @@ impl Tunnel { } println!("proxy details have been updated"); + println!("note: The OpenVPN tunnel constraints have been updated to use TCP"); Ok(()) } diff --git a/mullvad-daemon/src/lib.rs b/mullvad-daemon/src/lib.rs index 03a789362a..058466b04e 100644 --- a/mullvad-daemon/src/lib.rs +++ b/mullvad-daemon/src/lib.rs @@ -53,7 +53,10 @@ use mullvad_rpc::{AccountsProxy, AppVersionProxy, HttpHandle}; use mullvad_types::{ account::{AccountData, AccountToken}, location::GeoIpLocation, - relay_constraints::{RelaySettings, RelaySettingsUpdate}, + relay_constraints::{ + Constraint, OpenVpnConstraints, RelayConstraintsUpdate, RelaySettings, RelaySettingsUpdate, + TunnelConstraints, + }, relay_list::{Relay, RelayList}, settings, settings::Settings, @@ -66,7 +69,7 @@ use talpid_core::{ tunnel_state_machine::{self, TunnelCommand, TunnelParameters, TunnelParametersGenerator}, }; use talpid_types::{ - net::OpenVpnProxySettings, + net::{OpenVpnProxySettings, TransportProtocol}, tunnel::{BlockReason, TunnelStateTransition}, }; @@ -629,22 +632,52 @@ impl Daemon { tx: oneshot::Sender<::std::result::Result<(), settings::Error>>, proxy: Option<OpenVpnProxySettings>, ) { - let save_result = self.settings.set_openvpn_proxy(proxy); - match save_result { - Ok(settings_changed) => { + let constraints_result = match proxy { + Some(_) => self.apply_proxy_constraints(), + _ => Ok(false), + }; + let proxy_result = self.settings.set_openvpn_proxy(proxy); + + match (proxy_result, constraints_result) { + (Ok(proxy_changed), Ok(constraints_changed)) => { Self::oneshot_send(tx, Ok(()), "set_openvpn_proxy response"); - if settings_changed { + if proxy_changed || constraints_changed { self.management_interface_broadcaster .notify_settings(&self.settings); + info!("Initiating tunnel restart because the OpenVPN proxy setting changed"); + self.reconnect_tunnel(); } } - Err(settings_error) => { - error!("{}", settings_error.display_chain()); - Self::oneshot_send(tx, Err(settings_error), "set_openvpn_proxy response"); + (Ok(_), Err(error)) | (Err(error), Ok(_)) => { + error!("{}", error.display_chain()); + Self::oneshot_send(tx, Err(error), "set_openvpn_proxy response"); + } + (Err(error), Err(_)) => { + error!("{}", error.display_chain()); + Self::oneshot_send(tx, Err(error), "set_openvpn_proxy response"); } } } + // Set the OpenVPN tunnel to use TCP. + fn apply_proxy_constraints(&mut self) -> settings::Result<bool> { + let openvpn_constraints = OpenVpnConstraints { + port: Constraint::Any, + protocol: Constraint::Only(TransportProtocol::Tcp), + }; + + let tunnel_constraints = TunnelConstraints::OpenVpn(openvpn_constraints); + + let constraints_update = RelayConstraintsUpdate { + location: None, + tunnel: Some(Constraint::Only(tunnel_constraints)), + }; + + let settings_update = RelaySettingsUpdate::Normal(constraints_update); + + self.settings.update_relay_settings(settings_update) + } + fn on_set_enable_ipv6(&mut self, tx: oneshot::Sender<()>, enable_ipv6: bool) { let save_result = self.settings.set_enable_ipv6(enable_ipv6); match save_result.chain_err(|| "Unable to save settings") { |
