summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-12-03 20:25:45 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-12-04 13:18:17 +0000
commite3fc7d791c5f1b9c62be1af0d28d0766418c1fa4 (patch)
treeabfdb0aea82ae765cdeb38012c317f40a171667e
parentfba28942ab14aa5ed927adce0e33e6b6087a1e95 (diff)
downloadmullvadvpn-e3fc7d791c5f1b9c62be1af0d28d0766418c1fa4.tar.xz
mullvadvpn-e3fc7d791c5f1b9c62be1af0d28d0766418c1fa4.zip
Configure custom DNS servers in tun provider
-rw-r--r--talpid-core/src/tunnel/tun_provider/android/mod.rs28
-rw-r--r--talpid-core/src/tunnel_state_machine/mod.rs2
2 files changed, 29 insertions, 1 deletions
diff --git a/talpid-core/src/tunnel/tun_provider/android/mod.rs b/talpid-core/src/tunnel/tun_provider/android/mod.rs
index 7aa54d8d03..4c136ef189 100644
--- a/talpid-core/src/tunnel/tun_provider/android/mod.rs
+++ b/talpid-core/src/tunnel/tun_provider/android/mod.rs
@@ -60,11 +60,16 @@ pub struct AndroidTunProvider {
object: GlobalRef,
last_tun_config: TunConfig,
allow_lan: bool,
+ custom_dns_servers: Option<Vec<IpAddr>>,
}
impl AndroidTunProvider {
/// Create a new AndroidTunProvider interfacing with Android's VpnService.
- pub fn new(context: AndroidContext, allow_lan: bool) -> Self {
+ pub fn new(
+ context: AndroidContext,
+ allow_lan: bool,
+ custom_dns_servers: Option<Vec<IpAddr>>,
+ ) -> Self {
let env = JnixEnv::from(
context
.jvm
@@ -79,6 +84,7 @@ impl AndroidTunProvider {
object: context.vpn_service,
last_tun_config: TunConfig::default(),
allow_lan,
+ custom_dns_servers,
}
}
@@ -91,6 +97,15 @@ impl AndroidTunProvider {
Ok(())
}
+ pub fn set_custom_dns_servers(&mut self, servers: Option<Vec<IpAddr>>) -> Result<(), Error> {
+ if self.custom_dns_servers != servers {
+ self.custom_dns_servers = servers;
+ self.recreate_tun_if_open()?;
+ }
+
+ Ok(())
+ }
+
/// Retrieve a tunnel device with the provided configuration.
pub fn get_tun(&mut self, config: TunConfig) -> Result<VpnServiceTun, Error> {
let tun_fd = self.get_tun_fd(config.clone())?;
@@ -213,6 +228,11 @@ impl AndroidTunProvider {
}
fn prepare_tun_config(&self, config: &mut TunConfig) {
+ self.prepare_tun_config_for_allow_lan(config);
+ self.prepare_tun_config_for_custom_dns(config);
+ }
+
+ fn prepare_tun_config_for_allow_lan(&self, config: &mut TunConfig) {
if self.allow_lan {
let (required_ipv4_routes, required_ipv6_routes) = config
.required_routes
@@ -253,6 +273,12 @@ impl AndroidTunProvider {
}
}
+ fn prepare_tun_config_for_custom_dns(&self, config: &mut TunConfig) {
+ if let Some(custom_dns_servers) = self.custom_dns_servers.clone() {
+ config.dns_servers = custom_dns_servers;
+ }
+ }
+
fn call_method(
&self,
name: &'static str,
diff --git a/talpid-core/src/tunnel_state_machine/mod.rs b/talpid-core/src/tunnel_state_machine/mod.rs
index 79f3ca7021..cfe7ec3306 100644
--- a/talpid-core/src/tunnel_state_machine/mod.rs
+++ b/talpid-core/src/tunnel_state_machine/mod.rs
@@ -100,6 +100,8 @@ pub async fn spawn(
android_context,
#[cfg(target_os = "android")]
allow_lan,
+ #[cfg(target_os = "android")]
+ custom_dns.clone(),
);
let runtime = tokio::runtime::Handle::current();