@@ -7,7 +7,7 @@ use std::collections::VecDeque;
7
7
use std:: io;
8
8
use std:: io:: ErrorKind :: WouldBlock ;
9
9
use std:: marker:: PhantomData ;
10
- use std:: net:: { IpAddr , SocketAddr } ;
10
+ use std:: net:: { IpAddr , SocketAddr , Ipv4Addr , Ipv6Addr } ;
11
11
use std:: {
12
12
future:: Future ,
13
13
pin:: Pin ,
@@ -20,6 +20,8 @@ use super::{DEFAULT_TTL, MDNS_PORT};
20
20
use crate :: address_family:: AddressFamily ;
21
21
use crate :: services:: { ServiceData , Services } ;
22
22
23
+ use local_ip_address:: { list_afinet_netifas} ;
24
+
23
25
pub type AnswerBuilder = dns_parser:: Builder < dns_parser:: Answers > ;
24
26
25
27
const SERVICE_TYPE_ENUMERATION_NAME : Cow < ' static , str > =
@@ -221,7 +223,7 @@ impl<AF: AddressFamily> FSM<AF> {
221
223
}
222
224
223
225
fn add_ip_rr ( & self , hostname : & Name , mut builder : AnswerBuilder , ttl : u32 ) -> AnswerBuilder {
224
- let interfaces = match get_if_addrs ( ) {
226
+ let interfaces = match list_afinet_netifas ( ) {
225
227
Ok ( interfaces) => interfaces,
226
228
Err ( err) => {
227
229
error ! ( "could not get list of interfaces: {}" , err) ;
@@ -230,22 +232,25 @@ impl<AF: AddressFamily> FSM<AF> {
230
232
} ;
231
233
232
234
for iface in interfaces {
233
- if iface. is_loopback ( ) {
234
- continue ;
235
- }
236
235
237
236
trace ! ( "found interface {:?}" , iface) ;
238
- if !self . allowed_ip . is_empty ( ) && !self . allowed_ip . contains ( & iface. ip ( ) ) {
237
+ if !self . allowed_ip . is_empty ( ) && !self . allowed_ip . contains ( & iface. 1 ) {
239
238
trace ! ( " -> interface dropped" ) ;
240
239
continue ;
241
240
}
242
241
243
- match ( iface. ip ( ) , AF :: DOMAIN ) {
242
+ match ( iface. 1 , AF :: DOMAIN ) {
244
243
( IpAddr :: V4 ( ip) , Domain :: IPV4 ) => {
245
- builder = builder. add_answer ( hostname, QueryClass :: IN , ttl, & RRData :: A ( ip) )
244
+ if !is_loopback_ipv4 ( ip) {
245
+ builder = builder. add_answer ( hostname, QueryClass :: IN , ttl, & RRData :: A ( ip) ) ;
246
+ trace ! ( " -> adding IP address {:?}" , iface. 1 ) ;
247
+ }
246
248
}
247
249
( IpAddr :: V6 ( ip) , Domain :: IPV6 ) => {
248
- builder = builder. add_answer ( hostname, QueryClass :: IN , ttl, & RRData :: AAAA ( ip) )
250
+ if !is_loopback_ipv6 ( ip) {
251
+ builder = builder. add_answer ( hostname, QueryClass :: IN , ttl, & RRData :: AAAA ( ip) ) ;
252
+ trace ! ( " -> adding IP address {:?}" , iface. 1 ) ;
253
+ }
249
254
}
250
255
_ => ( ) ,
251
256
}
@@ -318,6 +323,15 @@ impl<AF: Unpin + AddressFamily> Future for FSM<AF> {
318
323
}
319
324
}
320
325
326
+
327
+ fn is_loopback_ipv6 ( ip : Ipv6Addr ) -> bool {
328
+ ip. segments ( ) == [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ]
329
+ }
330
+
331
+ fn is_loopback_ipv4 ( ip : Ipv4Addr ) -> bool {
332
+ ip. octets ( ) [ 0 ] == 127
333
+ }
334
+
321
335
#[ cfg( test) ]
322
336
mod tests {
323
337
use super :: * ;
0 commit comments