summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2022-03-17 16:08:04 +0100
committerDavid Lönnhager <david.l@mullvad.net>2022-03-18 10:27:42 +0100
commit8fdea52ee962c2e58985f4ba8d388848f220255e (patch)
treefdb52a1540ff5749e5415e1ddb81a9d8fee4cc39
parent8609033acdc7e7f7da98c3e3330d9792dbb9aa87 (diff)
downloadmullvadvpn-8fdea52ee962c2e58985f4ba8d388848f220255e.tar.xz
mullvadvpn-8fdea52ee962c2e58985f4ba8d388848f220255e.zip
Encapsulate interface data in ST module
-rw-r--r--talpid-core/src/split_tunnel/windows/mod.rs87
1 files changed, 37 insertions, 50 deletions
diff --git a/talpid-core/src/split_tunnel/windows/mod.rs b/talpid-core/src/split_tunnel/windows/mod.rs
index e8b5455434..01a3d324b5 100644
--- a/talpid-core/src/split_tunnel/windows/mod.rs
+++ b/talpid-core/src/split_tunnel/windows/mod.rs
@@ -133,18 +133,21 @@ impl Drop for QuitEvent {
enum Request {
SetPaths(Vec<OsString>),
- RegisterIps(
- Option<Ipv4Addr>,
- Option<Ipv6Addr>,
- Option<Ipv4Addr>,
- Option<Ipv6Addr>,
- ),
+ RegisterIps(InterfaceAddresses),
}
type RequestResponseTx = sync_mpsc::Sender<Result<(), Error>>;
type RequestTx = sync_mpsc::Sender<(Request, RequestResponseTx)>;
const REQUEST_TIMEOUT: Duration = Duration::from_secs(5);
+#[derive(Default, PartialEq, Clone)]
+struct InterfaceAddresses {
+ tunnel_ipv4: Option<Ipv4Addr>,
+ tunnel_ipv6: Option<Ipv6Addr>,
+ internet_ipv4: Option<Ipv4Addr>,
+ internet_ipv6: Option<Ipv6Addr>,
+}
+
struct EventThreadContext {
handle: Arc<driver::DeviceHandle>,
event_overlapped: OVERLAPPED,
@@ -362,7 +365,7 @@ impl SplitTunnel {
}
};
- let mut previous_addresses = (None, None, None, None);
+ let mut previous_addresses = InterfaceAddresses::default();
while let Ok((request, response_tx)) = rx.recv() {
let response = match request {
@@ -389,34 +392,24 @@ impl SplitTunnel {
result
}
- Request::RegisterIps(
- mut tunnel_ipv4,
- mut tunnel_ipv6,
- internet_ipv4,
- internet_ipv6,
- ) => {
- if internet_ipv4.is_none() && internet_ipv6.is_none() {
- tunnel_ipv4 = None;
- tunnel_ipv6 = None;
+ Request::RegisterIps(mut ips) => {
+ if ips.internet_ipv4.is_none() && ips.internet_ipv6.is_none() {
+ ips.tunnel_ipv4 = None;
+ ips.tunnel_ipv6 = None;
}
- if previous_addresses.0 == tunnel_ipv4
- && previous_addresses.1 == tunnel_ipv6
- && previous_addresses.2 == internet_ipv4
- && previous_addresses.3 == internet_ipv6
- {
+ if previous_addresses == ips {
Ok(())
} else {
let result = handle
.register_ips(
- tunnel_ipv4,
- tunnel_ipv6,
- internet_ipv4,
- internet_ipv6,
+ ips.tunnel_ipv4,
+ ips.tunnel_ipv6,
+ ips.internet_ipv4,
+ ips.internet_ipv6,
)
.map_err(Error::RegisterIps);
if result.is_ok() {
- previous_addresses =
- (tunnel_ipv4, tunnel_ipv6, internet_ipv4, internet_ipv6);
+ previous_addresses = ips;
}
result
}
@@ -568,7 +561,7 @@ impl SplitTunnel {
/// Instructs the driver to stop redirecting tunnel traffic and INADDR_ANY.
pub fn clear_tunnel_addresses(&mut self) -> Result<(), Error> {
self._route_change_callback = None;
- self.send_request(Request::RegisterIps(None, None, None, None))
+ self.send_request(Request::RegisterIps(InterfaceAddresses::default()))
}
}
@@ -594,10 +587,7 @@ impl Drop for SplitTunnel {
struct SplitTunnelDefaultRouteChangeHandlerContext {
request_tx: RequestTx,
pub daemon_tx: Weak<mpsc::UnboundedSender<TunnelCommand>>,
- pub tunnel_ipv4: Option<Ipv4Addr>,
- pub tunnel_ipv6: Option<Ipv6Addr>,
- pub internet_ipv4: Option<Ipv4Addr>,
- pub internet_ipv6: Option<Ipv6Addr>,
+ pub addresses: InterfaceAddresses,
}
impl SplitTunnelDefaultRouteChangeHandlerContext {
@@ -610,22 +600,19 @@ impl SplitTunnelDefaultRouteChangeHandlerContext {
SplitTunnelDefaultRouteChangeHandlerContext {
request_tx,
daemon_tx,
- tunnel_ipv4,
- tunnel_ipv6,
- internet_ipv4: None,
- internet_ipv6: None,
+ addresses: InterfaceAddresses {
+ tunnel_ipv4,
+ tunnel_ipv6,
+ internet_ipv4: None,
+ internet_ipv6: None,
+ },
}
}
pub fn register_ips(&self) -> Result<(), Error> {
SplitTunnel::send_request_inner(
&self.request_tx,
- Request::RegisterIps(
- self.tunnel_ipv4,
- self.tunnel_ipv6,
- self.internet_ipv4,
- self.internet_ipv6,
- ),
+ Request::RegisterIps(self.addresses.clone()),
)
}
@@ -644,10 +631,10 @@ impl SplitTunnelDefaultRouteChangeHandlerContext {
.map_err(Error::LuidToIp)?
.flatten();
- self.internet_ipv4 = internet_ipv4
+ self.addresses.internet_ipv4 = internet_ipv4
.map(|addr| Ipv4Addr::try_from(addr).map_err(|_| Error::IpParseError))
.transpose()?;
- self.internet_ipv6 = internet_ipv6
+ self.addresses.internet_ipv6 = internet_ipv6
.map(|addr| Ipv6Addr::try_from(addr).map_err(|_| Error::IpParseError))
.transpose()?;
Ok(())
@@ -677,17 +664,17 @@ unsafe extern "system" fn split_tunnel_default_route_change_handler(
DefaultRouteChanged | DefaultRouteUpdatedDetails => {
match interface_luid_to_ip(address_family, default_route.interface_luid) {
Ok(Some(ip)) => match IpAddr::from(ip) {
- IpAddr::V4(addr) => ctx.internet_ipv4 = Some(addr),
- IpAddr::V6(addr) => ctx.internet_ipv6 = Some(addr),
+ IpAddr::V4(addr) => ctx.addresses.internet_ipv4 = Some(addr),
+ IpAddr::V6(addr) => ctx.addresses.internet_ipv6 = Some(addr),
},
Ok(None) => {
log::warn!("Failed to obtain default route interface address");
match address_family {
WinNetAddrFamily::IPV4 => {
- ctx.internet_ipv4 = None;
+ ctx.addresses.internet_ipv4 = None;
}
WinNetAddrFamily::IPV6 => {
- ctx.internet_ipv6 = None;
+ ctx.addresses.internet_ipv6 = None;
}
}
}
@@ -709,10 +696,10 @@ unsafe extern "system" fn split_tunnel_default_route_change_handler(
DefaultRouteRemoved => {
match address_family {
WinNetAddrFamily::IPV4 => {
- ctx.internet_ipv4 = None;
+ ctx.addresses.internet_ipv4 = None;
}
WinNetAddrFamily::IPV6 => {
- ctx.internet_ipv6 = None;
+ ctx.addresses.internet_ipv6 = None;
}
}
ctx.register_ips()