From 1759d7f7623c548402e0974bd9714716943c3a55 Mon Sep 17 00:00:00 2001 From: fufesou Date: Fri, 16 Jun 2023 23:05:10 +0800 Subject: [PATCH 1/2] lan discovery, try get ip addr only when 0.0.0.0 Signed-off-by: fufesou --- src/lan.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/lan.rs b/src/lan.rs index 1f0635c1ccc7..36a65a06be4b 100644 --- a/src/lan.rs +++ b/src/lan.rs @@ -202,6 +202,17 @@ fn wait_response( ) -> ResultType<()> { let mut last_recv_time = Instant::now(); + let local_addr = socket.local_addr(); + let try_get_ip_by_peer = match local_addr.as_ref() { + Err(..) => true, + Ok(addr) => addr.ip().is_unspecified(), + }; + let mac = if let Ok(local_addr) = local_addr { + get_mac(&local_addr.ip()) + } else { + "".to_owned() + }; + socket.set_read_timeout(timeout)?; loop { let mut buf = [0; 2048]; @@ -211,13 +222,17 @@ fn wait_response( Some(rendezvous_message::Union::PeerDiscovery(p)) => { last_recv_time = Instant::now(); if p.cmd == "pong" { - let mac = if let Some(self_addr) = get_ipaddr_by_peer(&addr) { - get_mac(&self_addr) + let local_mac = if try_get_ip_by_peer { + if let Some(self_addr) = get_ipaddr_by_peer(&addr) { + get_mac(&self_addr) + } else { + "".to_owned() + } } else { - "".to_owned() + mac.clone() }; - if mac != p.mac { + if local_mac.is_empty() && p.mac.is_empty() || local_mac != p.mac { allow_err!(tx.send(config::DiscoveryPeer { id: p.id.clone(), ip_mac: HashMap::from([ From 5dc0917ea9e184555bd9e495dcdc129cfe3b4da3 Mon Sep 17 00:00:00 2001 From: fufesou Date: Fri, 16 Jun 2023 23:31:37 +0800 Subject: [PATCH 2/2] lan discovery, refact mac Signed-off-by: fufesou --- src/lan.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/lan.rs b/src/lan.rs index 36a65a06be4b..d9f0c0894f5e 100644 --- a/src/lan.rs +++ b/src/lan.rs @@ -207,11 +207,7 @@ fn wait_response( Err(..) => true, Ok(addr) => addr.ip().is_unspecified(), }; - let mac = if let Ok(local_addr) = local_addr { - get_mac(&local_addr.ip()) - } else { - "".to_owned() - }; + let mut mac: Option = None; socket.set_read_timeout(timeout)?; loop { @@ -229,7 +225,18 @@ fn wait_response( "".to_owned() } } else { - mac.clone() + match mac.as_ref() { + Some(m) => m.clone(), + None => { + let m = if let Ok(local_addr) = local_addr { + get_mac(&local_addr.ip()) + } else { + "".to_owned() + }; + mac = Some(m.clone()); + m + } + } }; if local_mac.is_empty() && p.mac.is_empty() || local_mac != p.mac {