@@ -297,6 +297,7 @@ async fn run(
297
297
dst_addr : SocketAddr ,
298
298
queries : & Arc < Mutex < Vec < Query > > > ,
299
299
) {
300
+ let mut interface_addr = None ;
300
301
for _ in 0 ..=MAX_MESSAGE_RECORDS {
301
302
let q = match p. question ( ) {
302
303
Ok ( q) => q,
@@ -313,16 +314,22 @@ async fn run(
313
314
314
315
for local_name in local_names {
315
316
if * local_name == q. name . data {
316
- let interface_addr = match get_interface_addr_for_ip ( src) . await {
317
- Ok ( e) => e,
318
- Err ( e) => {
319
- log:: warn!(
320
- "Failed to get local interface to communicate with {}: {:?}" ,
321
- & src,
322
- e
323
- ) ;
324
- continue ;
325
- }
317
+ let interface_addr = match interface_addr {
318
+ Some ( addr) => addr,
319
+ None => match get_interface_addr_for_ip ( src) . await {
320
+ Ok ( addr) => {
321
+ interface_addr. replace ( addr) ;
322
+ addr
323
+ }
324
+ Err ( e) => {
325
+ log:: warn!(
326
+ "Failed to get local interface to communicate with {}: {:?}" ,
327
+ & src,
328
+ e
329
+ ) ;
330
+ continue ;
331
+ }
332
+ } ,
326
333
} ;
327
334
328
335
log:: trace!(
@@ -332,7 +339,7 @@ async fn run(
332
339
interface_addr
333
340
) ;
334
341
if let Err ( e) =
335
- send_answer ( socket, interface_addr, & q. name . data , src. ip ( ) , dst_addr) . await
342
+ send_answer ( socket, & interface_addr, & q. name . data , src. ip ( ) , dst_addr) . await
336
343
{
337
344
log:: error!( "Error sending answer to client: {:?}" , e) ;
338
345
continue ;
@@ -374,7 +381,7 @@ async fn run(
374
381
375
382
async fn send_answer (
376
383
socket : & Arc < UdpSocket > ,
377
- interface_addr : SocketAddr ,
384
+ interface_addr : & SocketAddr ,
378
385
name : & str ,
379
386
dst : IpAddr ,
380
387
dst_addr : SocketAddr ,
0 commit comments