Skip to content

Commit 86255e8

Browse files
authored
mdns: get_interface_addr_for_ip once per query (#275)
1 parent e549e67 commit 86255e8

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

mdns/src/conn/mod.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ async fn run(
297297
dst_addr: SocketAddr,
298298
queries: &Arc<Mutex<Vec<Query>>>,
299299
) {
300+
let mut interface_addr = None;
300301
for _ in 0..=MAX_MESSAGE_RECORDS {
301302
let q = match p.question() {
302303
Ok(q) => q,
@@ -313,16 +314,22 @@ async fn run(
313314

314315
for local_name in local_names {
315316
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+
},
326333
};
327334

328335
log::trace!(
@@ -332,7 +339,7 @@ async fn run(
332339
interface_addr
333340
);
334341
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
336343
{
337344
log::error!("Error sending answer to client: {:?}", e);
338345
continue;
@@ -374,7 +381,7 @@ async fn run(
374381

375382
async fn send_answer(
376383
socket: &Arc<UdpSocket>,
377-
interface_addr: SocketAddr,
384+
interface_addr: &SocketAddr,
378385
name: &str,
379386
dst: IpAddr,
380387
dst_addr: SocketAddr,

0 commit comments

Comments
 (0)