diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-12-03 20:25:45 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-12-04 13:18:17 +0000 |
| commit | e3fc7d791c5f1b9c62be1af0d28d0766418c1fa4 (patch) | |
| tree | abfdb0aea82ae765cdeb38012c317f40a171667e | |
| parent | fba28942ab14aa5ed927adce0e33e6b6087a1e95 (diff) | |
| download | mullvadvpn-e3fc7d791c5f1b9c62be1af0d28d0766418c1fa4.tar.xz mullvadvpn-e3fc7d791c5f1b9c62be1af0d28d0766418c1fa4.zip | |
Configure custom DNS servers in tun provider
| -rw-r--r-- | talpid-core/src/tunnel/tun_provider/android/mod.rs | 28 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/mod.rs | 2 |
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(); |
