summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--talpid-core/src/tunnel_state_machine/blocked_state.rs3
-rw-r--r--talpid-core/src/tunnel_state_machine/connected_state.rs46
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs44
-rw-r--r--talpid-core/src/tunnel_state_machine/disconnected_state.rs7
-rw-r--r--talpid-core/src/tunnel_state_machine/disconnecting_state.rs5
-rw-r--r--talpid-core/src/tunnel_state_machine/mod.rs4
6 files changed, 68 insertions, 41 deletions
diff --git a/talpid-core/src/tunnel_state_machine/blocked_state.rs b/talpid-core/src/tunnel_state_machine/blocked_state.rs
index f63326b800..50efb9e371 100644
--- a/talpid-core/src/tunnel_state_machine/blocked_state.rs
+++ b/talpid-core/src/tunnel_state_machine/blocked_state.rs
@@ -38,6 +38,9 @@ impl TunnelState for BlockedState {
Ok(TunnelCommand::Disconnect) | Err(_) => {
NewState(DisconnectedState::enter(shared_values, ()))
}
+ Ok(TunnelCommand::Block(reason)) => {
+ NewState(BlockedState::enter(shared_values, reason))
+ }
_ => SameState(self),
}
}
diff --git a/talpid-core/src/tunnel_state_machine/connected_state.rs b/talpid-core/src/tunnel_state_machine/connected_state.rs
index 02a44c8be0..0117958503 100644
--- a/talpid-core/src/tunnel_state_machine/connected_state.rs
+++ b/talpid-core/src/tunnel_state_machine/connected_state.rs
@@ -66,6 +66,25 @@ impl ConnectedState {
use self::EventConsequence::*;
match try_handle_event!(self, commands.poll()) {
+ Ok(TunnelCommand::AllowLan(allow_lan)) => {
+ self.tunnel_parameters.allow_lan = allow_lan;
+
+ match self.set_security_policy(shared_values) {
+ Ok(()) => SameState(self),
+ Err(error) => {
+ error!("{}", error.display_chain());
+
+ NewState(DisconnectingState::enter(
+ shared_values,
+ (
+ self.close_handle,
+ self.tunnel_close_event,
+ AfterDisconnect::Block(BlockReason::SetSecurityPolicyError),
+ ),
+ ))
+ }
+ }
+ }
Ok(TunnelCommand::Connect(parameters)) => {
if parameters != self.tunnel_parameters {
NewState(DisconnectingState::enter(
@@ -88,25 +107,14 @@ impl ConnectedState {
AfterDisconnect::Nothing,
),
)),
- Ok(TunnelCommand::AllowLan(allow_lan)) => {
- self.tunnel_parameters.allow_lan = allow_lan;
-
- match self.set_security_policy(shared_values) {
- Ok(()) => SameState(self),
- Err(error) => {
- error!("{}", error.display_chain());
-
- NewState(DisconnectingState::enter(
- shared_values,
- (
- self.close_handle,
- self.tunnel_close_event,
- AfterDisconnect::Block(BlockReason::SetSecurityPolicyError),
- ),
- ))
- }
- }
- }
+ Ok(TunnelCommand::Block(reason)) => NewState(DisconnectingState::enter(
+ shared_values,
+ (
+ self.close_handle,
+ self.tunnel_close_event,
+ AfterDisconnect::Block(reason),
+ ),
+ )),
}
}
diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs
index a87fa1384e..184832acaa 100644
--- a/talpid-core/src/tunnel_state_machine/connecting_state.rs
+++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs
@@ -175,6 +175,24 @@ impl ConnectingState {
use self::EventConsequence::*;
match try_handle_event!(self, commands.poll()) {
+ Ok(TunnelCommand::AllowLan(allow_lan)) => {
+ self.tunnel_parameters.allow_lan = allow_lan;
+ match Self::set_security_policy(shared_values, self.tunnel_endpoint, allow_lan) {
+ Ok(()) => SameState(self),
+ Err(error) => {
+ error!("{}", error.display_chain());
+
+ NewState(DisconnectingState::enter(
+ shared_values,
+ (
+ self.close_handle,
+ self.tunnel_close_event,
+ AfterDisconnect::Block(BlockReason::SetSecurityPolicyError),
+ ),
+ ))
+ }
+ }
+ }
Ok(TunnelCommand::Connect(parameters)) => {
if parameters != self.tunnel_parameters {
NewState(DisconnectingState::enter(
@@ -197,24 +215,14 @@ impl ConnectingState {
AfterDisconnect::Nothing,
),
)),
- Ok(TunnelCommand::AllowLan(allow_lan)) => {
- self.tunnel_parameters.allow_lan = allow_lan;
- match Self::set_security_policy(shared_values, self.tunnel_endpoint, allow_lan) {
- Ok(()) => SameState(self),
- Err(error) => {
- error!("{}", error.display_chain());
-
- NewState(DisconnectingState::enter(
- shared_values,
- (
- self.close_handle,
- self.tunnel_close_event,
- AfterDisconnect::Block(BlockReason::SetSecurityPolicyError),
- ),
- ))
- }
- }
- }
+ Ok(TunnelCommand::Block(reason)) => NewState(DisconnectingState::enter(
+ shared_values,
+ (
+ self.close_handle,
+ self.tunnel_close_event,
+ AfterDisconnect::Block(reason),
+ ),
+ )),
}
}
diff --git a/talpid-core/src/tunnel_state_machine/disconnected_state.rs b/talpid-core/src/tunnel_state_machine/disconnected_state.rs
index f92630606c..80a7eb5ce0 100644
--- a/talpid-core/src/tunnel_state_machine/disconnected_state.rs
+++ b/talpid-core/src/tunnel_state_machine/disconnected_state.rs
@@ -3,8 +3,8 @@ use futures::sync::mpsc;
use futures::Stream;
use super::{
- ConnectingState, Error, EventConsequence, SharedTunnelStateValues, TunnelCommand, TunnelState,
- TunnelStateTransition, TunnelStateWrapper,
+ BlockedState, ConnectingState, Error, EventConsequence, SharedTunnelStateValues, TunnelCommand,
+ TunnelState, TunnelStateTransition, TunnelStateWrapper,
};
use security::NetworkSecurity;
@@ -47,6 +47,9 @@ impl TunnelState for DisconnectedState {
Ok(TunnelCommand::Connect(parameters)) => {
NewState(ConnectingState::enter(shared_values, parameters))
}
+ Ok(TunnelCommand::Block(reason)) => {
+ NewState(BlockedState::enter(shared_values, reason))
+ }
Ok(_) => SameState(self),
Err(_) => Finished,
}
diff --git a/talpid-core/src/tunnel_state_machine/disconnecting_state.rs b/talpid-core/src/tunnel_state_machine/disconnecting_state.rs
index 6fbdacffe2..452b8d3ac1 100644
--- a/talpid-core/src/tunnel_state_machine/disconnecting_state.rs
+++ b/talpid-core/src/tunnel_state_machine/disconnecting_state.rs
@@ -33,20 +33,23 @@ impl DisconnectingState {
self.after_disconnect = match after_disconnect {
AfterDisconnect::Nothing => match event {
Ok(TunnelCommand::Connect(parameters)) => Reconnect(parameters),
+ Ok(TunnelCommand::Block(reason)) => Block(reason),
_ => Nothing,
},
AfterDisconnect::Block(reason) => match event {
Ok(TunnelCommand::Connect(parameters)) => Reconnect(parameters),
Ok(TunnelCommand::Disconnect) => Nothing,
+ Ok(TunnelCommand::Block(new_reason)) => Block(new_reason),
_ => AfterDisconnect::Block(reason),
},
AfterDisconnect::Reconnect(mut tunnel_parameters) => match event {
- Ok(TunnelCommand::Connect(parameters)) => Reconnect(parameters),
Ok(TunnelCommand::AllowLan(allow_lan)) => {
tunnel_parameters.allow_lan = allow_lan;
Reconnect(tunnel_parameters)
}
+ Ok(TunnelCommand::Connect(parameters)) => Reconnect(parameters),
Ok(TunnelCommand::Disconnect) | Err(_) => Nothing,
+ Ok(TunnelCommand::Block(reason)) => Block(reason),
},
};
diff --git a/talpid-core/src/tunnel_state_machine/mod.rs b/talpid-core/src/tunnel_state_machine/mod.rs
index 20f1529b01..433333efa0 100644
--- a/talpid-core/src/tunnel_state_machine/mod.rs
+++ b/talpid-core/src/tunnel_state_machine/mod.rs
@@ -18,7 +18,7 @@ use futures::{Async, Future, Poll, Stream};
use tokio_core::reactor::Core;
use talpid_types::net::{TunnelEndpoint, TunnelOptions};
-use talpid_types::tunnel::TunnelStateTransition;
+use talpid_types::tunnel::{BlockReason, TunnelStateTransition};
use self::blocked_state::BlockedState;
use self::connected_state::{ConnectedState, ConnectedStateBootstrap};
@@ -110,6 +110,8 @@ pub enum TunnelCommand {
Connect(TunnelParameters),
/// Close tunnel connection.
Disconnect,
+ /// Disconnect any open tunnel and block all network access
+ Block(BlockReason),
}
/// Information necessary to open a tunnel.