summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-10-16 11:54:09 +0200
committerDavid Lönnhager <david.l@mullvad.net>2020-10-22 09:33:58 +0200
commitc60f24ededf5371d25f70b5744d099c2c8ad0e52 (patch)
treef0df1439c87b5d51342ab9b52d63e2344868c14c
parentad7ecabcf6004bd766823ea1e1345af7af4357b6 (diff)
downloadmullvadvpn-c60f24ededf5371d25f70b5744d099c2c8ad0e52.tar.xz
mullvadvpn-c60f24ededf5371d25f70b5744d099c2c8ad0e52.zip
Add custom DNS tunnel command
-rw-r--r--talpid-core/src/tunnel_state_machine/connected_state.rs25
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs4
-rw-r--r--talpid-core/src/tunnel_state_machine/disconnected_state.rs4
-rw-r--r--talpid-core/src/tunnel_state_machine/disconnecting_state.rs12
-rw-r--r--talpid-core/src/tunnel_state_machine/error_state.rs4
-rw-r--r--talpid-core/src/tunnel_state_machine/mod.rs2
6 files changed, 51 insertions, 0 deletions
diff --git a/talpid-core/src/tunnel_state_machine/connected_state.rs b/talpid-core/src/tunnel_state_machine/connected_state.rs
index b561fc7a83..c4b7458960 100644
--- a/talpid-core/src/tunnel_state_machine/connected_state.rs
+++ b/talpid-core/src/tunnel_state_machine/connected_state.rs
@@ -172,6 +172,31 @@ impl ConnectedState {
}
}
}
+ Some(TunnelCommand::CustomDns(servers)) => {
+ if shared_values.custom_dns != servers {
+ shared_values.custom_dns = servers;
+
+ if let Err(error) = self.set_firewall_policy(shared_values) {
+ return self.disconnect(
+ shared_values,
+ AfterDisconnect::Block(ErrorStateCause::SetFirewallPolicyError(error)),
+ );
+ }
+
+ match self.set_dns(shared_values) {
+ Ok(()) => SameState(self.into()),
+ Err(error) => {
+ log::error!("{}", error.display_chain_with_msg("Failed to set DNS"));
+ self.disconnect(
+ shared_values,
+ AfterDisconnect::Block(ErrorStateCause::SetDnsError),
+ )
+ }
+ }
+ } else {
+ SameState(self.into())
+ }
+ }
Some(TunnelCommand::BlockWhenDisconnected(block_when_disconnected)) => {
shared_values.block_when_disconnected = block_when_disconnected;
SameState(self.into())
diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs
index bfccac6572..8fde71cc98 100644
--- a/talpid-core/src/tunnel_state_machine/connecting_state.rs
+++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs
@@ -227,6 +227,10 @@ impl ConnectingState {
}
}
}
+ Some(TunnelCommand::CustomDns(servers)) => {
+ shared_values.custom_dns = servers;
+ SameState(self.into())
+ }
Some(TunnelCommand::BlockWhenDisconnected(block_when_disconnected)) => {
shared_values.block_when_disconnected = block_when_disconnected;
SameState(self.into())
diff --git a/talpid-core/src/tunnel_state_machine/disconnected_state.rs b/talpid-core/src/tunnel_state_machine/disconnected_state.rs
index faeac0a45f..685925b922 100644
--- a/talpid-core/src/tunnel_state_machine/disconnected_state.rs
+++ b/talpid-core/src/tunnel_state_machine/disconnected_state.rs
@@ -82,6 +82,10 @@ impl TunnelState for DisconnectedState {
}
SameState(self.into())
}
+ Some(TunnelCommand::CustomDns(servers)) => {
+ shared_values.custom_dns = servers;
+ SameState(self.into())
+ }
Some(TunnelCommand::BlockWhenDisconnected(block_when_disconnected)) => {
if shared_values.block_when_disconnected != block_when_disconnected {
shared_values.block_when_disconnected = block_when_disconnected;
diff --git a/talpid-core/src/tunnel_state_machine/disconnecting_state.rs b/talpid-core/src/tunnel_state_machine/disconnecting_state.rs
index 33a09ca31a..9ecdd6dc88 100644
--- a/talpid-core/src/tunnel_state_machine/disconnecting_state.rs
+++ b/talpid-core/src/tunnel_state_machine/disconnecting_state.rs
@@ -32,6 +32,10 @@ impl DisconnectingState {
let _ = shared_values.set_allow_lan(allow_lan);
AfterDisconnect::Nothing
}
+ Some(TunnelCommand::CustomDns(servers)) => {
+ shared_values.custom_dns = servers;
+ AfterDisconnect::Nothing
+ }
Some(TunnelCommand::BlockWhenDisconnected(block_when_disconnected)) => {
shared_values.block_when_disconnected = block_when_disconnected;
AfterDisconnect::Nothing
@@ -49,6 +53,10 @@ impl DisconnectingState {
let _ = shared_values.set_allow_lan(allow_lan);
AfterDisconnect::Block(reason)
}
+ Some(TunnelCommand::CustomDns(servers)) => {
+ shared_values.custom_dns = servers;
+ AfterDisconnect::Block(reason)
+ }
Some(TunnelCommand::BlockWhenDisconnected(block_when_disconnected)) => {
shared_values.block_when_disconnected = block_when_disconnected;
AfterDisconnect::Block(reason)
@@ -71,6 +79,10 @@ impl DisconnectingState {
let _ = shared_values.set_allow_lan(allow_lan);
AfterDisconnect::Reconnect(retry_attempt)
}
+ Some(TunnelCommand::CustomDns(servers)) => {
+ shared_values.custom_dns = servers;
+ AfterDisconnect::Reconnect(retry_attempt)
+ }
Some(TunnelCommand::BlockWhenDisconnected(block_when_disconnected)) => {
shared_values.block_when_disconnected = block_when_disconnected;
AfterDisconnect::Reconnect(retry_attempt)
diff --git a/talpid-core/src/tunnel_state_machine/error_state.rs b/talpid-core/src/tunnel_state_machine/error_state.rs
index a9861e788e..bf545258fe 100644
--- a/talpid-core/src/tunnel_state_machine/error_state.rs
+++ b/talpid-core/src/tunnel_state_machine/error_state.rs
@@ -102,6 +102,10 @@ impl TunnelState for ErrorState {
SameState(self.into())
}
}
+ Some(TunnelCommand::CustomDns(servers)) => {
+ shared_values.custom_dns = servers;
+ SameState(self.into())
+ }
Some(TunnelCommand::BlockWhenDisconnected(block_when_disconnected)) => {
shared_values.block_when_disconnected = block_when_disconnected;
SameState(self.into())
diff --git a/talpid-core/src/tunnel_state_machine/mod.rs b/talpid-core/src/tunnel_state_machine/mod.rs
index 1793093580..21119aa6ad 100644
--- a/talpid-core/src/tunnel_state_machine/mod.rs
+++ b/talpid-core/src/tunnel_state_machine/mod.rs
@@ -150,6 +150,8 @@ pub async fn spawn(
pub enum TunnelCommand {
/// Enable or disable LAN access in the firewall.
AllowLan(bool),
+ /// Set custom DNS servers to use.
+ CustomDns(Option<Vec<IpAddr>>),
/// Enable or disable the block_when_disconnected feature.
BlockWhenDisconnected(bool),
/// Notify the state machine of the connectivity of the device.