summaryrefslogtreecommitdiffhomepage
path: root/talpid-core/src
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 /talpid-core/src
parent4f4b7670a8254a147c9e379b00e60390a0a7716e (diff)
downloadmullvadvpn-759a20aaebe2d460800472ac3b076f42c81b65c9.tar.xz
mullvadvpn-759a20aaebe2d460800472ac3b076f42c81b65c9.zip
Add `BlockReason::Ipv6Unavailable`
Diffstat (limited to 'talpid-core/src')
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs34
1 files changed, 27 insertions, 7 deletions
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))
}
}
}