summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-08-25 09:55:29 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-09-06 08:47:56 -0300
commit759a20aaebe2d460800472ac3b076f42c81b65c9 (patch)
tree7ee434d5ecdff848095dab3fc094b0294eb0ae12
parent4f4b7670a8254a147c9e379b00e60390a0a7716e (diff)
downloadmullvadvpn-759a20aaebe2d460800472ac3b076f42c81b65c9.tar.xz
mullvadvpn-759a20aaebe2d460800472ac3b076f42c81b65c9.zip
Add `BlockReason::Ipv6Unavailable`
-rw-r--r--gui/packages/desktop/src/renderer/errors.js3
-rw-r--r--gui/packages/desktop/src/renderer/lib/daemon-rpc.js2
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs34
-rw-r--r--talpid-types/src/tunnel.rs5
4 files changed, 37 insertions, 7 deletions
diff --git a/gui/packages/desktop/src/renderer/errors.js b/gui/packages/desktop/src/renderer/errors.js
index b333f66221..9cbf63808a 100644
--- a/gui/packages/desktop/src/renderer/errors.js
+++ b/gui/packages/desktop/src/renderer/errors.js
@@ -5,6 +5,9 @@ import type { BlockReason } from './lib/daemon-rpc';
export class BlockedError extends Error {
constructor(reason: BlockReason) {
switch (reason) {
+ case 'enable_ipv6_error':
+ super('Could not configure IPv6, please enable it on your system or disable it in the app');
+ break;
case 'set_security_policy_error':
super('Failed to apply security policy');
break;
diff --git a/gui/packages/desktop/src/renderer/lib/daemon-rpc.js b/gui/packages/desktop/src/renderer/lib/daemon-rpc.js
index aa9f020826..7a3a0bb030 100644
--- a/gui/packages/desktop/src/renderer/lib/daemon-rpc.js
+++ b/gui/packages/desktop/src/renderer/lib/daemon-rpc.js
@@ -42,6 +42,7 @@ const LocationSchema = object({
});
export type BlockReason =
+ | 'enable_ipv6_error'
| 'set_security_policy_error'
| 'start_tunnel_error'
| 'no_matching_relay'
@@ -245,6 +246,7 @@ const AccountDataSchema = object({
});
const allBlockReasons: Array<BlockReason> = [
+ 'enable_ipv6_error',
'set_security_policy_error',
'start_tunnel_error',
'no_matching_relay',
diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs
index 80fd94f364..6c31a08c69 100644
--- a/talpid-core/src/tunnel_state_machine/connecting_state.rs
+++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs
@@ -14,12 +14,12 @@ use talpid_types::tunnel::BlockReason;
use super::{
AfterDisconnect, BlockedState, ConnectedState, ConnectedStateBootstrap, DisconnectingState,
- EventConsequence, Result, ResultExt, SharedTunnelStateValues, TunnelCommand, TunnelParameters,
- TunnelState, TunnelStateTransition, TunnelStateWrapper,
+ EventConsequence, SharedTunnelStateValues, TunnelCommand, TunnelParameters, TunnelState,
+ TunnelStateTransition, TunnelStateWrapper,
};
use logging;
use security::SecurityPolicy;
-use tunnel::{CloseHandle, TunnelEvent, TunnelMetadata, TunnelMonitor};
+use tunnel::{self, CloseHandle, TunnelEvent, TunnelMetadata, TunnelMonitor};
const MIN_TUNNEL_ALIVE_TIME: Duration = Duration::from_millis(1000);
@@ -31,6 +31,18 @@ const TUNNEL_INTERFACE_ALIAS: Option<&str> = Some("Mullvad");
#[cfg(not(windows))]
const TUNNEL_INTERFACE_ALIAS: Option<&str> = None;
+error_chain! {
+ errors {
+ RotateLogError {
+ description("Failed to rotate tunnel log file")
+ }
+ }
+
+ links {
+ TunnelMonitorError(tunnel::Error, tunnel::ErrorKind);
+ }
+}
+
/// The tunnel has been started, but it is not established/functional.
pub struct ConnectingState {
tunnel_events: mpsc::UnboundedReceiver<TunnelEvent>,
@@ -101,7 +113,7 @@ impl ConnectingState {
};
let log_file = Self::prepare_tunnel_log_file(&parameters)?;
- TunnelMonitor::new(
+ Ok(TunnelMonitor::new(
parameters.endpoint,
&parameters.options,
TUNNEL_INTERFACE_ALIAS.to_owned().map(OsString::from),
@@ -109,7 +121,7 @@ impl ConnectingState {
log_file.as_ref().map(PathBuf::as_path),
&parameters.resource_dir,
on_tunnel_event,
- ).chain_err(|| "Unable to start tunnel monitor")
+ )?)
}
fn prepare_tunnel_log_file(parameters: &TunnelParameters) -> Result<Option<PathBuf>> {
@@ -119,7 +131,7 @@ impl ConnectingState {
TunnelEndpointData::Wireguard(_) => WIREGUARD_LOG_FILENAME,
};
let tunnel_log = log_dir.join(filename);
- logging::rotate_log(&tunnel_log).chain_err(|| "Unable to rotate tunnel log")?;
+ logging::rotate_log(&tunnel_log).chain_err(|| ErrorKind::RotateLogError)?;
Ok(Some(tunnel_log))
} else {
Ok(None)
@@ -291,9 +303,17 @@ impl TunnelState for ConnectingState {
TunnelStateTransition::Connecting,
),
Err(error) => {
+ let block_reason = match *error.kind() {
+ ErrorKind::TunnelMonitorError(tunnel::ErrorKind::EnableIpv6Error) => {
+ BlockReason::Ipv6Unavailable
+ }
+ _ => BlockReason::StartTunnelError,
+ };
+
let chained_error = error.chain_err(|| "Failed to start tunnel");
error!("{}", chained_error.display_chain());
- BlockedState::enter(shared_values, (BlockReason::StartTunnelError, allow_lan))
+
+ BlockedState::enter(shared_values, (block_reason, allow_lan))
}
}
}
diff --git a/talpid-types/src/tunnel.rs b/talpid-types/src/tunnel.rs
index 77a1ffacb5..324ad4e7d4 100644
--- a/talpid-types/src/tunnel.rs
+++ b/talpid-types/src/tunnel.rs
@@ -21,6 +21,8 @@ pub enum TunnelStateTransition {
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BlockReason {
+ /// Failed to configure IPv6 because it's disabled in the platform.
+ Ipv6Unavailable,
/// Failed to set security policy.
SetSecurityPolicyError,
/// Failed to start connection to remote server.
@@ -34,6 +36,9 @@ pub enum BlockReason {
impl fmt::Display for BlockReason {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
let description = match *self {
+ BlockReason::Ipv6Unavailable => {
+ "Failed to configure IPv6 because it's disabled in the platform"
+ }
BlockReason::SetSecurityPolicyError => "Failed to set security policy",
BlockReason::StartTunnelError => "Failed to start connection to remote server",
BlockReason::NoMatchingRelay => "No relay server matches the current settings",