get_ip_addr: Fall back to loopback if no better option exists

This commit is contained in:
Michael Vines
2018-11-23 08:23:16 -05:00
parent 942256a647
commit d5adec20a3

View File

@ -58,14 +58,11 @@ fn find_eth0ish_ip_addr(ifaces: &mut Vec<datalink::NetworkInterface>) -> Option<
.cmp(&b.name.chars().last().unwrap()) .cmp(&b.name.chars().last().unwrap())
}); });
let mut lo = None;
for iface in ifaces.clone() { for iface in ifaces.clone() {
trace!("get_ip_addr considering iface {}", iface.name); trace!("get_ip_addr considering iface {}", iface.name);
for p in iface.ips { for p in iface.ips {
trace!(" ip {}", p); trace!(" ip {}", p);
if p.ip().is_loopback() {
trace!(" loopback");
continue;
}
if p.ip().is_multicast() { if p.ip().is_multicast() {
trace!(" multicast"); trace!(" multicast");
continue; continue;
@ -76,6 +73,13 @@ fn find_eth0ish_ip_addr(ifaces: &mut Vec<datalink::NetworkInterface>) -> Option<
trace!(" link local"); trace!(" link local");
continue; continue;
} }
if p.ip().is_loopback() {
// Fall back to loopback if no better option exists
// (local development and test)
trace!(" loopback");
lo = Some(p.ip());
continue;
}
trace!(" picked {}", p.ip()); trace!(" picked {}", p.ip());
return Some(p.ip()); return Some(p.ip());
} }
@ -83,13 +87,19 @@ fn find_eth0ish_ip_addr(ifaces: &mut Vec<datalink::NetworkInterface>) -> Option<
// Select an ipv6 address if the config is selected // Select an ipv6 address if the config is selected
#[cfg(feature = "ipv6")] #[cfg(feature = "ipv6")]
{ {
if p.ip().is_loopback() {
trace!(" loopback");
lo = Some(p.ip());
continue;
}
return Some(p.ip()); return Some(p.ip());
} }
} }
} }
} }
} }
None trace!(" picked {:?}", lo);
lo
} }
pub fn get_ip_addr() -> Option<IpAddr> { pub fn get_ip_addr() -> Option<IpAddr> {
@ -214,10 +224,18 @@ mod tests {
}; };
} }
// loopback bad // loopback bad when alternatives exist
assert_eq!(
find_eth0ish_ip_addr(&mut vec![
mock_interface!(eth0, "192.168.137.1/8"),
mock_interface!(lo, "127.0.0.1/24")
]),
Some(mock_interface!(eth0, "192.168.137.1/8").ips[0].ip())
);
// find loopback as a last resort
assert_eq!( assert_eq!(
find_eth0ish_ip_addr(&mut vec![mock_interface!(lo, "127.0.0.1/24")]), find_eth0ish_ip_addr(&mut vec![mock_interface!(lo, "127.0.0.1/24")]),
None Some(mock_interface!(lo, "127.0.0.1/24").ips[0].ip()),
); );
// multicast bad // multicast bad
assert_eq!( assert_eq!(