summaryrefslogtreecommitdiffhomepage
path: root/talpid-core
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-09-06 10:36:16 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-09-11 12:52:20 -0300
commite467f176f09ddc87f5ba2d099487502e58783594 (patch)
tree408224a827c7e642f08c64ae00fa01fccbba0758 /talpid-core
parent79699bad388232631f28d3e53b652decd7c59fa0 (diff)
downloadmullvadvpn-e467f176f09ddc87f5ba2d099487502e58783594.tar.xz
mullvadvpn-e467f176f09ddc87f5ba2d099487502e58783594.zip
Create `winnet` module
Based on the previous `route` module.
Diffstat (limited to 'talpid-core')
-rw-r--r--talpid-core/src/lib.rs5
-rw-r--r--talpid-core/src/security/windows/dns.rs16
-rw-r--r--talpid-core/src/security/windows/ffi.rs13
-rw-r--r--talpid-core/src/security/windows/mod.rs34
-rw-r--r--talpid-core/src/winnet.rs (renamed from talpid-core/src/security/windows/route.rs)25
5 files changed, 49 insertions, 44 deletions
diff --git a/talpid-core/src/lib.rs b/talpid-core/src/lib.rs
index ecc530aec3..54e3ef08ef 100644
--- a/talpid-core/src/lib.rs
+++ b/talpid-core/src/lib.rs
@@ -35,6 +35,8 @@ extern crate uuid;
#[cfg(target_os = "linux")]
extern crate which;
#[cfg(windows)]
+extern crate widestring;
+#[cfg(windows)]
extern crate winreg;
extern crate openvpn_plugin;
@@ -45,6 +47,9 @@ extern crate talpid_types;
#[macro_use]
extern crate nftnl;
+#[cfg(windows)]
+mod winnet;
+
/// Working with processes.
pub mod process;
diff --git a/talpid-core/src/security/windows/dns.rs b/talpid-core/src/security/windows/dns.rs
index d068cb4151..4904946c98 100644
--- a/talpid-core/src/security/windows/dns.rs
+++ b/talpid-core/src/security/windows/dns.rs
@@ -1,16 +1,14 @@
-extern crate widestring;
-
-use super::ffi;
-use super::system_state::SystemStateWriter;
-
-use self::widestring::WideCString;
-use libc;
use std::net::IpAddr;
use std::path::Path;
use std::ptr;
use std::slice;
use error_chain::ChainedError;
+use libc;
+use widestring::WideCString;
+
+use super::system_state::SystemStateWriter;
+use winnet;
const DNS_STATE_FILENAME: &'static str = "dns-state-backup";
@@ -49,7 +47,7 @@ pub struct WinDns {
impl WinDns {
pub fn new<P: AsRef<Path>>(cache_dir: P) -> Result<Self> {
- unsafe { WinDns_Initialize(Some(ffi::error_sink), ptr::null_mut()).into_result()? };
+ unsafe { WinDns_Initialize(Some(winnet::error_sink), ptr::null_mut()).into_result()? };
let backup_writer = SystemStateWriter::new(
cache_dir
@@ -191,7 +189,7 @@ extern "system" {
#[link_name(WinDns_Initialize)]
pub fn WinDns_Initialize(
- sink: Option<ffi::ErrorSink>,
+ sink: Option<winnet::ErrorSink>,
sink_context: *mut libc::c_void,
) -> InitializationResult;
diff --git a/talpid-core/src/security/windows/ffi.rs b/talpid-core/src/security/windows/ffi.rs
index 029989359e..2362876897 100644
--- a/talpid-core/src/security/windows/ffi.rs
+++ b/talpid-core/src/security/windows/ffi.rs
@@ -1,16 +1,3 @@
-use libc::{c_char, c_void};
-
-pub type ErrorSink = extern "system" fn(msg: *const c_char, ctx: *mut c_void);
-
-pub extern "system" fn error_sink(msg: *const c_char, _ctx: *mut c_void) {
- use std::ffi::CStr;
- if msg.is_null() {
- error!("Log message from FFI boundary is NULL");
- } else {
- error!("{}", unsafe { CStr::from_ptr(msg).to_string_lossy() });
- }
-}
-
#[macro_export]
macro_rules! ffi_error {
($result:ident, $error:expr) => {
diff --git a/talpid-core/src/security/windows/mod.rs b/talpid-core/src/security/windows/mod.rs
index e762a4887a..6ecca8988b 100644
--- a/talpid-core/src/security/windows/mod.rs
+++ b/talpid-core/src/security/windows/mod.rs
@@ -1,24 +1,21 @@
-extern crate widestring;
-
-use super::{NetworkSecurityT, SecurityPolicy};
use std::net::IpAddr;
use std::path::Path;
use std::ptr;
-use self::winfw::*;
use talpid_types::net::Endpoint;
+use widestring::WideCString;
-use self::widestring::WideCString;
-
+use self::dns::WinDns;
+use self::winfw::*;
+use super::{NetworkSecurityT, SecurityPolicy};
+use winnet;
#[macro_use]
mod ffi;
+
mod dns;
-mod route;
mod system_state;
-use self::dns::WinDns;
-
error_chain! {
errors {
/// Failure to initialize windows firewall module
@@ -50,11 +47,15 @@ error_chain! {
ResettingPolicy {
description("Failed to reset firewall policies")
}
+
+ /// Failure to set TAP adapter metric
+ SetTapMetric {
+ description("Unable to set TAP adapter metric")
+ }
}
links {
WinDns(dns::Error, dns::ErrorKind) #[doc = "WinDNS failure"];
- WinRoute(route::Error, route::ErrorKind) #[doc = "Failure to modify system routing metrics"];
}
}
@@ -73,7 +74,7 @@ impl NetworkSecurityT for NetworkSecurity {
unsafe {
WinFw_Initialize(
WINFW_TIMEOUT_SECONDS,
- Some(ffi::error_sink),
+ Some(winnet::error_sink),
ptr::null_mut(),
).into_result()?
};
@@ -168,14 +169,15 @@ impl NetworkSecurity {
self.dns.set_dns(&vec![tunnel_metadata.gateway.into()])?;
- let metrics_set = route::ensure_top_metric_for_interface(&tunnel_metadata.interface)?;
+ let metrics_set = winnet::ensure_top_metric_for_interface(&tunnel_metadata.interface)
+ .chain_err(|| ErrorKind::SetTapMetric)?;
+
if metrics_set {
debug!("Network interface metrics were changed");
} else {
debug!("Network interface metrics were not changed");
}
-
unsafe {
WinFw_ApplyPolicyConnected(
winfw_settings,
@@ -195,10 +197,12 @@ impl NetworkSecurity {
#[allow(non_snake_case)]
mod winfw {
- use super::{ffi, ErrorKind, Result};
use libc;
use talpid_types::net::TransportProtocol;
+ use super::{ErrorKind, Result};
+ use winnet;
+
#[repr(C)]
pub struct WinFwRelay {
pub ip: *const libc::wchar_t,
@@ -254,7 +258,7 @@ mod winfw {
#[link_name(WinFw_Initialize)]
pub fn WinFw_Initialize(
timeout: libc::c_uint,
- sink: Option<ffi::ErrorSink>,
+ sink: Option<winnet::ErrorSink>,
sink_context: *mut libc::c_void,
) -> InitializationResult;
diff --git a/talpid-core/src/security/windows/route.rs b/talpid-core/src/winnet.rs
index 6ecf336956..b906b2af3a 100644
--- a/talpid-core/src/security/windows/route.rs
+++ b/talpid-core/src/winnet.rs
@@ -1,8 +1,8 @@
-use super::ffi;
-use super::widestring::WideCString;
-use libc;
use std::ptr;
+use libc::{c_char, c_void, wchar_t};
+use widestring::WideCString;
+
error_chain!{
errors{
/// Failure to set metrics of network interfaces
@@ -15,6 +15,17 @@ error_chain!{
}
}
+pub type ErrorSink = extern "system" fn(msg: *const c_char, ctx: *mut c_void);
+
+pub extern "system" fn error_sink(msg: *const c_char, _ctx: *mut c_void) {
+ use std::ffi::CStr;
+ if msg.is_null() {
+ error!("Log message from FFI boundary is NULL");
+ } else {
+ error!("{}", unsafe { CStr::from_ptr(msg).to_string_lossy() });
+ }
+}
+
/// Returns true if metrics were changed, false otherwise
pub fn ensure_top_metric_for_interface(interface_alias: &str) -> Result<bool> {
let interface_alias_ws =
@@ -22,7 +33,7 @@ pub fn ensure_top_metric_for_interface(interface_alias: &str) -> Result<bool> {
unsafe {
WinRoute_EnsureTopMetric(
interface_alias_ws.as_wide_c_str().as_ptr(),
- Some(ffi::error_sink),
+ Some(error_sink),
ptr::null_mut(),
).into()
}
@@ -56,8 +67,8 @@ impl Into<Result<bool>> for MetricResult {
extern "system" {
#[link_name(WinRoute_EnsureTopMetric)]
fn WinRoute_EnsureTopMetric(
- tunnel_interface_alias: *const libc::wchar_t,
- sink: Option<ffi::ErrorSink>,
- sink_context: *mut libc::c_void,
+ tunnel_interface_alias: *const wchar_t,
+ sink: Option<ErrorSink>,
+ sink_context: *mut c_void,
) -> MetricResult;
}