Skip to content

Commit 1d83b43

Browse files
authored
Fix interface priority bug when either of IPv4/IPv6 is disabled (#4)
1 parent f17cc8f commit 1d83b43

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "wsl2-dns-agent"
3-
version = "0.3.3"
3+
version = "0.3.4"
44
edition = "2021"
55
license = "GPL-3.0"
66
description = "An agent that automatically patches your WSL2 DNS configuration for users of Cisco AnyConnect (or similar VPNs)"

src/dns.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ use win32_utils::str::FromWin32Str;
99
use windows::Win32::Foundation::{ERROR_BUFFER_OVERFLOW, WIN32_ERROR};
1010
use windows::Win32::NetworkManagement::IpHelper::{
1111
FreeMibTable, GetAdaptersAddresses, GetIpForwardTable2, GET_ADAPTERS_ADDRESSES_FLAGS,
12-
IP_ADAPTER_ADDRESSES_LH, MIB_IPFORWARD_ROW2, MIB_IPFORWARD_TABLE2,
12+
IP_ADAPTER_ADDRESSES_LH, IP_ADAPTER_IPV4_ENABLED, IP_ADAPTER_IPV6_ENABLED, MIB_IPFORWARD_ROW2,
13+
MIB_IPFORWARD_TABLE2,
1314
};
1415
use windows::Win32::Networking::WinSock::AF_UNSPEC;
1516

@@ -59,6 +60,8 @@ struct Adapter {
5960
ipv6_interface_index: u32,
6061
dns_servers: Vec<IpAddr>,
6162
dns_suffixes: Vec<String>,
63+
ipv4_enabled: bool,
64+
ipv6_enabled: bool,
6265
}
6366

6467
/// Returns a list of the system network adapters
@@ -118,6 +121,8 @@ fn get_adapters() -> Result<Vec<Adapter>, Error> {
118121
ipv6_interface_index: adapter.Ipv6IfIndex,
119122
dns_servers,
120123
dns_suffixes,
124+
ipv4_enabled: adapter.Anonymous2.Flags & IP_ADAPTER_IPV4_ENABLED != 0,
125+
ipv6_enabled: adapter.Anonymous2.Flags & IP_ADAPTER_IPV6_ENABLED != 0,
121126
});
122127
next = adapter.Next;
123128
}
@@ -128,7 +133,19 @@ fn get_adapters() -> Result<Vec<Adapter>, Error> {
128133
impl Adapter {
129134
// For the purposes of DNS, the interface metric is whichever one is lowest
130135
fn interface_metric(&self) -> u32 {
131-
std::cmp::min(self.ipv4_metric, self.ipv6_metric)
136+
// When IPv4/IPv6 is disabled then Windows returns a metric of 0 which isn't
137+
// very helpful
138+
let ipv4 = if self.ipv4_enabled {
139+
self.ipv4_metric
140+
} else {
141+
u32::MAX
142+
};
143+
let ipv6 = if self.ipv6_enabled {
144+
self.ipv6_metric
145+
} else {
146+
u32::MAX
147+
};
148+
std::cmp::min(ipv4, ipv6)
132149
}
133150
}
134151

@@ -170,6 +187,7 @@ pub fn get_configuration() -> Result<DnsConfiguration, Error> {
170187
})
171188
.sorted_by_key(Adapter::interface_metric)
172189
.collect::<Vec<_>>();
190+
log::info!("Found adapters: {:?}", internet_adapters);
173191

174192
let servers = internet_adapters
175193
.iter()

0 commit comments

Comments
 (0)