@@ -9,7 +9,8 @@ use win32_utils::str::FromWin32Str;
9
9
use windows:: Win32 :: Foundation :: { ERROR_BUFFER_OVERFLOW , WIN32_ERROR } ;
10
10
use windows:: Win32 :: NetworkManagement :: IpHelper :: {
11
11
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 ,
13
14
} ;
14
15
use windows:: Win32 :: Networking :: WinSock :: AF_UNSPEC ;
15
16
@@ -59,6 +60,8 @@ struct Adapter {
59
60
ipv6_interface_index : u32 ,
60
61
dns_servers : Vec < IpAddr > ,
61
62
dns_suffixes : Vec < String > ,
63
+ ipv4_enabled : bool ,
64
+ ipv6_enabled : bool ,
62
65
}
63
66
64
67
/// Returns a list of the system network adapters
@@ -118,6 +121,8 @@ fn get_adapters() -> Result<Vec<Adapter>, Error> {
118
121
ipv6_interface_index : adapter. Ipv6IfIndex ,
119
122
dns_servers,
120
123
dns_suffixes,
124
+ ipv4_enabled : adapter. Anonymous2 . Flags & IP_ADAPTER_IPV4_ENABLED != 0 ,
125
+ ipv6_enabled : adapter. Anonymous2 . Flags & IP_ADAPTER_IPV6_ENABLED != 0 ,
121
126
} ) ;
122
127
next = adapter. Next ;
123
128
}
@@ -128,7 +133,19 @@ fn get_adapters() -> Result<Vec<Adapter>, Error> {
128
133
impl Adapter {
129
134
// For the purposes of DNS, the interface metric is whichever one is lowest
130
135
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)
132
149
}
133
150
}
134
151
@@ -170,6 +187,7 @@ pub fn get_configuration() -> Result<DnsConfiguration, Error> {
170
187
} )
171
188
. sorted_by_key ( Adapter :: interface_metric)
172
189
. collect :: < Vec < _ > > ( ) ;
190
+ log:: info!( "Found adapters: {:?}" , internet_adapters) ;
173
191
174
192
let servers = internet_adapters
175
193
. iter ( )
0 commit comments