summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-05-17 12:05:19 +0200
committerDavid Lönnhager <david.l@mullvad.net>2021-07-02 09:54:19 +0200
commitd1f203db76a0a06ddd89c54a0c9f990b0a35f208 (patch)
treef2435098be3687ee863c513d8344c864570e9955
parent1beccd0cb439220c49e21e0203603e4428a6e42c (diff)
downloadmullvadvpn-d1f203db76a0a06ddd89c54a0c9f990b0a35f208.tar.xz
mullvadvpn-d1f203db76a0a06ddd89c54a0c9f990b0a35f208.zip
Make LAN IPv4 address optional
-rw-r--r--talpid-core/src/split_tunnel/windows/driver.rs16
-rw-r--r--talpid-core/src/split_tunnel/windows/mod.rs31
2 files changed, 22 insertions, 25 deletions
diff --git a/talpid-core/src/split_tunnel/windows/driver.rs b/talpid-core/src/split_tunnel/windows/driver.rs
index 51c72c8051..37b110ebc1 100644
--- a/talpid-core/src/split_tunnel/windows/driver.rs
+++ b/talpid-core/src/split_tunnel/windows/driver.rs
@@ -194,7 +194,7 @@ impl DeviceHandle {
&self,
tunnel_ipv4: Ipv4Addr,
tunnel_ipv6: Option<Ipv6Addr>,
- internet_ipv4: Ipv4Addr,
+ internet_ipv4: Option<Ipv4Addr>,
internet_ipv6: Option<Ipv6Addr>,
) -> io::Result<()> {
let mut addresses: SplitTunnelAddresses = unsafe { mem::zeroed() };
@@ -216,12 +216,14 @@ impl DeviceHandle {
);
}
- let internet_ipv4 = internet_ipv4.octets();
- ptr::copy_nonoverlapping(
- &internet_ipv4[0] as *const u8,
- &mut addresses.internet_ipv4 as *mut _ as *mut u8,
- internet_ipv4.len(),
- );
+ if let Some(internet_ipv4) = internet_ipv4 {
+ let internet_ipv4 = internet_ipv4.octets();
+ ptr::copy_nonoverlapping(
+ &internet_ipv4[0] as *const u8,
+ &mut addresses.internet_ipv4 as *mut _ as *mut u8,
+ internet_ipv4.len(),
+ );
+ }
if let Some(internet_ipv6) = internet_ipv6 {
let internet_ipv6 = internet_ipv6.octets();
diff --git a/talpid-core/src/split_tunnel/windows/mod.rs b/talpid-core/src/split_tunnel/windows/mod.rs
index d5710d2d71..95631dd569 100644
--- a/talpid-core/src/split_tunnel/windows/mod.rs
+++ b/talpid-core/src/split_tunnel/windows/mod.rs
@@ -307,8 +307,9 @@ impl SplitTunnel {
.flatten();
let tunnel_ipv4 = tunnel_ipv4.unwrap_or(*RESERVED_IP_V4);
- let internet_ipv4 = Ipv4Addr::try_from(internet_ipv4.unwrap_or_default())
- .map_err(|_| Error::IpParseError)?;
+ let internet_ipv4 = internet_ipv4
+ .map(|addr| Ipv4Addr::try_from(addr).map_err(|_| Error::IpParseError))
+ .transpose()?;
let internet_ipv6 = internet_ipv6
.map(|addr| Ipv6Addr::try_from(addr).map_err(|_| Error::IpParseError))
.transpose()?;
@@ -346,13 +347,7 @@ impl SplitTunnel {
pub fn clear_tunnel_addresses(&mut self) -> Result<(), Error> {
self._route_change_callback = None;
- Self::register_ips(
- &*self.handle,
- Ipv4Addr::new(0, 0, 0, 0),
- None,
- Ipv4Addr::new(0, 0, 0, 0),
- None,
- )
+ Self::register_ips(&*self.handle, Ipv4Addr::new(0, 0, 0, 0), None, None, None)
}
/// Configures IP addresses used for socket rebinding.
@@ -360,20 +355,20 @@ impl SplitTunnel {
handle: &Mutex<driver::DeviceHandle>,
tunnel_ipv4: Ipv4Addr,
tunnel_ipv6: Option<Ipv6Addr>,
- internet_ipv4: Ipv4Addr,
+ internet_ipv4: Option<Ipv4Addr>,
internet_ipv6: Option<Ipv6Addr>,
) -> Result<(), Error> {
log::debug!(
- "Register IPs: {} {:?} {} {:?}",
+ "Register IPs: tunnel: {} {:?}, LAN interface: {:?} {:?}",
tunnel_ipv4,
tunnel_ipv6,
internet_ipv4,
internet_ipv6
);
- // If there is no valid internet IPv4 address, ignore any tunnel addresses.
+ // If there is no valid internet address, ignore any tunnel addresses.
// This should only be the case if a reserved tunnel IP is used to keep the driver engaged.
- let tunnel_ipv4 = if internet_ipv4.is_unspecified() {
+ let tunnel_ipv4 = if internet_ipv4.is_none() && internet_ipv6.is_none() {
Ipv4Addr::new(0, 0, 0, 0)
} else {
tunnel_ipv4
@@ -415,7 +410,7 @@ struct SplitTunnelDefaultRouteChangeHandlerContext {
pub daemon_tx: Weak<mpsc::UnboundedSender<TunnelCommand>>,
pub tunnel_ipv4: Ipv4Addr,
pub tunnel_ipv6: Option<Ipv6Addr>,
- pub internet_ipv4: Ipv4Addr,
+ pub internet_ipv4: Option<Ipv4Addr>,
pub internet_ipv6: Option<Ipv6Addr>,
}
@@ -425,7 +420,7 @@ impl SplitTunnelDefaultRouteChangeHandlerContext {
daemon_tx: Weak<mpsc::UnboundedSender<TunnelCommand>>,
tunnel_ipv4: Ipv4Addr,
tunnel_ipv6: Option<Ipv6Addr>,
- internet_ipv4: Ipv4Addr,
+ internet_ipv4: Option<Ipv4Addr>,
internet_ipv6: Option<Ipv6Addr>,
) -> Self {
SplitTunnelDefaultRouteChangeHandlerContext {
@@ -469,14 +464,14 @@ unsafe extern "system" fn split_tunnel_default_route_change_handler(
winnet::WinNetDefaultRouteChangeEventType::DefaultRouteChanged => {
match interface_luid_to_ip(address_family.clone(), default_route.interface_luid) {
Ok(Some(ip)) => match IpAddr::from(ip) {
- IpAddr::V4(addr) => ctx.internet_ipv4 = addr,
+ IpAddr::V4(addr) => ctx.internet_ipv4 = Some(addr),
IpAddr::V6(addr) => ctx.internet_ipv6 = Some(addr),
},
Ok(None) => {
log::warn!("Failed to obtain default route interface address");
match address_family {
WinNetAddrFamily::IPV4 => {
- ctx.internet_ipv4 = Ipv4Addr::new(0, 0, 0, 0);
+ ctx.internet_ipv4 = None;
}
WinNetAddrFamily::IPV6 => {
ctx.internet_ipv6 = None;
@@ -501,7 +496,7 @@ unsafe extern "system" fn split_tunnel_default_route_change_handler(
winnet::WinNetDefaultRouteChangeEventType::DefaultRouteRemoved => {
match address_family {
WinNetAddrFamily::IPV4 => {
- ctx.internet_ipv4 = Ipv4Addr::new(0, 0, 0, 0);
+ ctx.internet_ipv4 = None;
}
WinNetAddrFamily::IPV6 => {
ctx.internet_ipv6 = None;